|
@@ -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
|