|
|
@@ -15,8 +15,10 @@ import cn.iocoder.yudao.module.iscs.dal.mysql.workdesign.WorkflowWorkNodeMapper;
|
|
|
import cn.iocoder.yudao.module.iscs.enums.MessageEnum;
|
|
|
import cn.iocoder.yudao.module.iscs.enums.WorkTypeEnum;
|
|
|
import cn.iocoder.yudao.module.iscs.service.isolationpoint.IsolationPointService;
|
|
|
+import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
|
|
|
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
|
|
|
import cn.iocoder.yudao.module.system.service.appnotify.AppNotifySendService;
|
|
|
+import cn.iocoder.yudao.module.system.service.dept.DeptService;
|
|
|
import cn.iocoder.yudao.module.system.service.notify.NotifySendService;
|
|
|
import cn.iocoder.yudao.module.system.service.sms.SmsSendService;
|
|
|
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
|
|
|
@@ -70,7 +72,8 @@ public class WorkflowWorkNodeServiceImpl extends ServiceImpl<WorkflowWorkNodeMap
|
|
|
private WorkflowWorkPointService workflowWorkPointService;
|
|
|
@Resource
|
|
|
private IsolationPointService isolationPointService;
|
|
|
-
|
|
|
+ @Resource
|
|
|
+ private DeptService deptService;
|
|
|
|
|
|
@Transactional
|
|
|
@Override
|
|
|
@@ -271,6 +274,7 @@ public class WorkflowWorkNodeServiceImpl extends ServiceImpl<WorkflowWorkNodeMap
|
|
|
}
|
|
|
|
|
|
private void sendByType(WorkflowWorkNodeDO nodeDO) {
|
|
|
+ ArrayList<Long> longs = new ArrayList<>();
|
|
|
if (nodeDO.getType().equals(WorkTypeEnum.CREATEJOB.value)) {
|
|
|
// 创建作业
|
|
|
WorkflowWorkDO workDO = workflowWorkService.getById(nodeDO.getWorkId());
|
|
|
@@ -279,6 +283,9 @@ public class WorkflowWorkNodeServiceImpl extends ServiceImpl<WorkflowWorkNodeMap
|
|
|
Map<String, Object> templateParams = new HashMap<>();
|
|
|
templateParams.put("name", user.getNickname());
|
|
|
sendMessage(nodeDO, user.getId(), "MESSAGE_001", templateParams);
|
|
|
+ // 抄送
|
|
|
+ longs.add(user.getId());
|
|
|
+ copyMessageSend(nodeDO, longs, "MESSAGE_001", templateParams);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -290,6 +297,9 @@ public class WorkflowWorkNodeServiceImpl extends ServiceImpl<WorkflowWorkNodeMap
|
|
|
Map<String, Object> templateParams = new HashMap<>();
|
|
|
templateParams.put("name", user.getNickname());
|
|
|
sendMessage(nodeDO, user.getId(), "MESSAGE_002", templateParams);
|
|
|
+ // 抄送
|
|
|
+ longs.add(user.getId());
|
|
|
+ copyMessageSend(nodeDO, longs, "MESSAGE_002", templateParams);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -302,6 +312,9 @@ public class WorkflowWorkNodeServiceImpl extends ServiceImpl<WorkflowWorkNodeMap
|
|
|
Map<String, Object> templateParams = new HashMap<>();
|
|
|
templateParams.put("name", user.getNickname());
|
|
|
sendMessage(nodeDO, user.getId(), "MESSAGE_003", templateParams);
|
|
|
+ // 抄送
|
|
|
+ longs.add(user.getId());
|
|
|
+ copyMessageSend(nodeDO, longs, "MESSAGE_003", templateParams);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -314,6 +327,9 @@ public class WorkflowWorkNodeServiceImpl extends ServiceImpl<WorkflowWorkNodeMap
|
|
|
Map<String, Object> templateParams = new HashMap<>();
|
|
|
templateParams.put("name", user.getNickname());
|
|
|
sendMessage(nodeDO, user.getId(), "MESSAGE_007", templateParams);
|
|
|
+ // 抄送
|
|
|
+ longs.add(user.getId());
|
|
|
+ copyMessageSend(nodeDO, longs, "MESSAGE_007", templateParams);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -341,6 +357,11 @@ public class WorkflowWorkNodeServiceImpl extends ServiceImpl<WorkflowWorkNodeMap
|
|
|
sendMessage(nodeDO, adminUserDO.getId(), "MESSAGE_004", templateParams);
|
|
|
jtlockerName.append(adminUserDO.getNickname());
|
|
|
}
|
|
|
+ // 抄送
|
|
|
+ longs.addAll(jtlockerIds);
|
|
|
+ Map<String, Object> templateParams = new HashMap<>();
|
|
|
+ templateParams.put("name", "");
|
|
|
+ copyMessageSend(nodeDO, longs, "MESSAGE_004", templateParams);
|
|
|
}
|
|
|
// 上锁人归还钥匙
|
|
|
if (!jtlockerIds.isEmpty() && StringUtils.isNotBlank(nodeProgress) && "2".equals(nodeProgress)) {
|
|
|
@@ -351,10 +372,15 @@ public class WorkflowWorkNodeServiceImpl extends ServiceImpl<WorkflowWorkNodeMap
|
|
|
sendMessage(nodeDO, adminUserDO.getId(), "MESSAGE_011", templateParams);
|
|
|
jtlockerName.append(adminUserDO.getNickname());
|
|
|
}
|
|
|
+ // 抄送
|
|
|
+ longs.addAll(jtlockerIds);
|
|
|
+ Map<String, Object> templateParams = new HashMap<>();
|
|
|
+ templateParams.put("name", "");
|
|
|
+ copyMessageSend(nodeDO, longs, "MESSAGE_011", templateParams);
|
|
|
}
|
|
|
// 共锁人
|
|
|
List<Long> jtcolockerIds = nodeUserDOList.stream().filter(o -> "jtcolocker".equals(o.getType())).map(WorkflowWorkNodeUserDO::getUserId).toList();
|
|
|
- if (!jtcolockerIds.isEmpty() && StringUtils.isNotBlank(nodeProgress) && "3".equals(nodeProgress)) {
|
|
|
+ if (!jtcolockerIds.isEmpty() && StringUtils.isNotBlank(nodeProgress) && "3".equals(nodeProgress)) {
|
|
|
List<AdminUserDO> userList = adminUserService.getUserList(jtcolockerIds);
|
|
|
for (AdminUserDO adminUserDO : userList) {
|
|
|
// 发送
|
|
|
@@ -363,6 +389,11 @@ public class WorkflowWorkNodeServiceImpl extends ServiceImpl<WorkflowWorkNodeMap
|
|
|
templateParams.put("user", jtlockerName);
|
|
|
sendMessage(nodeDO, adminUserDO.getId(), "MESSAGE_008", templateParams);
|
|
|
}
|
|
|
+ // 抄送
|
|
|
+ longs.addAll(jtcolockerIds);
|
|
|
+ Map<String, Object> templateParams = new HashMap<>();
|
|
|
+ templateParams.put("name", "");
|
|
|
+ copyMessageSend(nodeDO, longs, "MESSAGE_008", templateParams);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -388,6 +419,11 @@ public class WorkflowWorkNodeServiceImpl extends ServiceImpl<WorkflowWorkNodeMap
|
|
|
sendMessage(nodeDO, adminUserDO.getId(), "MESSAGE_009", templateParams);
|
|
|
jtcolockerName.append(adminUserDO.getNickname());
|
|
|
}
|
|
|
+ // 抄送
|
|
|
+ longs.addAll(jtcolockerIds);
|
|
|
+ Map<String, Object> templateParams = new HashMap<>();
|
|
|
+ templateParams.put("name", "");
|
|
|
+ copyMessageSend(nodeDO, longs, "MESSAGE_009", templateParams);
|
|
|
}
|
|
|
// 上锁人
|
|
|
List<Long> jtlockerIds = nodeUserDOList.stream().filter(o -> "jtlocker".equals(o.getType())).map(WorkflowWorkNodeUserDO::getUserId).toList();
|
|
|
@@ -400,6 +436,12 @@ public class WorkflowWorkNodeServiceImpl extends ServiceImpl<WorkflowWorkNodeMap
|
|
|
templateParams.put("names", jtcolockerName);
|
|
|
sendMessage(nodeDO, adminUserDO.getId(), "MESSAGE_005", templateParams);
|
|
|
}
|
|
|
+ // 抄送
|
|
|
+ longs.addAll(jtlockerIds);
|
|
|
+ Map<String, Object> templateParams = new HashMap<>();
|
|
|
+ templateParams.put("name", "");
|
|
|
+ templateParams.put("names", jtcolockerName);
|
|
|
+ copyMessageSend(nodeDO, longs, "MESSAGE_005", templateParams);
|
|
|
}
|
|
|
// 上锁人归还硬件
|
|
|
if (!jtlockerIds.isEmpty() && StringUtils.isNotBlank(nodeProgress) && "3".equals(nodeProgress)) {
|
|
|
@@ -411,6 +453,12 @@ public class WorkflowWorkNodeServiceImpl extends ServiceImpl<WorkflowWorkNodeMap
|
|
|
templateParams.put("names", jtcolockerName);
|
|
|
sendMessage(nodeDO, adminUserDO.getId(), "MESSAGE_012", templateParams);
|
|
|
}
|
|
|
+ // 抄送
|
|
|
+ longs.addAll(jtlockerIds);
|
|
|
+ Map<String, Object> templateParams = new HashMap<>();
|
|
|
+ templateParams.put("name", "");
|
|
|
+ templateParams.put("names", jtcolockerName);
|
|
|
+ copyMessageSend(nodeDO, longs, "MESSAGE_012", templateParams);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -435,6 +483,9 @@ public class WorkflowWorkNodeServiceImpl extends ServiceImpl<WorkflowWorkNodeMap
|
|
|
Map<String, Object> templateParams = new HashMap<>();
|
|
|
templateParams.put("name", user.getNickname());
|
|
|
sendMessage(nodeDO, user.getId(), "MESSAGE_006", templateParams);
|
|
|
+ // 抄送
|
|
|
+ longs.add(user.getId());
|
|
|
+ copyMessageSend(nodeDO, longs, "MESSAGE_006", templateParams);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -481,6 +532,90 @@ public class WorkflowWorkNodeServiceImpl extends ServiceImpl<WorkflowWorkNodeMap
|
|
|
|
|
|
}
|
|
|
|
|
|
+ private void copyMessageSend(WorkflowWorkNodeDO nodeDO, List<Long> removeUserIds, String templateKey, Map<String, Object> templateParams) {
|
|
|
+
|
|
|
+ Set<Long> allUserIds = new HashSet<>();
|
|
|
+
|
|
|
+ // 解析抄送参数,如果部门参数有效,开始发送抄送
|
|
|
+ Set<Long> deptIds = convertStringToLongList(nodeDO.getCopyDeptIds());
|
|
|
+ if (!deptIds.isEmpty()) {
|
|
|
+ // 1.获取部门下所有的子部门
|
|
|
+ List<DeptDO> childDeptList = deptService.getChildDeptList(deptIds);
|
|
|
+ if (!childDeptList.isEmpty()) {
|
|
|
+ Set<Long> childDeptIds = childDeptList.stream().map(DeptDO::getId).collect(Collectors.toSet());
|
|
|
+ // 子母合并
|
|
|
+ deptIds.addAll(childDeptIds);
|
|
|
+ }
|
|
|
+ // 2.获取部门下所有的成员
|
|
|
+ allUserIds = adminUserService.getUserListByDeptIds(deptIds).stream().map(AdminUserDO::getId).collect(Collectors.toSet());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 解析抄送参数,如果人员参数有效,开始发送抄送
|
|
|
+ Set<Long> userIds = convertStringToLongList(nodeDO.getCopyUserIds());
|
|
|
+ if (!userIds.isEmpty()) {
|
|
|
+ allUserIds.addAll(userIds);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (!allUserIds.isEmpty()) {
|
|
|
+ // 排除自己
|
|
|
+ // removeUserIds.forEach(allUserIds::remove);
|
|
|
+ // 3.开始抄送给上面人员
|
|
|
+ if (StringUtils.isNotBlank(nodeDO.getMessageTemplateCode()) && "true".equals(nodeDO.getMessageTemplateCode())) {
|
|
|
+ // 站内信
|
|
|
+ try {
|
|
|
+ for (Long userId : allUserIds) {
|
|
|
+ notifySendService.sendSingleNotifyToAdminCopy(userId, Objects.requireNonNull(MessageEnum.getByKey(templateKey)).znx, templateParams, 0);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("站内信发送失败----------" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(nodeDO.getAppTemplateCode()) && "true".equals(nodeDO.getAppTemplateCode())) {
|
|
|
+ // app
|
|
|
+ try {
|
|
|
+ for (Long userId : allUserIds) {
|
|
|
+ appNotifySendService.sendSingleAppNotifyToAdminCopy(userId, Objects.requireNonNull(MessageEnum.getByKey(templateKey)).znx, templateParams);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("app消息发送失败----------" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将逗号分隔的数字字符串转换为 List<Long>
|
|
|
+ *
|
|
|
+ * @param numStr 逗号分隔的数字字符串(如 "1,34,3245,564")
|
|
|
+ * @return 转换后的 List<Long>
|
|
|
+ */
|
|
|
+ public static Set<Long> convertStringToLongList(String numStr) {
|
|
|
+ // 空值/空字符串处理
|
|
|
+ if (numStr == null || numStr.trim().isEmpty()) {
|
|
|
+ return new HashSet<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 方式1:Stream流(简洁,Java 8+ 支持)
|
|
|
+ Set<Long> result = Arrays.stream(numStr.split(",")) // 按逗号分割字符串
|
|
|
+ .map(String::trim) // 去除每个元素的首尾空格(处理如 "1, 34 , 3245" 这种情况)
|
|
|
+ .filter(s -> !s.isEmpty()) // 过滤分割后可能出现的空字符串(如 ",1,34," 分割后的空元素)
|
|
|
+ .map(s -> {
|
|
|
+ // 异常处理:防止非数字字符串导致转换失败
|
|
|
+ try {
|
|
|
+ return Long.parseLong(s);
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ System.out.println("忽略无效数字:" + s + ",原因:" + e.getMessage());
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .filter(java.util.Objects::nonNull) // 过滤转换失败的 null 值
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
@Override
|
|
|
public PageResult<MyWorkRespVO> getMyNodePage(WorkflowWorkNodePageReqVO vo) {
|