46 Commits f5171a03e3 ... e73755ff70

Autore SHA1 Messaggio Data
  zhaojinyu e73755ff70 修改上传文件实现类,上传文件默认使用原名称如果重复添加序列号 8 mesi fa
  gez ae0cd217c5 Merge branch 'system-zjy' of uskycloud/usky-cloud into master 8 mesi fa
  gez 04bd8fe3da Merge branch 'system-zjy' of uskycloud/usky-cloud into master 9 mesi fa
  hanzhengyi e3f88af378 Merge branch 'fu-dev' of uskycloud/usky-cloud into master 9 mesi fa
  fuyuchuan e76ef05525 消息中心新增发布人数据返回;个人消息删除接口 9 mesi fa
  fuyuchuan ed789791e3 修复工作报告消息中心发送异常问题 9 mesi fa
  fuyuchuan 2fccc22339 修复租户切换导致报错 9 mesi fa
  gez 86256b2ae0 Merge branch 'fu-dev' of uskycloud/usky-cloud into master 9 mesi fa
  fuyuchuan 7f8bf9ae7f 通知公告表新增tenant_id字段,通知列表增加是否为接收部门成员筛选;用户角色表新增tenant_id字段;统一用户多个角色菜单显示异常问题修复 9 mesi fa
  gez a3de469dc2 Merge branch 'system-zjy' of uskycloud/usky-cloud into master 9 mesi fa
  gez 7255b39dc3 Merge branch 'system-zjy' of uskycloud/usky-cloud into master 9 mesi fa
  gez 5ab687398c Merge branch 'fu-dev' of uskycloud/usky-cloud into master 9 mesi fa
  fuyuchuan 9ea96c9a1f 通知公告列表添加租户筛选条件 9 mesi fa
  fuyuchuan 49415e6428 同一用户多个角色数据权限异常问题修复;改造通知公告代码,调用新消息中心代码 9 mesi fa
  fuyuchuan e1bcaf7c44 同一用户多个角色数据权限异常问题修复;改造通知公告代码,调用新消息中心代码 9 mesi fa
  fuyuchuan 7361cd2c61 消息中心代码改造 9 mesi fa
  fuyuchuan fda47bfe01 消息中心代码改造 9 mesi fa
  fuyuchuan 804eb784f6 通知公告问题修复 10 mesi fa
  gez 287e1fb0d9 Merge branch 'fu-dev' of uskycloud/usky-cloud into master 10 mesi fa
  fuyuchuan f61654a20e 通知公告优化改造 10 mesi fa
  fuyuchuan 304b40c097 通知公告优化改造 10 mesi fa
  fuyuchuan bc46a8b37e 通知公告优化改造 10 mesi fa
  fuyuchuan 7c61ef37f9 人员列表接口添加真实姓名查询参数 10 mesi fa
  gez 53a35123f1 Merge branch 'fu-dev' of uskycloud/usky-cloud into master 10 mesi fa
  fuyuchuan e66de0c0d5 定时任务列表接口添加倒序条件;移动端用户注册手机号、用户名、邮箱修改为全平台唯一校验 10 mesi fa
  fuyuchuan 6cedf40f12 修复消息列表仅本人数据入库有部门id 10 mesi fa
  fuyuchuan cb9b0aeebf 修复新注册用户数据库缺少租户id;新增用户岗位关联数据 10 mesi fa
  gez 1ed2f18425 Merge branch 'fu-dev' of uskycloud/usky-cloud into master 10 mesi fa
  fuyuchuan 9de77f4e7b Merge branch 'system-165' into fu-dev 10 mesi fa
  fuyuchuan 2faed7dc63 消息中心推送消息不成功bug修复” 10 mesi fa
  gez 96a5815e0e Merge branch 'fu-dev' of uskycloud/usky-cloud into master 10 mesi fa
  fuyuchuan 04c48ecf87 新增部门数据查询接口,无数据权限;修改默认消息配置代码“ 10 mesi fa
  fuyuchuan b2deccaf6b Merge branch 'master' of http://47.111.81.118:3000/uskycloud/usky-cloud into fu-dev 10 mesi fa
  james 05cfbbce1d Merge branch 'system-zyj' into system-165 11 mesi fa
  james 65357cfec8 Merge branch 'system-zyj' into system-165 11 mesi fa
  james addd134c65 Merge branch 'system-zyj' into system-165 11 mesi fa
  james 3cf0e072a0 Merge branch 'system-zyj' into system-165 11 mesi fa
  james 71a16b3213 Merge branch 'system-zyj' into system-165 11 mesi fa
  fuyuchuan 9b99b424e9 Merge branch 'master' into fu-dev 1 anno fa
  fuyuchuan a34f7c8f12 Merge branch 'master' into fu-dev 1 anno fa
  james dda36c7ed1 Merge branch 'system-zyj' into system-165 1 anno fa
  hanzhengyi cd8e558c47 Merge branch 'han' of uskycloud/usky-cloud into system-165 1 anno fa
  fuyuchuan 61a646e2cc Merge branch 'master' into fu-dev 1 anno fa
  fuyuchuan b33d94f36d Merge branch 'master' of http://47.111.81.118:3000/uskycloud/usky-cloud into fu-dev 1 anno fa
  fuyuchuan 5c615473e8 Merge branch 'master' of http://47.111.81.118:3000/uskycloud/usky-cloud into fu-dev 1 anno fa
  fuyuchuan aa8c2710da 下拉树返回类型泛型添加 1 anno fa
33 ha cambiato i file con 1210 aggiunte e 607 eliminazioni
  1. 1 1
      base-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/aspect/DataScopeAspect.java
  2. 16 3
      base-modules/service-file/src/main/java/com/ruoyi/file/service/impl/FilesServiceImpl.java
  3. 1 0
      base-modules/service-job/src/main/resources/mapper/job/SysJobMapper.xml
  4. 17 4
      base-modules/service-system/service-system-api/src/main/java/com/usky/system/RemoteMceService.java
  5. 62 0
      base-modules/service-system/service-system-api/src/main/java/com/usky/system/domain/MceRequestVO.java
  6. 12 10
      base-modules/service-system/service-system-api/src/main/java/com/usky/system/factory/RemoteMceFallbackFactory.java
  7. 2 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/RuoYiSystemApplication.java
  8. 8 1
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/api/SysMceControllerApi.java
  9. 28 18
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/MceReceiveController.java
  10. 9 2
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysDeptController.java
  11. 15 5
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysUserController.java
  12. 3 3
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/TokenController.java
  13. 153 32
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysNotice.java
  14. 22 15
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysUserRole.java
  15. 2 1
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/SysRoleMapper.java
  16. 4 4
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/SysUserRoleMapper.java
  17. 3 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/ISysDeptService.java
  18. 1 1
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/ISysRoleService.java
  19. 3 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/MceContentService.java
  20. 5 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/MceReceiveService.java
  21. 40 9
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceContentServiceImpl.java
  22. 34 33
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceMbuserServiceImpl.java
  23. 359 75
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceReceiveServiceImpl.java
  24. 7 4
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysDeptServiceImpl.java
  25. 137 230
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysMenuServiceImpl.java
  26. 70 31
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysNoticeServiceImpl.java
  27. 7 4
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysRoleServiceImpl.java
  28. 8 5
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysUserServiceImpl.java
  29. 25 11
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysUserTenantServiceImpl.java
  30. 94 59
      base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysNoticeMapper.xml
  31. 7 7
      base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysRoleMapper.xml
  32. 3 0
      base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysUserMapper.xml
  33. 52 39
      base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysUserRoleMapper.xml

+ 1 - 1
base-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/aspect/DataScopeAspect.java

@@ -101,7 +101,7 @@ public class DataScopeAspect
             else if (DATA_SCOPE_CUSTOM.equals(dataScope))
             {
                 sqlString.append(StringUtils.format(" OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, role.getRoleId()));
-                sqlLambda.append(StringUtils.format(" OR dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, role.getRoleId()));
+                sqlLambda.append(StringUtils.format(" OR dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", role.getRoleId()));
             }
             else if (DATA_SCOPE_DEPT.equals(dataScope))
             {

+ 16 - 3
base-modules/service-file/src/main/java/com/ruoyi/file/service/impl/FilesServiceImpl.java

@@ -45,7 +45,7 @@ public class FilesServiceImpl extends ServiceImpl<FilesMapper, FilesUpload> impl
 
         // 获取当前日期时间
         LocalDateTime now = LocalDateTime.now();
-        String timestamp = now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
+//        String timestamp = now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
 
         //文件类型
         String type = originalFilename.substring(originalFilename.lastIndexOf(".") + 1).toLowerCase();
@@ -55,13 +55,26 @@ public class FilesServiceImpl extends ServiceImpl<FilesMapper, FilesUpload> impl
         // 获取每月递增值
         int monthIncrement = getMonthIncrement(yearMonth);
         // 新文件名格式:时间戳+每月递增值+文件类型
-        String fileUuid = timestamp + "A" + String.format("%04d", monthIncrement) + "." + type;
+//        String fileUuid = timestamp + "A" + String.format("%04d", monthIncrement) + "." + type;
 
         // 将相对路径转化为绝对路径
         String destPath = filesUploadPath + "/" + yearMonth;
 
         // 新的文件地址,绝对路径+新的文件名称
-        File uploadFile = new File(destPath + "/" + fileUuid);
+//        File uploadFile = new File(destPath + "/" + fileUuid);
+        File uploadFile;
+        String fileUuid = originalFilename; // 初始使用原文件名
+        int count = 1; // 用于生成重复文件名的序号
+        while (true) {
+            uploadFile = new File(destPath + "/" + fileUuid);
+            if (!uploadFile.exists()) { // 如果文件不存在,直接使用该文件名
+                break;
+            } else { // 如果文件已存在,修改文件名
+                String nameWithoutType = originalFilename.substring(0, originalFilename.lastIndexOf("."));
+                fileUuid = nameWithoutType + "(" + count + ")." + type;
+                count++;
+            }
+        }
 
         // 判断配置的文件目录是否存在,若不存在则创建一个新的文件目录
         File parentFile = uploadFile.getParentFile();

+ 1 - 0
base-modules/service-job/src/main/resources/mapper/job/SysJobMapper.xml

@@ -41,6 +41,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 				AND invoke_target like concat('%', #{invokeTarget}, '%')
 			</if>
 		</where>
+		ORDER BY job_id DESC
 	</select>
 	
 	<select id="selectJobAll" resultMap="SysJobResult">

+ 17 - 4
base-modules/service-system/service-system-api/src/main/java/com/usky/system/RemoteMceService.java

@@ -2,6 +2,8 @@ package com.usky.system;
 
 
 import com.usky.common.core.bean.ApiResult;
+
+import com.usky.system.domain.MceRequestVO;
 import com.usky.system.factory.RemoteMceFallbackFactory;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.MediaType;
@@ -11,19 +13,30 @@ import org.springframework.web.bind.annotation.RequestBody;
 
 /**
  * 消息服务
- * 
+ *
  * @author ruoyi
  */
 @FeignClient(contextId = "remoteMceService", value = "usky-system", fallbackFactory = RemoteMceFallbackFactory.class)
-public interface RemoteMceService
-{
+public interface RemoteMceService {
     /**
      * 新增消息推送
      *
      * @param mceInfo 消息信息
      * @return 结果
      */
-    @PostMapping(value = "/addMce",produces= MediaType.APPLICATION_JSON_UTF8_VALUE,consumes = "application/json;" +
+    @PostMapping(value = "/addMce", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = "application/json;" +
             "charset=UTF-8")
     public ApiResult<Void> addMce(@RequestBody String mceInfo);
+
+    /**
+     * @description: 消息推送-新
+     * @author: fyc
+     * @email yuchuan.fu@chinausky.com
+     * @date: 2025/3/14 14:58
+     * @param: [mceInfo]
+     * @return: com.usky.common.core.bean.ApiResult<java.lang.Void>
+     **/
+    @PostMapping(value = "/addMceReceive")
+    ApiResult<Void> addMceReceive(MceRequestVO mceInfo);
+
 }

+ 62 - 0
base-modules/service-system/service-system-api/src/main/java/com/usky/system/domain/MceRequestVO.java

@@ -0,0 +1,62 @@
+package com.usky.system.domain;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.usky.common.core.bean.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ *
+ * @author fyc
+ * @email yuchuan.fu@chinausky.com
+ * @date 2025/3/13
+ */
+@EqualsAndHashCode(callSuper = true)
+@Slf4j
+@Data
+public class MceRequestVO  extends BaseEntity {
+
+    /** 字典标签  */
+    private String infoTypeName;
+
+    /** 消息类型  */
+    @NotBlank(message = "消息类型 infoType 不能为空!")
+    private String infoType;
+
+    /** 消息标题  */
+    @NotBlank(message = "消息标题 infoTitle 不能为空!")
+    private String infoTitle;
+
+    /** 消息内容  */
+    @NotBlank(message = "消息内容 infoContent 不能为空!")
+    private String infoContent;
+
+    /** 消息发布人  */
+    @NotBlank(message = "消息发布人 userName 不能为空!")
+    private String userName;
+
+    /** 消息详情id  */
+    @NotNull(message = "消息详情 id 不能为空!")
+    private Integer id;
+
+    /** 消息接收人userId集合  */
+    @NotNull(message = "消息接收人 userIds 不能为空!")
+    private List<Long> userIds;
+
+    @Override
+    public String toString() {
+        ObjectMapper objectMapper = new ObjectMapper();
+        try {
+            return objectMapper.writeValueAsString(this);
+        } catch (JsonProcessingException e) {
+            log.error("MceRequestVO toString error: {}", e.getMessage());
+            return "{}";
+        }
+    }
+}

+ 12 - 10
base-modules/service-system/service-system-api/src/main/java/com/usky/system/factory/RemoteMceFallbackFactory.java

@@ -3,6 +3,7 @@ package com.usky.system.factory;
 
 import com.usky.common.core.bean.ApiResult;
 import com.usky.system.RemoteMceService;
+import com.usky.system.domain.MceRequestVO;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.cloud.openfeign.FallbackFactory;
@@ -10,24 +11,25 @@ import org.springframework.stereotype.Component;
 
 /**
  * 消息服务降级处理
- * 
+ *
  * @author ruoyi
  */
 @Component
-public class RemoteMceFallbackFactory implements FallbackFactory<RemoteMceService>
-{
+public class RemoteMceFallbackFactory implements FallbackFactory<RemoteMceService> {
     private static final Logger log = LoggerFactory.getLogger(RemoteMceFallbackFactory.class);
 
     @Override
-    public RemoteMceService create(Throwable throwable)
-    {
+    public RemoteMceService create(Throwable throwable) {
         log.error("用户服务调用失败:{}", throwable.getMessage());
-        return new RemoteMceService()
-        {
+        return new RemoteMceService() {
             @Override
-            public ApiResult<Void> addMce(String mceInfo)
-            {
-                return ApiResult.error("500","新增消息失败:" + throwable.getMessage());
+            public ApiResult<Void> addMce(String mceInfo) {
+                return ApiResult.error("500", "新增消息失败:" + throwable.getMessage());
+            }
+
+            @Override
+            public ApiResult<Void> addMceReceive(MceRequestVO mceInfo) {
+                return ApiResult.error("500", "新增消息失败:" + throwable.getMessage());
             }
         };
     }

+ 2 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/RuoYiSystemApplication.java

@@ -12,6 +12,7 @@ import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.EnableAspectJAutoProxy;
 import org.springframework.core.env.Environment;
+import org.springframework.scheduling.annotation.EnableAsync;
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
@@ -28,6 +29,7 @@ import java.net.UnknownHostException;
 @MapperScan(value = "com.usky.system.mapper")
 @ComponentScan(basePackages = {"com.usky"})
 @SpringBootApplication
+@EnableAsync
 public class RuoYiSystemApplication
 {
     private static final Logger LOGGER = LoggerFactory.getLogger(RuoYiSystemApplication.class);

+ 8 - 1
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/api/SysMceControllerApi.java

@@ -2,15 +2,16 @@ package com.usky.system.controller.api;
 
 import com.usky.common.core.bean.ApiResult;
 import com.usky.system.RemoteMceService;
+import com.usky.system.domain.MceRequestVO;
 import com.usky.system.service.MceReceiveService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 
 
 @RestController
 public class SysMceControllerApi implements RemoteMceService {
 
-
     @Autowired
     private MceReceiveService mceReceiveService;
 
@@ -19,4 +20,10 @@ public class SysMceControllerApi implements RemoteMceService {
         mceReceiveService.add(mceInfo);
         return ApiResult.success();
     }
+
+    @Override
+    public ApiResult<Void> addMceReceive(@RequestBody MceRequestVO mceRequestVO) {
+        mceReceiveService.addMceReceive(mceRequestVO);
+        return ApiResult.success();
+    }
 }

+ 28 - 18
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/MceReceiveController.java

@@ -8,6 +8,7 @@ import com.usky.common.log.enums.BusinessType;
 import com.usky.system.domain.MceReceive;
 import com.usky.system.service.MceReceiveService;
 import io.swagger.models.auth.In;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -45,11 +46,10 @@ public class MceReceiveController {
                                                  @RequestParam(value = "infoType", required = false) String infoType,
                                                  @RequestParam(value = "startTime", required = false) String startTime,
                                                  @RequestParam(value = "endTime", required = false) String endTime,
-                                                 @RequestParam(value = "id",required = false) Integer id,
+                                                 @RequestParam(value = "id", required = false) Integer id,
                                                  @RequestParam(value = "current", required = false, defaultValue = "1") Integer current,
-                                                 @RequestParam(value = "size", required = false, defaultValue = "10") Integer size)
-    {
-        return ApiResult.success(mceReceiveService.mceList(infoTitle, infoType,startTime, endTime, id,current, size));
+                                                 @RequestParam(value = "size", required = false, defaultValue = "10") Integer size) {
+        return ApiResult.success(mceReceiveService.mceList(infoTitle, infoType, startTime, endTime, id, current, size));
     }
 
     /**
@@ -68,9 +68,8 @@ public class MceReceiveController {
                                                        @RequestParam(value = "startTime", required = false) String startTime,
                                                        @RequestParam(value = "endTime", required = false) String endTime,
                                                        @RequestParam(value = "current", required = false, defaultValue = "1") Integer current,
-                                                       @RequestParam(value = "size", required = false, defaultValue = "10") Integer size)
-    {
-        return ApiResult.success(mceReceiveService.mceManageList(infoTitle, infoType,startTime, endTime, current, size));
+                                                       @RequestParam(value = "size", required = false, defaultValue = "10") Integer size) {
+        return ApiResult.success(mceReceiveService.mceManageList(infoTitle, infoType, startTime, endTime, current, size));
     }
 
     /**
@@ -83,9 +82,8 @@ public class MceReceiveController {
     @GetMapping("/mceManageById")
     public ApiResult<CommonPage<MceReceive>> mceManageById(@RequestParam(value = "id") Integer id,
                                                            @RequestParam(value = "current", required = false, defaultValue = "1") Integer current,
-                                                           @RequestParam(value = "size", required = false, defaultValue = "10") Integer size)
-    {
-        return ApiResult.success(mceReceiveService.mceManageById(id,current,size));
+                                                           @RequestParam(value = "size", required = false, defaultValue = "10") Integer size) {
+        return ApiResult.success(mceReceiveService.mceManageById(id, current, size));
     }
 
     /**
@@ -93,8 +91,7 @@ public class MceReceiveController {
      * @return
      */
     @GetMapping("/mceReceiveStatic")
-    public ApiResult<Map<String, Object>> mceReceiveStatic()
-    {
+    public ApiResult<Map<String, Object>> mceReceiveStatic() {
         return ApiResult.success(mceReceiveService.mceReceiveStatic());
     }
 
@@ -103,7 +100,7 @@ public class MceReceiveController {
      * @return
      */
     @PutMapping
-    ApiResult<Void> updateMceReceive(@RequestBody MceReceive mceReceive){
+    ApiResult<Void> updateMceReceive(@RequestBody MceReceive mceReceive) {
         mceReceiveService.updateMceReceive(mceReceive);
         return ApiResult.success();
     }
@@ -114,20 +111,33 @@ public class MceReceiveController {
      */
     @Log(title = "新增发布消息", businessType = BusinessType.INSERT)
     @PostMapping("/mceAdd")
-    ApiResult<Void> add(@RequestBody String mceReceive){
+    ApiResult<Void> add(@RequestBody String mceReceive) {
         mceReceiveService.add(mceReceive);
         return ApiResult.success();
     }
 
     /**
-     * 删除
+     * 删除消息及内容,并清空所有的消息接收表数据
      */
     @Log(title = "删除已发布消息", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{id}")
-    public ApiResult<Void> removeById(@PathVariable("id") Integer id)
-    {
+    @DeleteMapping("/remove/{contentId}")
+    public ApiResult<Void> removeById(@PathVariable("contentId") Integer id) {
         mceReceiveService.removeById(id);
         return ApiResult.success();
     }
+
+    /**
+     * 删除一条消息
+     **/
+    @Log(title = "删除消息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{id}")
+    public ApiResult<Void> deleteById(@PathVariable("id") Integer id) {
+        boolean f = mceReceiveService.deleteById(id);
+        if (f) {
+            return ApiResult.success();
+        } else {
+            return ApiResult.error("删除失败");
+        }
+    }
 }
 

+ 9 - 2
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysDeptController.java

@@ -12,6 +12,7 @@ import com.usky.system.domain.SysUser;
 import com.usky.system.domain.constants.UserConstants;
 import com.usky.system.service.ISysDeptService;
 import com.usky.system.service.ISysUserService;
+import com.usky.system.service.vo.TreeNode;
 import org.apache.commons.lang3.ArrayUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -46,6 +47,12 @@ public class SysDeptController extends BaseController {
         return ApiResult.success(depts);
     }
 
+    @GetMapping("/deptList")
+    public ApiResult deptList(SysDept dept) {
+        List<SysDept> depts = deptService.selectDept(dept);
+        return ApiResult.success(depts);
+    }
+
     /**
      * 查询部门列表(排除节点)
      */
@@ -84,7 +91,7 @@ public class SysDeptController extends BaseController {
      * 获取部门人员下拉树列表
      */
     @GetMapping("/deptUserTreeSelect")
-    public ApiResult treeselect(SysDept dept, SysUser user) {
+    public ApiResult <List<TreeNode>> treeselect(SysDept dept, SysUser user) {
         List<SysDept> depts = deptService.deptList(dept);
         List<SysUser> users = iSysUserService.selectDUserList(user);
         return ApiResult.success(deptService.buildDeptUserTreeSelect(depts, users));
@@ -94,7 +101,7 @@ public class SysDeptController extends BaseController {
      * 部门人员下拉树-工时统计
      */
     @GetMapping("/jurisdictionDeptUserTree")
-    public ApiResult jurisdictionDeptUserTree(SysDept dept, SysUser user) {
+    public ApiResult <List<TreeNode>> jurisdictionDeptUserTree(SysDept dept, SysUser user) {
         List<SysDept> depts = deptService.selectDeptList(dept);
         List<SysUser> users = iSysUserService.selectUserList(user);
         return ApiResult.success(deptService.buildDeptUserTreeSelect(depts, users));

+ 15 - 5
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysUserController.java

@@ -10,7 +10,9 @@ import com.usky.system.controller.web.page.TableDataInfo;
 import com.usky.system.domain.SysDept;
 import com.usky.system.domain.SysRole;
 import com.usky.system.domain.SysUser;
+import com.usky.system.domain.SysUserTenant;
 import com.usky.system.domain.constants.UserConstants;
+import com.usky.system.mapper.SysUserTenantMapper;
 import com.usky.system.service.ISysDeptService;
 import com.usky.system.service.ISysPostService;
 import com.usky.system.service.ISysRoleService;
@@ -29,7 +31,7 @@ import java.util.stream.Collectors;
 
 /**
  * 用户信息
- * 
+ *
  * @author yq
  */
 @RestController
@@ -48,6 +50,9 @@ public class SysUserController extends BaseController
     @Autowired
     private ISysDeptService deptService;
 
+    @Autowired
+    private SysUserTenantMapper sysUserTenantMapper;
+
     /**
      * 获取用户列表
      */
@@ -113,6 +118,7 @@ public class SysUserController extends BaseController
     @GetMapping(value = { "/", "/{userId}" })
     public ApiResult<Map<String,Object>> getInfo(@PathVariable(value = "userId", required = false) Long userId)
     {
+        Integer tenantId = SecurityUtils.getTenantId();
         Map<String,Object> ajax = new HashMap<>();
         List<SysRole> roles = roleService.selectRoleAll();
         ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
@@ -121,7 +127,7 @@ public class SysUserController extends BaseController
         {
             ajax.put("data", userService.selectUserById(userId));
             ajax.put("postIds", postService.selectPostListByUserId(userId));
-            ajax.put("roleIds", roleService.selectRoleListByUserId(userId));
+            ajax.put("roleIds", roleService.selectRoleListByUserId(userId, tenantId));
         }
         return ApiResult.success(ajax);
     }
@@ -160,20 +166,24 @@ public class SysUserController extends BaseController
     @PostMapping("/appAdd")
     public ApiResult<Void> appAdd(@Validated @RequestBody SysUser user)
     {
-        if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName(),user.getTenantId())))
+        if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName(),0)))
         {
             return ApiResult.error(BusinessErrorCode.BIZ_BUSINESS_ERROR.getCode(), "新增用户'" + user.getUserName() + "'失败,登录账号已存在");
         }
-        if(UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique1(user.getPhonenumber(),user.getTenantId()))){
+        if(UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique1(user.getPhonenumber(),0))){
             return ApiResult.error(BusinessErrorCode.BIZ_BUSINESS_ERROR.getCode(), "新增手机号'" + user.getPhonenumber() + "'失败,手机号已存在");
         }
+        if(UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique1(user.getEmail(),0))){
+            return ApiResult.error(BusinessErrorCode.BIZ_BUSINESS_ERROR.getCode(), "新增邮箱'" + user.getEmail() + "'失败,邮箱已存在");
+        }
         List<SysDept> list = deptService.deptListByTenant(user.getTenantId());
-        if (list.size() > 0){
+        if (!list.isEmpty()){
             user.setDeptId(list.get(0).getDeptId());
         }
         user.setUserType("00");
         user.setTenantId(user.getTenantId());
         user.setCreateBy(user.getUserName());
+        user.setTenantId(user.getTenantId());
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
         int row = userService.insertUser(user);
         return toAjax(row);

+ 3 - 3
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/TokenController.java

@@ -127,9 +127,9 @@ public class TokenController {
         if(CollectionUtils.isEmpty(list)){
             //新增消息设置记录
             MceSetting mceSetting = new MceSetting();
-            mceSetting.setAppMode("{\"1\":true,\"2\":true,\"3\":true,\"4\":true}");
-            mceSetting.setPcMode("{\"1\":true,\"2\":true,\"3\":true,\"4\":true}");
-            mceSetting.setWcMode("{\"1\":true,\"2\":true,\"3\":true,\"4\":true}");
+            mceSetting.setAppMode("{\"1\":true,\"2\":true,\"3\":true,\"4\":true,\"5\":true}");
+            mceSetting.setPcMode("{\"1\":true,\"2\":true,\"3\":true,\"4\":true,\"5\":true}");
+            mceSetting.setWcMode("{\"1\":true,\"2\":true,\"3\":true,\"4\":true,\"5\":true}");
 
             mceSetting.setCreateBy(userInfo.getUserName());
             mceSetting.setCreateTime(LocalDateTime.now());

+ 153 - 32
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysNotice.java

@@ -1,22 +1,27 @@
 package com.usky.system.domain;
 
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.usky.common.core.bean.BaseEntity;
 import io.swagger.models.auth.In;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
+import org.springframework.data.annotation.Transient;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.Size;
+import java.time.LocalDateTime;
 
 
 /**
  * 通知公告表 sys_notice
- * 
+ *
  * @author yq
  */
-public class SysNotice extends BaseEntity
-{
+public class SysNotice {
     private static final long serialVersionUID = 1L;
 
     /** 公告ID */
@@ -34,18 +39,52 @@ public class SysNotice extends BaseEntity
     /** 公告状态(0正常 1关闭) */
     private String status;
 
-    public Integer getNoticeId()
-    {
+    /** 附件地址 */
+    private String fileUrl;
+
+    /** 作者 */
+    private String author;
+
+    /** 通知接收部门id */
+    private String deptId;
+
+    // 新增临时字段,用于时间段查询
+    @TableField(exist = false)
+    @JsonIgnore
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime startTime;
+
+    @TableField(exist = false)
+    @JsonIgnore
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime endTime;
+
+    /** 创建者 */
+    private String createBy;
+
+    /** 创建时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    /** 更新者 */
+    private String updateBy;
+
+    /** 更新时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    /** 租户id */
+    private Integer tenantId;
+
+    public Integer getNoticeId() {
         return noticeId;
     }
 
-    public void setNoticeId(Integer noticeId)
-    {
+    public void setNoticeId(Integer noticeId) {
         this.noticeId = noticeId;
     }
 
-    public void setNoticeTitle(String noticeTitle)
-    {
+    public void setNoticeTitle(String noticeTitle) {
         this.noticeTitle = noticeTitle;
     }
 
@@ -56,49 +95,131 @@ public class SysNotice extends BaseEntity
         return noticeTitle;
     }
 
-    public void setNoticeType(String noticeType)
-    {
+    public void setNoticeType(String noticeType) {
         this.noticeType = noticeType;
     }
 
-    public String getNoticeType()
-    {
+    public String getNoticeType() {
         return noticeType;
     }
 
-    public void setNoticeContent(String noticeContent)
-    {
+    public void setNoticeContent(String noticeContent) {
         this.noticeContent = noticeContent;
     }
 
-    public String getNoticeContent()
-    {
+    @NotBlank(message = "公告内容不能为空")
+    public String getNoticeContent() {
         return noticeContent;
     }
 
-    public void setStatus(String status)
-    {
+    public void setStatus(String status) {
         this.status = status;
     }
 
-    public String getStatus()
-    {
+    public String getStatus() {
         return status;
     }
 
+    public String getFileUrl() {
+        return fileUrl;
+    }
+
+    public void setFileUrl(String fileUrl) {
+        this.fileUrl = fileUrl;
+    }
+
+    public String getAuthor() {
+        return author;
+    }
+
+    public void setAuthor(String author) {
+        this.author = author;
+    }
+
+    public LocalDateTime getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(LocalDateTime startTime) {
+        this.startTime = startTime;
+    }
+
+    public LocalDateTime getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(LocalDateTime endTime) {
+        this.endTime = endTime;
+    }
+
+    @NotBlank(message = "通知接收部门id不能为空")
+    public String getDeptId() {
+        return deptId;
+    }
+
+    public void setDeptId(String deptId) {
+        this.deptId = deptId;
+    }
+
+    public String getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(String createBy) {
+        this.createBy = createBy;
+    }
+
+    public LocalDateTime getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(LocalDateTime createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getUpdateBy() {
+        return updateBy;
+    }
+
+    public void setUpdateBy(String updateBy) {
+        this.updateBy = updateBy;
+    }
+
+    public LocalDateTime getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(LocalDateTime updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-            .append("noticeId", getNoticeId())
-            .append("noticeTitle", getNoticeTitle())
-            .append("noticeType", getNoticeType())
-            .append("noticeContent", getNoticeContent())
-            .append("status", getStatus())
-            .append("createBy", getCreateBy())
-            .append("createTime", getCreateTime())
-            .append("updateBy", getUpdateBy())
-            .append("updateTime", getUpdateTime())
-            .append("remark", getRemark())
-            .toString();
+                .append("noticeId", getNoticeId())
+                .append("noticeTitle", getNoticeTitle())
+                .append("noticeType", getNoticeType())
+                .append("noticeContent", getNoticeContent())
+                .append("status", getStatus())
+                .append("createBy", getCreateBy())
+                .append("createTime", getCreateTime())
+                .append("updateBy", getUpdateBy())
+                .append("updateTime", getUpdateTime())
+                .append("fileUrl", getFileUrl())
+                .append("author", getAuthor())
+                .append("deptId", getDeptId())
+                .append("createTime", getCreateTime())
+                .append("createBy", getCreateBy())
+                .append("updateBy", getUpdateBy())
+                .append("updateTime", getUpdateTime())
+                .toString();
     }
 }

+ 22 - 15
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysUserRole.java

@@ -5,42 +5,49 @@ import org.apache.commons.lang3.builder.ToStringStyle;
 
 /**
  * 用户和角色关联 sys_user_role
- * 
+ *
  * @author yq
  */
-public class SysUserRole
-{
+public class SysUserRole {
     /** 用户ID */
     private Long userId;
-    
+
     /** 角色ID */
     private Long roleId;
 
-    public Long getUserId()
-    {
+    /** 租户ID */
+    private Integer tenantId;
+
+    public Long getUserId() {
         return userId;
     }
 
-    public void setUserId(Long userId)
-    {
+    public void setUserId(Long userId) {
         this.userId = userId;
     }
 
-    public Long getRoleId()
-    {
+    public Long getRoleId() {
         return roleId;
     }
 
-    public void setRoleId(Long roleId)
-    {
+    public void setRoleId(Long roleId) {
         this.roleId = roleId;
     }
 
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-            .append("userId", getUserId())
-            .append("roleId", getRoleId())
-            .toString();
+                .append("userId", getUserId())
+                .append("roleId", getRoleId())
+                .append("tenantId", getTenantId())
+                .toString();
     }
 }

+ 2 - 1
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/SysRoleMapper.java

@@ -45,7 +45,8 @@ public interface SysRoleMapper extends CrudMapper<SysRole>
      * @param userId 用户ID
      * @return 选中角色ID列表
      */
-    public List<Integer> selectRoleListByUserId(@Param("userId") Long userId);
+    public List<Integer> selectRoleListByUserId(@Param("userId") Long userId,
+                                                @Param("tenantId") Integer tenantId);
 
     /**
      * 通过角色ID查询角色

+ 4 - 4
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/SysUserRoleMapper.java

@@ -22,7 +22,7 @@ public interface SysUserRoleMapper extends CrudMapper<SysUserRole>
      * @param userId 用户ID
      * @return 结果
      */
-    public int deleteUserRoleByUserId(@Param("userId") Long userId);
+    public int deleteUserRoleByUserId(@Param("userId") Long userId, @Param("tenantId") Integer tenantId);
 
     /**
      * 批量删除用户和角色关联
@@ -30,7 +30,7 @@ public interface SysUserRoleMapper extends CrudMapper<SysUserRole>
      * @param ids 需要删除的数据ID
      * @return 结果
      */
-    public int deleteUserRole(@Param("ids") Long[] ids);
+    public int deleteUserRole(@Param("ids") Long[] ids, @Param("tenantId") Integer tenantId);
 
     /**
      * 通过角色ID查询角色使用数量
@@ -38,7 +38,7 @@ public interface SysUserRoleMapper extends CrudMapper<SysUserRole>
      * @param roleId 角色ID
      * @return 结果
      */
-    public int countUserRoleByRoleId(@Param("roleId") Long roleId);
+    public int countUserRoleByRoleId(@Param("roleId") Long roleId, @Param("tenantId") Integer tenantId);
 
     /**
      * 批量新增用户角色信息
@@ -63,5 +63,5 @@ public interface SysUserRoleMapper extends CrudMapper<SysUserRole>
      * @param userIds 需要删除的用户数据ID
      * @return 结果
      */
-    public int deleteUserRoleInfos(@Param("roleId") Long roleId, @Param("userIds") Long[] userIds);
+    public int deleteUserRoleInfos(@Param("roleId") Long roleId, @Param("userIds") Long[] userIds, @Param("tenantId") Integer tenantId);
 }

+ 3 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/ISysDeptService.java

@@ -24,6 +24,9 @@ public interface ISysDeptService extends IService<SysDept>
      */
     public List<SysDept> selectDeptList(SysDept dept);
 
+    // 查询租户下部门信,无数据权限
+    List<SysDept> selectDept(SysDept dept);
+
     public List<SysDept> deptList(SysDept dept);
 
     public List<SysDept> deptListByTenant(Integer tenantId);

+ 1 - 1
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/ISysRoleService.java

@@ -52,7 +52,7 @@ public interface ISysRoleService extends CrudService<SysRole>
      * @param userId 用户ID
      * @return 选中角色ID列表
      */
-    public List<Integer> selectRoleListByUserId(Long userId);
+    public List<Integer> selectRoleListByUserId(Long userId, Integer tenantId);
 
     /**
      * 通过角色ID查询角色

+ 3 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/MceContentService.java

@@ -3,6 +3,7 @@ package com.usky.system.service;
 import com.alibaba.fastjson.JSONObject;
 import com.usky.system.domain.MceContent;
 import com.usky.common.mybatis.core.CrudService;
+import com.usky.system.domain.MceRequestVO;
 
 /**
  * <p>
@@ -13,6 +14,8 @@ import com.usky.common.mybatis.core.CrudService;
  * @since 2024-05-09
  */
 public interface MceContentService extends CrudService<MceContent> {
+
     void sendApp(JSONObject mceReceiveVO, String cids, Integer mceReceiveId, Integer sendType);
 
+    void sendAppNew(MceRequestVO mceRequestVO, String cids, Integer mceReceiveId, Integer sendType);
 }

+ 5 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/MceReceiveService.java

@@ -3,6 +3,7 @@ package com.usky.system.service;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.system.domain.MceReceive;
 import com.usky.common.mybatis.core.CrudService;
+import com.usky.system.domain.MceRequestVO;
 
 import java.util.Map;
 
@@ -26,8 +27,12 @@ public interface MceReceiveService extends CrudService<MceReceive> {
 
     void updateMceReceive(MceReceive mceReceive);
 
+    void addMceReceive(MceRequestVO mceRequestVO);
+
     void add(String mceReceive);
 
     boolean removeById(Integer id);
 
+    boolean deleteById(Integer id);
+
 }

+ 40 - 9
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceContentServiceImpl.java

@@ -10,9 +10,12 @@ import com.usky.system.service.MceMbuserService;
 import com.usky.system.service.config.websocket.HttpClientUtils;
 import com.usky.system.service.vo.SendWeChatMessageRequestVO;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
+import com.usky.system.domain.MceRequestVO;
 
 /**
  * <p>
@@ -29,21 +32,23 @@ public class MceContentServiceImpl extends AbstractCrudService<MceContentMapper,
     @Autowired
     private MceMbuserService mceMbuserService;
 
-    //异步多线程调用
-    @Async("asyncServiceExecutor")
-    public void sendApp(JSONObject mceReceiveVO, String cids, Integer mceReceiveId, Integer sendType){
-        if (sendType.equals(0)){
-            String appUrl = "https://fc-mp-85a26092-1305-4bf1-998f-b609512c8f7b.next.bspapp.com/uniPushMessage";
+    @Value("${appUrl}")
+    private String appUrl;
+
+    // 异步多线程调用
+    @Async
+    public void sendApp(JSONObject mceReceiveVO, String cids, Integer mceReceiveId, Integer sendType) {
+        if (sendType.equals(0)) {
             JsonObject jsonObject = new JsonObject();
             JsonObject jsonObject1 = new JsonObject();
             jsonObject1.addProperty("infoType", mceReceiveVO.get("infoType").toString());
-            jsonObject1.addProperty("moduleId", (int)mceReceiveVO.get("id"));
+            jsonObject1.addProperty("moduleId", (int) mceReceiveVO.get("id"));
             jsonObject.addProperty("cids", cids);
             jsonObject.addProperty("title", mceReceiveVO.get("infoTitle").toString());
             jsonObject.addProperty("content", mceReceiveVO.get("infoContent").toString());
-            jsonObject.add("payload",jsonObject1);
-            String resultString = HttpClientUtils.doPostJson(appUrl,jsonObject.toString());
-        }else if (sendType.equals(1)){
+            jsonObject.add("payload", jsonObject1);
+            String resultString = HttpClientUtils.doPostJson(appUrl, jsonObject.toString());
+        } else if (sendType.equals(1)) {
             SendWeChatMessageRequestVO sendWeChatMessageRequestVO = new SendWeChatMessageRequestVO();
             sendWeChatMessageRequestVO.setInfoContent(mceReceiveVO.get("infoContent").toString());
             sendWeChatMessageRequestVO.setInfoTitle(mceReceiveVO.get("infoTitle").toString());
@@ -56,4 +61,30 @@ public class MceContentServiceImpl extends AbstractCrudService<MceContentMapper,
             mceMbuserService.sendWeChatMessage(sendWeChatMessageRequestVO);
         }
     }
+
+    @Async
+    public void sendAppNew(MceRequestVO mceReceiveVO, String cids, Integer mceReceiveId, Integer sendType) {
+        if (sendType.equals(0)) {
+            JsonObject jsonObject = new JsonObject();
+            JsonObject jsonObject1 = new JsonObject();
+            jsonObject1.addProperty("infoType", mceReceiveVO.getInfoType());
+            jsonObject1.addProperty("moduleId", mceReceiveVO.getId());
+            jsonObject.addProperty("cids", cids);
+            jsonObject.addProperty("title", mceReceiveVO.getInfoTitle());
+            jsonObject.addProperty("content", mceReceiveVO.getInfoContent());
+            jsonObject.add("payload", jsonObject1);
+            String resultString = HttpClientUtils.doPostJson(appUrl, jsonObject.toString());
+        } else if (sendType.equals(1)) {
+            SendWeChatMessageRequestVO sendWeChatMessageRequestVO = new SendWeChatMessageRequestVO();
+            sendWeChatMessageRequestVO.setInfoContent(mceReceiveVO.getInfoContent());
+            sendWeChatMessageRequestVO.setInfoTitle(mceReceiveVO.getInfoTitle());
+            sendWeChatMessageRequestVO.setInfoId(mceReceiveId);
+            sendWeChatMessageRequestVO.setOpenId(cids);
+            sendWeChatMessageRequestVO.setInfoType(mceReceiveVO.getInfoType());
+            if (StringUtils.isNotEmpty(mceReceiveVO.getInfoTypeName())) {
+                sendWeChatMessageRequestVO.setInfoTypeName(mceReceiveVO.getInfoTypeName());
+            }
+            mceMbuserService.sendWeChatMessage(sendWeChatMessageRequestVO);
+        }
+    }
 }

+ 34 - 33
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceMbuserServiceImpl.java

@@ -61,13 +61,13 @@ public class MceMbuserServiceImpl extends AbstractCrudService<MceMbuserMapper, M
         return null;
     }
 
-    public static long getTimeDifference(String oldTime,String newTime) throws ParseException {
+    public static long getTimeDifference(String oldTime, String newTime) throws ParseException {
 
         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        long NTime =df.parse(newTime).getTime();
-        //从对象中拿到时间
+        long NTime = df.parse(newTime).getTime();
+        // 从对象中拿到时间
         long OTime = df.parse(oldTime).getTime();
-        long diff=(NTime-OTime)/1000/60;
+        long diff = (NTime - OTime) / 1000 / 60;
         return diff;
     }
 
@@ -79,60 +79,61 @@ public class MceMbuserServiceImpl extends AbstractCrudService<MceMbuserMapper, M
         Integer infoId = requestVO.getInfoId();
         String openId = requestVO.getOpenId();
 
-        //access_token时效校验,判断获取access_token获取时间是否超过有效时间,超过就调用更新,保证一直有效
-        if(!redisHelper.hasKey("access_key")){
+        // access_token时效校验,判断获取access_token获取时间是否超过有效时间,超过就调用更新,保证一直有效
+        if (!redisHelper.hasKey("access_key")) {
             redisHelper.set("access_time", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-            redisHelper.set("access_key",this.getWeChatAccessToken());
-        }else{
-            try{
+            redisHelper.set("access_key", this.getWeChatAccessToken());
+        } else {
+            try {
                 String access_time = redisHelper.get("access_time").toString();
                 String now_time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-                long i = getTimeDifference(access_time,now_time);
-                if(i > 115){ //大于115分钟
-                    redisHelper.set("access_time",LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-                    redisHelper.set("access_key",this.getWeChatAccessToken());
+                long i = getTimeDifference(access_time, now_time);
+                if (i > 115) { // 大于115分钟
+                    redisHelper.set("access_time", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+                    redisHelper.set("access_key", this.getWeChatAccessToken());
                 }
-            }catch (Exception e){
+            } catch (Exception e) {
                 throw new BusinessException(e.getMessage());
             }
 
         }
 
         Object obj = redisHelper.get("access_key");
-        if(obj == null){
-            throw new BusinessException("token不能为空");
+        if (obj == null) {
+            log.error("消息接收id:" + requestVO.getInfoId() + ",token为空,发送微信服务号消息失败");
+            return null;
         }
 
         String token = obj.toString();
 
-        TemplateMsgEntityVO messageVo=new TemplateMsgEntityVO();
+        TemplateMsgEntityVO messageVo = new TemplateMsgEntityVO();
         messageVo.setTTitle(infoTitle);
         messageVo.setTKeyword1(infoContent);
         messageVo.setTKeyword3(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
         messageVo.setTRemark(infoContent);
-        if(Objects.nonNull(requestVO.getInfoTypeName())){
-            messageVo.setTUrl(String.format(constant.WE_CHAT_CUSTOMER_CALL_URL,requestVO.getInfoType(),requestVO.getInfoTypeName(),infoId));
+        if (Objects.nonNull(requestVO.getInfoTypeName())) {
+            messageVo.setTUrl(String.format(constant.WE_CHAT_CUSTOMER_CALL_URL, requestVO.getInfoType(), requestVO.getInfoTypeName(), infoId));
             messageVo.setTKeyword2(requestVO.getInfoTypeName());
-        }else{
-            messageVo.setTUrl(String.format(constant.WE_CHAT_CUSTOMER_CALL_URL1,requestVO.getInfoType(),infoId));
+        } else {
+            messageVo.setTUrl(String.format(constant.WE_CHAT_CUSTOMER_CALL_URL1, requestVO.getInfoType(), infoId));
             messageVo.setTKeyword2("");
         }
 
         messageVo.setTemplateId(constant.WE_CHAT_TEMPLATE_ID);
 
-        String requestUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="  + token;
-        Map<String,Object> content=new HashMap<>();
+        String requestUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + token;
+        Map<String, Object> content = new HashMap<>();
         Map<String, TemplateData> data = new HashMap<>();
-        data.put("first",new TemplateData(messageVo.getTTitle(),"#44b549"));
-        data.put("keyword1",new TemplateData(messageVo.getTKeyword1(),"#173177"));
-        data.put("keyword2",new TemplateData(messageVo.getTKeyword2(),"#173177"));
-        data.put("keyword3",new TemplateData(messageVo.getTKeyword3(),"#173177"));
-        data.put("remark",new TemplateData(messageVo.getTRemark(),"#173177"));
-
-        content.put("touser",openId);
-        content.put("url",messageVo.getTUrl());
-        content.put("template_id",messageVo.getTemplateId());
-        content.put("data",data);
+        data.put("first", new TemplateData(messageVo.getTTitle(), "#44b549"));
+        data.put("keyword1", new TemplateData(messageVo.getTKeyword1(), "#173177"));
+        data.put("keyword2", new TemplateData(messageVo.getTKeyword2(), "#173177"));
+        data.put("keyword3", new TemplateData(messageVo.getTKeyword3(), "#173177"));
+        data.put("remark", new TemplateData(messageVo.getTRemark(), "#173177"));
+
+        content.put("touser", openId);
+        content.put("url", messageVo.getTUrl());
+        content.put("template_id", messageVo.getTemplateId());
+        content.put("data", data);
         String resp = HttpUtil.post(requestUrl, JSONUtil.parseObj(content).toString());
         System.out.println(content.toString());
         System.out.println(JSONUtil.parseObj(content));

+ 359 - 75
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceReceiveServiceImpl.java

@@ -10,22 +10,23 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.common.datascope.annotation.DataScope;
-import com.ruoyi.common.datascope.context.DataScopeContextHolder;
-import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.bean.CommonPage;
+import com.usky.common.core.exception.BusinessException;
 import com.usky.common.security.utils.SecurityUtils;
-import com.usky.system.RemoteUserService;
 import com.usky.system.domain.*;
 import com.usky.system.mapper.MceReceiveMapper;
+import com.usky.system.mapper.MceSettingMapper;
 import com.usky.system.mapper.SysUserMapper;
 import com.usky.system.service.*;
 import com.usky.common.mybatis.core.AbstractCrudService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -35,6 +36,7 @@ import java.util.*;
  * @author han
  * @since 2024-05-09
  */
+@Slf4j
 @Service
 public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper, MceReceive> implements MceReceiveService {
     @Autowired
@@ -54,35 +56,40 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
 
     @Autowired
     private SysUserMapper userMapper;
+    @Autowired
+    private MceSettingMapper mceSettingMapper;
+
+    @Autowired
+    private MceReceiveMapper mceReceiveMapper;
 
     @Override
     public CommonPage<Object> mceList(String infoTitle, String infoType, String startTime, String endTime, Integer id, Integer current, Integer size) {
         List<Object> list = new ArrayList<>();
         LambdaQueryWrapper<MceContent> lambdaQuery1 = Wrappers.lambdaQuery();
         lambdaQuery1.select(MceContent::getId, MceContent::getInfoTitle, MceContent::getInfoContent)
-                .like(StringUtils.isNotBlank(infoTitle),MceContent::getInfoTitle,infoTitle)
-                .eq(id != null,MceContent::getId,id);
+                .like(StringUtils.isNotBlank(infoTitle), MceContent::getInfoTitle, infoTitle)
+                .eq(id != null, MceContent::getId, id);
         List<MceContent> list1 = mceContentService.list(lambdaQuery1);
         IPage<MceReceive> page = new Page<>(current, size);
         List<Integer> contentIds = new ArrayList<>();
-        if (CollectionUtils.isNotEmpty(list1)){
-            for(int i=0;i<list1.size();i++){
+        if (CollectionUtils.isNotEmpty(list1)) {
+            for (int i = 0; i < list1.size(); i++) {
                 contentIds.add(list1.get(i).getId());
             }
             Long userId = SecurityUtils.getUserId();
             LambdaQueryWrapper<MceReceive> lambdaQuery = Wrappers.lambdaQuery();
             lambdaQuery.select(MceReceive::getId, MceReceive::getInfoType,
-                    MceReceive::getContentId, MceReceive::getReadFlag, MceReceive::getCreateTime,
-                    MceReceive::getReceiverId,MceReceive::getModuleId)
-                    .between(StringUtils.isNotBlank(startTime)&&StringUtils.isNotBlank(endTime),MceReceive::getCreateTime,
-                            startTime,endTime)
-                    .eq(StringUtils.isNotBlank(infoType),MceReceive::getInfoType, infoType)
+                            MceReceive::getContentId, MceReceive::getReadFlag, MceReceive::getCreateTime,
+                            MceReceive::getReceiverId, MceReceive::getModuleId, MceReceive::getCreateBy)
+                    .between(StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime), MceReceive::getCreateTime,
+                            startTime, endTime)
+                    .eq(StringUtils.isNotBlank(infoType), MceReceive::getInfoType, infoType)
                     .eq(MceReceive::getReceiverId, SecurityUtils.getUserId())
-                    .in(CollectionUtils.isNotEmpty(contentIds),MceReceive::getContentId,contentIds)
+                    .in(CollectionUtils.isNotEmpty(contentIds), MceReceive::getContentId, contentIds)
                     .orderByDesc(MceReceive::getId);
 //                .inSql(StringUtils.isNotBlank(infoTitle),MceReceive::getContentId,"SELECT id FROM mce_content WHERE " +
 //                        "info_title like '%" + infoTitle + "%' AND tenant_id = "+SecurityUtils.getTenantId()+"");
-            page = this.page(page,lambdaQuery);
+            page = this.page(page, lambdaQuery);
             if (CollectionUtils.isNotEmpty(page.getRecords())) {
                 for (int i = 0; i < page.getRecords().size(); i++) {
                     Map<String, Object> map = new HashMap<>();
@@ -91,10 +98,11 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
                     map.put("readFlag", page.getRecords().get(i).getReadFlag());
                     map.put("moduleId", page.getRecords().get(i).getModuleId());
                     map.put("createTime", page.getRecords().get(i).getCreateTime());
+                    map.put("createBy", page.getRecords().get(i).getCreateBy());
                     if (CollectionUtils.isNotEmpty(list1)) {
                         for (int j = 0; j < list1.size(); j++) {
                             if (page.getRecords().get(i).getContentId().equals(list1.get(j).getId())) {
-                                map.put("contentId",list1.get(j).getId());
+                                map.put("contentId", list1.get(j).getId());
                                 map.put("infoTitle", list1.get(j).getInfoTitle());
                                 map.put("infoContent", list1.get(j).getInfoContent());
                             }
@@ -104,7 +112,7 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
                 }
             }
         }
-        return new CommonPage<>(list,page.getTotal(),page.getCurrent(),page.getSize());
+        return new CommonPage<>(list, page.getTotal(), page.getCurrent(), page.getSize());
     }
 
     @Override
@@ -112,16 +120,16 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
     public CommonPage<Object> mceManageList(String infoTitle, String infoType, String startTime, String endTime, Integer current, Integer size) {
         List<Object> list = new ArrayList<>();
         IPage<MceContent> page = new Page<>(current, size);
-        //查询消息内容
+        // 查询消息内容
         LambdaQueryWrapper<MceContent> lambdaQuery1 = Wrappers.lambdaQuery();
-        lambdaQuery1.select(MceContent::getId, MceContent::getInfoTitle, MceContent::getInfoContent, MceContent::getCreateTime,MceContent::getInfoType)
-                .like(StringUtils.isNotBlank(infoTitle),MceContent::getInfoTitle,infoTitle)
-                .between(StringUtils.isNotBlank(startTime)&&StringUtils.isNotBlank(endTime),MceContent::getCreateTime, startTime,endTime)
-                .eq(StringUtils.isNotBlank(infoType),MceContent::getInfoType, infoType)
+        lambdaQuery1.select(MceContent::getId, MceContent::getInfoTitle, MceContent::getInfoContent, MceContent::getCreateTime, MceContent::getInfoType)
+                .like(StringUtils.isNotBlank(infoTitle), MceContent::getInfoTitle, infoTitle)
+                .between(StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime), MceContent::getCreateTime, startTime, endTime)
+                .eq(StringUtils.isNotBlank(infoType), MceContent::getInfoType, infoType)
 //                .apply(DataScopeContextHolder.getDataScopeSql())
-                .eq(MceContent::getTenantId,SecurityUtils.getTenantId())
+                .eq(MceContent::getTenantId, SecurityUtils.getTenantId())
                 .orderByDesc(MceContent::getId);
-        page = mceContentService.page(page,lambdaQuery1);
+        page = mceContentService.page(page, lambdaQuery1);
 
         if (CollectionUtils.isNotEmpty(page.getRecords())) {
             List<Integer> contentIds = new ArrayList<>();
@@ -129,11 +137,11 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
                 contentIds.add(page.getRecords().get(i).getId());
             }
             QueryWrapper<MceReceive> queryWrapper = Wrappers.query();
-            queryWrapper.select("content_id AS contentId","COUNT(read_flag=0 or null) as notReadCount","COUNT" +
-                    "(read_flag=1 or null) as readCount","issuer_name AS issuerName")
-                    .in("content_id",contentIds)
-                    .groupBy("content_id","issuer_name");
-            List<Map<String,Object>> readStatisticList = this.listMaps(queryWrapper);
+            queryWrapper.select("content_id AS contentId", "COUNT(read_flag=0 or null) as notReadCount", "COUNT" +
+                            "(read_flag=1 or null) as readCount", "issuer_name AS issuerName")
+                    .in("content_id", contentIds)
+                    .groupBy("content_id", "issuer_name");
+            List<Map<String, Object>> readStatisticList = this.listMaps(queryWrapper);
             for (int i = 0; i < page.getRecords().size(); i++) {
                 Map<String, Object> map = new HashMap<>();
                 map.put("id", page.getRecords().get(i).getId());
@@ -142,7 +150,7 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
                 map.put("infoType", page.getRecords().get(i).getInfoType());
                 map.put("createTime", page.getRecords().get(i).getCreateTime());
                 for (int j = 0; j < readStatisticList.size(); j++) {
-                    if (page.getRecords().get(i).getId().equals(readStatisticList.get(j).get("contentId"))){
+                    if (page.getRecords().get(i).getId().equals(readStatisticList.get(j).get("contentId"))) {
                         map.put("notReadCount", readStatisticList.get(j).get("notReadCount"));
                         map.put("readCount", readStatisticList.get(j).get("readCount"));
                         map.put("userName", readStatisticList.get(j).get("issuerName"));
@@ -152,15 +160,15 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
             }
         }
 
-        return new CommonPage<>(list,page.getTotal(),page.getCurrent(),page.getSize());
+        return new CommonPage<>(list, page.getTotal(), page.getCurrent(), page.getSize());
     }
 
     @Override
     public CommonPage<MceReceive> mceManageById(Integer id, Integer current, Integer size) {
         IPage<MceReceive> page = new Page<>(current, size);
         LambdaQueryWrapper<MceReceive> lambdaQuery = Wrappers.lambdaQuery();
-        lambdaQuery.eq(MceReceive::getContentId,id);
-        page = this.page(page,lambdaQuery);
+        lambdaQuery.eq(MceReceive::getContentId, id);
+        page = this.page(page, lambdaQuery);
 //        if (CollectionUtils.isNotEmpty(page.getRecords())) {
 //            List<Integer> userIds = new ArrayList<>();
 //            for (int i = 0; i < page.getRecords().size(); i++) {
@@ -183,7 +191,7 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
 //                }
 //            }
 //        }
-        return new CommonPage<>(page.getRecords(),page.getTotal(),page.getCurrent(),page.getSize());
+        return new CommonPage<>(page.getRecords(), page.getTotal(), page.getCurrent(), page.getSize());
     }
 
     @Override
@@ -192,15 +200,15 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
         LocalDateTime oneYearAgo = currentDate.minusYears(1);
         LocalDateTime zeroTime = oneYearAgo.withHour(0).withMinute(0).withSecond(0);
         QueryWrapper<MceReceive> queryWrapper = Wrappers.query();
-        queryWrapper.select("COUNT(read_flag=0 or null) as notReadCount","COUNT(read_flag=1 or null) as readCount"
-                ,"info_type AS infoType")
-                .eq("receiver_id",SecurityUtils.getUserId())
-                .between("create_time",zeroTime,currentDate)
+        queryWrapper.select("COUNT(read_flag=0 or null) as notReadCount", "COUNT(read_flag=1 or null) as readCount"
+                        , "info_type AS infoType")
+                .eq("receiver_id", SecurityUtils.getUserId())
+                .between("create_time", zeroTime, currentDate)
                 .groupBy("info_type");
-        List<Map<String,Object>> readStatisticList = this.listMaps(queryWrapper);
+        List<Map<String, Object>> readStatisticList = this.listMaps(queryWrapper);
         LambdaQueryWrapper<MceReceive> lambdaQuery = Wrappers.lambdaQuery();
-        lambdaQuery.eq(MceReceive::getReceiverId,SecurityUtils.getUserId())
-                .eq(MceReceive::getReadFlag,0);
+        lambdaQuery.eq(MceReceive::getReceiverId, SecurityUtils.getUserId())
+                .eq(MceReceive::getReadFlag, 0);
         Integer notReadCount = this.count(lambdaQuery);
         Map<String, Object> map = new HashMap<>();
         map.put("notReadCount", notReadCount);
@@ -209,19 +217,19 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
     }
 
     @Override
-    public void updateMceReceive(MceReceive mceReceive){
+    public void updateMceReceive(MceReceive mceReceive) {
         LambdaUpdateWrapper<MceReceive> updateWrapper = new UpdateWrapper<MceReceive>().lambda();
-        if (Objects.nonNull(mceReceive.getId())&&!mceReceive.getId().equals(0)){
-            updateWrapper.eq(MceReceive::getId,mceReceive.getId())
-                    .set(MceReceive::getReadFlag,1)
-                    .set(MceReceive::getUpdateBy,SecurityUtils.getUsername())
-                    .set(MceReceive::getUpdateTime,LocalDateTime.now());
-        }else {
-            updateWrapper.eq(MceReceive::getReceiverId,SecurityUtils.getUserId())
-                    .eq(MceReceive::getReadFlag,0)
-                    .set(MceReceive::getReadFlag,1)
-                    .set(MceReceive::getUpdateBy,SecurityUtils.getUsername())
-                    .set(MceReceive::getUpdateTime,LocalDateTime.now());
+        if (Objects.nonNull(mceReceive.getId()) && !mceReceive.getId().equals(0)) {
+            updateWrapper.eq(MceReceive::getId, mceReceive.getId())
+                    .set(MceReceive::getReadFlag, 1)
+                    .set(MceReceive::getUpdateBy, SecurityUtils.getUsername())
+                    .set(MceReceive::getUpdateTime, LocalDateTime.now());
+        } else {
+            updateWrapper.eq(MceReceive::getReceiverId, SecurityUtils.getUserId())
+                    .eq(MceReceive::getReadFlag, 0)
+                    .set(MceReceive::getReadFlag, 1)
+                    .set(MceReceive::getUpdateBy, SecurityUtils.getUsername())
+                    .set(MceReceive::getUpdateTime, LocalDateTime.now());
         }
         this.update(updateWrapper);
     }
@@ -236,21 +244,264 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
         }
     }
 
+    @Async
     @Override
-    public void add(String mceReceive){
+    public void addMceReceive(MceRequestVO mceRequestVO) {
+        // 如果 infoTypeName 为空,则从字典数据中获取
+        if (mceRequestVO.getInfoTypeName() == null) {
+            String infoTypeName = sysDictDataService.selectDictLabel("message_type", mceRequestVO.getInfoType());
+            mceRequestVO.setInfoTypeName(infoTypeName);
+        }
+
+        Integer tenantId = userMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, mceRequestVO.getUserName()).select(SysUser::getTenantId)).getTenantId();
+
+        // 获取当前租户的所有用户
+        List<SysUser> userList = userMapper.tenantIdUserList(tenantId);
+        if (CollectionUtils.isEmpty(userList)) {
+            return;
+        }
+
+        // 获取用户昵称与真实姓名的映射
+        Map<String, String> userNameNickNameMap = userList.stream()
+                .collect(Collectors.toMap(SysUser::getUserName, SysUser::getNickName));
+
+        LocalDateTime currentTime = LocalDateTime.now();
+        List<Long> userIdList = new ArrayList<>();
+        MceContent contentEntity = new MceContent();
+        Integer generatedContentId = 0;
+
+        // 遍历用户列表,处理消息内容
+        for (SysUser user : userList) {
+            userIdList.add(user.getUserId());
+            if (mceRequestVO.getUserName().equals(user.getUserName())) {
+                contentEntity.setInfoTitle(mceRequestVO.getInfoTitle());
+                contentEntity.setInfoContent(mceRequestVO.getInfoContent());
+                contentEntity.setInfoType(mceRequestVO.getInfoType());
+                contentEntity.setCreateBy(user.getUserName());
+                contentEntity.setCreateTime(currentTime);
+                contentEntity.setDeptId(user.getDeptId().intValue());
+                contentEntity.setTenantId(user.getTenantId());
+                mceContentService.save(contentEntity);
+                generatedContentId = contentEntity.getId();
+            }
+        }
+
+        // 筛选符合用户ID条件的用户
+        List<Long> targetUserIds = mceRequestVO.getUserIds();
+        userIdList.retainAll(targetUserIds);
+
+        // 查询符合条件的 MceMbuser 列表
+        List<MceMbuser> mbUserList = mceMbuserService.list(Wrappers.lambdaQuery(MceMbuser.class).in(MceMbuser::getUserId, userIdList));
+
+        // 遍历用户列表,处理消息接收记录
+        for (Long userId : userIdList) {
+            if (CollectionUtils.isEmpty(mbUserList)) {
+                continue;
+            }
+
+            Optional<MceMbuser> mbUserOptional = mbUserList.stream()
+                    .filter(mbUser -> mbUser.getUserId().equals(userId))
+                    .findFirst();
+
+
+            for (SysUser user : userList) {
+                if (user.getUserId().equals(userId)) {
+                    // 创建消息接收记录
+                    List<MceSetting> setting = mceSettingService.list(Wrappers.lambdaQuery(MceSetting.class).eq(MceSetting::getCreateBy, user.getUserName()));
+                    Integer receiveId = 0;
+                    if (CollectionUtils.isNotEmpty(setting)) {
+                        MceReceive mceReceive = createMceReceive(user, generatedContentId, mceRequestVO, userNameNickNameMap);
+                        this.save(mceReceive);
+                        receiveId = mceReceive.getId();
+                    }
+
+                    if (mbUserOptional.isPresent()) {
+                        MceMbuser mbUser = mbUserOptional.get();
+                        // 处理消息发送设置
+                        handleMessageSettings(mbUser, mceRequestVO, receiveId);
+                    }
+                }
+            }
+        }
+    }
+
+    // 创建消息接收记录
+    private MceReceive createMceReceive(SysUser user, Integer generatedContentId, MceRequestVO mceRequestVO, Map<String, String> userNameNickNameMap) {
+        MceReceive mceReceive = new MceReceive();
+        mceReceive.setReceiverId(user.getUserId().intValue());
+        mceReceive.setContentId(generatedContentId);
+        mceReceive.setReadFlag(0);
+        mceReceive.setInfoType(mceRequestVO.getInfoType());
+        mceReceive.setModuleId(mceRequestVO.getId());
+
+        String userName = mceRequestVO.getUserName();
+        String nickName = userNameNickNameMap.get(userName);
+        mceReceive.setIssuerName(nickName);
+
+        mceReceive.setReceiverName(user.getUserName());
+        mceReceive.setCreateBy(mceRequestVO.getUserName());
+        mceReceive.setCreateTime(LocalDateTime.now());
+        mceReceive.setTenantId(user.getTenantId());
+        mceReceive.setDeptId(Math.toIntExact(user.getDeptId()));
+        return mceReceive;
+    }
+
+    // 处理消息发送设置
+    private void handleMessageSettings(MceMbuser mbUser, MceRequestVO mceRequestVO, Integer mceReceiveId) {
+        List<MceSetting> settingList = mceSettingService.list(Wrappers.lambdaQuery(MceSetting.class).eq(MceSetting::getCreateBy, mceRequestVO.getUserName()));
+
+        if (CollectionUtils.isNotEmpty(settingList)) {
+            MceSetting setting = settingList.get(0);
+            JSONObject appMode = JSONObject.parseObject(setting.getAppMode());
+            JSONObject wcMode = JSONObject.parseObject(setting.getWcMode());
+
+            String infoType = mceRequestVO.getInfoType();
+
+            // 处理应用消息发送
+            if (appMode.getBoolean(infoType)) {
+                if (mbUser.getCids() != null) {
+                    try {
+                        mceContentService.sendAppNew(mceRequestVO, mbUser.getCids(), 0, 0);
+                    } catch (Exception e) {
+                        log.error("为用户ID: {} 发送应用消息失败,错误信息: {}", mbUser.getUserId(), e.getMessage(), e);
+                    }
+                }
+            }
+
+            // 处理微信消息发送
+            if (wcMode.getBoolean(infoType)) {
+                if (mbUser.getOpenid() != null) {
+                    try {
+                        mceContentService.sendAppNew(mceRequestVO, mbUser.getOpenid(), mceReceiveId, 1);
+                    } catch (Exception e) {
+                        log.error("为用户ID: {} 发送微信消息失败,错误信息: {}", mbUser.getUserId(), e.getMessage(), e);
+                    }
+                }
+            }
+        }
+    }
+
+    /*
+    @Async
+    @Override
+    public void addMceReceive(MceRequestVO mceRequestVO) {
+        if (mceRequestVO.getInfoTypeName() == null) {
+            String infoTypeName = sysDictDataService.selectDictLabel("message_type", mceRequestVO.getInfoType());
+            mceRequestVO.setInfoTypeName(infoTypeName);
+        }
+
+        List<SysUser> userList = userMapper.tenantIdUserList(SecurityUtils.getTenantId());
+        // 获取用户昵称与真实姓名Map
+        Map<String, String> userNameNickNameMap = userList.stream().collect(Collectors.toMap(SysUser::getUserName, SysUser::getNickName));
+
+        if (CollectionUtils.isNotEmpty(userList)) {
+            LocalDateTime currentTime = LocalDateTime.now();
+            List<Integer> userIdList = new ArrayList<>();
+            MceContent contentEntity = new MceContent();
+            Integer generatedContentId = 0;
+            for (SysUser user : userList) {
+                userIdList.add(user.getUserId().intValue());
+                if (mceRequestVO.getUserName().equals(user.getUserName())) {
+                    contentEntity.setInfoTitle(mceRequestVO.getInfoTitle());
+                    contentEntity.setInfoContent(mceRequestVO.getInfoContent());
+                    contentEntity.setInfoType(mceRequestVO.getInfoType());
+                    contentEntity.setCreateBy(user.getUserName());
+                    contentEntity.setCreateTime(currentTime);
+                    contentEntity.setDeptId(user.getDeptId().intValue());
+                    contentEntity.setTenantId(user.getTenantId());
+                    mceContentService.save(contentEntity);
+                    generatedContentId = contentEntity.getId();
+                }
+            }
+
+            List<Long> userIds1;
+            userIds1 = mceRequestVO.getUserIds();
+            userList.retainAll(userIds1);
+
+            LambdaQueryWrapper<MceMbuser> lambdaQuery3 = Wrappers.lambdaQuery();
+            lambdaQuery3.in(MceMbuser::getUserId, userList);
+            List<MceMbuser> list3 = mceMbuserService.list(lambdaQuery3);
+
+            for (int i = 0; i < userList.size(); i++) {
+                if (CollectionUtils.isNotEmpty(list3)) {
+                    for (int j = 0; j < list3.size(); j++) {
+                        if (userList.get(i).getUserId().equals(list3.get(j).getUserId())) {
+                            MceReceive mceReceive1 = new MceReceive();
+                            mceReceive1.setReceiverId(userList.get(i).getUserId().intValue());
+                            mceReceive1.setContentId(generatedContentId);
+                            mceReceive1.setReadFlag(0);
+                            mceReceive1.setInfoType(mceRequestVO.getInfoType());
+                            mceReceive1.setModuleId(mceRequestVO.getId());
+
+                            String userName = mceRequestVO.getUserName();
+                            String nickName = userNameNickNameMap.get(userName);
+                            mceReceive1.setIssuerName(nickName);
+
+                            mceReceive1.setReceiverName(userList.get(i).getUserName());
+                            mceReceive1.setCreateBy(mceRequestVO.getUserName());
+                            mceReceive1.setCreateTime(LocalDateTime.now());
+                            mceReceive1.setTenantId(userList.get(i).getTenantId());
+                            mceReceive1.setDeptId(Math.toIntExact(userList.get(i).getDeptId()));
+                            this.save(mceReceive1);
+                            Integer mceReceiveId = mceReceive1.getId();
+
+                            LambdaQueryWrapper<MceSetting> lambdaQuery = Wrappers.lambdaQuery();
+                            lambdaQuery.eq(MceSetting::getCreateBy, userList.get(i).getUserName());
+                            List<MceSetting> list1 = mceSettingService.list(lambdaQuery);
+
+                            if (CollectionUtils.isNotEmpty(list1)) {
+                                JSONObject appMode = JSONObject.parseObject(list1.get(0).getAppMode());
+                                JSONObject wcMode = JSONObject.parseObject(list1.get(0).getWcMode());
+
+                                if (appMode.get(mceRequestVO.getInfoType()).equals(true)) {
+                                    if (userList.get(i).getUserId().equals(list3.get(j).getUserId()) && StringUtils.isNotBlank(list3.get(j).getCids())) {
+                                        try {
+                                            mceContentService.sendAppNew(mceRequestVO, list3.get(j).getCids(), 0, 0);
+                                        } catch (Exception e) {
+                                            log.error("为用户ID: {} 发送应用消息失败,错误信息: {}", list3.get(j).getUserId(), e.getMessage(), e);
+                                        }
+                                    }
+                                }
+
+                                if (wcMode.get(mceRequestVO.getInfoType()).equals(true)) {
+                                    if (userList.get(i).getUserId().equals(list3.get(j).getUserId()) && StringUtils.isNotBlank(list3.get(j).getOpenid())) {
+                                        try {
+                                            mceContentService.sendAppNew(mceRequestVO, list3.get(j).getOpenid(), mceReceiveId, 1);
+                                        } catch (Exception e) {
+                                            log.error("为用户ID: {} 发送微信消息失败,错误信息: {}", list3.get(j).getUserId(), e.getMessage(), e);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    */
+
+    @Async
+    @Override
+    public void add(String mceReceive) {
         JSONObject mceReceiveVO = JSONObject.parseObject(mceReceive);
-        String infoTypeName = sysDictDataService.selectDictLabel("message_type",mceReceiveVO.get("infoType").toString());
+        String infoTypeName = sysDictDataService.selectDictLabel("message_type", mceReceiveVO.get("infoType").toString());
         if (!mceReceiveVO.containsKey("infoTypeName")) {
-            mceReceiveVO.put("infoTypeName",infoTypeName);
+            mceReceiveVO.put("infoTypeName", infoTypeName);
         }
-        List<SysUser> list = userMapper.tenantIdUserList(SecurityUtils.getTenantId());
+
+        Integer tenantId = userMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, mceReceiveVO.get("userName")).select(SysUser::getTenantId)).getTenantId();
+        List<SysUser> list = userMapper.tenantIdUserList(tenantId);
+        // 获取用户昵称与真实姓名Map
+        Map<String, String> userNameNickNameMap = list.stream().collect(Collectors.toMap(SysUser::getUserName, SysUser::getNickName));
         MceContent mceContent = new MceContent();
         Integer contentId = 0;
+
         if (CollectionUtils.isNotEmpty(list)) {
             List<Integer> userIds = new ArrayList<>();
             for (int g = 0; g < list.size(); g++) {
                 userIds.add(list.get(g).getUserId().intValue());
-                if (mceReceiveVO.get("userName").equals(list.get(g).getUserName())){
+                if (mceReceiveVO.get("userName").equals(list.get(g).getUserName())) {
                     mceContent.setInfoTitle(mceReceiveVO.get("infoTitle").toString());
                     mceContent.setInfoContent(mceReceiveVO.get("infoContent").toString());
                     mceContent.setInfoType(mceReceiveVO.get("infoType").toString());
@@ -262,50 +513,65 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
                     contentId = mceContent.getId();
                 }
             }
+
             List<Integer> userIds1;
             if (mceReceiveVO.containsKey("userIds")) {
                 userIds1 = convertObjectToList(mceReceiveVO.get("userIds"));
                 userIds.retainAll(userIds1);
             }
+
             LambdaQueryWrapper<MceMbuser> lambdaQuery3 = Wrappers.lambdaQuery();
-            lambdaQuery3.in(MceMbuser::getUserId,userIds);
+            lambdaQuery3.in(MceMbuser::getUserId, userIds);
             List<MceMbuser> list3 = mceMbuserService.list(lambdaQuery3);
+
             for (int i = 0; i < list.size(); i++) {
-                if (CollectionUtils.isNotEmpty(list3)){
+                if (CollectionUtils.isNotEmpty(list3)) {
                     for (int j = 0; j < list3.size(); j++) {
-                        if (list.get(i).getUserId().equals(list3.get(j).getUserId())){
+                        if (list.get(i).getUserId().equals(list3.get(j).getUserId())) {
                             MceReceive mceReceive1 = new MceReceive();
                             mceReceive1.setReceiverId(list.get(i).getUserId().intValue());
                             mceReceive1.setContentId(contentId);
                             mceReceive1.setReadFlag(0);
                             mceReceive1.setInfoType(mceReceiveVO.get("infoType").toString());
-                            mceReceive1.setModuleId((int)mceReceiveVO.get("id"));
+                            mceReceive1.setModuleId((int) mceReceiveVO.get("id"));
                             if (mceReceiveVO.containsKey("userName")) {
-                                mceReceive1.setIssuerName(mceReceiveVO.get("userName").toString());
+                                String userName = mceReceiveVO.get("userName").toString();
+                                String nickName = userNameNickNameMap.get(userName);
+                                mceReceive1.setIssuerName(nickName);
                             }
                             mceReceive1.setReceiverName(list.get(i).getUserName());
                             mceReceive1.setCreateBy(mceReceiveVO.get("userName").toString());
                             mceReceive1.setCreateTime(LocalDateTime.now());
                             mceReceive1.setTenantId(list.get(i).getTenantId());
-                            if (mceReceiveVO.get("userName").equals(list.get(i).getUserName())){
-                                mceReceive1.setDeptId(list.get(i).getDeptId().intValue());
-                            }
+                            mceReceive1.setDeptId(list.get(i).getDeptId().intValue());
                             this.save(mceReceive1);
                             Integer mceReceiveId = mceReceive1.getId();
+
                             LambdaQueryWrapper<MceSetting> lambdaQuery = Wrappers.lambdaQuery();
-                            lambdaQuery.eq(MceSetting::getCreateBy,list.get(i).getUserName());
+                            lambdaQuery.eq(MceSetting::getCreateBy, list.get(i).getUserName());
                             List<MceSetting> list1 = mceSettingService.list(lambdaQuery);
-                            if (CollectionUtils.isNotEmpty(list1)){
+
+                            if (CollectionUtils.isNotEmpty(list1)) {
                                 JSONObject appMode = JSONObject.parseObject(list1.get(0).getAppMode());
                                 JSONObject wcMode = JSONObject.parseObject(list1.get(0).getWcMode());
-                                if (appMode.get(mceReceiveVO.get("infoType").toString()).equals(true)){
-                                    if (list.get(i).getUserId().equals(list3.get(j).getUserId()) && StringUtils.isNotBlank(list3.get(j).getCids())){
-                                        mceContentService.sendApp(mceReceiveVO,list3.get(j).getCids(),0,0);
+
+                                if (appMode.get(mceReceiveVO.get("infoType").toString()).equals(true)) {
+                                    if (list.get(i).getUserId().equals(list3.get(j).getUserId()) && StringUtils.isNotBlank(list3.get(j).getCids())) {
+                                        try {
+                                            mceContentService.sendApp(mceReceiveVO, list3.get(j).getCids(), 0, 0);
+                                        } catch (Exception e) {
+                                            log.error("为用户ID: {} 发送应用消息失败,错误信息: {}", list3.get(j).getUserId(), e.getMessage(), e);
+                                        }
                                     }
                                 }
-                                if (wcMode.get(mceReceiveVO.get("infoType").toString()).equals(true)){
-                                    if (list.get(i).getUserId().equals(list3.get(j).getUserId()) && StringUtils.isNotBlank(list3.get(j).getOpenid())){
-                                        mceContentService.sendApp(mceReceiveVO,list3.get(j).getOpenid(),mceReceiveId,1);
+
+                                if (wcMode.get(mceReceiveVO.get("infoType").toString()).equals(true)) {
+                                    if (list.get(i).getUserId().equals(list3.get(j).getUserId()) && StringUtils.isNotBlank(list3.get(j).getOpenid())) {
+                                        try {
+                                            mceContentService.sendApp(mceReceiveVO, list3.get(j).getOpenid(), mceReceiveId, 1);
+                                        } catch (Exception e) {
+                                            log.error("为用户ID: {} 发送微信消息失败,错误信息: {}", list3.get(j).getUserId(), e.getMessage(), e);
+                                        }
                                     }
                                 }
                             }
@@ -319,8 +585,26 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
     @Override
     public boolean removeById(Integer id) {
         LambdaQueryWrapper<MceReceive> lambdaQuery = Wrappers.lambdaQuery();
-        lambdaQuery.eq(MceReceive::getContentId,id);
+        lambdaQuery.eq(MceReceive::getContentId, id);
         this.remove(lambdaQuery);
         return mceContentService.removeById(id);
     }
+
+    @Override
+    public boolean deleteById(Integer id) {
+        boolean f;
+        Integer userId = SecurityUtils.getUserId().intValue();
+        MceReceive mceReceive = mceReceiveMapper.selectOne(new LambdaQueryWrapper<MceReceive>().eq(MceReceive::getId, id));
+        if (mceReceive != null) {
+            if (userId.equals(mceReceive.getReceiverId())) {
+                mceReceiveMapper.deleteById(id);
+                f = true;
+            } else {
+                throw new BusinessException("您无权删除该条记录!");
+            }
+        } else {
+            throw new BusinessException("记录不存在,删除失败!");
+        }
+        return f;
+    }
 }

+ 7 - 4
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysDeptServiceImpl.java

@@ -1,8 +1,6 @@
 package com.usky.system.service.impl;
 
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.datascope.annotation.DataScope;
 import com.usky.common.mybatis.core.AbstractCrudService;
 import com.usky.common.security.utils.SecurityUtils;
@@ -12,7 +10,6 @@ import com.usky.common.core.util.StringUtils;
 import com.usky.system.domain.SysDept;
 import com.usky.system.domain.SysRole;
 import com.usky.system.domain.SysUser;
-import com.usky.system.domain.SysUserPost;
 import com.usky.system.domain.constants.UserConstants;
 import com.usky.system.mapper.SysDeptMapper;
 import com.usky.system.mapper.SysRoleMapper;
@@ -27,7 +24,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 
 
@@ -63,6 +59,13 @@ public class SysDeptServiceImpl extends AbstractCrudService<SysDeptMapper, SysDe
         return deptMapper.selectDeptList(dept);
     }
 
+    // 查询租户下部门信,无数据权限
+    @Override
+    public List<SysDept> selectDept(SysDept dept) {
+        dept.setTenantId(SecurityUtils.getTenantId());
+        return deptMapper.selectDeptList(dept);
+    }
+
     @Override
     public List<SysDept> deptList(SysDept dept) {
         dept.setTenantId(SecurityUtils.getTenantId());

+ 137 - 230
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysMenuServiceImpl.java

@@ -28,8 +28,7 @@ import java.util.stream.Collectors;
  * @author yq
  */
 @Service
-public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMenu> implements ISysMenuService
-{
+public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMenu> implements ISysMenuService {
     public static final String PREMISSION_STRING = "perms[\"{0}\"]";
 
     @Autowired
@@ -69,8 +68,7 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 菜单列表
      */
     @Override
-    public List<SysMenu> selectMenuList(Long userId)
-    {
+    public List<SysMenu> selectMenuList(Long userId) {
         return selectMenuList(new SysMenu(), userId);
     }
 
@@ -81,16 +79,12 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 菜单列表
      */
     @Override
-    public List<SysMenu> selectMenuList(SysMenu menu, Long userId)
-    {
+    public List<SysMenu> selectMenuList(SysMenu menu, Long userId) {
         List<SysMenu> menuList = null;
         // 管理员显示所有菜单信息
-        if (SysUserVO.isAdmin(userId))
-        {
+        if (SysUserVO.isAdmin(userId)) {
             menuList = menuMapper.selectMenuList(menu);
-        }
-        else
-        {
+        } else {
             menu.getParams().put("userId", userId);
             menuList = menuMapper.selectMenuListByUserId(menu);
         }
@@ -98,24 +92,21 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
     }
 
     @Override
-    public List<SysMenu> selectMenuListTwo(SysMenu menu)
-    {
-        List<SysMenu> menuList = menuMapper.selectMenuListOne(SecurityUtils.getTenantId(),menu.getMenuName());
+    public List<SysMenu> selectMenuListTwo(SysMenu menu) {
+        List<SysMenu> menuList = menuMapper.selectMenuListOne(SecurityUtils.getTenantId(), menu.getMenuName());
         return menuList;
     }
 
 
     @Override
-    public List<SysMenu> selectMenuListOne(Long userId)
-    {
+    public List<SysMenu> selectMenuListOne(Long userId) {
         List<SysMenu> menuList = menuMapper.selectMenuListByUserIdOne(userId);
         return menuList;
     }
 
 
     @Override
-    public List<SysMobileMenu> selectMobileMenuListOne(Long userId)
-    {
+    public List<SysMobileMenu> selectMobileMenuListOne(Long userId) {
         List<SysMobileMenu> menuList = menuMapper.selectMobileMenuListByUserIdOne(userId);
         return menuList;
     }
@@ -127,14 +118,11 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 权限列表
      */
     @Override
-    public Set<String> selectMenuPermsByUserId(Long userId)
-    {
+    public Set<String> selectMenuPermsByUserId(Long userId) {
         List<String> perms = menuMapper.selectMenuPermsByUserId(userId);
         Set<String> permsSet = new HashSet<>();
-        for (String perm : perms)
-        {
-            if (StringUtils.isNotEmpty(perm))
-            {
+        for (String perm : perms) {
+            if (StringUtils.isNotEmpty(perm)) {
                 permsSet.addAll(Arrays.asList(perm.trim().split(",")));
             }
         }
@@ -148,14 +136,11 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 权限列表
      */
     @Override
-    public Set<String> selectMenuPermsByUserIdOne(Integer tenantId)
-    {
+    public Set<String> selectMenuPermsByUserIdOne(Integer tenantId) {
         List<String> perms = menuMapper.selectMenuPermsByUserIdOne(tenantId);
         Set<String> permsSet = new HashSet<>();
-        for (String perm : perms)
-        {
-            if (StringUtils.isNotEmpty(perm))
-            {
+        for (String perm : perms) {
+            if (StringUtils.isNotEmpty(perm)) {
                 permsSet.addAll(Arrays.asList(perm.trim().split(",")));
             }
         }
@@ -170,15 +155,11 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 菜单列表
      */
     @Override
-    public List<SysMenu> selectMenuTreeByUserId(Long userId)
-    {
+    public List<SysMenu> selectMenuTreeByUserId(Long userId) {
         List<SysMenu> menus = null;
-        if (1L == userId)
-        {
+        if (1L == userId) {
             menus = menuMapper.selectMenuTreeAll();
-        }
-        else
-        {
+        } else {
             menus = menuMapper.selectMenuTreeByUserId(userId);
         }
         return getChildPerms(menus, 0);
@@ -191,33 +172,29 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 菜单列表
      */
     @Override
-    public List<SysMenu> selectMenuTreeByUserId1(Long userId,Long platformId)
-    {
+    public List<SysMenu> selectMenuTreeByUserId1(Long userId, Long platformId) {
         List<SysMenu> menus = null;
-        if (1L == userId)
-        {
+        if (1L == userId) {
             menus = menuMapper.selectMenuTreeAll();
-        }
-        else
-        {
-            menus = menuMapper.selectMenuTreeByUserId1(userId,platformId);
+        } else {
+            menus = menuMapper.selectMenuTreeByUserId1(userId, platformId);
         }
         return getChildPerms(menus, 0);
     }
 
 
-    public List<SysMenu> selectMenuTreeByUserIdOne(Integer tenantId){
+    public List<SysMenu> selectMenuTreeByUserIdOne(Integer tenantId) {
         List<SysMenu> menus = menuMapper.selectMenuTreeByUserIdOne(tenantId);
         return getChildPerms(menus, 0);
     }
 
-    public List<SysMenu> selectMenuTreeByUserIdOne1(Integer tenantId,Integer platformId){
-        List<SysMenu> menus = menuMapper.selectMenuTreeByUserIdOne1(tenantId,platformId);
+    public List<SysMenu> selectMenuTreeByUserIdOne1(Integer tenantId, Integer platformId) {
+        List<SysMenu> menus = menuMapper.selectMenuTreeByUserIdOne1(tenantId, platformId);
         return getChildPerms(menus, 0);
     }
 
     @Override
-    public List<SysTenantMenu> selectTenantMenuList(Integer tenantId){
+    public List<SysTenantMenu> selectTenantMenuList(Integer tenantId) {
         List<SysTenantMenu> menus = tenantMenuMapper.selectTenantMenuList(tenantId);
         return menus;
     }
@@ -229,8 +206,7 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 选中菜单列表
      */
     @Override
-    public List<Integer> selectMenuListByRoleId(Long roleId)
-    {
+    public List<Integer> selectMenuListByRoleId(Long roleId) {
         SysRole role = roleMapper.selectRoleById(roleId);
         return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly());
     }
@@ -242,11 +218,9 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 路由列表
      */
     @Override
-    public List<RouterVo> buildMenus(List<SysMenu> menus)
-    {
+    public List<RouterVo> buildMenus(List<SysMenu> menus) {
         List<RouterVo> routers = new LinkedList<RouterVo>();
-        for (SysMenu menu : menus)
-        {
+        for (SysMenu menu : menus) {
             RouterVo router = new RouterVo();
             router.setHidden("1".equals(menu.getVisible()));
             router.setName(getRouteName(menu));
@@ -254,14 +228,11 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
             router.setComponent(getComponent(menu));
             router.setMeta(new MetaVo(menu.getMenuName(), menu.getMenuAliasName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath(), menu.getIsFrame(), menu.getIsNew(), menu.getRemark()));
             List<SysMenu> cMenus = menu.getChildren();
-            if (!cMenus.isEmpty() && cMenus.size() > 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType()))
-            {
+            if (!cMenus.isEmpty() && cMenus.size() > 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType())) {
                 router.setAlwaysShow(true);
                 router.setRedirect("noRedirect");
                 router.setChildren(buildMenus(cMenus));
-            }
-            else if (isMenuFrame(menu))
-            {
+            } else if (isMenuFrame(menu)) {
                 router.setMeta(null);
                 List<RouterVo> childrenList = new ArrayList<RouterVo>();
                 RouterVo children = new RouterVo();
@@ -271,14 +242,12 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
                 children.setMeta(new MetaVo(menu.getMenuName(), menu.getMenuAliasName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath(), menu.getIsFrame(), menu.getIsNew(), menu.getRemark()));
                 childrenList.add(children);
                 router.setChildren(childrenList);
-            }
-            else if (menu.getParentId().intValue() == 0 && isInnerLink(menu))
-            {
+            } else if (menu.getParentId().intValue() == 0 && isInnerLink(menu)) {
                 router.setMeta(new MetaVo(menu.getMenuName(), menu.getMenuAliasName(), menu.getIcon(), menu.getIsFrame(), menu.getIsNew(), menu.getRemark()));
                 router.setPath("/inner");
                 List<RouterVo> childrenList = new ArrayList<RouterVo>();
                 RouterVo children = new RouterVo();
-                String routerPath = StringUtils.replaceEach(menu.getPath(), new String[] { Constants.HTTP, Constants.HTTPS }, new String[] { "", "" });
+                String routerPath = StringUtils.replaceEach(menu.getPath(), new String[]{Constants.HTTP, Constants.HTTPS}, new String[]{"", ""});
                 children.setPath(routerPath);
                 children.setComponent(UserConstants.INNER_LINK);
                 children.setName(StringUtils.capitalize(routerPath));
@@ -296,23 +265,23 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 路由列表
      */
     @Override
-    public List<PlatformRouterVo> buildPlatformMenus()
-    {
+    public List<PlatformRouterVo> buildPlatformMenus() {
         List<PlatformRouterVo> platformRouterVos = new LinkedList<PlatformRouterVo>();
-        if (SecurityUtils.getLoginUser().getSysUser().getUserType().equals("01")){
-            List<SysPlatformVo> sysPlatformVos = sysPlatformMapper.getTenantPlatformList(SecurityUtils.getTenantId());
-            if (CollectionUtils.isNotEmpty(sysPlatformVos)){
-                for (SysPlatformVo platformVo : sysPlatformVos)
-                {
+        Long userId = SecurityUtils.getUserId();
+        Integer tenantId = SecurityUtils.getTenantId();
+        String userType = SecurityUtils.getLoginUser().getSysUser().getUserType();
+        if ("01".equals(userType)) {
+            List<SysPlatformVo> sysPlatformVos = sysPlatformMapper.getTenantPlatformList(tenantId);
+            if (CollectionUtils.isNotEmpty(sysPlatformVos)) {
+                for (SysPlatformVo platformVo : sysPlatformVos) {
                     PlatformRouterVo platformRouterVo = new PlatformRouterVo();
                     platformRouterVo.setPlatformId(platformVo.getId());
                     platformRouterVo.setPlatformName(platformVo.getPlatformName());
                     platformRouterVo.setIcon(platformVo.getIcon());
-                    List<SysMenu> menus1 = this.selectMenuTreeByUserIdOne1(SecurityUtils.getTenantId(),
+                    List<SysMenu> menus1 = this.selectMenuTreeByUserIdOne1(tenantId,
                             platformVo.getId());
                     List<RouterVo> routers = new LinkedList<RouterVo>();
-                    for (SysMenu menu : menus1)
-                    {
+                    for (SysMenu menu : menus1) {
                         RouterVo router = new RouterVo();
                         router.setHidden("1".equals(menu.getVisible()));
                         router.setName(getRouteName(menu));
@@ -320,14 +289,11 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
                         router.setComponent(getComponent(menu));
                         router.setMeta(new MetaVo(menu.getMenuName(), menu.getMenuAliasName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath(), menu.getIsFrame(), menu.getIsNew(), menu.getRemark()));
                         List<SysMenu> cMenus = menu.getChildren();
-                        if (!cMenus.isEmpty() && cMenus.size() > 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType()))
-                        {
+                        if (!cMenus.isEmpty() && UserConstants.TYPE_DIR.equals(menu.getMenuType())) {
                             router.setAlwaysShow(true);
                             router.setRedirect("noRedirect");
                             router.setChildren(buildMenus(cMenus));
-                        }
-                        else if (isMenuFrame(menu))
-                        {
+                        } else if (isMenuFrame(menu)) {
                             router.setMeta(null);
                             List<RouterVo> childrenList = new ArrayList<RouterVo>();
                             RouterVo children = new RouterVo();
@@ -337,14 +303,12 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
                             children.setMeta(new MetaVo(menu.getMenuName(), menu.getMenuAliasName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath(), menu.getIsFrame(), menu.getIsNew(), menu.getRemark()));
                             childrenList.add(children);
                             router.setChildren(childrenList);
-                        }
-                        else if (menu.getParentId().intValue() == 0 && isInnerLink(menu))
-                        {
+                        } else if (menu.getParentId().intValue() == 0 && isInnerLink(menu)) {
                             router.setMeta(new MetaVo(menu.getMenuName(), menu.getMenuAliasName(), menu.getIcon(), menu.getIsFrame(), menu.getIsNew(), menu.getRemark()));
                             router.setPath("/inner");
                             List<RouterVo> childrenList = new ArrayList<RouterVo>();
                             RouterVo children = new RouterVo();
-                            String routerPath = StringUtils.replaceEach(menu.getPath(), new String[] { Constants.HTTP, Constants.HTTPS }, new String[] { "", "" });
+                            String routerPath = StringUtils.replaceEach(menu.getPath(), new String[]{Constants.HTTP, Constants.HTTPS}, new String[]{"", ""});
                             children.setPath(routerPath);
                             children.setComponent(UserConstants.INNER_LINK);
                             children.setName(StringUtils.capitalize(routerPath));
@@ -358,25 +322,27 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
                     platformRouterVos.add(platformRouterVo);
                 }
             }
-        }else {
+        } else {
             LambdaQueryWrapper<SysUserRole> queryWrapper = Wrappers.lambdaQuery();
-            queryWrapper.in(SysUserRole::getUserId,SecurityUtils.getUserId());
+            queryWrapper.eq(SysUserRole::getUserId, userId)
+                    .eq(SysUserRole::getTenantId, tenantId);
             List<SysUserRole> userRoleList = sysUserRoleMapper.selectList(queryWrapper);
-            if (CollectionUtils.isNotEmpty(userRoleList)){
-                List<SysPlatformVo> sysPlatformVos = sysPlatformMapper.getRolePlatformList(SecurityUtils.getTenantId(),
-                        userRoleList.get(0).getRoleId().intValue());
-                if (CollectionUtils.isNotEmpty(sysPlatformVos)){
-                    for (SysPlatformVo platformVo : sysPlatformVos)
-                    {
+            if (CollectionUtils.isNotEmpty(userRoleList)) {
+                List<SysPlatformVo> sysPlatformVos = userRoleList.stream()
+                        .map(userRole -> sysPlatformMapper.getRolePlatformList(tenantId, Math.toIntExact(userRole.getRoleId())))
+                        .flatMap(Collection::stream)
+                        .distinct()
+                        .collect(Collectors.toList());
+                if (CollectionUtils.isNotEmpty(sysPlatformVos)) {
+                    for (SysPlatformVo platformVo : sysPlatformVos) {
                         PlatformRouterVo platformRouterVo = new PlatformRouterVo();
                         platformRouterVo.setPlatformId(platformVo.getId());
                         platformRouterVo.setPlatformName(platformVo.getPlatformName());
                         platformRouterVo.setIcon(platformVo.getIcon());
-                        List<SysMenu> menus1 = this.selectMenuTreeByUserId1(SecurityUtils.getUserId(),
+                        List<SysMenu> menus1 = this.selectMenuTreeByUserId1(userId,
                                 platformVo.getId().longValue());
                         List<RouterVo> routers = new LinkedList<RouterVo>();
-                        for (SysMenu menu : menus1)
-                        {
+                        for (SysMenu menu : menus1) {
                             RouterVo router = new RouterVo();
                             router.setHidden("1".equals(menu.getVisible()));
                             router.setName(getRouteName(menu));
@@ -384,14 +350,11 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
                             router.setComponent(getComponent(menu));
                             router.setMeta(new MetaVo(menu.getMenuName(), menu.getMenuAliasName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath(), menu.getIsFrame(), menu.getIsNew(), menu.getRemark()));
                             List<SysMenu> cMenus = menu.getChildren();
-                            if (!cMenus.isEmpty() && cMenus.size() > 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType()))
-                            {
+                            if (!cMenus.isEmpty() && cMenus.size() > 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType())) {
                                 router.setAlwaysShow(true);
                                 router.setRedirect("noRedirect");
                                 router.setChildren(buildMenus(cMenus));
-                            }
-                            else if (isMenuFrame(menu))
-                            {
+                            } else if (isMenuFrame(menu)) {
                                 router.setMeta(null);
                                 List<RouterVo> childrenList = new ArrayList<RouterVo>();
                                 RouterVo children = new RouterVo();
@@ -401,14 +364,12 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
                                 children.setMeta(new MetaVo(menu.getMenuName(), menu.getMenuAliasName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath(), menu.getIsFrame(), menu.getIsNew(), menu.getRemark()));
                                 childrenList.add(children);
                                 router.setChildren(childrenList);
-                            }
-                            else if (menu.getParentId().intValue() == 0 && isInnerLink(menu))
-                            {
+                            } else if (menu.getParentId().intValue() == 0 && isInnerLink(menu)) {
                                 router.setMeta(new MetaVo(menu.getMenuName(), menu.getMenuAliasName(), menu.getIcon(), menu.getIsFrame(), menu.getIsNew(), menu.getRemark()));
                                 router.setPath("/inner");
                                 List<RouterVo> childrenList = new ArrayList<RouterVo>();
                                 RouterVo children = new RouterVo();
-                                String routerPath = StringUtils.replaceEach(menu.getPath(), new String[] { Constants.HTTP, Constants.HTTPS }, new String[] { "", "" });
+                                String routerPath = StringUtils.replaceEach(menu.getPath(), new String[]{Constants.HTTP, Constants.HTTPS}, new String[]{"", ""});
                                 children.setPath(routerPath);
                                 children.setComponent(UserConstants.INNER_LINK);
                                 children.setName(StringUtils.capitalize(routerPath));
@@ -434,26 +395,21 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 树结构列表
      */
     @Override
-    public List<SysMenu> buildMenuTree(List<SysMenu> menus)
-    {
+    public List<SysMenu> buildMenuTree(List<SysMenu> menus) {
         List<SysMenu> returnList = new ArrayList<SysMenu>();
         List<Long> tempList = new ArrayList<Long>();
-        for (SysMenu dept : menus)
-        {
+        for (SysMenu dept : menus) {
             tempList.add(dept.getMenuId());
         }
-        for (Iterator<SysMenu> iterator = menus.iterator(); iterator.hasNext();)
-        {
+        for (Iterator<SysMenu> iterator = menus.iterator(); iterator.hasNext(); ) {
             SysMenu menu = (SysMenu) iterator.next();
             // 如果是顶级节点, 遍历该父节点的所有子节点
-            if (!tempList.contains(menu.getParentId()))
-            {
+            if (!tempList.contains(menu.getParentId())) {
                 recursionFn(menus, menu);
                 returnList.add(menu);
             }
         }
-        if (returnList.isEmpty())
-        {
+        if (returnList.isEmpty()) {
             returnList = menus;
         }
         return returnList;
@@ -466,26 +422,21 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 树结构列表
      */
     @Override
-    public List<SysMobileMenu> buildMobileMenuTree(List<SysMobileMenu> menus)
-    {
+    public List<SysMobileMenu> buildMobileMenuTree(List<SysMobileMenu> menus) {
         List<SysMobileMenu> returnList = new ArrayList<SysMobileMenu>();
         List<Long> tempList = new ArrayList<Long>();
-        for (SysMobileMenu dept : menus)
-        {
+        for (SysMobileMenu dept : menus) {
             tempList.add(dept.getMenuId());
         }
-        for (Iterator<SysMobileMenu> iterator = menus.iterator(); iterator.hasNext();)
-        {
+        for (Iterator<SysMobileMenu> iterator = menus.iterator(); iterator.hasNext(); ) {
             SysMobileMenu menu = (SysMobileMenu) iterator.next();
             // 如果是顶级节点, 遍历该父节点的所有子节点
-            if (!tempList.contains(menu.getParentId()))
-            {
+            if (!tempList.contains(menu.getParentId())) {
                 recursionMobileFn(menus, menu);
                 returnList.add(menu);
             }
         }
-        if (returnList.isEmpty())
-        {
+        if (returnList.isEmpty()) {
             returnList = menus;
         }
         return returnList;
@@ -498,8 +449,7 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 下拉树结构列表
      */
     @Override
-    public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus)
-    {
+    public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus) {
         List<SysMenu> menuTrees = buildMenuTree(menus);
         return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
     }
@@ -511,8 +461,7 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 下拉树结构列表
      */
     @Override
-    public List<TreeMobileSelect> buildMobileMenuTreeSelect(List<SysMobileMenu> menus)
-    {
+    public List<TreeMobileSelect> buildMobileMenuTreeSelect(List<SysMobileMenu> menus) {
         List<SysMobileMenu> menuTrees = buildMobileMenuTree(menus);
         return menuTrees.stream().map(TreeMobileSelect::new).collect(Collectors.toList());
     }
@@ -524,8 +473,7 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 菜单信息
      */
     @Override
-    public SysMenu selectMenuById(Long menuId)
-    {
+    public SysMenu selectMenuById(Long menuId) {
         return menuMapper.selectMenuById(menuId);
     }
 
@@ -536,8 +484,7 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 结果
      */
     @Override
-    public boolean hasChildByMenuId(Long menuId)
-    {
+    public boolean hasChildByMenuId(Long menuId) {
         int result = menuMapper.hasChildByMenuId(menuId);
         return result > 0 ? true : false;
     }
@@ -549,8 +496,7 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 结果
      */
     @Override
-    public boolean checkMenuExistRole(Long menuId)
-    {
+    public boolean checkMenuExistRole(Long menuId) {
         int result = roleMenuMapper.checkMenuExistRole(menuId);
         return result > 0 ? true : false;
     }
@@ -562,8 +508,7 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 结果
      */
     @Override
-    public int insertMenu(SysMenu menu)
-    {
+    public int insertMenu(SysMenu menu) {
         return menuMapper.insertMenu(menu);
     }
 
@@ -574,55 +519,53 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 结果
      */
     @Override
-    public int updateMenu(SysMenu menu)
-    {
+    public int updateMenu(SysMenu menu) {
         return menuMapper.updateMenu(menu);
     }
 
     @Override
-    public void updateTenantMenu(SysTenantMenu tenantMenu){
+    public void updateTenantMenu(SysTenantMenu tenantMenu) {
         UpdateWrapper<SysTenantMenu> updateWrapper = Wrappers.update();
-        updateWrapper.set("menu_alias_name",tenantMenu.getMenuAliasName())
-                .eq("tenant_id",tenantMenu.getTenantId())
-                .eq("menu_id",tenantMenu.getMenuId());
+        updateWrapper.set("menu_alias_name", tenantMenu.getMenuAliasName())
+                .eq("tenant_id", tenantMenu.getTenantId())
+                .eq("menu_id", tenantMenu.getMenuId());
         tenantMenuService.update(updateWrapper);
 
 
-
         LambdaQueryWrapper<SysUser> queryWrapper1 = Wrappers.lambdaQuery();
         queryWrapper1.select(SysUser::getUserId)
-                .eq(SysUser::getStatus,0)
-                .eq(SysUser::getDelFlag,0)
-                .eq(SysUser::getTenantId,SecurityUtils.getTenantId());
+                .eq(SysUser::getStatus, 0)
+                .eq(SysUser::getDelFlag, 0)
+                .eq(SysUser::getTenantId, SecurityUtils.getTenantId());
         List<SysUser> list = sysUserMapper.selectList(queryWrapper1);
         List<Long> userIdList = new ArrayList<>();
-        if(CollectionUtils.isNotEmpty(list)){
+        if (CollectionUtils.isNotEmpty(list)) {
             for (int i = 0; i < list.size(); i++) {
                 userIdList.add(list.get(i).getUserId());
             }
         }
 
-        if(userIdList.size() > 0){
+        if (userIdList.size() > 0) {
             LambdaQueryWrapper<SysUserRole> queryWrapper = Wrappers.lambdaQuery();
-            queryWrapper.in(SysUserRole::getUserId,userIdList);
+            queryWrapper.in(SysUserRole::getUserId, userIdList);
             List<SysUserRole> userRoleList = sysUserRoleMapper.selectList(queryWrapper);
             List<Long> roleIdList = new ArrayList<>();
-            if(userRoleList.size() > 0){
+            if (userRoleList.size() > 0) {
                 for (int i = 0; i < userRoleList.size(); i++) {
-                    if(roleIdList.contains(userRoleList.get(i).getRoleId())){
+                    if (roleIdList.contains(userRoleList.get(i).getRoleId())) {
 
-                    }else{
+                    } else {
                         roleIdList.add(userRoleList.get(i).getRoleId());
                     }
                 }
             }
 
-            if(roleIdList.size() > 0){
+            if (roleIdList.size() > 0) {
                 UpdateWrapper<SysRoleMenu> updateWrapper1 = Wrappers.update();
-                updateWrapper1.set("menu_alias_name",tenantMenu.getMenuAliasName())
-                        .in("role_id",roleIdList)
-                        .eq("menu_id",tenantMenu.getMenuId());
-                sysRoleMenuMapper.update(null,updateWrapper1);
+                updateWrapper1.set("menu_alias_name", tenantMenu.getMenuAliasName())
+                        .in("role_id", roleIdList)
+                        .eq("menu_id", tenantMenu.getMenuId());
+                sysRoleMenuMapper.update(null, updateWrapper1);
             }
 
         }
@@ -636,8 +579,7 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 结果
      */
     @Override
-    public int deleteMenuById(Long menuId)
-    {
+    public int deleteMenuById(Long menuId) {
         return menuMapper.deleteMenuById(menuId);
     }
 
@@ -648,12 +590,10 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @return 结果
      */
     @Override
-    public String checkMenuNameUnique(SysMenu menu)
-    {
+    public String checkMenuNameUnique(SysMenu menu) {
         Long menuId = Objects.isNull(menu.getMenuId()) ? -1L : menu.getMenuId();
         SysMenu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId());
-        if (Objects.nonNull(info) && info.getMenuId().longValue() != menuId.longValue())
-        {
+        if (Objects.nonNull(info) && info.getMenuId().longValue() != menuId.longValue()) {
             return UserConstants.NOT_UNIQUE;
         }
         return UserConstants.UNIQUE;
@@ -665,12 +605,10 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @param menu 菜单信息
      * @return 路由名称
      */
-    public String getRouteName(SysMenu menu)
-    {
+    public String getRouteName(SysMenu menu) {
         String routerName = StringUtils.capitalize(menu.getPath());
         // 非外链并且是一级目录(类型为目录)
-        if (isMenuFrame(menu))
-        {
+        if (isMenuFrame(menu)) {
             routerName = StringUtils.EMPTY;
         }
         return routerName;
@@ -682,23 +620,19 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @param menu 菜单信息
      * @return 路由地址
      */
-    public String getRouterPath(SysMenu menu)
-    {
+    public String getRouterPath(SysMenu menu) {
         String routerPath = menu.getPath();
         // 内链打开外网方式
-        if (menu.getParentId().intValue() != 0 && isInnerLink(menu))
-        {
-            routerPath = StringUtils.replaceEach(routerPath, new String[] { Constants.HTTP, Constants.HTTPS }, new String[] { "", "" });
+        if (menu.getParentId().intValue() != 0 && isInnerLink(menu)) {
+            routerPath = StringUtils.replaceEach(routerPath, new String[]{Constants.HTTP, Constants.HTTPS}, new String[]{"", ""});
         }
         // 非外链并且是一级目录(类型为目录)
         if (0 == menu.getParentId().intValue() && UserConstants.TYPE_DIR.equals(menu.getMenuType())
-                && UserConstants.NO_FRAME.equals(menu.getIsFrame()))
-        {
+                && UserConstants.NO_FRAME.equals(menu.getIsFrame())) {
             routerPath = "/" + menu.getPath();
         }
         // 非外链并且是一级目录(类型为菜单)
-        else if (isMenuFrame(menu))
-        {
+        else if (isMenuFrame(menu)) {
             routerPath = "/";
         }
         return routerPath;
@@ -710,19 +644,13 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @param menu 菜单信息
      * @return 组件信息
      */
-    public String getComponent(SysMenu menu)
-    {
+    public String getComponent(SysMenu menu) {
         String component = UserConstants.LAYOUT;
-        if (StringUtils.isNotEmpty(menu.getComponent()) && !isMenuFrame(menu))
-        {
+        if (StringUtils.isNotEmpty(menu.getComponent()) && !isMenuFrame(menu)) {
             component = menu.getComponent();
-        }
-        else if (StringUtils.isEmpty(menu.getComponent()) && menu.getParentId().intValue() != 0 && isInnerLink(menu))
-        {
+        } else if (StringUtils.isEmpty(menu.getComponent()) && menu.getParentId().intValue() != 0 && isInnerLink(menu)) {
             component = UserConstants.INNER_LINK;
-        }
-        else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu))
-        {
+        } else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu)) {
             component = UserConstants.PARENT_VIEW;
         }
         return component;
@@ -734,8 +662,7 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @param menu 菜单信息
      * @return 结果
      */
-    public boolean isMenuFrame(SysMenu menu)
-    {
+    public boolean isMenuFrame(SysMenu menu) {
         return menu.getParentId().intValue() == 0 && UserConstants.TYPE_MENU.equals(menu.getMenuType())
                 && menu.getIsFrame().equals(UserConstants.NO_FRAME);
     }
@@ -746,8 +673,7 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @param menu 菜单信息
      * @return 结果
      */
-    public boolean isInnerLink(SysMenu menu)
-    {
+    public boolean isInnerLink(SysMenu menu) {
         return menu.getIsFrame().equals(UserConstants.NO_FRAME) && StringUtils.startsWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS);
     }
 
@@ -757,8 +683,7 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @param menu 菜单信息
      * @return 结果
      */
-    public boolean isParentView(SysMenu menu)
-    {
+    public boolean isParentView(SysMenu menu) {
         return menu.getParentId().intValue() != 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType());
     }
 
@@ -769,15 +694,12 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @param parentId 传入的父节点ID
      * @return String
      */
-    public List<SysMenu> getChildPerms(List<SysMenu> list, int parentId)
-    {
+    public List<SysMenu> getChildPerms(List<SysMenu> list, int parentId) {
         List<SysMenu> returnList = new ArrayList<SysMenu>();
-        for (Iterator<SysMenu> iterator = list.iterator(); iterator.hasNext();)
-        {
+        for (Iterator<SysMenu> iterator = list.iterator(); iterator.hasNext(); ) {
             SysMenu t = (SysMenu) iterator.next();
             // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点
-            if (t.getParentId() == parentId)
-            {
+            if (t.getParentId() == parentId) {
                 recursionFn(list, t);
                 returnList.add(t);
             }
@@ -791,15 +713,12 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @param list
      * @param t
      */
-    private void recursionFn(List<SysMenu> list, SysMenu t)
-    {
+    private void recursionFn(List<SysMenu> list, SysMenu t) {
         // 得到子节点列表
         List<SysMenu> childList = getChildList(list, t);
         t.setChildren(childList);
-        for (SysMenu tChild : childList)
-        {
-            if (hasChild(list, tChild))
-            {
+        for (SysMenu tChild : childList) {
+            if (hasChild(list, tChild)) {
                 recursionFn(list, tChild);
             }
         }
@@ -811,15 +730,12 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
      * @param list
      * @param t
      */
-    private void recursionMobileFn(List<SysMobileMenu> list, SysMobileMenu t)
-    {
+    private void recursionMobileFn(List<SysMobileMenu> list, SysMobileMenu t) {
         // 得到子节点列表
         List<SysMobileMenu> childList = getChildMobileList(list, t);
         t.setChildren(childList);
-        for (SysMobileMenu tChild : childList)
-        {
-            if (hasMobileChild(list, tChild))
-            {
+        for (SysMobileMenu tChild : childList) {
+            if (hasMobileChild(list, tChild)) {
                 recursionMobileFn(list, tChild);
             }
         }
@@ -828,15 +744,12 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
     /**
      * 得到子节点列表
      */
-    private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t)
-    {
+    private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t) {
         List<SysMenu> tlist = new ArrayList<SysMenu>();
         Iterator<SysMenu> it = list.iterator();
-        while (it.hasNext())
-        {
+        while (it.hasNext()) {
             SysMenu n = (SysMenu) it.next();
-            if (n.getParentId().longValue() == t.getMenuId().longValue())
-            {
+            if (n.getParentId().longValue() == t.getMenuId().longValue()) {
                 tlist.add(n);
             }
         }
@@ -846,15 +759,12 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
     /**
      * 得到移动端子节点列表
      */
-    private List<SysMobileMenu> getChildMobileList(List<SysMobileMenu> list, SysMobileMenu t)
-    {
+    private List<SysMobileMenu> getChildMobileList(List<SysMobileMenu> list, SysMobileMenu t) {
         List<SysMobileMenu> tlist = new ArrayList<SysMobileMenu>();
         Iterator<SysMobileMenu> it = list.iterator();
-        while (it.hasNext())
-        {
+        while (it.hasNext()) {
             SysMobileMenu n = (SysMobileMenu) it.next();
-            if (n.getParentId().longValue() == t.getMenuId())
-            {
+            if (n.getParentId().longValue() == t.getMenuId()) {
                 tlist.add(n);
             }
         }
@@ -864,30 +774,27 @@ public class SysMenuServiceImpl extends AbstractCrudService<SysMenuMapper, SysMe
     /**
      * 判断是否有子节点
      */
-    private boolean hasChild(List<SysMenu> list, SysMenu t)
-    {
+    private boolean hasChild(List<SysMenu> list, SysMenu t) {
         return getChildList(list, t).size() > 0 ? true : false;
     }
 
     /**
      * 判断移动端是否有子节点
      */
-    private boolean hasMobileChild(List<SysMobileMenu> list, SysMobileMenu t)
-    {
+    private boolean hasMobileChild(List<SysMobileMenu> list, SysMobileMenu t) {
         return getChildMobileList(list, t).size() > 0 ? true : false;
     }
 
     @Override
-    public List<TenantPlatformMenuVo> selectRolePlatformMenu()
-    {
+    public List<TenantPlatformMenuVo> selectRolePlatformMenu() {
         List<TenantPlatformMenuVo> list1 = new ArrayList<>();
         List<SysPlatformVo> list = sysPlatformMapper.getTenantPlatformList(SecurityUtils.getTenantId());
-        if (CollectionUtils.isNotEmpty(list)){
-            for(int i=0;i<list.size();i++){
+        if (CollectionUtils.isNotEmpty(list)) {
+            for (int i = 0; i < list.size(); i++) {
                 TenantPlatformMenuVo tenantPlatformMenuVo = new TenantPlatformMenuVo();
                 tenantPlatformMenuVo.setId(list.get(i).getId());
                 tenantPlatformMenuVo.setLabel(list.get(i).getPlatformName());
-                List<SysMenu> menus = baseMapper.getTenantPlatformMenuList(SecurityUtils.getTenantId(),list.get(i).getId());
+                List<SysMenu> menus = baseMapper.getTenantPlatformMenuList(SecurityUtils.getTenantId(), list.get(i).getId());
                 tenantPlatformMenuVo.setChildren(this.buildMenuTreeSelect(menus));
                 list1.add(tenantPlatformMenuVo);
             }

+ 70 - 31
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysNoticeServiceImpl.java

@@ -1,111 +1,150 @@
 package com.usky.system.service.impl;
 
 
-import com.google.gson.JsonObject;
-import com.usky.common.core.bean.ApiResult;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.usky.common.core.exception.BusinessException;
 import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.common.security.utils.SecurityUtils;
+import com.usky.system.domain.MceRequestVO;
 import com.usky.system.domain.SysNotice;
+import com.usky.system.domain.SysUser;
 import com.usky.system.mapper.SysNoticeMapper;
+import com.usky.system.mapper.SysUserMapper;
 import com.usky.system.service.ISysNoticeService;
 import com.usky.system.service.MceReceiveService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.HashMap;
+import java.util.Arrays;
 import java.util.List;
-import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 公告 服务层实现
- * 
+ *
  * @author ruoyi
  */
 @Service
-public class SysNoticeServiceImpl extends AbstractCrudService<SysNoticeMapper, SysNotice> implements ISysNoticeService
-{
+public class SysNoticeServiceImpl extends AbstractCrudService<SysNoticeMapper, SysNotice> implements ISysNoticeService {
     @Autowired
     private SysNoticeMapper noticeMapper;
 
     @Autowired
     private MceReceiveService mceReceiveService;
 
+    @Autowired
+    private SysUserMapper sysUserMapper;
+
     /**
      * 查询公告信息
-     * 
+     *
      * @param noticeId 公告ID
      * @return 公告信息
      */
     @Override
-    public SysNotice selectNoticeById(Long noticeId)
-    {
+    public SysNotice selectNoticeById(Long noticeId) {
         return noticeMapper.selectNoticeById(noticeId);
     }
 
     /**
      * 查询公告列表
-     * 
+     *
      * @param notice 公告信息
      * @return 公告集合
      */
     @Override
-    public List<SysNotice> selectNoticeList(SysNotice notice)
-    {
+    public List<SysNotice> selectNoticeList(SysNotice notice) {
+        notice.setTenantId(SecurityUtils.getTenantId());
+        String deptId = SecurityUtils.getLoginUser().getSysUser().getDeptId().toString();
+        notice.setDeptId(deptId);
         return noticeMapper.selectNoticeList(notice);
     }
 
     /**
      * 新增公告
-     * 
+     *
      * @param notice 公告信息
      * @return 结果
      */
     @Override
-    public int insertNotice(SysNotice notice)
-    {
+    public int insertNotice(SysNotice notice) {
+        notice.setTenantId(SecurityUtils.getTenantId());
         noticeMapper.insertNotice(notice);
         int insertId = notice.getNoticeId();
-        JsonObject jsonObject = new JsonObject();
-        jsonObject.addProperty("infoTitle", notice.getNoticeTitle());
-        jsonObject.addProperty("infoContent",notice.getNoticeContent());
-        jsonObject.addProperty("infoType",1);
-        jsonObject.addProperty("id",insertId);
-        mceReceiveService.add(jsonObject.toString());
+
+        String deptId = notice.getDeptId();
+        List<Long> deptIds = Arrays.stream(deptId.split(",")).map(Long::parseLong).collect(Collectors.toList());
+        List<Long> usersIds = sysUserMapper.selectList(Wrappers.lambdaQuery(SysUser.class).select(SysUser::getUserId).in(SysUser::getDeptId, deptIds)).stream().map(SysUser::getUserId).collect(Collectors.toList());
+
+        if (!deptIds.isEmpty()) {
+            sendNotice(notice.getNoticeTitle(), insertId, notice.getCreateBy(), usersIds);
+        }
+
         return insertId;
     }
 
+    /**
+     * 发送消息
+     * @param infoContent 消息内容
+     * @param id 通知公告id
+     * @param userName 发布人
+     * @param userIds 接收人
+     */
+    private void sendNotice(String infoContent, Integer id, String userName, List<Long> userIds) {
+
+        // JSONObject jsonObject = new JSONObject();
+        // jsonObject.put("infoTitle", "通知公告");
+        // jsonObject.put("infoContent", infoContent);
+        // jsonObject.put("infoType", 1);
+        // jsonObject.put("id", id);
+        // jsonObject.put("userName", userName);
+        // jsonObject.put("userIds", userIds);
+        MceRequestVO mceRequestVO = new MceRequestVO();
+        mceRequestVO.setInfoTitle("通知公告");
+        mceRequestVO.setInfoContent(infoContent);
+        mceRequestVO.setInfoType("1");
+        mceRequestVO.setId(id);
+        mceRequestVO.setUserName(userName);
+        mceRequestVO.setUserIds(userIds);
+        try {
+            //mceReceiveService.add(jsonObject.toString());
+            mceReceiveService.addMceReceive(mceRequestVO);
+        } catch (Exception e) {
+            log.error(String.format("公告:%d,消息发送失败:%s", id, e.getMessage()));
+        }
+    }
+
     /**
      * 修改公告
-     * 
+     *
      * @param notice 公告信息
      * @return 结果
      */
     @Override
-    public int updateNotice(SysNotice notice)
-    {
+    public int updateNotice(SysNotice notice) {
         return noticeMapper.updateNotice(notice);
     }
 
     /**
      * 删除公告对象
-     * 
+     *
      * @param noticeId 公告ID
      * @return 结果
      */
     @Override
-    public int deleteNoticeById(Long noticeId)
-    {
+    public int deleteNoticeById(Long noticeId) {
         return noticeMapper.deleteNoticeById(noticeId);
     }
 
     /**
      * 批量删除公告信息
-     * 
+     *
      * @param noticeIds 需要删除的公告ID
      * @return 结果
      */
     @Override
-    public int deleteNoticeByIds(Long[] noticeIds)
-    {
+    public int deleteNoticeByIds(Long[] noticeIds) {
         return noticeMapper.deleteNoticeByIds(noticeIds);
     }
 }

+ 7 - 4
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysRoleServiceImpl.java

@@ -125,9 +125,9 @@ public class SysRoleServiceImpl extends AbstractCrudService<SysRoleMapper, SysRo
      * @return 选中角色ID列表
      */
     @Override
-    public List<Integer> selectRoleListByUserId(Long userId)
+    public List<Integer> selectRoleListByUserId(Long userId, Integer tenantId)
     {
-        return roleMapper.selectRoleListByUserId(userId);
+        return roleMapper.selectRoleListByUserId(userId,tenantId);
     }
 
     /**
@@ -201,7 +201,7 @@ public class SysRoleServiceImpl extends AbstractCrudService<SysRoleMapper, SysRo
     @Override
     public int countUserRoleByRoleId(Long roleId)
     {
-        return userRoleMapper.countUserRoleByRoleId(roleId);
+        return userRoleMapper.countUserRoleByRoleId(roleId,SecurityUtils.getTenantId());
     }
 
     /**
@@ -395,7 +395,8 @@ public class SysRoleServiceImpl extends AbstractCrudService<SysRoleMapper, SysRo
     @Override
     public int deleteAuthUsers(Long roleId, Long[] userIds)
     {
-        return userRoleMapper.deleteUserRoleInfos(roleId, userIds);
+        Integer tenantId = SecurityUtils.getTenantId();
+        return userRoleMapper.deleteUserRoleInfos(roleId, userIds, tenantId);
     }
 
     /**
@@ -410,11 +411,13 @@ public class SysRoleServiceImpl extends AbstractCrudService<SysRoleMapper, SysRo
     {
         // 新增用户与角色管理
         List<SysUserRole> list = new ArrayList<SysUserRole>();
+        Integer tenantId = SecurityUtils.getTenantId();
         for (Long userId : userIds)
         {
             SysUserRole ur = new SysUserRole();
             ur.setUserId(userId);
             ur.setRoleId(roleId);
+            ur.setTenantId(tenantId);
             list.add(ur);
         }
         return userRoleMapper.batchUserRole(list);

+ 8 - 5
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysUserServiceImpl.java

@@ -406,7 +406,7 @@ public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUs
     public int updateUser(SysUser user) {
         Long userId = user.getUserId();
         // 删除用户与角色关联
-        userRoleMapper.deleteUserRoleByUserId(userId);
+        userRoleMapper.deleteUserRoleByUserId(userId,SecurityUtils.getTenantId());
         // 新增用户与角色管理
         insertUserRole(user);
         // 删除用户与岗位关联
@@ -437,7 +437,7 @@ public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUs
     @Override
     @Transactional
     public void insertUserAuth(Long userId, Long[] roleIds) {
-        userRoleMapper.deleteUserRoleByUserId(userId);
+        userRoleMapper.deleteUserRoleByUserId(userId, SecurityUtils.getTenantId());
         insertUserRole(userId, roleIds);
     }
 
@@ -512,6 +512,7 @@ public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUs
                 SysUserRole ur = new SysUserRole();
                 ur.setUserId(user.getUserId());
                 ur.setRoleId(roleId);
+                ur.setTenantId(SecurityUtils.getTenantId());
                 list.add(ur);
             }
             if (list.size() > 0) {
@@ -552,10 +553,12 @@ public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUs
         if (Objects.nonNull(roleIds)) {
             // 新增用户与角色管理
             List<SysUserRole> list = new ArrayList<SysUserRole>();
+            Integer tenantId = SecurityUtils.getTenantId();
             for (Long roleId : roleIds) {
                 SysUserRole ur = new SysUserRole();
                 ur.setUserId(userId);
                 ur.setRoleId(roleId);
+                ur.setTenantId(tenantId);
                 list.add(ur);
             }
             if (list.size() > 0) {
@@ -574,7 +577,7 @@ public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUs
     @Transactional
     public int deleteUserById(Long userId) {
         // 删除用户与角色关联
-        userRoleMapper.deleteUserRoleByUserId(userId);
+        userRoleMapper.deleteUserRoleByUserId(userId, SecurityUtils.getTenantId());
         // 删除用户与岗位表
         userPostMapper.deleteUserPostByUserId(userId);
         return userMapper.deleteUserById(userId);
@@ -593,7 +596,7 @@ public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUs
             checkUserAllowed(new SysUser(userId));
         }
         // 删除用户与角色关联
-        userRoleMapper.deleteUserRole(userIds);
+        userRoleMapper.deleteUserRole(userIds, SecurityUtils.getTenantId());
         // 删除用户与岗位关联
         userPostMapper.deleteUserPost(userIds);
         return userMapper.deleteUserByIds(userIds);
@@ -606,7 +609,7 @@ public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUs
         SysUser user = this.selectUserById(userId);
         if (user.getPassword().equals(password)) {
             // 删除用户与角色关联
-            userRoleMapper.deleteUserRoleByUserId(userId);
+            userRoleMapper.deleteUserRoleByUserId(userId, SecurityUtils.getTenantId());
             // 删除用户与岗位表
             userPostMapper.deleteUserPostByUserId(userId);
             return userMapper.deleteUserById(userId);

+ 25 - 11
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysUserTenantServiceImpl.java

@@ -6,7 +6,9 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.usky.common.core.exception.BusinessException;
 import com.usky.system.RemoteDeptService;
 import com.usky.system.domain.SysTenant;
+import com.usky.system.domain.SysUserRole;
 import com.usky.system.domain.SysUserTenant;
+import com.usky.system.mapper.SysUserRoleMapper;
 import com.usky.system.mapper.SysUserTenantMapper;
 import com.usky.system.service.SysTenantService;
 import com.usky.system.service.SysUserTenantService;
@@ -33,6 +35,9 @@ public class SysUserTenantServiceImpl extends AbstractCrudService<SysUserTenantM
     @Autowired
     private SysTenantService sysTenantService;
 
+    @Autowired
+    private SysUserRoleMapper sysUserRoleMapper;
+
     /**
      * 企业邀请用户
      *
@@ -42,9 +47,16 @@ public class SysUserTenantServiceImpl extends AbstractCrudService<SysUserTenantM
     @Transactional
     public void insertInviteUser(SysUserTenant sysUserTenant) {
         int userCount = baseMapper.checkUserIdUnique(sysUserTenant.getTenantId(), sysUserTenant.getUserId());
-        if (userCount > 0){
+        if (userCount > 0) {
             throw new BusinessException("用户已绑定,无法重复绑定!");
-        }else {
+        } else {
+            // SysUserRole sysUserRole = sysUserRoleMapper.selectOne(Wrappers.<SysUserRole>lambdaQuery().eq(SysUserRole::getUserId, sysUserTenant.getUserId()).eq(SysUserRole::getTenantId, sysUserTenant.getTenantId()));
+            // if (sysUserRole == null) {
+            //     SysUserRole sysUserRole1 = new SysUserRole();
+            //     sysUserRole1.setUserId(sysUserTenant.getUserId());
+            //     sysUserRole1.setTenantId(sysUserTenant.getTenantId());
+            //     sysUserRoleMapper.insert(sysUserRole1);
+            // }
             this.save(sysUserTenant);
         }
     }
@@ -57,8 +69,10 @@ public class SysUserTenantServiceImpl extends AbstractCrudService<SysUserTenantM
      */
     @Override
     @Transactional
-    public void deleteUserTenant(Integer tenantId,Long userId) {
+    public void deleteUserTenant(Integer tenantId, Long userId) {
         baseMapper.deleteUserTenant(tenantId, userId);
+        Long[] userIds = new Long[]{userId};
+        sysUserRoleMapper.deleteUserRole(userIds, tenantId);
     }
 
     /**
@@ -66,19 +80,19 @@ public class SysUserTenantServiceImpl extends AbstractCrudService<SysUserTenantM
      */
     @Override
     @Transactional
-    public List<SysTenant> getTenantByUser(Long userId){
+    public List<SysTenant> getTenantByUser(Long userId) {
         LambdaQueryWrapper<SysUserTenant> queryWrapper = Wrappers.lambdaQuery();
-        queryWrapper.eq(SysUserTenant::getUserId,userId);
+        queryWrapper.eq(SysUserTenant::getUserId, userId);
         List<SysUserTenant> userTenants = this.list(queryWrapper);
         List<Integer> tenantIdList = new ArrayList<>();
         List<SysTenant> tenantList = new ArrayList<>();
         LambdaQueryWrapper<SysTenant> queryWrapper1 = Wrappers.lambdaQuery();
-        if (CollectionUtils.isNotEmpty(userTenants)){
+        if (CollectionUtils.isNotEmpty(userTenants)) {
             for (int i = 0; i < userTenants.size(); i++) {
                 tenantIdList.add(userTenants.get(i).getTenantId());
             }
-            queryWrapper1.in(SysTenant::getId,tenantIdList)
-                    .eq(SysTenant::getStatus,0);
+            queryWrapper1.in(SysTenant::getId, tenantIdList)
+                    .eq(SysTenant::getStatus, 0);
             tenantList = sysTenantService.list(queryWrapper1);
         }
         return tenantList;
@@ -86,10 +100,10 @@ public class SysUserTenantServiceImpl extends AbstractCrudService<SysUserTenantM
 
     @Override
     @Transactional
-    public Boolean getIdByUser(Integer tenantId,Long userId){
+    public Boolean getIdByUser(Integer tenantId, Long userId) {
         LambdaQueryWrapper<SysUserTenant> queryWrapper = Wrappers.lambdaQuery();
-        queryWrapper.eq(SysUserTenant::getUserId,userId)
-                .eq(SysUserTenant::getTenantId,tenantId);
+        queryWrapper.eq(SysUserTenant::getUserId, userId)
+                .eq(SysUserTenant::getTenantId, tenantId);
         List<SysUserTenant> userTenants = this.list(queryWrapper);
         return userTenants.get(0).getIsDefault();
     }

+ 94 - 59
base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysNoticeMapper.xml

@@ -1,96 +1,131 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
-PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.usky.system.mapper.SysNoticeMapper">
-    
+
     <resultMap type="com.usky.system.domain.SysNotice" id="SysNoticeResult">
-        <result property="noticeId"       column="notice_id"       />
-        <result property="noticeTitle"    column="notice_title"    />
-        <result property="noticeType"     column="notice_type"     />
-        <result property="noticeContent"  column="notice_content"  />
-        <result property="status"         column="status"          />
-        <result property="createBy"       column="create_by"       />
-        <result property="createTime"     column="create_time"     />
-        <result property="updateBy"       column="update_by"       />
-        <result property="updateTime"     column="update_time"     />
-        <result property="remark"         column="remark"          />
+        <result property="noticeId" column="notice_id"/>
+        <result property="noticeTitle" column="notice_title"/>
+        <result property="noticeType" column="notice_type"/>
+        <result property="noticeContent" column="notice_content"/>
+        <result property="status" column="status"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="fileUrl" column="file_url"/>
+        <result property="author" column="author"/>
+        <result property="deptId" column="dept_id"/>
+        <result property="tenantId" column="tenant_id"/>
     </resultMap>
-    
+
     <sql id="selectNoticeVo">
-        select notice_id, notice_title, notice_type, cast(notice_content as char) as notice_content, status, create_by, create_time, update_by, update_time, remark 
-		from sys_notice
+        select notice_id,
+               notice_title,
+               notice_type,
+               notice_content,
+               status,
+               create_by,
+               create_time,
+               update_by,
+               update_time,
+               file_url,
+               author,
+               dept_id,
+               tenant_id
+        from sys_notice
     </sql>
-    
+
     <select id="selectNoticeById" parameterType="Long" resultMap="SysNoticeResult">
         <include refid="selectNoticeVo"/>
         where notice_id = #{noticeId}
     </select>
-    
+
     <select id="selectNoticeList" parameterType="com.usky.system.domain.SysNotice" resultMap="SysNoticeResult">
         <include refid="selectNoticeVo"/>
         <where>
-			<if test="noticeTitle != null and noticeTitle != ''">
-				AND notice_title like concat('%', #{noticeTitle}, '%')
-			</if>
-			<if test="noticeType != null and noticeType != ''">
-				AND notice_type = #{noticeType}
-			</if>
-			<if test="createBy != null and createBy != ''">
-				AND create_by like concat('%', #{createBy}, '%')
-			</if>
-			<if test="1 == 1">
+            <if test="noticeTitle != null and noticeTitle != ''">
+                AND notice_title like concat('%', #{noticeTitle}, '%')
+            </if>
+            <if test="noticeType != null and noticeType != ''">
+                AND notice_type = #{noticeType}
+            </if>
+            <if test="createBy != null and createBy != ''">
+                AND create_by like concat('%', #{createBy}, '%')
+            </if>
+            <if test="1 == 1">
                 and status = 0
             </if>
             <if test="noticeId != null and noticeId != ''">
                 AND notice_id = #{noticeId}
             </if>
-		</where>
+            <if test="startTime != null and endTime != null">
+                AND create_time BETWEEN #{startTime} AND #{endTime}
+            </if>
+            <if test="tenantId != null and tenantId != ''">
+                AND tenant_id = #{tenantId}
+            </if>
+            AND FIND_IN_SET(#{deptId}, dept_id) > 0
+        </where>
         order by notice_id desc
     </select>
-    
-    <insert id="insertNotice" useGeneratedKeys="true" keyProperty="noticeId"  parameterType="com.usky.system.domain.SysNotice">
+
+    <insert id="insertNotice" useGeneratedKeys="true" keyProperty="noticeId"
+            parameterType="com.usky.system.domain.SysNotice">
         insert into sys_notice (
-			<if test="noticeTitle != null and noticeTitle != '' ">notice_title, </if>
-			<if test="noticeType != null and noticeType != '' ">notice_type, </if>
-			<if test="noticeContent != null and noticeContent != '' ">notice_content, </if>
-			<if test="status != null and status != '' ">status, </if>
-			<if test="remark != null and remark != ''">remark,</if>
- 			<if test="createBy != null and createBy != ''">create_by,</if>
- 			create_time
- 		)values(
-			<if test="noticeTitle != null and noticeTitle != ''">#{noticeTitle}, </if>
-			<if test="noticeType != null and noticeType != ''">#{noticeType}, </if>
-			<if test="noticeContent != null and noticeContent != ''">#{noticeContent}, </if>
-			<if test="status != null and status != ''">#{status}, </if>
-			<if test="remark != null and remark != ''">#{remark},</if>
- 			<if test="createBy != null and createBy != ''">#{createBy},</if>
- 			sysdate()
-		)
+        <if test="noticeTitle != null and noticeTitle != '' ">notice_title,</if>
+        <if test="noticeType != null and noticeType != '' ">notice_type,</if>
+        <if test="noticeContent != null and noticeContent != '' ">notice_content,</if>
+        <if test="status != null and status != '' ">status,</if>
+        <if test="createBy != null and createBy != ''">create_by,</if>
+        <if test="fileUrl != null and fileUrl != ''">file_url,</if>
+        <if test="author != null and author != ''">author,</if>
+        <if test="deptId != null and deptId != ''">dept_id,</if>
+        <if test="tenantId != null and tenantId != ''">tenant_id,</if>
+        create_time
+        )values(
+        <if test="noticeTitle != null and noticeTitle != ''">#{noticeTitle},</if>
+        <if test="noticeType != null and noticeType != ''">#{noticeType},</if>
+        <if test="noticeContent != null and noticeContent != ''">#{noticeContent},</if>
+        <if test="status != null and status != ''">#{status},</if>
+        <if test="createBy != null and createBy != ''">#{createBy},</if>
+        <if test="fileUrl != null and fileUrl != ''">#{fileUrl},</if>
+        <if test="author != null and author != ''">#{author},</if>
+        <if test="deptId != null and deptId != ''">#{deptId},</if>
+        <if test="tenantId != null and tenantId != ''">#{tenantId},</if>
+        sysdate()
+        )
     </insert>
-	 
+
     <update id="updateNotice" parameterType="com.usky.system.domain.SysNotice">
-        update sys_notice 
+        update sys_notice
         <set>
-            <if test="noticeTitle != null and noticeTitle != ''">notice_title = #{noticeTitle}, </if>
-            <if test="noticeType != null and noticeType != ''">notice_type = #{noticeType}, </if>
-            <if test="noticeContent != null">notice_content = #{noticeContent}, </if>
-            <if test="status != null and status != ''">status = #{status}, </if>
+            <if test="noticeTitle != null and noticeTitle != ''">notice_title = #{noticeTitle},</if>
+            <if test="noticeType != null and noticeType != ''">notice_type = #{noticeType},</if>
+            <if test="noticeContent != null">notice_content = #{noticeContent},</if>
+            <if test="status != null and status != ''">status = #{status},</if>
             <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
- 			update_time = sysdate()
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="fileUrl != null and fileUrl != ''">file_url = #{fileUrl},</if>
+            <if test="author != null and author != ''">author = #{author},</if>
+            <if test="deptId != null and deptId != ''">dept_id = #{deptId},</if>
+            update_time = sysdate()
         </set>
         where notice_id = #{noticeId}
     </update>
-	
+
     <delete id="deleteNoticeById" parameterType="Long">
-        delete from sys_notice where notice_id = #{noticeId}
+        delete
+        from sys_notice
+        where notice_id = #{noticeId}
     </delete>
-    
+
     <delete id="deleteNoticeByIds" parameterType="Long">
-        delete from sys_notice where notice_id in 
+        delete from sys_notice where notice_id in
         <foreach item="noticeIds" collection="param1" open="(" separator="," close=")">
             #{noticeIds}
         </foreach>
     </delete>
-    
+
 </mapper>

+ 7 - 7
base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysRoleMapper.xml

@@ -68,13 +68,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	<select id="selectRoleAll" resultMap="SysRoleResult">
 		<include refid="selectRoleVo"/>
 	</select>
-	
-	<select id="selectRoleListByUserId" parameterType="Long" resultType="Integer">
-		select r.role_id
-        from sys_role r
-	        left join sys_user_role ur on ur.role_id = r.role_id
-	        left join sys_user u on u.user_id = ur.user_id
-	    where u.user_id = #{userId}
+
+	<select id="selectRoleListByUserId" parameterType="map" resultType="Integer">
+		SELECT r.role_id
+		FROM sys_role r
+				 LEFT JOIN sys_user_role ur ON ur.role_id = r.role_id
+				 LEFT JOIN sys_user u ON u.user_id = ur.user_id
+		WHERE u.user_id = #{userId, jdbcType=BIGINT} AND r.tenant_id = #{tenantId, jdbcType=INTEGER}
 	</select>
 	
 	<select id="selectRoleById" parameterType="Long" resultMap="SysRoleResult">

+ 3 - 0
base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysUserMapper.xml

@@ -68,6 +68,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<if test="userName != null and userName != ''">
 			AND u.user_name like concat('%', #{userName}, '%')
 		</if>
+		<if test="nickName != null and nickName != ''">
+			AND u.nick_name like concat('%', #{nickName}, '%')
+		</if>
 		<if test="createBy != null and createBy != ''">
 			AND u.create_by = #{createBy}
 		</if>

+ 52 - 39
base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysUserRoleMapper.xml

@@ -1,44 +1,57 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
-PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.usky.system.mapper.SysUserRoleMapper">
 
-	<resultMap type="com.usky.system.domain.SysUserRole" id="SysUserRoleResult">
-		<result property="userId"     column="user_id"      />
-		<result property="roleId"     column="role_id"      />
-	</resultMap>
-
-	<delete id="deleteUserRoleByUserId" parameterType="Long">
-		delete from sys_user_role where user_id=#{userId}
-	</delete>
-	
-	<select id="countUserRoleByRoleId" resultType="Integer">
-	    select count(1) from sys_user_role where role_id=#{roleId}  
-	</select>
-	
-	<delete id="deleteUserRole" parameterType="Long">
- 		delete from sys_user_role where user_id in
- 		<foreach collection="ids" item="ids" open="(" separator="," close=")">
- 			#{ids}
-        </foreach> 
- 	</delete>
-	
-	<insert id="batchUserRole">
-		insert into sys_user_role(user_id, role_id) values
-		<foreach item="item" index="index" collection="list" separator=",">
-			(#{item.userId},#{item.roleId})
-		</foreach>
-	</insert>
-	
-	<delete id="deleteUserRoleInfo" parameterType="com.usky.system.domain.SysUserRole">
-		delete from sys_user_role where user_id=#{userId} and role_id=#{roleId}
-	</delete>
-	
-	<delete id="deleteUserRoleInfos">
-	    delete from sys_user_role where role_id=#{roleId} and user_id in
- 	    <foreach collection="userIds" item="userId" open="(" separator="," close=")">
- 	        #{userId}
-            </foreach> 
-	</delete>
+    <resultMap type="com.usky.system.domain.SysUserRole" id="SysUserRoleResult">
+        <result property="userId" column="user_id"/>
+        <result property="roleId" column="role_id"/>
+        <result property="tenantId" column="tenant_id"/>
+    </resultMap>
+
+    <delete id="deleteUserRoleByUserId" parameterType="map">
+        delete
+        from sys_user_role
+        where user_id = #{userId, jdbcType=BIGINT}
+          and tenant_id = #{tenantId, jdbcType=INTEGER}
+    </delete>
+
+    <select id="countUserRoleByRoleId" resultType="Integer">
+        select count(1)
+        from sys_user_role
+        where role_id = #{roleId, jdbcType=BIGINT}
+          and tenant_id = #{tenantId, jdbcType=INTEGER}
+    </select>
+
+    <delete id="deleteUserRole" parameterType="map">
+        delete from sys_user_role where user_id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id, jdbcType=BIGINT}
+        </foreach>
+        and tenant_id=#{tenantId, jdbcType=INTEGER}
+    </delete>
+
+    <insert id="batchUserRole">
+        insert into sys_user_role(user_id, role_id, tenant_id) values
+        <foreach item="item" index="index" collection="list" separator=",">
+            (#{item.userId, jdbcType=BIGINT}, #{item.roleId, jdbcType=INTEGER}, #{item.tenantId, jdbcType=INTEGER})
+        </foreach>
+    </insert>
+
+    <delete id="deleteUserRoleInfo" parameterType="map">
+        delete
+        from sys_user_role
+        where user_id = #{userId, jdbcType=BIGINT}
+          and role_id = #{roleId, jdbcType=INTEGER}
+    </delete>
+
+    <delete id="deleteUserRoleInfos" parameterType="map">
+        delete from sys_user_role where role_id=#{roleId, jdbcType=INTEGER} and user_id in
+        <foreach collection="userIds" item="userId" open="(" separator="," close=")">
+            #{userId, jdbcType=BIGINT}
+        </foreach>
+        and tenant_id=#{tenantId, jdbcType=INTEGER}
+    </delete>
+
 </mapper>