1811872455@163.com 1 tydzień temu
rodzic
commit
2ec8f26db4
36 zmienionych plików z 354 dodań i 296 usunięć
  1. 4 0
      java/storlead-api/pom.xml
  2. 0 141
      java/storlead-api/src/main/java/com/storlead/system/controller/SysAppApiController.java
  3. 2 1
      java/storlead-api/src/main/resources/application.yml
  4. 1 14
      java/storlead-message/storlead-message-api/src/main/java/com/storlead/message/controller/MessageApiController.java
  5. 3 0
      java/storlead-message/storlead-message-biz/src/main/java/com/storlead/message/service/InsideMessageSendLogService.java
  6. 3 2
      java/storlead-message/storlead-message-biz/src/main/java/com/storlead/message/service/impl/InsideMessageRecordServiceImpl.java
  7. 24 0
      java/storlead-message/storlead-message-biz/src/main/java/com/storlead/message/service/impl/InsideMessageSendLogServiceImpl.java
  8. 2 1
      java/storlead-message/storlead-message-biz/src/main/resources/mapper/InsideMessageRecordMapper.xml
  9. 3 0
      java/storlead-message/storlead-message-core/src/main/java/com/storlead/message/pojo/dto/MessageDTO.java
  10. 3 0
      java/storlead-message/storlead-message-core/src/main/java/com/storlead/message/pojo/entity/InsideMessageRecordEntity.java
  11. 7 0
      java/storlead-message/storlead-message-core/src/main/java/com/storlead/message/pojo/vo/MessageTypeReadStateVO.java
  12. 0 0
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/CompanyApiController.java
  13. 0 0
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/CompanyCustomSettingsController.java
  14. 0 0
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/CorpWeChatController.java
  15. 0 0
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/DeptApiController.java
  16. 0 0
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/DeptController.java
  17. 0 0
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/DeptRoleController.java
  18. 9 9
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/FileResourceController.java
  19. 0 0
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/JobApiController.java
  20. 0 0
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/JobController.java
  21. 63 105
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/MenuApiController.java
  22. 0 0
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/PermissionResApiController.java
  23. 0 0
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/QuickMenuApiController.java
  24. 0 0
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/RoleApiController.java
  25. 0 0
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/SubCompanyApiController.java
  26. 0 0
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/SubCompanyController.java
  27. 68 0
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/SysAppApiController.java
  28. 0 0
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/SysDictApiController.java
  29. 0 0
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/SystemConfigItemController.java
  30. 1 1
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/ThumbnailPreviewController.java
  31. 0 0
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/dto/CompanyDTO.java
  32. 116 3
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/service/impl/SysAppServiceImpl.java
  33. 6 8
      java/storlead-system/storlead-system-core/src/main/java/com/storlead/system/pojo/dto/MenuParamDTO.java
  34. 2 2
      java/storlead-system/storlead-system-core/src/main/java/com/storlead/system/pojo/dto/SysAppPageDTO.java
  35. 12 6
      java/storlead-system/storlead-system-core/src/main/java/com/storlead/system/pojo/entity/SysAppEntity.java
  36. 25 3
      java/storlead-system/storlead-system-spi/src/main/java/com/storlead/system/service/SysAppService.java

+ 4 - 0
java/storlead-api/pom.xml

@@ -60,6 +60,10 @@
             <groupId>com.storlead.boot</groupId>
             <artifactId>storlead-system-biz</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.storlead.boot</groupId>
+            <artifactId>storlead-system-api</artifactId>
+        </dependency>
 
         <!-- UserServiceImpl 等依赖 ThirdPartyUserSyncService,默认实现见 storlead-thirdparty-biz -->
         <dependency>

+ 0 - 141
java/storlead-api/src/main/java/com/storlead/system/controller/SysAppApiController.java

@@ -1,141 +0,0 @@
-package com.storlead.system.controller;
-
-import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.storlead.framework.common.result.Result;
-import com.storlead.system.pojo.dto.SysAppPageDTO;
-import com.storlead.system.pojo.entity.SysAppEntity;
-import com.storlead.system.service.SysAppService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.Date;
-import java.util.Objects;
-
-/**
- * 系统应用管理
- */
-@Api(tags = "系统: 应用管理")
-@RestController
-@RequestMapping("/sys/app")
-public class SysAppApiController {
-
-    @Resource
-    private SysAppService sysAppService;
-
-    @ApiOperation("应用分页")
-    @PostMapping("/pagelist")
-    public Result<IPage<SysAppEntity>> pagelist(@RequestBody SysAppPageDTO dto) {
-        IPage<SysAppEntity> page = new Page<>(dto.getPageIndex(), dto.getPageSize());
-        LambdaQueryWrapper<SysAppEntity> w = new LambdaQueryWrapper<>();
-        w.eq(SysAppEntity::getIsDelete, 0);
-        if (StrUtil.isNotBlank(dto.getAppCode())) {
-            w.like(SysAppEntity::getAppCode, dto.getAppCode().trim());
-        }
-        if (StrUtil.isNotBlank(dto.getAppName())) {
-            w.like(SysAppEntity::getAppName, dto.getAppName().trim());
-        }
-        if (dto.getEnabled() != null) {
-            w.eq(SysAppEntity::getEnabled, dto.getEnabled());
-        }
-        w.orderByAsc(SysAppEntity::getSort).orderByAsc(SysAppEntity::getId);
-        return Result.ok(sysAppService.page(page, w));
-    }
-
-    @ApiOperation("已启用应用列表(下拉等)")
-    @PostMapping("/listEnabled")
-    public Result<?> listEnabled() {
-        return Result.ok(sysAppService.listEnabled());
-    }
-
-    @ApiOperation("详情")
-    @PostMapping("/detail")
-    public Result<?> detail(@RequestParam Long id) {
-        SysAppEntity one = sysAppService.getOne(new LambdaQueryWrapper<SysAppEntity>()
-                .eq(SysAppEntity::getId, id)
-                .eq(SysAppEntity::getIsDelete, 0));
-        if (one == null) {
-            return Result.error("应用不存在或已删除");
-        }
-        return Result.ok(one);
-    }
-
-    @ApiOperation("保存或更新")
-    @PostMapping("/save")
-    public Result<?> save(@RequestBody SysAppEntity body) {
-        if (body == null || StrUtil.isBlank(body.getAppCode()) || StrUtil.isBlank(body.getAppName())) {
-            return Result.error("appCode、appName 不能为空");
-        }
-        body.setAppCode(body.getAppCode().trim());
-        body.setAppName(body.getAppName().trim());
-
-        Date now = new Date();
-        if (body.getId() == null) {
-            if (body.getEnabled() == null) {
-                body.setEnabled(1);
-            }
-            if (body.getIsDelete() == null) {
-                body.setIsDelete(0);
-            }
-            if (body.getSort() == null) {
-                body.setSort(0);
-            }
-            if (body.getOwnerBy() == null) {
-                body.setOwnerBy(0L);
-            }
-            body.setCreateTime(now);
-        }
-
-        LambdaQueryWrapper<SysAppEntity> dup = new LambdaQueryWrapper<SysAppEntity>()
-                .eq(SysAppEntity::getAppCode, body.getAppCode())
-                .eq(SysAppEntity::getIsDelete, 0);
-        if (body.getId() != null) {
-            dup.ne(SysAppEntity::getId, body.getId());
-        }
-        if (sysAppService.count(dup) > 0) {
-            return Result.error("应用编码已存在: " + body.getAppCode());
-        }
-
-        body.setUpdateTime(now);
-
-        sysAppService.saveOrUpdate(body);
-        return Result.ok();
-    }
-
-    @ApiOperation("启用/禁用")
-    @PostMapping("/enable")
-    public Result<?> enable(@RequestParam Long id, @RequestParam Boolean enabled) {
-        if (id == null || enabled == null) {
-            return Result.error("参数错误");
-        }
-        LambdaUpdateWrapper<SysAppEntity> uw = new LambdaUpdateWrapper<>();
-        uw.set(SysAppEntity::getEnabled, Boolean.TRUE.equals(enabled) ? 1 : 0);
-        uw.set(SysAppEntity::getUpdateTime, new Date());
-        uw.eq(SysAppEntity::getId, id).eq(SysAppEntity::getIsDelete, 0);
-        if (!sysAppService.update(uw)) {
-            return Result.error("更新失败,应用不存在或已删除");
-        }
-        return Result.ok();
-    }
-
-    @ApiOperation("逻辑删除(无关联菜单时)")
-    @PostMapping("/delete")
-    public Result<?> delete(@RequestParam Long id) {
-        if (Objects.isNull(id)) {
-            return Result.error("id 不能为空");
-        }
-        if (!sysAppService.trySoftDelete(id)) {
-            return Result.error("删除失败:仍存在关联菜单,或记录不存在");
-        }
-        return Result.ok();
-    }
-}

+ 2 - 1
java/storlead-api/src/main/resources/application.yml

@@ -39,7 +39,7 @@ spring:
             threadCount: 10
             threadPriority: 5
             threadsInheritContextClassLoaderOfInitializingThread: true
-            class: org.quartz.simpl.SimpleThreadPool
+            class: org.quartz.simpl.SimpleThreadPool`
   # 在上下文中没有Executor bean的情况下,Spring Boot会自动配置ThreadPoolTaskExecutor,并使用合理的默认值,这些默认值可以自动关联到异步任务执行(@EnableAsync)和Spring MVC异步请求处理。
   #如果您已经在上下文中定义了一个自定义执行器,那么常规任务执行(即@EnableAsync)将透明地使用它,但是Spring MVC支持将不会被配置,因为它需要一个AsyncTaskExecutor实现(名为applicationTaskExecutor)。根据您的目标安排,您可以将执行程序更改为ThreadPoolTaskExecutor,或者定义一个ThreadPoolTaskExecutor和一个包装自定义执行程序的AsyncConfigurer。
   task:
@@ -65,6 +65,7 @@ storlead:
     ignore-tables:
       - system_wechat_config
       - system_oss_config
+      - sys_app
   datasource:
     # 子模块默认数据源(未标注 @DS 时生效;标注 @DS 则以注解为准)
     module-default-enabled: true

+ 1 - 14
java/storlead-message/storlead-message-api/src/main/java/com/storlead/message/controller/MessageApiController.java

@@ -47,20 +47,7 @@ public class MessageApiController {
             @ApiResponse(code = 200, message = "", response = MessageDetailVO.class)
     })
     public Result<?> getMessage(MessageDTO dto) {
-        Page<InsideMessageSendLogEntity> page = new Page<>(dto.getPageIndex(),dto.getPageSize());
-        QueryWrapper<InsideMessageSendLogEntity> queryWrapper = new QueryWrapper();
-        queryWrapper.eq("mlog.receiver_user_id", LoginUserUtil.getCurrentUserId());
-        if (Objects.nonNull(dto.getMessageType())) {
-            queryWrapper.eq("mr.message_type",dto.getMessageType());
-        }
-        if (Objects.nonNull(dto.getIsRead())) {
-            queryWrapper.eq("mlog.is_read",dto.getIsRead());
-            queryWrapper.eq("mlog.is_read",dto.getIsRead());
-        }
-        queryWrapper.eq("mlog.is_delete",Integer.valueOf(0));
-        queryWrapper.orderByAsc("mlog.is_read");
-        queryWrapper.orderByDesc("mlog.id");
-        IPage<MessageDetailVO> pageList =  messageSendLogService.queryListMessageLog(page,queryWrapper);
+        IPage<MessageDetailVO> pageList =  messageSendLogService.queryListMessageLog(dto);
         return Result.ok(pageList);
     }
 

+ 3 - 0
java/storlead-message/storlead-message-biz/src/main/java/com/storlead/message/service/InsideMessageSendLogService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.storlead.framework.mybatis.service.MyBaseService;
+import com.storlead.message.pojo.dto.MessageDTO;
 import com.storlead.message.pojo.entity.InsideMessageSendLogEntity;
 import com.storlead.message.pojo.vo.MessageDetailVO;
 import com.storlead.message.pojo.vo.MessageNoReadTotalVO;
@@ -21,6 +22,8 @@ public interface InsideMessageSendLogService extends MyBaseService<InsideMessage
 
     IPage<MessageDetailVO> queryListMessageLog(Page<InsideMessageSendLogEntity> page, Wrapper<InsideMessageSendLogEntity> wrapper);
 
+    IPage<MessageDetailVO> queryListMessageLog(MessageDTO dto);
+
     MessageNoReadTotalVO countNoReadtotal(Wrapper<InsideMessageSendLogEntity> wrapper);
 
     List<MessageTypeReadStateVO> getCountNoReadCount(Wrapper<InsideMessageSendLogEntity> wrapper);

+ 3 - 2
java/storlead-message/storlead-message-biz/src/main/java/com/storlead/message/service/impl/InsideMessageRecordServiceImpl.java

@@ -19,6 +19,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import javax.annotation.Resource;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -43,10 +44,10 @@ public class InsideMessageRecordServiceImpl extends MyBaseServiceImpl<InsideMess
     @Value("${domainname}")
     private  String domainname;
 
-    @Autowired
+    @Resource
     private MessageTemplateEventGroupService templateService;
 
-    @Autowired
+    @Resource
     private InsideMessageSendLogService insideMessageSendLogService;
 
     @Override

+ 24 - 0
java/storlead-message/storlead-message-biz/src/main/java/com/storlead/message/service/impl/InsideMessageSendLogServiceImpl.java

@@ -1,9 +1,12 @@
 package com.storlead.message.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.storlead.framework.mybatis.service.impl.MyBaseServiceImpl;
+import com.storlead.framework.util.LoginUserUtil;
+import com.storlead.message.pojo.dto.MessageDTO;
 import com.storlead.message.pojo.entity.InsideMessageSendLogEntity;
 import com.storlead.message.pojo.vo.MessageDetailVO;
 import com.storlead.message.pojo.vo.MessageNoReadTotalVO;
@@ -13,6 +16,7 @@ import com.storlead.message.service.InsideMessageSendLogService;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.Objects;
 
 /**
  * <p>
@@ -30,6 +34,26 @@ public class InsideMessageSendLogServiceImpl extends MyBaseServiceImpl<InsideMes
         return this.baseMapper.pageListMessageLog(page,wrapper);
     }
 
+    @Override
+    public IPage<MessageDetailVO> queryListMessageLog(MessageDTO dto) {
+
+        Page<InsideMessageSendLogEntity> page = new Page<>(dto.getPageIndex(),dto.getPageSize());
+        QueryWrapper<InsideMessageSendLogEntity> queryWrapper = new QueryWrapper();
+        queryWrapper.eq("mlog.receiver_user_id", LoginUserUtil.getCurrentUserId());
+        if (Objects.nonNull(dto.getMessageType())) {
+            queryWrapper.eq("mr.message_type",dto.getMessageType());
+        }
+        if (Objects.nonNull(dto.getIsRead())) {
+            queryWrapper.eq("mlog.is_read",dto.getIsRead());
+            queryWrapper.eq("mlog.is_read",dto.getIsRead());
+        }
+        queryWrapper.eq("mlog.is_delete",Integer.valueOf(0));
+        queryWrapper.orderByAsc("mlog.is_read");
+        queryWrapper.orderByDesc("mlog.id");
+
+        return queryListMessageLog(page,queryWrapper);
+    }
+
     @Override
     public MessageNoReadTotalVO countNoReadtotal(Wrapper<InsideMessageSendLogEntity> wrapper) {
         return this.baseMapper.countNoReadNumber(wrapper);

+ 2 - 1
java/storlead-message/storlead-message-biz/src/main/resources/mapper/InsideMessageRecordMapper.xml

@@ -9,6 +9,7 @@
                     <result column="content" property="content" />
                     <result column="message_icon" property="messageIcon" />
                     <result column="message_tag" property="messageTag" />
+                    <result column="app_id" property="appId" />
                     <result column="callback_url" property="callbackUrl" />
                     <result column="wx_callback_url" property="wxCallbackUrl" />
                     <result column="send_user_id" property="sendUserId" />
@@ -28,7 +29,7 @@
 
         <!-- 通用查询结果列 -->
         <sql id="Base_Column_List">
-            id, title, content, message_icon, message_tag, callback_url, wx_callback_url, send_user_id, status, message_type, message_sub_type, timer_send_time, actually_send_time, create_by, create_time, update_by, update_time, enabled, is_delete, sort
+            id, title, content, message_icon,app_id, message_tag, callback_url, wx_callback_url, send_user_id, status, message_type, message_sub_type, timer_send_time, actually_send_time, create_by, create_time, update_by, update_time, enabled, is_delete, sort
         </sql>
 
     <select id="selectOldById" resultType="map">

+ 3 - 0
java/storlead-message/storlead-message-core/src/main/java/com/storlead/message/pojo/dto/MessageDTO.java

@@ -24,4 +24,7 @@ public class MessageDTO extends PageDTO {
 
     @ApiModelProperty(value = "0:未读,1:已读")
     private Integer isRead;
+
+    @ApiModelProperty(value = "应用Id")
+    private Long appId;
 }

+ 3 - 0
java/storlead-message/storlead-message-core/src/main/java/com/storlead/message/pojo/entity/InsideMessageRecordEntity.java

@@ -40,6 +40,9 @@ public class InsideMessageRecordEntity extends SysBaseField {
     @ApiModelProperty(value = "消息标题")
     private String title;
 
+    @ApiModelProperty(value = "所属服务: 0:主应用,10:智能贸易,20:销售,30:otr,40:工资,50:项目,60:领存平台")
+    private Long appId;
+
     @ApiModelProperty(value = "内容")
     private String content;
 

+ 7 - 0
java/storlead-message/storlead-message-core/src/main/java/com/storlead/message/pojo/vo/MessageTypeReadStateVO.java

@@ -1,5 +1,6 @@
 package com.storlead.message.pojo.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -11,6 +12,12 @@ import lombok.Data;
 @Data
 public class MessageTypeReadStateVO {
 
+    @ApiModelProperty(value = "appId")
+    private Integer appId;
+
+    @ApiModelProperty(value = "应用名称")
+    private String appName;
+
     private Integer messageType;
 
     private String messageTypeName;

+ 0 - 0
java/storlead-api/src/main/java/com/storlead/system/controller/CompanyApiController.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/CompanyApiController.java


+ 0 - 0
java/storlead-api/src/main/java/com/storlead/system/controller/CompanyCustomSettingsController.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/CompanyCustomSettingsController.java


+ 0 - 0
java/storlead-api/src/main/java/com/storlead/system/controller/CorpWeChatController.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/CorpWeChatController.java


+ 0 - 0
java/storlead-api/src/main/java/com/storlead/system/controller/DeptApiController.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/DeptApiController.java


+ 0 - 0
java/storlead-api/src/main/java/com/storlead/system/controller/DeptController.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/DeptController.java


+ 0 - 0
java/storlead-api/src/main/java/com/storlead/system/controller/DeptRoleController.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/DeptRoleController.java


+ 9 - 9
java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/FileResourceController.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/FileResourceController.java

@@ -1,4 +1,4 @@
-package com.storlead.system;
+package com.storlead.system.controller;
 
 
 import com.alibaba.fastjson.JSONObject;
@@ -134,14 +134,14 @@ public class FileResourceController {
             fileResourceEntity.setFileSize(Integer.valueOf((int) (file.getSize() / FileUtil.KB)));
             JSONObject jsonObject = new JSONObject();
             if (Integer.valueOf(0).equals(fileProperties.getMode())) {
-//                StorePath storePath = fastFileStorageClient.uploadFile(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null);
-//                if(Objects.isNull(storePath)){
-//                    return  Result.error("上传错误");
-//                }
-//                fileResourceEntity.setFilePath(fileProperties.getFilePath()+File.separator+storePath.getFullPath());
-//                fileResourceService.save(fileResourceEntity);
-//                String url = fileProperties.getFilePath()+"/"+storePath.getFullPath();
-//                jsonObject.put("url", url);
+                //  StorePath storePath = fastFileStorageClient.uploadFile(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null);
+                //  if(Objects.isNull(storePath)){
+                //      return  Result.error("上传错误");
+                //  }
+                //  fileResourceEntity.setFilePath(fileProperties.getFilePath()+File.separator+storePath.getFullPath());
+                //  fileResourceService.save(fileResourceEntity);
+                //  String url = fileProperties.getFilePath()+"/"+storePath.getFullPath();
+                //  jsonObject.put("url", url);
             } else  {
                 String url = ossFileService.upload(file);
                 jsonObject.put("url", url);

+ 0 - 0
java/storlead-api/src/main/java/com/storlead/system/controller/JobApiController.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/JobApiController.java


+ 0 - 0
java/storlead-api/src/main/java/com/storlead/system/controller/JobController.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/JobController.java


+ 63 - 105
java/storlead-api/src/main/java/com/storlead/system/controller/MenuApiController.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/MenuApiController.java

@@ -65,17 +65,12 @@ public class MenuApiController {
 
     @ApiOperation("查询菜单Tree")
     @PostMapping("listTree")
-    public Result listTree(@RequestBody MenuParamDTO dto) {
+    public Result listTree(@RequestBody(required = false) MenuParamDTO dto) {
         try {
             LambdaQueryWrapper<MenuEntity> queryWrapper = new LambdaQueryWrapper();
             queryWrapper.eq(MenuEntity::getIsDelete,0);
             queryWrapper.eq(MenuEntity::getEnabled,1);
-            if (Objects.isNull(dto)) {
-                queryWrapper.eq(MenuEntity::getServiceModeType,0);
-            } else {
-                queryWrapper.eq(MenuEntity::getServiceModeType,dto.getServiceModeType());
-                applyAppIdFilter(queryWrapper, dto.getAppId());
-            }
+            applyMenuScopeFilter(queryWrapper, dto);
             queryWrapper.orderByAsc(MenuEntity::getSort);
             List<MenuEntity> menus = menuService.list(queryWrapper);
             if(CollectionUtils.isEmpty(menus)) {
@@ -92,18 +87,13 @@ public class MenuApiController {
 
     @ApiOperation("查询菜单所有菜单")
     @PostMapping("listAllTree")
-    public Result listAllTree(@RequestBody MenuParamDTO dto) {
+    public Result listAllTree(@RequestBody(required = false) MenuParamDTO dto) {
         try {
             LambdaQueryWrapper<MenuEntity> queryWrapper = new LambdaQueryWrapper();
             queryWrapper.eq(MenuEntity::getIsDelete,0);
             queryWrapper.eq(MenuEntity::getEnabled,1);
             queryWrapper.orderByAsc(MenuEntity::getSort);
-            if (Objects.isNull(dto)) {
-                queryWrapper.eq(MenuEntity::getServiceModeType,0);
-            } else {
-                queryWrapper.eq(MenuEntity::getServiceModeType,dto.getServiceModeType());
-                applyAppIdFilter(queryWrapper, dto.getAppId());
-            }
+            applyMenuScopeFilter(queryWrapper, dto);
             List<MenuEntity> menus = menuService.list(queryWrapper);
             List<RouterVo> routerVos = menuToRouter(menus);
             return Result.ok(routerVos);
@@ -146,95 +136,46 @@ public class MenuApiController {
     }
 
 
-    @ApiOperation("查询菜单Tree")
-    @PostMapping("listResTree")
+    /**
+     * 资源树(权限配置等):返回 {@link TreeVo},type=20 表示菜单节点。
+     * PC / H5 原各有一套接口,逻辑相同,已合并;旧路径 list_web_h5_res_tree 仍可用。
+     */
+    @ApiOperation("查询菜单资源树(PC/H5 共用)")
+    @PostMapping(value = {"listResTree", "list_web_h5_res_tree"})
     public Result listResTree(@RequestBody(required = false) MenuParamDTO dto) {
         try {
-            LambdaQueryWrapper<MenuEntity> queryWrapper = new LambdaQueryWrapper();
-            queryWrapper.eq(MenuEntity::getIsDelete,0);
-            queryWrapper.eq(MenuEntity::getEnabled,1);
-            queryWrapper.orderByAsc(MenuEntity::getSort);
-            if (Objects.isNull(dto)) {
-                queryWrapper.eq(MenuEntity::getServiceModeType,0);
-            } else {
-                queryWrapper.eq(MenuEntity::getServiceModeType, dto.getServiceModeType());
-                applyAppIdFilter(queryWrapper, dto.getAppId());
-            }
-
-            List<MenuEntity> menus = menuService.list(queryWrapper);
-            if(CollectionUtils.isEmpty(menus)) {
-                return Result.ok(Collections.EMPTY_LIST);
-            }
-            List<TreeVo> resls = new ArrayList<>();
-            Map<Long, List<TreeVo>> resMap = new HashMap<>();
-            List<TreeVo> menuResls = new ArrayList<>();
-            if(!CollectionUtils.isEmpty(menus)) {
-                for(MenuEntity res : menus) {
-                    TreeVo treeVo= new TreeVo();
-                    treeVo.setId(res.getId());
-                    treeVo.setMenuId(res.getId());
-                    treeVo.setParentId(res.getPid());
-                    treeVo.setTitle(res.getMenuName());
-                    treeVo.setType(20);
-                    treeVo.setArg(res);
-                    treeVo.setExpand(false);
-                    treeVo.setDisabled(false);
-                    treeVo.setDisableCheckbox(false);
-                    menuResls.add(treeVo);
-                }
-            }
-            List<TreeVo> res = createResTrees(Long.valueOf(0),menuResls);
-            return Result.ok(res);
-        }catch (Exception e) {
-            e.printStackTrace();
-            return Result.error("获取菜单信息错误:"+e.getMessage());
+            return Result.ok(buildResTree(dto));
+        } catch (Exception e) {
+            log.error("listResTree error", e);
+            return Result.error("获取菜单信息错误:" + e.getMessage());
         }
     }
 
-
-    @ApiOperation("查询菜单Tree(H5和移动端共用)")
-    @PostMapping("list_web_h5_res_tree")
-    public Result listWebH5ResTree(@RequestBody MenuParamDTO dto) {
-        try {
-            LambdaQueryWrapper<MenuEntity> queryWrapper = new LambdaQueryWrapper();
-            queryWrapper.eq(MenuEntity::getIsDelete,0);
-            queryWrapper.eq(MenuEntity::getEnabled,1);
-            queryWrapper.orderByAsc(MenuEntity::getSort);
-            if (Objects.isNull(dto)) {
-                queryWrapper.eq(MenuEntity::getServiceModeType,0);
-            } else {
-                queryWrapper.eq(MenuEntity::getServiceModeType,dto.getServiceModeType());
-                applyAppIdFilter(queryWrapper, dto.getAppId());
-            }
-            List<MenuEntity> menus = menuService.list(queryWrapper);
-            if(CollectionUtils.isEmpty(menus)) {
-                return Result.ok(Collections.EMPTY_LIST);
-            }
-            List<TreeVo> resls = new ArrayList<>();
-            Map<Long, List<TreeVo>> resMap = new HashMap<>();
-
-            List<TreeVo> menuResls = new ArrayList<>();
-            if(!CollectionUtils.isEmpty(menus)) {
-                for(MenuEntity res : menus) {
-                    TreeVo treeVo= new TreeVo();
-                    treeVo.setId(res.getId());
-                    treeVo.setMenuId(res.getId());
-                    treeVo.setParentId(res.getPid());
-                    treeVo.setTitle(res.getMenuName());
-                    treeVo.setType(20);
-                    treeVo.setArg(res);
-                    treeVo.setExpand(false);
-                    treeVo.setDisabled(false);
-                    treeVo.setDisableCheckbox(false);
-                    menuResls.add(treeVo);
-                }
-            }
-            List<TreeVo> res = createResTrees(Long.valueOf(0),menuResls);
-            return Result.ok(res);
-        }catch (Exception e) {
-            e.printStackTrace();
-            return Result.error("获取菜单信息错误:"+e.getMessage());
+    private List<TreeVo> buildResTree(MenuParamDTO dto) {
+        LambdaQueryWrapper<MenuEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(MenuEntity::getIsDelete, 0);
+        queryWrapper.eq(MenuEntity::getEnabled, 1);
+        queryWrapper.orderByAsc(MenuEntity::getSort);
+        applyMenuScopeFilter(queryWrapper, dto);
+        List<MenuEntity> menus = menuService.list(queryWrapper);
+        if (CollectionUtils.isEmpty(menus)) {
+            return Collections.emptyList();
+        }
+        List<TreeVo> menuResls = new ArrayList<>();
+        for (MenuEntity res : menus) {
+            TreeVo treeVo = new TreeVo();
+            treeVo.setId(res.getId());
+            treeVo.setMenuId(res.getId());
+            treeVo.setParentId(res.getPid());
+            treeVo.setTitle(res.getMenuName());
+            treeVo.setType(20);
+            treeVo.setArg(res);
+            treeVo.setExpand(false);
+            treeVo.setDisabled(false);
+            treeVo.setDisableCheckbox(false);
+            menuResls.add(treeVo);
         }
+        return createResTrees(0L, menuResls);
     }
 
 
@@ -243,11 +184,13 @@ public class MenuApiController {
     public Result pagelist(@RequestBody MenuParam dto) {
         try {
             IPage<MenuEntity> page = new Page<>(dto.getPageIndex(),dto.getPageSize());
-            LambdaQueryWrapper<MenuEntity> queryWrapper = new LambdaQueryWrapper();
-            if
-            (Objects.nonNull(dto)) {
-                queryWrapper.eq(MenuEntity::getServiceModeType,dto.getServiceModeType());
-                applyAppIdFilter(queryWrapper, dto.getAppId());
+            LambdaQueryWrapper<MenuEntity> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(MenuEntity::getIsDelete, 0);
+            if (Objects.nonNull(dto)) {
+                if (dto.getServiceModeType() != null) {
+                    queryWrapper.eq(MenuEntity::getServiceModeType, dto.getServiceModeType());
+                }
+                applyAppIdFilter(queryWrapper, parseAppId(dto.getAppId()));
             }
             IPage<MenuEntity> menus = menuService.page(page,queryWrapper);
             return Result.ok(menus);
@@ -516,15 +459,30 @@ public class MenuApiController {
     }
 
     /**
-     * 从 DTO 字符串解析应用维度;非空且合法时在查询上追加 app_id 条件(要求库表 menu.app_id 与数据一致)。
+     * 菜单列表通用范围:终端类型 + 应用 ID(appId 有值时按 menu.app_id 过滤)。
      */
-    private void applyAppIdFilter(LambdaQueryWrapper<MenuEntity> queryWrapper, String appIdRaw) {
-        Long appId = parseAppId(appIdRaw);
+    private void applyMenuScopeFilter(LambdaQueryWrapper<MenuEntity> queryWrapper, MenuParamDTO dto) {
+        if (dto == null || dto.getServiceModeType() == null) {
+            queryWrapper.eq(MenuEntity::getServiceModeType, 0);
+        } else {
+            queryWrapper.eq(MenuEntity::getServiceModeType, dto.getServiceModeType());
+        }
+        applyAppIdFilter(queryWrapper, dto != null ? dto.getAppId() : null);
+    }
+
+    /**
+     * 按应用过滤:appId 非空时追加 menu.app_id = appId。
+     */
+    private void applyAppIdFilter(LambdaQueryWrapper<MenuEntity> queryWrapper, Long appId) {
         if (appId != null) {
             queryWrapper.eq(MenuEntity::getAppId, appId);
         }
     }
 
+    private void applyAppIdFilter(LambdaQueryWrapper<MenuEntity> queryWrapper, String appIdRaw) {
+        applyAppIdFilter(queryWrapper, parseAppId(appIdRaw));
+    }
+
     private Long parseAppId(String appIdRaw) {
         if (StrUtil.isBlank(appIdRaw)) {
             return null;

+ 0 - 0
java/storlead-api/src/main/java/com/storlead/system/controller/PermissionResApiController.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/PermissionResApiController.java


+ 0 - 0
java/storlead-api/src/main/java/com/storlead/system/controller/QuickMenuApiController.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/QuickMenuApiController.java


+ 0 - 0
java/storlead-api/src/main/java/com/storlead/system/controller/RoleApiController.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/RoleApiController.java


+ 0 - 0
java/storlead-api/src/main/java/com/storlead/system/controller/SubCompanyApiController.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/SubCompanyApiController.java


+ 0 - 0
java/storlead-api/src/main/java/com/storlead/system/controller/SubCompanyController.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/SubCompanyController.java


+ 68 - 0
java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/SysAppApiController.java

@@ -0,0 +1,68 @@
+package com.storlead.system.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.storlead.framework.common.result.Result;
+import com.storlead.system.pojo.dto.SysAppPageDTO;
+import com.storlead.system.pojo.entity.SysAppEntity;
+import com.storlead.system.service.SysAppService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * 系统应用管理
+ */
+@Api(tags = "系统: 应用管理")
+@RestController
+@RequestMapping("/sys/app")
+public class SysAppApiController {
+
+    @Resource
+    private SysAppService sysAppService;
+
+    @ApiOperation("应用分页")
+    @PostMapping("/pagelist")
+    public Result<IPage<SysAppEntity>> pagelist(@RequestBody SysAppPageDTO dto) {
+        return Result.ok(sysAppService.pageQuery(dto));
+    }
+
+    @ApiOperation("已启用应用列表(下拉等)")
+    @PostMapping("/listEnabled")
+    public Result<?> listEnabled() {
+        return Result.ok(sysAppService.listEnabled());
+    }
+
+    @ApiOperation("详情")
+    @PostMapping("/detail")
+    public Result<?> detail(@RequestParam Long id) {
+        SysAppEntity one = sysAppService.getDetail(id);
+        if (one == null) {
+            return Result.error("应用不存在或已删除");
+        }
+        return Result.ok(one);
+    }
+
+    @ApiOperation("保存或更新")
+    @PostMapping("/save")
+    public Result<?> save(@RequestBody SysAppEntity body) {
+        return sysAppService.saveApp(body);
+    }
+
+    @ApiOperation("启用/禁用")
+    @PostMapping("/enable")
+    public Result<?> enable(@RequestParam Long id, @RequestParam Boolean enabled) {
+        return sysAppService.enableApp(id, enabled);
+    }
+
+    @ApiOperation("逻辑删除(无关联菜单时)")
+    @PostMapping("/delete")
+    public Result<?> delete(@RequestParam Long id) {
+        return sysAppService.deleteApp(id);
+    }
+}

+ 0 - 0
java/storlead-api/src/main/java/com/storlead/system/controller/SysDictApiController.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/SysDictApiController.java


+ 0 - 0
java/storlead-api/src/main/java/com/storlead/system/controller/SystemConfigItemController.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/SystemConfigItemController.java


+ 1 - 1
java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/ThumbnailPreviewController.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/controller/ThumbnailPreviewController.java

@@ -1,4 +1,4 @@
-package com.storlead.system;
+package com.storlead.system.controller;
 
 import com.storlead.system.properties.FileProperties;
 import io.swagger.annotations.Api;

+ 0 - 0
java/storlead-api/src/main/java/com/storlead/system/dto/CompanyDTO.java → java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/dto/CompanyDTO.java


+ 116 - 3
java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/service/impl/SysAppServiceImpl.java

@@ -1,17 +1,25 @@
 package com.storlead.system.service.impl;
 
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.storlead.framework.common.result.Result;
+import com.storlead.framework.util.LoginUserUtil;
 import com.storlead.system.mapper.MenuMapper;
 import com.storlead.system.mapper.SysAppMapper;
+import com.storlead.system.pojo.dto.SysAppPageDTO;
 import com.storlead.system.pojo.entity.MenuEntity;
 import com.storlead.system.pojo.entity.SysAppEntity;
 import com.storlead.system.service.SysAppService;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 系统应用服务实现
@@ -22,6 +30,24 @@ public class SysAppServiceImpl extends ServiceImpl<SysAppMapper, SysAppEntity> i
     @Resource
     private MenuMapper menuMapper;
 
+    @Override
+    public IPage<SysAppEntity> pageQuery(SysAppPageDTO dto) {
+        IPage<SysAppEntity> page = new Page<>(dto.getPageIndex(), dto.getPageSize());
+        LambdaQueryWrapper<SysAppEntity> w = new LambdaQueryWrapper<>();
+        w.eq(SysAppEntity::getIsDelete, 0);
+        if (dto.getAppCode() != null) {
+            w.eq(SysAppEntity::getAppCode, dto.getAppCode());
+        }
+        if (StrUtil.isNotBlank(dto.getAppName())) {
+            w.like(SysAppEntity::getAppName, dto.getAppName().trim());
+        }
+        if (dto.getEnabled() != null) {
+            w.eq(SysAppEntity::getEnabled, dto.getEnabled());
+        }
+        w.orderByAsc(SysAppEntity::getSort).orderByAsc(SysAppEntity::getId);
+        return page(page, w);
+    }
+
     @Override
     public List<SysAppEntity> listEnabled() {
         return list(new LambdaQueryWrapper<SysAppEntity>()
@@ -32,17 +58,104 @@ public class SysAppServiceImpl extends ServiceImpl<SysAppMapper, SysAppEntity> i
     }
 
     @Override
-    public boolean trySoftDelete(Long id) {
+    public SysAppEntity getDetail(Long id) {
         if (id == null) {
-            return false;
+            return null;
+        }
+        return getOne(new LambdaQueryWrapper<SysAppEntity>()
+                .eq(SysAppEntity::getId, id)
+                .eq(SysAppEntity::getIsDelete, 0));
+    }
+
+    @Override
+    public Result<?> saveApp(SysAppEntity body) {
+        if (body == null || body.getAppCode() == null || StrUtil.isBlank(body.getAppName())) {
+            return Result.error("appCode、appName 不能为空");
+        }
+        body.setAppName(body.getAppName().trim());
+        if (StrUtil.isNotBlank(body.getAppTitle())) {
+            body.setAppTitle(body.getAppTitle().trim());
+        }
+        if (StrUtil.isNotBlank(body.getDomainName())) {
+            body.setDomainName(body.getDomainName().trim());
+        }
+
+        Long userId = LoginUserUtil.getCurrentUserId();
+        Date now = new Date();
+        if (body.getId() == null) {
+            if (body.getEnabled() == null) {
+                body.setEnabled(1);
+            }
+            if (body.getIsDelete() == null) {
+                body.setIsDelete(0);
+            }
+            if (body.getSort() == null) {
+                body.setSort(0);
+            }
+            if (body.getOwnerBy() == null) {
+                body.setOwnerBy(userId != null ? userId : 0L);
+            }
+            body.setCreateBy(userId);
+            body.setCreateTime(now);
+        }
+
+        LambdaQueryWrapper<SysAppEntity> dup = new LambdaQueryWrapper<SysAppEntity>()
+                .eq(SysAppEntity::getAppCode, body.getAppCode())
+                .eq(SysAppEntity::getIsDelete, 0);
+        if (body.getId() != null) {
+            dup.ne(SysAppEntity::getId, body.getId());
+        }
+        if (count(dup) > 0) {
+            return Result.error("应用编码已存在: " + body.getAppCode());
+        }
+
+        body.setUpdateBy(userId);
+        body.setUpdateTime(now);
+        saveOrUpdate(body);
+        return Result.ok(body.getId());
+    }
+
+    @Override
+    public Result<?> enableApp(Long id, Boolean enabled) {
+        if (id == null || enabled == null) {
+            return Result.error("参数错误");
+        }
+        LambdaUpdateWrapper<SysAppEntity> uw = new LambdaUpdateWrapper<>();
+        uw.set(SysAppEntity::getEnabled, Boolean.TRUE.equals(enabled) ? 1 : 0);
+        uw.set(SysAppEntity::getUpdateTime, new Date());
+        uw.set(SysAppEntity::getUpdateBy, LoginUserUtil.getCurrentUserId());
+        uw.eq(SysAppEntity::getId, id).eq(SysAppEntity::getIsDelete, 0);
+        if (!update(uw)) {
+            return Result.error("更新失败,应用不存在或已删除");
+        }
+        return Result.ok();
+    }
+
+    @Override
+    public Result<?> deleteApp(Long id) {
+        if (Objects.isNull(id)) {
+            return Result.error("id 不能为空");
+        }
+        if (!trySoftDelete(id)) {
+            return Result.error("删除失败:仍存在关联菜单,或记录不存在");
         }
+        return Result.ok();
+    }
+
+    /**
+     * 逻辑删除;存在关联菜单时返回 false。
+     */
+    private boolean trySoftDelete(Long id) {
         long menuCnt = menuMapper.selectCount(
                 new LambdaQueryWrapper<MenuEntity>().eq(MenuEntity::getAppId, id));
         if (menuCnt > 0) {
             return false;
         }
         LambdaUpdateWrapper<SysAppEntity> uw = new LambdaUpdateWrapper<>();
-        uw.set(SysAppEntity::getIsDelete, 1).eq(SysAppEntity::getId, id).eq(SysAppEntity::getIsDelete, 0);
+        uw.set(SysAppEntity::getIsDelete, 1);
+        uw.set(SysAppEntity::getUpdateTime, new Date());
+        uw.set(SysAppEntity::getUpdateBy, LoginUserUtil.getCurrentUserId());
+        uw.eq(SysAppEntity::getId, id).eq(SysAppEntity::getIsDelete, 0);
         return update(uw);
     }
 }

+ 6 - 8
java/storlead-system/storlead-system-core/src/main/java/com/storlead/system/pojo/dto/MenuParamDTO.java

@@ -4,16 +4,14 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
- * @program: sp-sales-platform
- * @description:
- * @author: chenkq
- * @create: 2025-05-26 14:34
+ * 菜单树/列表查询参数
  */
 @Data
 public class MenuParamDTO {
-    @ApiModelProperty(value = "所属服务类型: 0:PC,1:移动")
-    private String serviceModeType;
 
-    @ApiModelProperty(value = "所属服务: 0:主应用,10:智能贸易,20:销售,30:otr,40:工资,50:项目,60:领存平台")
-    private String appId;
+    @ApiModelProperty(value = "所属服务类型: 0=PC,1=移动")
+    private Integer serviceModeType;
+
+    @ApiModelProperty(value = "所属应用 ID,对应 sys_app.id / menu.app_id")
+    private Long appId;
 }

+ 2 - 2
java/storlead-system/storlead-system-core/src/main/java/com/storlead/system/pojo/dto/SysAppPageDTO.java

@@ -18,8 +18,8 @@ public class SysAppPageDTO extends Page {
 
     private static final long serialVersionUID = 1L;
 
-    @ApiModelProperty(value = "应用编码(模糊)")
-    private String appCode;
+    @ApiModelProperty(value = "应用编码(精确匹配)")
+    private Long appCode;
 
     @ApiModelProperty(value = "应用名称(模糊)")
     private String appName;

+ 12 - 6
java/storlead-system/storlead-system-core/src/main/java/com/storlead/system/pojo/entity/SysAppEntity.java

@@ -29,22 +29,25 @@ public class SysAppEntity implements Serializable {
     private Long id;
 
     @ApiModelProperty(value = "应用编码,全局唯一")
-    private String appCode;
+    private Long appCode;
 
     @ApiModelProperty(value = "应用名称")
     private String appName;
 
+    @ApiModelProperty(value = "前台标题")
+    private String appTitle;
+
     @ApiModelProperty(value = "图标")
     private String icon;
 
+    @ApiModelProperty(value = "域名/端口")
+    private String domainName;
+
     @ApiModelProperty(value = "默认首页路由/入口")
     private String homePath;
 
-    @ApiModelProperty(value = "备注")
-    private String remark;
-
-    @ApiModelProperty(value = "拥有者")
-    private Long ownerBy;
+    @ApiModelProperty(value = "创建者")
+    private Long createBy;
 
     @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -67,4 +70,7 @@ public class SysAppEntity implements Serializable {
 
     @ApiModelProperty(value = "排序")
     private Integer sort;
+
+    @ApiModelProperty(value = "拥有者")
+    private Long ownerBy;
 }

+ 25 - 3
java/storlead-system/storlead-system-spi/src/main/java/com/storlead/system/service/SysAppService.java

@@ -1,22 +1,44 @@
 package com.storlead.system.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.storlead.framework.common.result.Result;
+import com.storlead.system.pojo.dto.SysAppPageDTO;
 import com.storlead.system.pojo.entity.SysAppEntity;
 
 import java.util.List;
-
 /**
  * 系统应用服务
  */
 public interface SysAppService extends IService<SysAppEntity> {
 
+    /**
+     * 分页查询(未删除)
+     */
+    IPage<SysAppEntity> pageQuery(SysAppPageDTO dto);
+
     /**
      * 未删除且已启用的应用列表,按 sort 升序。
      */
     List<SysAppEntity> listEnabled();
 
     /**
-     * 逻辑删除;若仍存在 menu.app_id 指向该应用,则返回 false。
+     * 详情
+     */
+    SysAppEntity getDetail(Long id);
+
+    /**
+     * 新增或更新
+     */
+    Result<?> saveApp(SysAppEntity body);
+
+    /**
+     * 启用 / 禁用
+     */
+    Result<?> enableApp(Long id, Boolean enabled);
+
+    /**
+     * 逻辑删除;若仍存在 menu.app_id 指向该应用,则失败。
      */
-    boolean trySoftDelete(Long id);
+    Result<?> deleteApp(Long id);
 }