Jelajahi Sumber

update 优化 工作流后台发起或审批可以手动设置办理人

疯狂的狮子Li 11 bulan lalu
induk
melakukan
e67399c2c7

+ 5 - 0
ruoyi-api/ruoyi-api-workflow/src/main/java/org/dromara/workflow/api/domain/RemoteCompleteTask.java

@@ -50,6 +50,11 @@ public class RemoteCompleteTask implements Serializable {
      */
     private String notice;
 
+    /**
+     * 办理人(可不填 用于覆盖当前节点办理人)
+     */
+    private String handler;
+
     /**
      * 流程变量
      */

+ 5 - 0
ruoyi-api/ruoyi-api-workflow/src/main/java/org/dromara/workflow/api/domain/RemoteStartProcess.java

@@ -30,6 +30,11 @@ public class RemoteStartProcess implements Serializable {
      */
     private String flowCode;
 
+    /**
+     * 办理人(可不填 用于覆盖当前节点办理人)
+     */
+    private String handler;
+
     /**
      * 流程变量,前端会提交一个元素{'entity': {业务详情数据对象}}
      */

+ 5 - 0
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java

@@ -53,6 +53,11 @@ public class CompleteTaskBo implements Serializable {
      */
     private String notice;
 
+    /**
+     * 办理人(可不填 用于覆盖当前节点办理人)
+     */
+    private String handler;
+
     /**
      * 流程变量
      */

+ 5 - 0
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java

@@ -34,6 +34,11 @@ public class StartProcessBo implements Serializable {
     @NotBlank(message = "流程定义编码不能为空", groups = {AddGroup.class})
     private String flowCode;
 
+    /**
+     * 办理人(可不填 用于覆盖当前节点办理人)
+     */
+    private String handler;
+
     /**
      * 流程变量,前端会提交一个元素{'entity': {业务详情数据对象}}
      */

+ 10 - 0
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/WorkflowService.java

@@ -78,6 +78,8 @@ public interface WorkflowService {
 
     /**
      * 办理任务
+     * 系统后台发起审批 无用户信息 需要忽略权限
+     * completeTask.getVariables().put("ignore", true);
      *
      * @param completeTask 参数
      * @return 结果
@@ -89,7 +91,15 @@ public interface WorkflowService {
      *
      * @param taskId  任务ID
      * @param message 办理意见
+     * @return 结果
      */
     boolean completeTask(Long taskId, String message);
 
+    /**
+     * 启动流程并办理第一个任务
+     *
+     * @param startProcess 参数
+     * @return 结果
+     */
+    boolean startCompleteTask(RemoteStartProcess startProcess);
 }

+ 2 - 0
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java

@@ -128,6 +128,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
         variables.put(FlowConstant.AUTO_PASS, autoPass);
 
         FlowParams flowParams = FlowParams.build()
+            .handler(startProcessBo.getHandler())
             .flowCode(startProcessBo.getFlowCode())
             .variable(startProcessBo.getVariables())
             .flowStatus(BusinessStatusEnum.DRAFT.getStatus());
@@ -187,6 +188,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
             }
             // 构建流程参数,包括变量、跳转类型、消息、处理人、权限等信息
             FlowParams flowParams = FlowParams.build()
+                .handler(completeTaskBo.getHandler())
                 .variable(variables)
                 .skipType(SkipType.PASS.getKey())
                 .message(completeTaskBo.getMessage())

+ 9 - 10
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java

@@ -132,16 +132,15 @@ public class TestLeaveServiceImpl implements ITestLeaveService {
             bo.setId(leave.getId());
             // 后端发起需要忽略权限
             bo.getParams().put("ignore", true);
-            RemoteStartProcessReturn result = workflowService.startWorkFlow(new RemoteStartProcess() {{
-                setBusinessId(leave.getId().toString());
-                setFlowCode(StringUtils.isEmpty(bo.getFlowCode()) ? "leave1" : bo.getFlowCode());
-                setVariables(bo.getParams());
-            }});
-            boolean flag1 = workflowService.completeTask(new RemoteCompleteTask() {{
-                setTaskId(result.getTaskId());
-                setMessageType(List.of("1"));
-                setVariables(bo.getParams());
-            }});
+
+            RemoteStartProcess startProcess = new RemoteStartProcess();
+            startProcess.setBusinessId(leave.getId().toString());
+            startProcess.setFlowCode(StringUtils.isEmpty(bo.getFlowCode()) ? "leave1" : bo.getFlowCode());
+            startProcess.setVariables(bo.getParams());
+            // 后端发起 如果没有登录用户 比如定时任务 可以手动设置一个处理人id
+            // startProcess.setHandler("0");
+
+            boolean flag1 = workflowService.startCompleteTask(startProcess);
             if (!flag1) {
                 throw new ServiceException("流程发起异常");
             }

+ 33 - 0
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java

@@ -3,12 +3,14 @@ package org.dromara.workflow.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.warm.flow.orm.entity.FlowInstance;
 import org.dromara.workflow.api.domain.RemoteCompleteTask;
 import org.dromara.workflow.api.domain.RemoteStartProcess;
 import org.dromara.workflow.api.domain.RemoteStartProcessReturn;
 import org.dromara.workflow.common.ConditionalOnEnable;
+import org.dromara.workflow.common.enums.MessageTypeEnum;
 import org.dromara.workflow.domain.bo.CompleteTaskBo;
 import org.dromara.workflow.domain.bo.StartProcessBo;
 import org.dromara.workflow.service.IFlwDefinitionService;
@@ -17,6 +19,7 @@ import org.dromara.workflow.service.IFlwTaskService;
 import org.dromara.workflow.service.WorkflowService;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -148,4 +151,34 @@ public class WorkflowServiceImpl implements WorkflowService {
         return flwTaskService.completeTask(completeTask);
     }
 
+    /**
+     * 启动流程并办理第一个任务
+     *
+     * @param startProcess 参数
+     */
+    @Override
+    public boolean startCompleteTask(RemoteStartProcess startProcess) {
+        try {
+            StartProcessBo processBo = new StartProcessBo();
+            processBo.setBusinessId(startProcess.getBusinessId());
+            processBo.setFlowCode(startProcess.getFlowCode());
+            processBo.setVariables(startProcess.getVariables());
+            processBo.setHandler(startProcess.getHandler());
+
+            RemoteStartProcessReturn result = flwTaskService.startWorkFlow(processBo);
+            CompleteTaskBo taskBo = new CompleteTaskBo();
+            taskBo.setTaskId(result.getTaskId());
+            taskBo.setMessageType(Collections.singletonList(MessageTypeEnum.SYSTEM_MESSAGE.getCode()));
+            taskBo.setVariables(startProcess.getVariables());
+            taskBo.setHandler(startProcess.getHandler());
+
+            boolean flag = flwTaskService.completeTask(taskBo);
+            if (!flag) {
+                throw new ServiceException("流程发起异常");
+            }
+            return true;
+        } catch (Exception e) {
+            throw new ServiceException(e.getMessage());
+        }
+    }
 }