浏览代码

配合告警通知修改消息中心代并优化

fuyuchuan 1 天之前
父节点
当前提交
8338ff725b

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

@@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -20,7 +21,7 @@ import java.util.List;
 @EqualsAndHashCode(callSuper = true)
 @Slf4j
 @Data
-public class MceRequestVO  extends BaseEntity {
+public class MceRequestVO extends BaseEntity {
 
     /** 字典标签  */
     private String infoTypeName;
@@ -89,7 +90,27 @@ public class MceRequestVO  extends BaseEntity {
     /**
      * oa跳转类型 (todo我的待办、me我发起的、copy抄送我的)
      */
-    String oaType;
+    private String oaType;
+
+    /**
+     * 设备id
+     */
+    private String deviceId;
+
+    /**
+     * 报警时间
+     */
+    private String alarmTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 报警发送方式(站内消息通知是默认的,1:APP,2:微信)
+     */
+    private String alarmSendType;
 
     @Override
     public String toString() {

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

@@ -166,10 +166,10 @@ public class MceMbuserServiceImpl extends AbstractCrudService<MceMbuserMapper, M
                 break;
 
             case "2":
-            case "4":
                 TemplateMsgEntityVO messageVo = new TemplateMsgEntityVO();
                 messageVo.setTTitle(infoTitle);
                 messageVo.setTKeyword1(infoContent);
+                messageVo.setTKeyword2(infoType);
                 messageVo.setTKeyword3(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                 messageVo.setTRemark(infoContent);
                 /* 设备预警信息提醒
@@ -177,7 +177,7 @@ public class MceMbuserServiceImpl extends AbstractCrudService<MceMbuserMapper, M
                  * 设备号:{{keyword1.DATA}}
                  * 报警类型:{{keyword2.DATA}}
                  * 时间:{{keyword3.DATA}}
-                 * {{remark.DATA}}
+                 * 备注:{{remark.DATA}}
                  **/
                 messageVo.setTemplateId(constant.WE_CHAT_TEMPLATE_ID);
                 data.put("first", new TemplateData(messageVo.getTTitle(), "#44b549"));
@@ -188,9 +188,26 @@ public class MceMbuserServiceImpl extends AbstractCrudService<MceMbuserMapper, M
 
                 templateId = messageVo.getTemplateId();
                 break;
+            case "4":
+                /* 设备预警信息提醒
+                 * {{first.DATA}}
+                 * 设备号:{{keyword1.DATA}}
+                 * 报警类型:{{keyword2.DATA}}
+                 * 时间:{{keyword3.DATA}}
+                 * 备注:{{remark.DATA}}
+                 **/
+                data.put("first", new TemplateData(requestVO.getInfoTitle(), "#44b549"));
+                data.put("keyword1", new TemplateData(requestVO.getDeviceId(), "#173177"));
+                data.put("keyword2", new TemplateData(requestVO.getInfoContent(), "#173177"));
+                data.put("keyword3", new TemplateData(requestVO.getAlarmTime(), "#173177"));
+                data.put("remark", new TemplateData(requestVO.getRemark(), "#173177"));
+
+                // 设置公众号模板消息ID
+                templateId = constant.WE_CHAT_TEMPLATE_ID;
+                break;
         }
 
-        log.info("oaType:{}",oaType);
+        log.info("oaType:{}", oaType);
         // 回调地址
         if ("3".equals(requestVO.getInfoType())) {
             tUrl = String.format(constant.WE_CHAT_CUSTOMER_CALL_URL3, infoType, infoTypeName, infoId, oaType);

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

@@ -265,126 +265,161 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
     @Async
     @Override
     public void addMceReceive(MceRequestVO mceRequestVO) {
+        log.info("本次发送消息内容: {}", mceRequestVO.toString());
 
-        log.info("本次发送消息内容{}", mceRequestVO.toString());
-
-        // 登录成功 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);
-            return;
-        }
-
-        // 如果 infoTypeName 为空,则从字典数据中获取
+        // 补充信息类型名称
         if (mceRequestVO.getInfoTypeName() == null) {
             String infoTypeName = sysDictDataService.selectDictLabel("message_type", mceRequestVO.getInfoType());
             mceRequestVO.setInfoTypeName(infoTypeName);
         }
 
-        Integer tenantId = null;
-        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());
+        // 获取发送者租户ID
+        Integer tenantId = getUserTenantId(mceRequestVO.getUserName());
+        if (tenantId == null) {
+            log.error("获取用户租户ID失败,未找到用户: {}", mceRequestVO.getUserName());
             return;
         }
 
-        // 获取当前租户的所有用户
-        List<SysUser> userList = userMapper.tenantIdUserList(tenantId);
-        if (CollectionUtils.isEmpty(userList)) {
+        // 获取租户所有用户信息
+        List<SysUser> allUsers = userMapper.tenantIdUserList(tenantId);
+        if (CollectionUtils.isEmpty(allUsers)) {
+            log.warn("租户下未找到任何用户,租户ID: {}", tenantId);
             return;
         }
 
-        // 获取用户昵称与真实姓名的映射
-        Map<String, String> userNameNickNameMap = userList.stream()
+        // 构建用户信息映射
+        Map<Long, SysUser> userIdToUserMap = allUsers.stream()
+                .collect(Collectors.toMap(SysUser::getUserId, user -> user));
+
+        Map<String, String> userNameToNickNameMap = allUsers.stream()
                 .collect(Collectors.toMap(SysUser::getUserName, SysUser::getNickName));
 
-        LocalDateTime currentTime = LocalDateTime.now();
-        List<Long> userIdList = new ArrayList<>();
-        Integer generatedContentId = null;
-
-        // 遍历用户列表,处理消息内容
-        for (SysUser user : userList) {
-            userIdList.add(user.getUserId());
-            if (mceRequestVO.getUserName().equals(user.getUserName())) {
-                MceContent contentEntity = new MceContent();
-                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());
-                boolean save = mceContentService.save(contentEntity);
-                if (!save) {
-                    log.error("消息内容保存失败,用户:{},消息内容:{}", user.getUserName(), contentEntity);
-                    continue;
-                }
-                generatedContentId = contentEntity.getId();
-            }
+        // 保存消息内容
+        Integer contentId = saveMessageContent(mceRequestVO, userIdToUserMap);
+        if (contentId == null) {
+            log.error("消息内容保存失败,用户: {}", mceRequestVO.getUserName());
+            return;
         }
 
-
-        // 筛选符合用户ID条件的用户
+        // 筛选目标用户
         List<Long> targetUserIds = mceRequestVO.getUserIds();
-        userIdList.retainAll(targetUserIds);
+        List<Long> validUserIds = allUsers.stream()
+                .map(SysUser::getUserId)
+                .filter(targetUserIds::contains)
+                .collect(Collectors.toList());
+
+        if (CollectionUtils.isEmpty(validUserIds)) {
+            log.error("用户: {} 发送的{},id: {},抄送用户均不存在!消息发送终止",
+                    mceRequestVO.getUserName(), mceRequestVO.getInfoTypeName(), mceRequestVO.getId());
+            return;
+        }
+
+        // 获取用户消息配置
+        List<MceMbuser> mbUserList = mceMbuserService.list(Wrappers.lambdaQuery(MceMbuser.class)
+                .in(MceMbuser::getUserId, validUserIds));
 
-        if (CollectionUtils.isEmpty(userIdList)) {
-            log.error("用户:" + mceRequestVO.getUserName() +
-                    ",发送的" + mceRequestVO.getInfoTypeName() +
-                    ",id:" + mceRequestVO.getId() +
-                    ",抄送用户均未找到消息配置,消息发送终止");
+        if (CollectionUtils.isEmpty(mbUserList)) {
+            log.error("消息配置为空!用户id列表为: {},id: {},消息发送终止", validUserIds, mceRequestVO.getId());
             return;
         }
 
-        // 查询符合条件的 MceMbuser 列表
-        List<MceMbuser> mbUserList = mceMbuserService.list(Wrappers.lambdaQuery(MceMbuser.class).in(MceMbuser::getUserId, userIdList));
+        // 构建用户ID到消息配置的映射
+        Map<Long, MceMbuser> userIdToMbUserMap = mbUserList.stream()
+                .collect(Collectors.toMap(MceMbuser::getUserId, mbUser -> mbUser));
+
+        // 获取消息发送设置
+        List<MceSetting> settings = mceSettingService.list(Wrappers.lambdaQuery(MceSetting.class)
+                .eq(MceSetting::getCreateBy, mceRequestVO.getUserName()));
+
+        if (CollectionUtils.isEmpty(settings)) {
+            log.warn("未找到消息发送设置,用户: {}", mceRequestVO.getUserName());
+            return;
+        }
 
-        // 遍历用户列表,处理消息接收记录
-        for (Long userId : userIdList) {
-            if (CollectionUtils.isEmpty(mbUserList)) {
+        MceSetting setting = settings.get(0);
+        JSONObject appMode = JSONObject.parseObject(setting.getAppMode());
+        JSONObject wcMode = JSONObject.parseObject(setting.getWcMode());
+
+        // 处理每个目标用户的消息接收和发送
+        for (Long userId : validUserIds) {
+            SysUser user = userIdToUserMap.get(userId);
+            if (user == null) {
                 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();
-                    }
+            // 创建消息接收记录
+            MceReceive mceReceive = createMceReceive(user, contentId, mceRequestVO, userNameToNickNameMap);
+            boolean saveResult = this.save(mceReceive);
+            if (!saveResult) {
+                log.error("创建消息接收记录失败,用户ID: {}", userId);
+                continue;
+            }
 
-                    if (mbUserOptional.isPresent()) {
-                        MceMbuser mbUser = mbUserOptional.get();
-                        // 处理消息发送设置
-                        handleMessageSettings(mbUser, mceRequestVO, receiveId);
-                    }
-                }
+            // 获取用户消息配置
+            MceMbuser mbUser = userIdToMbUserMap.get(userId);
+            if (mbUser == null) {
+                continue;
             }
+
+            // 根据消息类型处理消息发送
+            handleMessageDelivery(mbUser, mceRequestVO, mceReceive.getId(), appMode, wcMode);
+        }
+    }
+
+    /**
+     * 获取用户租户ID
+     */
+    private Integer getUserTenantId(String userName) {
+        try {
+            SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
+                    .eq(SysUser::getUserName, userName)
+                    .select(SysUser::getTenantId));
+            return user != null ? user.getTenantId() : null;
+        } catch (Exception e) {
+            log.error("获取用户租户ID失败,报错信息:{}", e.getMessage(), e);
+            return null;
+        }
+    }
+
+    /**
+     * 保存消息内容
+     */
+    private Integer saveMessageContent(MceRequestVO mceRequestVO, Map<Long, SysUser> userIdToUserMap) {
+        SysUser sender = userIdToUserMap.values().stream()
+                .filter(user -> mceRequestVO.getUserName().equals(user.getUserName()))
+                .findFirst()
+                .orElse(null);
+
+        if (sender == null) {
+            log.error("未找到发送者信息,用户名: {}", mceRequestVO.getUserName());
+            return null;
         }
+
+        MceContent contentEntity = new MceContent();
+        contentEntity.setInfoTitle(mceRequestVO.getInfoTitle());
+        contentEntity.setInfoContent(mceRequestVO.getInfoContent());
+        contentEntity.setInfoType(mceRequestVO.getInfoType());
+        contentEntity.setCreateBy(sender.getUserName());
+        contentEntity.setCreateTime(LocalDateTime.now());
+        contentEntity.setDeptId(sender.getDeptId().intValue());
+        contentEntity.setTenantId(sender.getTenantId());
+
+        boolean saveResult = mceContentService.save(contentEntity);
+        return saveResult ? contentEntity.getId() : null;
     }
 
-    // 创建消息接收记录
-    private MceReceive createMceReceive(SysUser user, Integer generatedContentId, MceRequestVO mceRequestVO, Map<String, String> userNameNickNameMap) {
+    /**
+     * 创建消息接收记录
+     */
+    private MceReceive createMceReceive(SysUser user, Integer contentId, MceRequestVO mceRequestVO,
+                                        Map<String, String> userNameToNickNameMap) {
         MceReceive mceReceive = new MceReceive();
         mceReceive.setReceiverId(user.getUserId().intValue());
-        mceReceive.setContentId(generatedContentId);
+        mceReceive.setContentId(contentId);
         mceReceive.setReadFlag(0);
         mceReceive.setInfoType(mceRequestVO.getInfoType());
         mceReceive.setModuleId(mceRequestVO.getId());
-
-        String userName = mceRequestVO.getUserName();
-        String nickName = userNameNickNameMap.get(userName);
-        mceReceive.setIssuerName(nickName);
-
+        mceReceive.setIssuerName(userNameToNickNameMap.get(mceRequestVO.getUserName()));
         mceReceive.setReceiverName(user.getUserName());
         mceReceive.setCreateBy(mceRequestVO.getUserName());
         mceReceive.setCreateTime(LocalDateTime.now());
@@ -393,41 +428,84 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
         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()));
+    /**
+     * 处理消息发送
+     */
+    private void handleMessageDelivery(MceMbuser mbUser, MceRequestVO mceRequestVO,
+                                       Integer mceReceiveId, JSONObject appMode, JSONObject wcMode) {
+        String infoType = mceRequestVO.getInfoType();
 
-        if (CollectionUtils.isNotEmpty(settingList)) {
-            MceSetting setting = settingList.get(0);
-            JSONObject appMode = JSONObject.parseObject(setting.getAppMode());
-            JSONObject wcMode = JSONObject.parseObject(setting.getWcMode());
+        // 登录成功通知只给登录用户发送微信公众号消息
+        if ("0".equals(infoType)) {
+            sendWeChatMessage(mbUser, mceRequestVO, wcMode, infoType, mceReceiveId);
+            return;
+        }
 
-            String infoType = mceRequestVO.getInfoType();
+        // 处理告警消息
+        if ("4".equals(infoType)) {
+            handleAlarmMessage(mbUser, mceRequestVO, mceReceiveId, appMode, wcMode, infoType);
+            return;
+        }
 
-            // 处理应用消息发送
-            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);
-                    }
-                }
+        // 处理普通消息(默认APP和微信都通知)
+        handleNormalMessage(mbUser, mceRequestVO, mceReceiveId, appMode, wcMode, infoType);
+    }
+
+    /**
+     * 处理告警消息
+     */
+    private void handleAlarmMessage(MceMbuser mbUser, MceRequestVO mceRequestVO, Integer mceReceiveId,
+                                    JSONObject appMode, JSONObject wcMode, String infoType) {
+        String alarmSendType = mceRequestVO.getAlarmSendType();
+        switch (alarmSendType) {
+            case "1":
+                sendAppMessage(mbUser, mceRequestVO, appMode, infoType);
+                break;
+            case "2":
+                sendWeChatMessage(mbUser, mceRequestVO, wcMode, infoType, mceReceiveId);
+                break;
+            default:
+                log.error("未知的告警发送类型: {}", alarmSendType);
+        }
+    }
+
+    /**
+     * 发送普通消息
+     */
+    private void handleNormalMessage(MceMbuser mbUser, MceRequestVO mceRequestVO, Integer mceReceiveId,
+                                     JSONObject appMode, JSONObject wcMode, String infoType) {
+        sendAppMessage(mbUser, mceRequestVO, appMode, infoType);
+        sendWeChatMessage(mbUser, mceRequestVO, wcMode, infoType, mceReceiveId);
+    }
+
+    /**
+     * 发送APP消息
+     */
+    private void sendAppMessage(MceMbuser mbUser, MceRequestVO mceRequestVO, JSONObject mode, String infoType) {
+        if (mode.getBoolean(infoType) && 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);
-                    }
-                }
+    /**
+     * 推送微信消息
+     */
+    private void sendWeChatMessage(MceMbuser mbUser, MceRequestVO mceRequestVO, JSONObject mode,
+                                   String infoType, Integer mceReceiveId) {
+        if (mode.getBoolean(infoType) && mbUser.getOpenid() != null) {
+            try {
+                mceContentService.sendAppNew(mceRequestVO, mbUser.getOpenid(), mceReceiveId, 1);
+            } catch (Exception e) {
+                log.error("为用户ID: {} 发送微信消息失败,错误信息: {}", mbUser.getUserId(), e.getMessage(), e);
             }
         }
     }
 
+
     /*
     @Async
     @Override

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

@@ -79,4 +79,20 @@ public class SendWeChatMessageRequestVO {
      * oa跳转类型 (todo我的待办、me我发起的、copy抄送我的)
      */
     String oaType;
+
+    /**
+     * 设备id
+     */
+    private String deviceId;
+
+
+    /**
+     * 报警时间
+     */
+    private String alarmTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
 }