#294 消息中心代码回退,修复消息中心租户未隔离问题

已關閉
fuyuchuan 請求將 7 次代碼提交從 uskycloud/fu-dev 合併至 uskycloud/system-165

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

@@ -37,7 +37,9 @@ public class MceRequestVO  extends BaseEntity {
     @NotBlank(message = "消息内容 infoContent 不能为空!")
     private String infoContent;
 
-    /** 消息发布人  */
+    /** 消息发布人
+     * 登录账号 loginAccount
+     * */
     @NotBlank(message = "消息发布人 userName 不能为空!")
     private String userName;
 
@@ -49,6 +51,27 @@ public class MceRequestVO  extends BaseEntity {
     @NotNull(message = "消息接收人 userIds 不能为空!")
     private List<Long> userIds;
 
+    /**
+     * ip地址
+     */
+    String ipAddress;
+
+    /**
+     * 登录地址
+     */
+    String loginAddress;
+
+    /**
+     * 登录方式
+     */
+    String loginType;
+
+    /**
+     * 审批结果
+     */
+    String approvalResult;
+
+
     @Override
     public String toString() {
         ObjectMapper objectMapper = new ObjectMapper();

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

@@ -17,8 +17,14 @@ public class constant {
     public static final String WE_CHAT_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";
     // 微信公众号消息推送地址
     public static final String WE_CHAT_REQUEST_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s";
-    // 微信公众号推送消息模板id
+    // 微信公众号推送-告警-消息模板id
     public static final String WE_CHAT_TEMPLATE_ID = "FmrNuMzgh0E8bWg1j8a2R3zTmRarHYtZ72TSzPrF9Iw";
+    // 微信公众号推送-OA-消息模板id
+    public static final String WE_CHAT_OA_TEMPLATE_ID = "RDahJYyDGpQKEn6vzdifS9u9F-vxA6FOIIDe1cUw8WU";
+    // 微信公众号推送-报告提醒(工单)-消息模板id
+    public static final String WE_CHAT_WORK_TEMPLATE_ID = "0J7pBGkXq5nCEVsc9L6HBmfmUrO4BEOk-3d5WCndWZk";
+    // 微信公众号推送-登录-消息模板id
+    public static final String WE_CHAT_LOGIN_TEMPLATE_ID = "7o6J1_0gi89RsW3sR7Q853KTaWYT7Yu-jXjLnHbcB8M";
     // 微信公众号的消息回调地址(这儿可根据业务需求自定义动作,可选)
     public static final String WE_CHAT_CUSTOMER_CALL_URL = "https://manager.usky.cn/mobile/#/pages/common/appMessage/index?type=%s&typeName=%s&id=%s";
     public static final String WE_CHAT_CUSTOMER_CALL_URL1 = "https://manager.usky.cn/mobile/#/pages/common/appMessage/index?type=%s&id=%s";

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

@@ -131,7 +131,7 @@ public class MceReceiveController {
      * 消息发布-无需token
      * @return
      */
-    @PostMapping("/addMce")
+    @PostMapping("/addMceNew")
     ApiResult<Void> addNoToken(@RequestBody String mceNoToken) {
         mceReceiveService.addNoToken(mceNoToken);
         return ApiResult.success();

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

@@ -84,6 +84,21 @@ public class MceContentServiceImpl extends AbstractCrudService<MceContentMapper,
             if (StringUtils.isNotEmpty(mceReceiveVO.getInfoTypeName())) {
                 sendWeChatMessageRequestVO.setInfoTypeName(mceReceiveVO.getInfoTypeName());
             }
+            if (StringUtils.isNotEmpty(mceReceiveVO.getIpAddress())) {
+                sendWeChatMessageRequestVO.setIpAddress(mceReceiveVO.getIpAddress());
+            }
+            if (StringUtils.isNotEmpty(mceReceiveVO.getUserName())) {
+                sendWeChatMessageRequestVO.setUserName(mceReceiveVO.getUserName());
+            }
+            if (StringUtils.isNotEmpty(mceReceiveVO.getLoginAddress())) {
+                sendWeChatMessageRequestVO.setLoginAddress(mceReceiveVO.getLoginAddress());
+            }
+            if (StringUtils.isNotEmpty(mceReceiveVO.getLoginType())) {
+                sendWeChatMessageRequestVO.setLoginType(mceReceiveVO.getLoginType());
+            }
+            if (StringUtils.isNotEmpty(mceReceiveVO.getApprovalResult())) {
+                sendWeChatMessageRequestVO.setApprovalResult(mceReceiveVO.getApprovalResult());
+            }
             mceMbuserService.sendWeChatMessage(sendWeChatMessageRequestVO);
         }
     }

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

@@ -7,14 +7,12 @@ import com.usky.common.core.exception.BusinessException;
 import com.usky.common.redis.core.RedisHelper;
 import com.usky.system.domain.MceMbuser;
 import com.usky.system.mapper.MceMbuserMapper;
-import com.usky.system.service.ISysDictDataService;
 import com.usky.system.service.MceMbuserService;
 import com.usky.system.constant.constant;
 import com.usky.common.mybatis.core.AbstractCrudService;
-import com.usky.system.service.vo.SendWeChatMessageRequestVO;
-import com.usky.system.service.vo.TemplateData;
-import com.usky.system.service.vo.TemplateMsgEntityVO;
+import com.usky.system.service.vo.*;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
@@ -85,10 +83,11 @@ public class MceMbuserServiceImpl extends AbstractCrudService<MceMbuserMapper, M
             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分钟
+                String accessTime = redisHelper.get("access_time").toString();
+                String nowTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+                long i = getTimeDifference(accessTime, nowTime);
+                // 大于115分钟
+                if (i > 115) {
                     redisHelper.set("access_time", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                     redisHelper.set("access_key", this.getWeChatAccessToken());
                 }
@@ -104,35 +103,103 @@ public class MceMbuserServiceImpl extends AbstractCrudService<MceMbuserMapper, M
             return null;
         }
 
-        String token = obj.toString();
+        String tUrl;
+        String templateId = "";
 
-        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);
+        Map<String, TemplateData> data = new HashMap<>();
+        String nowTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+
+        switch (requestVO.getInfoType()) {
+            // 登录成功通知
+            case "0":
+                // 登录时间
+                data.put("time3", new TemplateData(nowTime, "#173177"));
+                // 登录账号 userName
+                data.put("thing6", new TemplateData(requestVO.getUserName(), "#173177"));
+                // 登录IP
+                data.put("character_string8", new TemplateData(requestVO.getLoginAddress(), "#173177"));
+                // 登录地点
+                data.put("thing9", new TemplateData(requestVO.getLoginAddress(), "#173177"));
+                // 登录方式
+                data.put("thing10", new TemplateData(requestVO.getLoginType(), "#173177"));
+                // 设置公众号模板消息ID
+                templateId = constant.WE_CHAT_LOGIN_TEMPLATE_ID;
+                break;
+
+            case "1":
+            case "5":
+                /* 通知公告&工作报告通知(工单已完成通知)
+                 * 工单标题{{thing9.DATA}}
+                 * 发起人{{thing8.DATA}}
+                 * 完成时间{{time12.DATA}}
+                 **/
+                data.put("thing9", new TemplateData(requestVO.getInfoContent(), "#173177"));
+                data.put("thing8", new TemplateData(requestVO.getUserName(), "#173177"));
+                data.put("time12", new TemplateData(nowTime, "#173177"));
+                // 设置公众号模板消息ID
+                templateId = constant.WE_CHAT_WORK_TEMPLATE_ID;
+                break;
+
+            case "3":
+                /* OA系统流程审批通知
+                 * 流程名称{{thing7.DATA}}
+                 * 审批节点{{thing8.DATA}}
+                 * 发起人{{thing13.DATA}}
+                 * 发起时间{{time10.DATA}}
+                 * 审批结果{{const21.DATA}}
+                 **/
+                data.put("thing7", new TemplateData(requestVO.getInfoTitle(), "#173177"));
+                data.put("thing8", new TemplateData(requestVO.getInfoContent(), "#173177"));
+                data.put("thing13", new TemplateData(requestVO.getUserName(), "#173177"));
+                data.put("time10", new TemplateData(nowTime, "#173177"));
+                data.put("const21", new TemplateData(requestVO.getApprovalResult(), "#173177"));
+
+                // 设置公众号模板消息ID
+                templateId = constant.WE_CHAT_OA_TEMPLATE_ID;
+                break;
+
+            case "2":
+            case "4":
+                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);
+                /* 设备预警信息提醒
+                 * {{first.DATA}}
+                 * 设备号:{{keyword1.DATA}}
+                 * 报警类型:{{keyword2.DATA}}
+                 * 时间:{{keyword3.DATA}}
+                 * {{remark.DATA}}
+                 **/
+                messageVo.setTemplateId(constant.WE_CHAT_TEMPLATE_ID);
+                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"));
+
+                templateId = messageVo.getTemplateId();
+                break;
+        }
+
+        // 回调地址
         if (Objects.nonNull(requestVO.getInfoTypeName())) {
-            messageVo.setTUrl(String.format(constant.WE_CHAT_CUSTOMER_CALL_URL, requestVO.getInfoType(), requestVO.getInfoTypeName(), infoId));
-            messageVo.setTKeyword2(requestVO.getInfoTypeName());
+            tUrl = String.format(constant.WE_CHAT_CUSTOMER_CALL_URL, requestVO.getInfoType(), requestVO.getInfoTypeName(), infoId);
         } else {
-            messageVo.setTUrl(String.format(constant.WE_CHAT_CUSTOMER_CALL_URL1, requestVO.getInfoType(), infoId));
-            messageVo.setTKeyword2("");
+            tUrl = String.format(constant.WE_CHAT_CUSTOMER_CALL_URL1, requestVO.getInfoType(), infoId);
         }
 
-        messageVo.setTemplateId(constant.WE_CHAT_TEMPLATE_ID);
-
+        String token = obj.toString();
         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());
+        if (StringUtils.isNotBlank(tUrl)) {
+            content.put("url", tUrl);
+        }
+        if (StringUtils.isNotBlank(templateId)) {
+            content.put("template_id", templateId);
+        }
         content.put("data", data);
         String resp = HttpUtil.post(requestUrl, JSONUtil.parseObj(content).toString());
         System.out.println(content.toString());

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

@@ -103,6 +103,7 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
                     map.put("moduleId", page.getRecords().get(i).getModuleId());
                     map.put("createTime", page.getRecords().get(i).getCreateTime());
                     map.put("createBy", page.getRecords().get(i).getCreateBy());
+                    map.put("issuerName", page.getRecords().get(i).getIssuerName());
                     if (CollectionUtils.isNotEmpty(list1)) {
                         for (int j = 0; j < list1.size(); j++) {
                             if (page.getRecords().get(i).getContentId().equals(list1.get(j).getId())) {
@@ -251,6 +252,14 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
     @Async
     @Override
     public void addMceReceive(MceRequestVO mceRequestVO) {
+
+        // 登录成功 infoType 为 0,只给登录用户发送公众号消息
+        if ("0".equals(mceRequestVO.getInfoType())){
+            List<MceMbuser> mbuserList = mceMbuserService.list(Wrappers.lambdaQuery(MceMbuser.class).in(MceMbuser::getUserId, mceRequestVO.getUserIds()));
+            String openid = mbuserList.get(0).getOpenid();
+            mceContentService.sendAppNew(mceRequestVO, openid, 0, 1);
+        }
+
         // 如果 infoTypeName 为空,则从字典数据中获取
         if (mceRequestVO.getInfoTypeName() == null) {
             String infoTypeName = sysDictDataService.selectDictLabel("message_type", mceRequestVO.getInfoType());
@@ -261,7 +270,7 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
         try {
             tenantId = userMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, mceRequestVO.getUserName()).select(SysUser::getTenantId)).getTenantId();
         } catch (Exception e) {
-            log.error("获取用户租户ID失败,报错信息:{}, 未找到用户-{}-的租户",e.getMessage(), mceRequestVO.getUserName());
+            log.error("获取用户租户ID失败,报错信息:{}, 未找到用户-{}-的租户", e.getMessage(), mceRequestVO.getUserName());
         }
 
         // 获取当前租户的所有用户
@@ -312,7 +321,6 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
                     .filter(mbUser -> mbUser.getUserId().equals(userId))
                     .findFirst();
 
-
             for (SysUser user : userList) {
                 if (user.getUserId().equals(userId)) {
                     // 创建消息接收记录
@@ -503,7 +511,7 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
         try {
             tenantId = userMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, mceReceiveVO.get("userName")).select(SysUser::getTenantId)).getTenantId();
         } catch (Exception e) {
-            log.error("获取用户租户ID失败,报错信息:{}, 未找到用户-{}-的租户",e.getMessage(), mceReceiveVO.get("userName"));
+            log.error("获取用户租户ID失败,报错信息:{}, 未找到用户-{}-的租户", e.getMessage(), mceReceiveVO.get("userName"));
         }
         List<SysUser> list = userMapper.tenantIdUserList(tenantId);
         // 获取用户昵称与真实姓名Map
@@ -660,6 +668,10 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
     @Override
     public void addNoToken(String mceNoToken) {
         JSONObject json = JSONObject.parseObject(mceNoToken);
+        String infoTypeName = sysDictDataService.selectDictLabel("message_type", json.get("infoType").toString());
+        if (!json.containsKey("infoTypeName")) {
+            json.put("infoTypeName", infoTypeName);
+        }
         List<String> userNames = JSONObject.parseArray(json.get("userNames").toString(), String.class);
 
         LambdaQueryWrapper<SysUser> lambdaQuery = Wrappers.lambdaQuery();
@@ -675,6 +687,7 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
         mceRequestVO.setInfoTypeName(json.get("infoTypeName").toString());
         mceRequestVO.setId((Integer) json.get("id"));
         mceRequestVO.setUserName(json.get("userName").toString());
+        mceRequestVO.setApprovalResult(json.get("approvalResult").toString());
         addMceReceive(mceRequestVO);
     }
 }

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

@@ -3,14 +3,12 @@ package com.usky.system.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.usky.common.core.bean.ApiResult;
-import com.usky.common.core.exception.BusinessErrorCode;
-import com.usky.common.security.utils.SecurityUtils;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.common.core.exception.BusinessException;
 import com.usky.common.core.util.BeanMapperUtils;
 import com.usky.common.core.util.StringUtils;
 import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.common.security.utils.SecurityUtils;
 import com.usky.system.domain.*;
 import com.usky.system.domain.constants.UserConstants;
 import com.usky.system.mapper.*;
@@ -112,9 +110,7 @@ public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUs
         }
 //        user.setUserType("00");
 //        user.setTenantId(SecurityUtils.getTenantId());
-        if(user.getUserType().equals("00")){
-            user.setDeptId(deptService.deptListByTenant(user.getTenantId()).get(0).getDeptId());
-        }
+        user.setDeptId(deptService.deptListByTenant(user.getTenantId()).get(0).getDeptId());
 
         user.setCreateBy(SecurityUtils.getUsername());
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));

+ 37 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/util/AsyncFactory.java

@@ -2,17 +2,25 @@ package com.usky.system.service.util;
 
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.common.core.constant.Constants;
 import com.ruoyi.common.core.utils.ServletUtils;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.utils.ip.IpUtils;
 import com.usky.common.core.util.SpringContextUtils;
+import com.usky.system.domain.MceRequestVO;
 import com.usky.system.domain.SysLogininfor;
+import com.usky.system.domain.SysUser;
+import com.usky.system.mapper.SysUserMapper;
 import com.usky.system.service.ISysLogininforService;
+import com.usky.system.service.ISysUserService;
+import com.usky.system.service.MceReceiveService;
 import eu.bitwalker.useragentutils.UserAgent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Collections;
+
 
 /**
  * @description: 异步工厂(产生任务用)
@@ -23,6 +31,10 @@ public class AsyncFactory
 {
     private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user");
 
+    private static final MceReceiveService mceReceiveService = SpringContextUtils.getBean(MceReceiveService.class);
+
+    public static final SysUserMapper SYS_USER_MAPPER = SpringContextUtils.getBean(SysUserMapper.class);
+
     /**
      * 记录登录信息
      *
@@ -63,6 +75,9 @@ public class AsyncFactory
         // 日志状态
         if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
             logininfor.setStatus(String.valueOf(Constants.LOGIN_SUCCESS_STATUS)); // 使用String.valueOf进行转换
+
+            // 微信公众号推送登录消息
+            sendWeChatMessage(logininfor);
         } else if (Constants.LOGIN_FAIL.equals(status)) {
             logininfor.setStatus(String.valueOf(Constants.LOGIN_FAIL_STATUS)); // 使用String.valueOf进行转换
         }
@@ -79,4 +94,26 @@ public class AsyncFactory
         }
         return "[" + msg.toString() + "]";
     }
+
+    private static void sendWeChatMessage(SysLogininfor logininfor) {
+        MceRequestVO mceRequestVO = new MceRequestVO();
+        mceRequestVO.setInfoTitle("登录成功通知");
+        mceRequestVO.setInfoContent("用户 "+logininfor.getUserName() +" 登录成功!");
+        mceRequestVO.setInfoType("0");
+        mceRequestVO.setInfoTypeName("登录通知");
+        mceRequestVO.setUserName(logininfor.getUserName());
+
+        LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.select(SysUser::getUserId)
+                .eq(SysUser::getUserName, logininfor.getUserName());
+        SysUser sysUser = SYS_USER_MAPPER.selectOne(queryWrapper);
+
+        mceRequestVO.setUserIds(Collections.singletonList(sysUser.getUserId()));
+
+        mceRequestVO.setUserName(logininfor.getUserName());
+        mceRequestVO.setLoginAddress(logininfor.getLoginLocation());
+        mceRequestVO.setLoginType(logininfor.getOs() + "-" + logininfor.getBrowser());
+        mceRequestVO.setIpAddress(logininfor.getIpaddr());
+        mceReceiveService.addMceReceive(mceRequestVO);
+    }
 }

+ 26 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/SendWeChatMessageRequestVO.java

@@ -33,4 +33,30 @@ public class SendWeChatMessageRequestVO {
      * openId
      */
     String openId;
+
+    /**
+     * ip地址
+     */
+    String ipAddress;
+
+    /**
+     * 登录地址
+     */
+    String loginAddress;
+
+    /**
+     * 登录方式
+     */
+    String loginType;
+
+    /**
+     * 发送人
+     * 登录账号
+     */
+    String userName;
+
+    /**
+     * 审批结果
+     */
+    String approvalResult;
 }