|
|
@@ -8,20 +8,31 @@ import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode
|
|
|
import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo.WorkflowWorkNodePageReqVO;
|
|
|
import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo.WorkflowWorkNodeSaveReqVO;
|
|
|
import cn.iocoder.yudao.module.iscs.dal.dataobject.workdesign.WorkflowDesignNodeDO;
|
|
|
+import cn.iocoder.yudao.module.iscs.dal.dataobject.workdesign.WorkflowWorkDO;
|
|
|
import cn.iocoder.yudao.module.iscs.dal.dataobject.workdesign.WorkflowWorkNodeDO;
|
|
|
import cn.iocoder.yudao.module.iscs.dal.dataobject.workdesign.WorkflowWorkNodeUserDO;
|
|
|
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.system.dal.dataobject.user.AdminUserDO;
|
|
|
+import cn.iocoder.yudao.module.system.service.notify.NotifySendService;
|
|
|
+import cn.iocoder.yudao.module.system.service.notify.NotifyTemplateService;
|
|
|
+import cn.iocoder.yudao.module.system.service.sms.SmsSendService;
|
|
|
+import cn.iocoder.yudao.module.system.service.sms.SmsTemplateService;
|
|
|
+import cn.iocoder.yudao.module.system.service.user.AdminUserService;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import jakarta.annotation.Resource;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
import org.dromara.hutool.core.lang.Assert;
|
|
|
+import org.springframework.context.annotation.Lazy;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.List;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 作业节点 Service 实现类
|
|
|
@@ -38,8 +49,22 @@ public class WorkflowWorkNodeServiceImpl extends ServiceImpl<WorkflowWorkNodeMap
|
|
|
private WorkflowDesignNodeService workflowDesignNodeService;
|
|
|
@Resource
|
|
|
private WorkflowWorkNodeUserService workflowWorkNodeUserService;
|
|
|
+ @Lazy
|
|
|
+ @Resource
|
|
|
+ private WorkflowWorkService workflowWorkService;
|
|
|
@Resource
|
|
|
private BpmFormService bpmFormService;
|
|
|
+ @Resource
|
|
|
+ private SmsTemplateService smsTemplateService;
|
|
|
+ @Resource
|
|
|
+ private SmsSendService smsSendService;
|
|
|
+ @Resource
|
|
|
+ private NotifyTemplateService notifyTemplateService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private NotifySendService notifySendService;
|
|
|
+ @Resource
|
|
|
+ private AdminUserService adminUserService;
|
|
|
|
|
|
|
|
|
@Override
|
|
|
@@ -52,8 +77,7 @@ public class WorkflowWorkNodeServiceImpl extends ServiceImpl<WorkflowWorkNodeMap
|
|
|
// 开始新建isc_workflow_work_node_user关联关系
|
|
|
if (updateReqVO.getNodeUserDOList() != null && !updateReqVO.getNodeUserDOList().isEmpty()) {
|
|
|
// 无论有没有 先删除再生成
|
|
|
- workflowWorkNodeUserService.remove(Wrappers.<WorkflowWorkNodeUserDO>lambdaQuery()
|
|
|
- .eq(WorkflowWorkNodeUserDO::getNodeId, updateReqVO.getNodeId()));
|
|
|
+ workflowWorkNodeUserService.remove(Wrappers.<WorkflowWorkNodeUserDO>lambdaQuery().eq(WorkflowWorkNodeUserDO::getNodeId, updateReqVO.getNodeId()));
|
|
|
// 开始生成
|
|
|
updateReqVO.getNodeUserDOList().forEach(o -> o.setNodeId(updateReqVO.getNodeId()));
|
|
|
workflowWorkNodeUserService.saveBatch(updateReqVO.getNodeUserDOList());
|
|
|
@@ -74,9 +98,7 @@ public class WorkflowWorkNodeServiceImpl extends ServiceImpl<WorkflowWorkNodeMap
|
|
|
@Override
|
|
|
public Boolean copyNode(Long designId, Long workId) {
|
|
|
// 需要copy的数据
|
|
|
- List<WorkflowDesignNodeDO> designNodeDOList = workflowDesignNodeService.list(Wrappers.<WorkflowDesignNodeDO>lambdaQuery()
|
|
|
- .eq(WorkflowDesignNodeDO::getDesignId, designId)
|
|
|
- .orderByAsc(WorkflowDesignNodeDO::getId));
|
|
|
+ List<WorkflowDesignNodeDO> designNodeDOList = workflowDesignNodeService.list(Wrappers.<WorkflowDesignNodeDO>lambdaQuery().eq(WorkflowDesignNodeDO::getDesignId, designId).orderByAsc(WorkflowDesignNodeDO::getId));
|
|
|
// 开始copy数据
|
|
|
List<WorkflowWorkNodeDO> workNodeDOList = BeanUtils.toBean(designNodeDOList, WorkflowWorkNodeDO.class);
|
|
|
// 通过formid获取formdata的数据,copy到worknode中
|
|
|
@@ -103,7 +125,260 @@ public class WorkflowWorkNodeServiceImpl extends ServiceImpl<WorkflowWorkNodeMap
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
- return saveBatch(workNodeDOList);
|
|
|
+ saveBatch(workNodeDOList);
|
|
|
+
|
|
|
+ // 存储上锁人、公锁人
|
|
|
+ List<WorkflowWorkNodeUserDO> workflowWorkNodeUserDOS = new ArrayList<>();
|
|
|
+ for (WorkflowWorkNodeDO nodeDO : workNodeDOList) {
|
|
|
+ if ("isolation".equals(nodeDO.getType())) {
|
|
|
+ for (WorkflowDesignNodeDO workflowDesignNodeDO : designNodeDOList) {
|
|
|
+ if (nodeDO.getUuid().equals(workflowDesignNodeDO.getUuid())) {
|
|
|
+ // 解析上锁人
|
|
|
+ if (StringUtils.isNotBlank(workflowDesignNodeDO.getLockPerson())) {
|
|
|
+ WorkflowWorkNodeUserDO workflowWorkNodeUserDO = new WorkflowWorkNodeUserDO();
|
|
|
+ workflowWorkNodeUserDO.setNodeId(nodeDO.getId());
|
|
|
+ workflowWorkNodeUserDO.setType("jtlocker");
|
|
|
+ workflowWorkNodeUserDO.setUserId(Long.valueOf(workflowDesignNodeDO.getLockPerson()));
|
|
|
+ workflowWorkNodeUserDOS.add(workflowWorkNodeUserDO);
|
|
|
+ }
|
|
|
+ // 解析共锁人
|
|
|
+ if (StringUtils.isNotBlank(workflowDesignNodeDO.getColockPersons())) {
|
|
|
+ List<Long> longs = parseStringToLongList(workflowDesignNodeDO.getColockPersons());
|
|
|
+ for (Long aLong : longs) {
|
|
|
+ WorkflowWorkNodeUserDO workflowWorkNodeUserDO = new WorkflowWorkNodeUserDO();
|
|
|
+ workflowWorkNodeUserDO.setNodeId(nodeDO.getId());
|
|
|
+ workflowWorkNodeUserDO.setType("jtcolocker");
|
|
|
+ workflowWorkNodeUserDO.setUserId(aLong);
|
|
|
+ workflowWorkNodeUserDOS.add(workflowWorkNodeUserDO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!workflowWorkNodeUserDOS.isEmpty()) {
|
|
|
+ workflowWorkNodeUserService.saveBatch(workflowWorkNodeUserDOS);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将形如 "[105,104]" 的字符串解析为 List<Long>
|
|
|
+ *
|
|
|
+ * @param str 待解析的字符串(格式如 [105,104])
|
|
|
+ * @return 解析后的 Long 类型 List
|
|
|
+ * @throws IllegalArgumentException 格式错误时抛出异常
|
|
|
+ */
|
|
|
+ public static List<Long> parseStringToLongList(String str) {
|
|
|
+ // 1. 校验入参非空
|
|
|
+ if (str == null || str.trim().isEmpty()) {
|
|
|
+ throw new IllegalArgumentException("待解析字符串不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 2. 移除首尾的中括号,同时去除首尾空格
|
|
|
+ String cleanStr = str.trim().replaceAll("^\\[|\\]$", "");
|
|
|
+
|
|
|
+ // 3. 处理空列表情况(如 "[]")
|
|
|
+ if (cleanStr.isEmpty()) {
|
|
|
+ return List.of(); // 返回空不可变列表
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 按逗号分割(兼容逗号前后有空格的情况,如 [105, 104])
|
|
|
+ String[] numStrs = cleanStr.split("\\s*,\\s*");
|
|
|
+
|
|
|
+ // 5. 转换为 Long 类型并收集成 List
|
|
|
+ return Arrays.stream(numStrs).map(Long::valueOf) // 字符串转 Long
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ // 转换失败时抛出明确的异常信息
|
|
|
+ // throw new IllegalArgumentException("字符串格式错误,无法解析为数字列表:" + str, e);
|
|
|
+ return new ArrayList<>();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Boolean sendMessageToAdmin(Long nodeId) {
|
|
|
+ // 获取节点信息
|
|
|
+ WorkflowWorkNodeDO nodeDO = getById(nodeId);
|
|
|
+
|
|
|
+ if (nodeDO != null && (StringUtils.isNotBlank(nodeDO.getSmsTemplateCode()) || StringUtils.isNotBlank(nodeDO.getMessageTemplateCode()) || StringUtils.isNotBlank(nodeDO.getEmailTemplateCode()) || StringUtils.isNotBlank(nodeDO.getAppTemplateCode()))) {
|
|
|
+ // 如果节点存在,并且有一个消息方式需要发送,就开始解析发送
|
|
|
+ try {
|
|
|
+ sendByType(nodeDO);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("发送异常---------------" + nodeDO.getId());
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
+ private void sendByType(WorkflowWorkNodeDO nodeDO) {
|
|
|
+ if (nodeDO.getType().equals(WorkTypeEnum.CREATEJOB.value)) {
|
|
|
+ // 创建作业
|
|
|
+ WorkflowWorkDO workDO = workflowWorkService.getById(nodeDO.getWorkId());
|
|
|
+ AdminUserDO user = adminUserService.getUser(Long.valueOf(workDO.getCreator()));
|
|
|
+ if (user != null) {
|
|
|
+ Map<String, Object> templateParams = new HashMap<>();
|
|
|
+ templateParams.put("name", user.getNickname());
|
|
|
+ sendMessage(nodeDO, user.getId(), "MESSAGE_001", templateParams);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (nodeDO.getType().equals(WorkTypeEnum.CONFIRM.value)) {
|
|
|
+ // 确认
|
|
|
+ if (nodeDO.getWorkerUserId() != null) {
|
|
|
+ AdminUserDO user = adminUserService.getUser(nodeDO.getWorkerUserId());
|
|
|
+ if (user != null) {
|
|
|
+ Map<String, Object> templateParams = new HashMap<>();
|
|
|
+ templateParams.put("name", user.getNickname());
|
|
|
+ sendMessage(nodeDO, user.getId(), "MESSAGE_002", templateParams);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (nodeDO.getType().equals(WorkTypeEnum.REVIEW.value)) {
|
|
|
+ // 审核
|
|
|
+ if (nodeDO.getWorkerUserId() != null) {
|
|
|
+ AdminUserDO user = adminUserService.getUser(nodeDO.getWorkerUserId());
|
|
|
+ if (user != null) {
|
|
|
+ Map<String, Object> templateParams = new HashMap<>();
|
|
|
+ templateParams.put("name", user.getNickname());
|
|
|
+ sendMessage(nodeDO, user.getId(), "MESSAGE_003", templateParams);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (nodeDO.getType().equals(WorkTypeEnum.INPUTINFO.value)) {
|
|
|
+ // 录入信息
|
|
|
+ if (nodeDO.getWorkerUserId() != null) {
|
|
|
+ AdminUserDO user = adminUserService.getUser(nodeDO.getWorkerUserId());
|
|
|
+ if (user != null) {
|
|
|
+ Map<String, Object> templateParams = new HashMap<>();
|
|
|
+ templateParams.put("name", user.getNickname());
|
|
|
+ sendMessage(nodeDO, user.getId(), "MESSAGE_007", templateParams);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (nodeDO.getType().equals(WorkTypeEnum.ISOLATION.value)) {
|
|
|
+ // 上锁/共锁
|
|
|
+ List<WorkflowWorkNodeUserDO> nodeUserDOList = workflowWorkNodeUserService.list(Wrappers.<WorkflowWorkNodeUserDO>lambdaQuery().eq(WorkflowWorkNodeUserDO::getNodeId, nodeDO.getId()));
|
|
|
+ // 上锁人
|
|
|
+ List<Long> jtlockerIds = nodeUserDOList.stream().filter(o -> "jtlocker".equals(o.getType())).map(WorkflowWorkNodeUserDO::getUserId).toList();
|
|
|
+ StringBuilder jtlockerName = new StringBuilder();
|
|
|
+ if (!jtlockerIds.isEmpty()) {
|
|
|
+ List<AdminUserDO> userList = adminUserService.getUserList(jtlockerIds);
|
|
|
+ for (AdminUserDO adminUserDO : userList) {
|
|
|
+ // 发送
|
|
|
+ Map<String, Object> templateParams = new HashMap<>();
|
|
|
+ templateParams.put("name", adminUserDO.getNickname());
|
|
|
+ sendMessage(nodeDO, adminUserDO.getId(), "MESSAGE_004", templateParams);
|
|
|
+ jtlockerName.append(adminUserDO.getNickname());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 共锁人
|
|
|
+ List<Long> jtcolockerIds = nodeUserDOList.stream().filter(o -> "jtcolocker".equals(o.getType())).map(WorkflowWorkNodeUserDO::getUserId).toList();
|
|
|
+ if (!jtcolockerIds.isEmpty()) {
|
|
|
+ List<AdminUserDO> userList = adminUserService.getUserList(jtcolockerIds);
|
|
|
+ for (AdminUserDO adminUserDO : userList) {
|
|
|
+ // 发送
|
|
|
+ Map<String, Object> templateParams = new HashMap<>();
|
|
|
+ templateParams.put("name", adminUserDO.getNickname());
|
|
|
+ templateParams.put("name1", jtlockerName);
|
|
|
+ sendMessage(nodeDO, adminUserDO.getId(), "MESSAGE_008", templateParams);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (nodeDO.getType().equals(WorkTypeEnum.RELEASEISOLATION.value)) {
|
|
|
+ // 解除共锁/上锁
|
|
|
+ if (StringUtils.isNotBlank(nodeDO.getIsolationNodeUuid())) {
|
|
|
+ // 先找到对应的上锁node
|
|
|
+ WorkflowWorkNodeDO parentNode = getOne(Wrappers.<WorkflowWorkNodeDO>lambdaQuery().eq(WorkflowWorkNodeDO::getUuid, nodeDO.getIsolationNodeUuid()));
|
|
|
+ // 再找关联的人员信息
|
|
|
+ List<WorkflowWorkNodeUserDO> nodeUserDOList = workflowWorkNodeUserService.list(Wrappers.<WorkflowWorkNodeUserDO>lambdaQuery().eq(WorkflowWorkNodeUserDO::getNodeId, parentNode.getId()));
|
|
|
+ // 共锁人
|
|
|
+ List<Long> jtcolockerIds = nodeUserDOList.stream().filter(o -> "jtcolocker".equals(o.getType())).map(WorkflowWorkNodeUserDO::getUserId).toList();
|
|
|
+ StringBuilder jtcolockerName = new StringBuilder();
|
|
|
+ if (!jtcolockerIds.isEmpty()) {
|
|
|
+ List<AdminUserDO> userList = adminUserService.getUserList(jtcolockerIds);
|
|
|
+ for (AdminUserDO adminUserDO : userList) {
|
|
|
+ // 发送
|
|
|
+ Map<String, Object> templateParams = new HashMap<>();
|
|
|
+ templateParams.put("name", adminUserDO.getNickname());
|
|
|
+ sendMessage(nodeDO, adminUserDO.getId(), "MESSAGE_009", templateParams);
|
|
|
+ jtcolockerName.append(adminUserDO.getNickname());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 上锁人
|
|
|
+ List<Long> jtlockerIds = nodeUserDOList.stream().filter(o -> "jtlocker".equals(o.getType())).map(WorkflowWorkNodeUserDO::getUserId).toList();
|
|
|
+ if (!jtlockerIds.isEmpty()) {
|
|
|
+ List<AdminUserDO> userList = adminUserService.getUserList(jtlockerIds);
|
|
|
+ for (AdminUserDO adminUserDO : userList) {
|
|
|
+ // 发送
|
|
|
+ Map<String, Object> templateParams = new HashMap<>();
|
|
|
+ templateParams.put("name", adminUserDO.getNickname());
|
|
|
+ templateParams.put("names", jtcolockerName);
|
|
|
+ sendMessage(nodeDO, adminUserDO.getId(), "MESSAGE_005", templateParams);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (nodeDO.getType().equals(WorkTypeEnum.RETURNLOCK.value)) {
|
|
|
+ // 还锁
|
|
|
+ if (nodeDO.getWorkerUserId() != null) {
|
|
|
+ AdminUserDO user = adminUserService.getUser(nodeDO.getWorkerUserId());
|
|
|
+ if (user != null) {
|
|
|
+ Map<String, Object> templateParams = new HashMap<>();
|
|
|
+ templateParams.put("name", user.getNickname());
|
|
|
+ sendMessage(nodeDO, user.getId(), "MESSAGE_010", templateParams);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (nodeDO.getType().equals(WorkTypeEnum.COMPLETE.value)) {
|
|
|
+ // 完成/结束
|
|
|
+ if (nodeDO.getWorkerUserId() != null) {
|
|
|
+ AdminUserDO user = adminUserService.getUser(nodeDO.getWorkerUserId());
|
|
|
+ if (user != null) {
|
|
|
+ Map<String, Object> templateParams = new HashMap<>();
|
|
|
+ templateParams.put("name", user.getNickname());
|
|
|
+ sendMessage(nodeDO, user.getId(), "MESSAGE_006", templateParams);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void sendMessage(WorkflowWorkNodeDO nodeDO, Long userId, String templateKey, Map<String, Object> templateParams) {
|
|
|
+ // 检查哪些发送渠道正常,并发送
|
|
|
+ if (StringUtils.isNotBlank(nodeDO.getSmsTemplateCode())) {
|
|
|
+ // 短信
|
|
|
+ /*SmsTemplateDO smsTemplate = smsTemplateService.getSmsTemplateByCodeFromCache(nodeDO.getSmsTemplateCode());
|
|
|
+ if (smsTemplate != null) {
|
|
|
+ smsSendService.sendSingleSmsToAdmin(null, userId, smsTemplate.getCode(), templateParams);
|
|
|
+ }*/
|
|
|
+ smsSendService.sendSingleSmsToAdmin(null, userId, Objects.requireNonNull(MessageEnum.getByKey(templateKey)).sms, templateParams);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (StringUtils.isNotBlank(nodeDO.getMessageTemplateCode())) {
|
|
|
+ // 站内信
|
|
|
+ // NotifyTemplateDO notifyTemplate = notifyTemplateService.getNotifyTemplateByCodeFromCache(nodeDO.getMessageTemplateCode());
|
|
|
+ // if (notifyTemplate != null) {
|
|
|
+ // notifySendService.sendSingleNotifyToAdmin(userId, notifyTemplate.getCode(), templateParams);
|
|
|
+ // }
|
|
|
+ notifySendService.sendSingleNotifyToAdmin(userId, Objects.requireNonNull(MessageEnum.getByKey(templateKey)).znx, templateParams);
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(nodeDO.getEmailTemplateCode())) {
|
|
|
+ // 邮件
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(nodeDO.getAppTemplateCode())) {
|
|
|
+ // app
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|