车车 4 месяцев назад
Родитель
Сommit
d9fae12785
17 измененных файлов с 467 добавлено и 97 удалено
  1. 8 8
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workflowdesignnode/vo/WorkflowDesignNodePageReqVO.java
  2. 8 12
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workflowdesignnode/vo/WorkflowDesignNodeRespVO.java
  3. 8 8
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workflowdesignnode/vo/WorkflowDesignNodeSaveReqVO.java
  4. 7 6
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workflowworknode/WorkflowWorkNodeController.java
  5. 1 1
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workflowworknode/vo/WorkflowWorkNodePageReqVO.java
  6. 10 14
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workflowworknode/vo/WorkflowWorkNodeRespVO.java
  7. 16 8
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/workdesign/WorkflowDesignNodeDO.java
  8. 8 8
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/workdesign/WorkflowWorkNodeDO.java
  9. 4 4
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/mysql/workdesign/WorkflowDesignNodeMapper.java
  10. 41 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/enums/MessageEnum.java
  11. 21 0
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/enums/WorkTypeEnum.java
  12. 6 2
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/workdesign/WorkflowDesignNodeServiceImpl.java
  13. 8 2
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/workdesign/WorkflowWorkNodeService.java
  14. 283 8
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/workdesign/WorkflowWorkNodeServiceImpl.java
  15. 27 2
      yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/workdesign/WorkflowWorkServiceImpl.java
  16. 10 13
      yudao-module-iscs/src/main/resources/mapper/workdesign/WorkflowWorkMapper.xml
  17. 1 1
      yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java

+ 8 - 8
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workflowdesignnode/vo/WorkflowDesignNodePageReqVO.java

@@ -49,17 +49,17 @@ public class WorkflowDesignNodePageReqVO extends PageParam {
     @Schema(description = "表单ID(自定义表单关联)", example = "2312")
     private Long formId;
 
-    @Schema(description = "短信模板ID", example = "24350")
-    private Long smsTemplateId;
+    @Schema(description = "短信模板CODE", example = "24350")
+    private String smsTemplateCode;
 
-    @Schema(description = "站内信模板ID", example = "3034")
-    private Long messageTemplateId;
+    @Schema(description = "站内信模板CODE", example = "3034")
+    private String messageTemplateCode;
 
-    @Schema(description = "邮件模板ID", example = "21892")
-    private Long emailTemplateId;
+    @Schema(description = "邮件模板CODE", example = "21892")
+    private String emailTemplateCode;
 
-    @Schema(description = "APP通知模板ID", example = "19425")
-    private Long appTemplateId;
+    @Schema(description = "APP通知模板v", example = "19425")
+    private String appTemplateCode;
 
     @Schema(description = "被通知人ID", example = "7041")
     private Long notifyUserId;

+ 8 - 12
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workflowdesignnode/vo/WorkflowDesignNodeRespVO.java

@@ -57,21 +57,17 @@ public class WorkflowDesignNodeRespVO {
     @ExcelProperty("表单ID(自定义表单关联)")
     private Long formId;
 
-    @Schema(description = "短信模板ID", example = "24350")
-    @ExcelProperty("短信模板ID")
-    private Long smsTemplateId;
+    @Schema(description = "短信模板CODE", example = "24350")
+    private String smsTemplateCode;
 
-    @Schema(description = "站内信模板ID", example = "3034")
-    @ExcelProperty("站内信模板ID")
-    private Long messageTemplateId;
+    @Schema(description = "站内信模板CODE", example = "3034")
+    private String messageTemplateCode;
 
-    @Schema(description = "邮件模板ID", example = "21892")
-    @ExcelProperty("邮件模板ID")
-    private Long emailTemplateId;
+    @Schema(description = "邮件模板CODE", example = "21892")
+    private String emailTemplateCode;
 
-    @Schema(description = "APP通知模板ID", example = "19425")
-    @ExcelProperty("APP通知模板ID")
-    private Long appTemplateId;
+    @Schema(description = "APP通知模板v", example = "19425")
+    private String appTemplateCode;
 
     @Schema(description = "被通知人ID", example = "7041")
     @ExcelProperty("被通知人ID")

+ 8 - 8
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workflowdesignnode/vo/WorkflowDesignNodeSaveReqVO.java

@@ -48,17 +48,17 @@ public class WorkflowDesignNodeSaveReqVO {
     @Schema(description = "表单ID(自定义表单关联)", example = "2312")
     private Long formId;
 
-    @Schema(description = "短信模板ID", example = "24350")
-    private Long smsTemplateId;
+    @Schema(description = "短信模板CODE", example = "24350")
+    private String smsTemplateCode;
 
-    @Schema(description = "站内信模板ID", example = "3034")
-    private Long messageTemplateId;
+    @Schema(description = "站内信模板CODE", example = "3034")
+    private String messageTemplateCode;
 
-    @Schema(description = "邮件模板ID", example = "21892")
-    private Long emailTemplateId;
+    @Schema(description = "邮件模板CODE", example = "21892")
+    private String emailTemplateCode;
 
-    @Schema(description = "APP通知模板ID", example = "19425")
-    private Long appTemplateId;
+    @Schema(description = "APP通知模板v", example = "19425")
+    private String appTemplateCode;
 
     @Schema(description = "被通知人ID", example = "7041")
     private Long notifyUserId;

+ 7 - 6
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workflowworknode/WorkflowWorkNodeController.java

@@ -1,15 +1,10 @@
 package cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode;
 
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo.WorkflowWorkNodePageReqVO;
-import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo.WorkflowWorkNodeRespVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo.WorkflowWorkNodeSaveReqVO;
-import cn.iocoder.yudao.module.iscs.dal.dataobject.workdesign.WorkflowWorkNodeDO;
 import cn.iocoder.yudao.module.iscs.service.workdesign.WorkflowWorkNodeService;
 import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
@@ -36,7 +31,7 @@ public class WorkflowWorkNodeController {
         return success(true);
     }
 
-    @GetMapping("/selectWorkflowWorkNodeById")
+    /*@GetMapping("/selectWorkflowWorkNodeById")
     @Operation(summary = "获得作业节点")
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
     @PreAuthorize("@ss.hasPermission('iscs:workflow-work-node:query')")
@@ -51,6 +46,12 @@ public class WorkflowWorkNodeController {
     public CommonResult<PageResult<WorkflowWorkNodeRespVO>> getWorkflowWorkNodePage(@Valid WorkflowWorkNodePageReqVO pageReqVO) {
         PageResult<WorkflowWorkNodeDO> pageResult = workflowWorkNodeService.getWorkflowWorkNodePage(pageReqVO);
         return success(BeanUtils.toBean(pageResult, WorkflowWorkNodeRespVO.class));
+    }*/
+
+    @PostMapping("/test")
+    @Operation(summary = "测试")
+    public CommonResult<Boolean> insertWorkflowWork(@Valid @RequestBody WorkflowWorkNodePageReqVO createReqVO) {
+        return success(workflowWorkNodeService.sendMessageToAdmin(createReqVO.getNodeId()));
     }
 
 

+ 1 - 1
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workflowworknode/vo/WorkflowWorkNodePageReqVO.java

@@ -17,7 +17,7 @@ public class WorkflowWorkNodePageReqVO extends PageParam {
     private Long workId;
 
     @Schema(description = "节点唯一标识", example = "20418")
-    private String nodeId;
+    private Long nodeId;
 
     @Schema(description = "父节点ID", example = "6764")
     private Long parentId;

+ 10 - 14
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workflowworknode/vo/WorkflowWorkNodeRespVO.java

@@ -74,13 +74,17 @@ public class WorkflowWorkNodeRespVO {
     @ExcelProperty("表单内容")
     private String formData;
 
-    @Schema(description = "短信模板ID", example = "1796")
-    @ExcelProperty("短信模板ID")
-    private Long smsTemplateId;
+    @Schema(description = "短信模板CODE", example = "24350")
+    private String smsTemplateCode;
 
-    @Schema(description = "站内信模板ID", example = "233")
-    @ExcelProperty("站内信模板ID")
-    private Long messageTemplateId;
+    @Schema(description = "站内信模板CODE", example = "3034")
+    private String messageTemplateCode;
+
+    @Schema(description = "邮件模板CODE", example = "21892")
+    private String emailTemplateCode;
+
+    @Schema(description = "APP通知模板CODE", example = "19425")
+    private String appTemplateCode;
 
     @Schema(description = "节点状态", example = "2")
     @ExcelProperty("节点状态")
@@ -89,18 +93,10 @@ public class WorkflowWorkNodeRespVO {
     @ExcelProperty("审批意见")
     private String approvalOpinion;
 
-    @Schema(description = "邮件模板ID", example = "17553")
-    @ExcelProperty("邮件模板ID")
-    private Long emailTemplateId;
-
     @Schema(description = "隔离方式", example = "2")
     @ExcelProperty("隔离方式")
     private String isolationType;
 
-    @Schema(description = "APP通知模板ID", example = "6277")
-    @ExcelProperty("APP通知模板ID")
-    private Long appTemplateId;
-
     @Schema(description = "隔离点")
     @ExcelProperty("隔离点")
     private String isolationPoints;

+ 16 - 8
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/workdesign/WorkflowDesignNodeDO.java

@@ -79,21 +79,21 @@ public class WorkflowDesignNodeDO extends BaseDO {
      */
     private Long formId;
     /**
-     * 短信模板ID
+     * 短信模板CODE
      */
-    private Long smsTemplateId;
+    private String smsTemplateCode;
     /**
-     * 站内信模板ID
+     * 站内信模板CODE
      */
-    private Long messageTemplateId;
+    private String messageTemplateCode;
     /**
-     * 邮件模板ID
+     * 邮件模板CODE
      */
-    private Long emailTemplateId;
+    private String emailTemplateCode;
     /**
-     * APP通知模板ID
+     * APP通知模板CODE
      */
-    private Long appTemplateId;
+    private String appTemplateCode;
     /**
      * 被通知人ID
      */
@@ -118,5 +118,13 @@ public class WorkflowDesignNodeDO extends BaseDO {
      * 隔离节点ID
      */
     private String isolationNodeUuid;
+    /**
+     * 上锁人
+     */
+    private String lockPerson;
+    /**
+     * 共锁人
+     */
+    private String colockPersons;
 
 }

+ 8 - 8
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/workdesign/WorkflowWorkNodeDO.java

@@ -85,21 +85,21 @@ public class WorkflowWorkNodeDO extends BaseDO {
      */
     private String formData;
     /**
-     * 短信模板ID
+     * 短信模板CODE
      */
-    private Long smsTemplateId;
+    private String smsTemplateCode;
     /**
-     * 站内信模板ID
+     * 站内信模板CODE
      */
-    private Long messageTemplateId;
+    private String messageTemplateCode;
     /**
-     * 邮件模板ID
+     * 邮件模板CODE
      */
-    private Long emailTemplateId;
+    private String emailTemplateCode;
     /**
-     * APP通知模板ID
+     * APP通知模板CODE
      */
-    private Long appTemplateId;
+    private String appTemplateCode;
     /**
      * 被通知人ID
      */

+ 4 - 4
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/mysql/workdesign/WorkflowDesignNodeMapper.java

@@ -21,10 +21,10 @@ public interface WorkflowDesignNodeMapper extends BaseMapperX<WorkflowDesignNode
                 .eqIfPresent(WorkflowDesignNodeDO::getWorkerUserId, reqVO.getWorkerUserId())
                 .eqIfPresent(WorkflowDesignNodeDO::getWorkerGroupId, reqVO.getWorkerGroupId())
                 .eqIfPresent(WorkflowDesignNodeDO::getFormId, reqVO.getFormId())
-                .eqIfPresent(WorkflowDesignNodeDO::getSmsTemplateId, reqVO.getSmsTemplateId())
-                .eqIfPresent(WorkflowDesignNodeDO::getMessageTemplateId, reqVO.getMessageTemplateId())
-                .eqIfPresent(WorkflowDesignNodeDO::getEmailTemplateId, reqVO.getEmailTemplateId())
-                .eqIfPresent(WorkflowDesignNodeDO::getAppTemplateId, reqVO.getAppTemplateId())
+                .eqIfPresent(WorkflowDesignNodeDO::getSmsTemplateCode, reqVO.getSmsTemplateCode())
+                .eqIfPresent(WorkflowDesignNodeDO::getMessageTemplateCode, reqVO.getMessageTemplateCode())
+                .eqIfPresent(WorkflowDesignNodeDO::getEmailTemplateCode, reqVO.getEmailTemplateCode())
+                .eqIfPresent(WorkflowDesignNodeDO::getAppTemplateCode, reqVO.getAppTemplateCode())
                 .eqIfPresent(WorkflowDesignNodeDO::getNotifyUserId, reqVO.getNotifyUserId())
                 .eqIfPresent(WorkflowDesignNodeDO::getNotifyUserGroupId, reqVO.getNotifyUserGroupId())
                 .betweenIfPresent(WorkflowDesignNodeDO::getNotifyTime, reqVO.getNotifyTime())

+ 41 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/enums/MessageEnum.java

@@ -0,0 +1,41 @@
+package cn.iocoder.yudao.module.iscs.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum MessageEnum {
+    MESSAGE_001("MESSAGE_001","ISCS_SMS_001", "ISCS_ZNX_001"),  // 发布作业成功后推送-创建作业
+    MESSAGE_002("MESSAGE_002","ISCS_SMS_002", "ISCS_ZNX_002"),  // 节点任务开始时推送-确认
+    MESSAGE_003("MESSAGE_003","ISCS_SMS_003", "ISCS_ZNX_003"),  // 节点任务开始时推送-审核
+    MESSAGE_004("MESSAGE_004","ISCS_SMS_004", "ISCS_ZNX_004"),  // 节点任务开始时推送-上锁
+    MESSAGE_005("MESSAGE_005","ISCS_SMS_005", "ISCS_ZNX_005"),  // 节点任务开始时推送-解除上锁
+    MESSAGE_006("MESSAGE_006","ISCS_SMS_006", "ISCS_ZNX_006"),  // 节点任务开始时推送-完成 / 结束
+    MESSAGE_007("MESSAGE_007","ISCS_SMS_007", "ISCS_ZNX_007"),  // 节点任务开始时推送-录入信息
+    MESSAGE_008("MESSAGE_008","ISCS_SMS_008", "ISCS_ZNX_008"),  // 节点任务开始时推送-共锁
+    MESSAGE_009("MESSAGE_009","ISCS_SMS_009", "ISCS_ZNX_009"),  // 节点任务开始时推送-解除共锁
+    MESSAGE_010("MESSAGE_010","ISCS_SMS_010", "ISCS_ZNX_010");  // 节点任务开始时推送-还锁
+
+    public final String key;
+
+    public final String sms;
+
+    public final String znx;
+
+    /**
+     * 根据key查找对应的枚举实例
+     * @param key 枚举key(如"MESSAGE_001")
+     * @return 匹配的枚举实例,无匹配则返回null
+     */
+    public static MessageEnum getByKey(String key) {
+        // 遍历所有枚举常量,匹配key
+        for (MessageEnum enumItem : MessageEnum.values()) {
+            if (enumItem.key.equals(key)) {
+                return enumItem;
+            }
+        }
+        // 无匹配时返回null(也可根据业务需求抛出异常,比如throw new IllegalArgumentException("无效的key: " + key))
+        return null;
+    }
+}

+ 21 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/enums/WorkTypeEnum.java

@@ -0,0 +1,21 @@
+package cn.iocoder.yudao.module.iscs.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum WorkTypeEnum {
+    CREATEJOB("createJob"),                // 创建作业
+    CONFIRM("confirm"),                    // 确认
+    REVIEW("review"),                      // 审核
+    INPUTINFO("inputInfo"),                // 录入信息
+    ISOLATION("isolation"),                // 隔离/方案
+    RELEASEISOLATION("releaseIsolation"),  // 解除隔离
+    RETURNLOCK("returnLock"),              // 还锁
+    COMPLETE("complete");                  // 完成/结束
+
+
+    public final String value;
+
+}

+ 6 - 2
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/workdesign/WorkflowDesignNodeServiceImpl.java

@@ -141,9 +141,11 @@ public class WorkflowDesignNodeServiceImpl extends ServiceImpl<WorkflowDesignNod
                     String isolationType = node.get("data").get("isolationType") != null ? node.get("data").get("isolationType").asText() : null;
                     String isolationPoints = node.get("data").get("isolationPoints") != null ? node.get("data").get("isolationPoints").toString() : null;
                     String isolationNodeUuid = node.get("data").get("isolationNodeUuid") != null ? node.get("data").get("isolationNodeUuid").asText() : null;
+                    String lockPerson = node.get("data").get("lockPerson") != null ? node.get("data").get("lockPerson").asText() : null;
+                    String coLockPersons = node.get("data").get("coLockPersons") != null ? node.get("data").get("coLockPersons").toString() : null;
 
-                    System.out.printf("节点%d: uuid=%s, nodeName=%s, nodeIcon=%s, 类型=%s, position=%s, data=%s, 标签=%s, 表单=%s, 负责人=%s, 隔离类型=%s, 隔离点=%s, 隔离点Uuid=%s%n",
-                            ++index, uuid, nodeName, nodeIcon, type, position, data, remark, formId, workerUserId, isolationType, isolationPoints, isolationNodeUuid);
+                    System.out.printf("节点%d: uuid=%s, nodeName=%s, nodeIcon=%s, 类型=%s, position=%s, data=%s, 标签=%s, 表单=%s, 负责人=%s, 隔离类型=%s, 隔离点=%s, 隔离点Uuid=%s, 上锁人=%s, 共锁人=%s%n",
+                            ++index, uuid, nodeName, nodeIcon, type, position, data, remark, formId, workerUserId, isolationType, isolationPoints, isolationNodeUuid, lockPerson, coLockPersons);
                     WorkflowDesignNodeDO workflowDesignNodeDO = new WorkflowDesignNodeDO();
                     workflowDesignNodeDO.setUuid(uuid);
                     workflowDesignNodeDO.setNodeName(nodeName);
@@ -156,6 +158,8 @@ public class WorkflowDesignNodeServiceImpl extends ServiceImpl<WorkflowDesignNod
                     workflowDesignNodeDO.setIsolationType(StringUtils.isNotBlank(isolationType) ? isolationType : null);
                     workflowDesignNodeDO.setIsolationPoints(StringUtils.isNotBlank(isolationPoints) && !"[]".equals(isolationPoints) ? isolationPoints : null);
                     workflowDesignNodeDO.setIsolationNodeUuid(StringUtils.isNotBlank(isolationNodeUuid) ? isolationNodeUuid : null);
+                    workflowDesignNodeDO.setLockPerson(StringUtils.isNotBlank(lockPerson) ? lockPerson : null);
+                    workflowDesignNodeDO.setColockPersons(StringUtils.isNotBlank(coLockPersons) && !"[]".equals(coLockPersons) ? coLockPersons : null);
                     // 处理关系字段
                     PcValueVO pcValueVO = pcValueMap.get(uuid);
                     if (pcValueVO != null) {

+ 8 - 2
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/workdesign/WorkflowWorkNodeService.java

@@ -7,8 +7,6 @@ import cn.iocoder.yudao.module.iscs.dal.dataobject.workdesign.WorkflowWorkNodeDO
 import com.baomidou.mybatisplus.extension.service.IService;
 import jakarta.validation.Valid;
 
-import java.util.List;
-
 /**
  * 作业节点 Service 接口
  *
@@ -48,4 +46,12 @@ public interface WorkflowWorkNodeService extends IService<WorkflowWorkNodeDO> {
      */
     Boolean copyNode(Long designId, Long workId);
 
+    /**
+     * 发送单条消息给管理后台的用户
+     * @param nodeId
+     * @return
+     */
+    Boolean sendMessageToAdmin(Long nodeId);
+
+
 }

+ 283 - 8
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/workdesign/WorkflowWorkNodeServiceImpl.java

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

+ 27 - 2
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/workdesign/WorkflowWorkServiceImpl.java

@@ -245,12 +245,21 @@ public class WorkflowWorkServiceImpl extends ServiceImpl<WorkflowWorkMapper, Wor
                             .eq(WorkflowWorkNodeDO::getId, nodeDO.getId())
                             .set(WorkflowWorkNodeDO::getApprovalStatus, "approved")
                             .set(WorkflowWorkNodeDO::getStartTime, LocalDateTime.now()));
+                    // 发送消息
+                    workflowWorkNodeService.sendMessageToAdmin(nodeDO.getId());
                     // 开启第二(审批)节点
                     workflowWorkNodeService.update(Wrappers.<WorkflowWorkNodeDO>lambdaUpdate()
                             .eq(WorkflowWorkNodeDO::getWorkId, vo.getWorkId())
                             .eq(WorkflowWorkNodeDO::getParentUuid, nodeDO.getUuid())
                             .set(WorkflowWorkNodeDO::getApprovalStatus, "running")
                             .set(WorkflowWorkNodeDO::getStartTime, LocalDateTime.now()));
+                    // 发送消息
+                    List<WorkflowWorkNodeDO> list1 = workflowWorkNodeService.list(Wrappers.<WorkflowWorkNodeDO>lambdaQuery()
+                            .eq(WorkflowWorkNodeDO::getWorkId, vo.getWorkId())
+                            .eq(WorkflowWorkNodeDO::getParentUuid, nodeDO.getUuid()));
+                    for (WorkflowWorkNodeDO workflowWorkNodeDO : list1) {
+                        workflowWorkNodeService.sendMessageToAdmin(workflowWorkNodeDO.getId());
+                    }
                 }
             }
         }
@@ -340,8 +349,14 @@ public class WorkflowWorkServiceImpl extends ServiceImpl<WorkflowWorkMapper, Wor
                         .eq(WorkflowWorkNodeDO::getWorkId, nodeDO.getWorkId())
                         .in(WorkflowWorkNodeDO::getUuid, list)
                         .set(WorkflowWorkNodeDO::getApprovalStatus, "running")
-                        .set(WorkflowWorkNodeDO::getStartTime, now)
-                );
+                        .set(WorkflowWorkNodeDO::getStartTime, now));
+                // 发送消息
+                List<WorkflowWorkNodeDO> list1 = workflowWorkNodeService.list(Wrappers.<WorkflowWorkNodeDO>lambdaQuery()
+                        .eq(WorkflowWorkNodeDO::getWorkId, nodeDO.getWorkId())
+                        .in(WorkflowWorkNodeDO::getUuid, list));
+                for (WorkflowWorkNodeDO workflowWorkNodeDO : list1) {
+                    workflowWorkNodeService.sendMessageToAdmin(workflowWorkNodeDO.getId());
+                }
             } else {
                 // 如果没有后续节点,看下是否完成整个流程
                 List<WorkflowWorkNodeDO> list = workflowWorkNodeService.list(Wrappers.<WorkflowWorkNodeDO>lambdaQuery()
@@ -374,6 +389,16 @@ public class WorkflowWorkServiceImpl extends ServiceImpl<WorkflowWorkMapper, Wor
         PageResult<WorkflowWorkRespVO> respVOPageResult = new PageResult<>();
         respVOPageResult.setList(myWorkPage.getRecords());
         respVOPageResult.setTotal(myWorkPage.getTotal());
+        // 查询当前节点
+        for (WorkflowWorkRespVO workflowWorkRespVO : respVOPageResult.getList()) {
+            List<WorkflowWorkNodeDO> list = workflowWorkNodeService.list(Wrappers.<WorkflowWorkNodeDO>lambdaQuery()
+                    .eq(WorkflowWorkNodeDO::getWorkId, workflowWorkRespVO.getId())
+                    .eq(WorkflowWorkNodeDO::getApprovalStatus, "running"));
+            if (!list.isEmpty()) {
+                String currentNodeName = list.stream().filter(o -> StringUtils.isNotBlank(o.getNodeName())).map(WorkflowWorkNodeDO::getNodeName).collect(Collectors.joining(","));
+                workflowWorkRespVO.setCurrentNodeName(currentNodeName);
+            }
+        }
         return respVOPageResult;
     }
 

+ 10 - 13
yudao-module-iscs/src/main/resources/mapper/workdesign/WorkflowWorkMapper.xml

@@ -206,32 +206,29 @@
         ww.cancellation_time,
         ww.cancellation_reason,
         ww.status,
-        ww.plan_time
+        ww.plan_time,
+        ww.create_time
         FROM
         isc_workflow_work ww
         <where>
             ww.deleted = b'0'
-            AND (
-            EXISTS (
-            SELECT 1
-            FROM isc_workflow_work_node wwn
-            WHERE
-            wwn.work_id = ww.id
-            AND wwn.deleted = b'0'
-            AND (
+            AND ( EXISTS ( SELECT 1 FROM isc_workflow_work_node wwn WHERE wwn.work_id = ww.id AND wwn.deleted = b'0' AND (
             -- 条件1:节点自身负责人ID匹配
             wwn.worker_user_id = #{vo.loginUserId}
             -- 条件2:关联表中负责人ID匹配
-            OR EXISTS (SELECT 1 FROM isc_workflow_work_node_user work_node_user
-            WHERE work_node_user.node_id = wwn.id
+            OR EXISTS (SELECT 1 FROM isc_workflow_work_node_user work_node_user WHERE work_node_user.node_id = wwn.id
             AND work_node_user.deleted = b'0'
-            AND work_node_user.user_id = #{vo.loginUserId} ) )
-            ) )
+            AND work_node_user.user_id = #{vo.loginUserId} ) ) )
+            -- 我的创建
+            OR ww.creator = #{vo.loginUserId} )
             <if test="vo.key != null and vo.key.trim != ''">
                 AND (ww.name like concat('%',#{vo.key},'%')
                 OR ww.order_no like concat('%',#{vo.key},'%')
                 OR ww.initiator_name like concat('%',#{vo.key},'%'))
             </if>
+            <if test="vo.status != null and vo.status.trim != ''">
+                AND ww.status = #{vo.status}
+            </if>
         </where>
         ORDER BY ww.create_time DESC
 

+ 1 - 1
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java

@@ -90,7 +90,7 @@ public class SmsLogServiceImpl implements SmsLogService {
                     .in(AdminUserDO::getId, userIds));
             for (SmsLogRespVO smsLogRespVO : bean.getList()) {
                 for (AdminUserDO adminUserDO : adminUserDOList) {
-                    if (smsLogRespVO.getUserId().equals(adminUserDO.getId())) {
+                    if (smsLogRespVO.getUserId() != null && smsLogRespVO.getUserId().equals(adminUserDO.getId())) {
                         smsLogRespVO.setNickname(adminUserDO.getNickname());
                     }
                 }