Browse Source

支持动态设置下一个节点

hubin 6 months ago
parent
commit
989ae4f7b3

+ 1 - 1
src/main/java/com/aizuda/boot/modules/auth/service/impl/AuthServiceImpl.java

@@ -40,7 +40,7 @@ public class AuthServiceImpl implements IAuthService {
     public Map<String, Object> login(HttpServletRequest request, HttpServletResponse response, LoginParam loginParam) {
         ApiAssert.fail(StringUtils.isEmpty(loginParam.getUsername())
                 || StringUtils.isEmpty(loginParam.getPassword()), "用户名密码不能为空");
-        ApiAssert.fail(!Objects.equals("azd321", loginParam.getCode()), "请输入正确的验证码");
+        ApiAssert.fail(!Objects.equals("azd567", loginParam.getCode()), "请输入正确的验证码");
         List<SysUser> userList = sysUserService.list(Wrappers.<SysUser>query().eq("username", loginParam.getUsername()));
         ApiAssert.fail(null == userList || userList.size() != 1, "用户不存或异常数据");
         SysUser user = userList.get(0);

+ 7 - 0
src/main/java/com/aizuda/boot/modules/flw/controller/ProcessTaskController.java

@@ -81,6 +81,13 @@ public class ProcessTaskController extends ApiController {
         return processTaskService.listPreviousNodes(taskId);
     }
 
+    @Operation(summary = "获取下一个节点列表")
+    @Permission("flw:processTask:approval")
+    @PostMapping("/next-nodes")
+    public Map<String, Object> nextNodes(@Validated @RequestBody NextNodesDTO dto) {
+        return processTaskService.listNextNodes(dto);
+    }
+
     @Operation(summary = "审批评论")
     @Permission("flw:processTask:approval")
     @PostMapping("/comment")

+ 29 - 0
src/main/java/com/aizuda/boot/modules/flw/entity/dto/NextNodesDTO.java

@@ -0,0 +1,29 @@
+package com.aizuda.boot.modules.flw.entity.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.PositiveOrZero;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Map;
+
+/**
+ * 获取下一个节点DTO
+ *
+ * @author 青苗
+ * @since 2024-12-19
+ */
+@Getter
+@Setter
+public class NextNodesDTO {
+
+    @Schema(description = "流程实例ID")
+    @NotNull
+    @PositiveOrZero
+    private Long instanceId;
+
+    @Schema(description = "执行参数")
+    private Map<String, Object> args;
+
+}

+ 5 - 0
src/main/java/com/aizuda/boot/modules/flw/entity/dto/TaskApprovalDTO.java

@@ -1,11 +1,14 @@
 package com.aizuda.boot.modules.flw.entity.dto;
 
+import com.aizuda.bpm.engine.model.DynamicAssignee;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.PositiveOrZero;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.Map;
+
 /**
  * 流程任务审批 DTO
  *
@@ -30,5 +33,7 @@ public class TaskApprovalDTO {
     @Schema(description = "终止流程")
     private boolean termination;
 
+    @Schema(description = "动态分配处理人员")
+    private Map<String, DynamicAssignee> assigneeMap;
 
 }

+ 7 - 0
src/main/java/com/aizuda/boot/modules/flw/service/IProcessTaskService.java

@@ -54,6 +54,13 @@ public interface IProcessTaskService {
      */
     List<Map<String, String>> listPreviousNodes(Long taskId);
 
+    /**
+     * 获取下一个节点列表
+     *
+     * @param dto {@link NextNodesDTO}
+     */
+    Map<String, Object> listNextNodes(NextNodesDTO dto);
+
     /**
      * 设置任务为已阅状态
      *

+ 46 - 1
src/main/java/com/aizuda/boot/modules/flw/service/impl/ProcessTaskServiceImpl.java

@@ -8,9 +8,11 @@ import com.aizuda.boot.modules.flw.flow.FlowHelper;
 import com.aizuda.boot.modules.flw.mapper.FlowlongMapper;
 import com.aizuda.boot.modules.flw.service.*;
 import com.aizuda.boot.modules.system.service.ISysSSEService;
+import com.aizuda.bpm.engine.FlowDataTransfer;
 import com.aizuda.bpm.engine.FlowLongEngine;
 import com.aizuda.bpm.engine.RuntimeService;
 import com.aizuda.bpm.engine.TaskService;
+import com.aizuda.bpm.engine.core.Execution;
 import com.aizuda.bpm.engine.core.FlowCreator;
 import com.aizuda.bpm.engine.core.enums.PerformType;
 import com.aizuda.bpm.engine.core.enums.ProcessType;
@@ -26,6 +28,7 @@ import com.aizuda.service.web.UserSession;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.AllArgsConstructor;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -225,7 +228,7 @@ public class ProcessTaskServiceImpl implements IProcessTaskService {
         } else {
             flwProcessForm = flwProcessFormService.getByInstanceId(instanceId);
         }
-        return null == flwProcessForm ? null :flwProcessForm.getContent();
+        return null == flwProcessForm ? null : flwProcessForm.getContent();
     }
 
     @Override
@@ -249,6 +252,40 @@ public class ProcessTaskServiceImpl implements IProcessTaskService {
         return mapList;
     }
 
+    @Override
+    public Map<String, Object> listNextNodes(NextNodesDTO dto) {
+        FlwInstance instance = flowLongEngine.queryService().getInstance(dto.getInstanceId());
+        ApiAssert.fail(null == instance, "当前流程实例不存在");
+        FlwExtInstance extInstance = flowLongEngine.queryService().getExtInstance(dto.getInstanceId());
+        NodeModel rootNodeModel = extInstance.model().getNodeConfig();
+        Execution execution = new Execution(FlowHelper.getFlowCreator(), dto.getArgs());
+        Map<String, Object> nodeModelsMap = new HashMap<>();
+        List<NodeModel> nodeModels = ModelHelper.getNextChildNodes(flowLongEngine.getContext(), execution, rootNodeModel, instance.getCurrentNodeKey());
+        if (null != nodeModels) {
+            // 1,普通审批
+            int nodeType = 1;
+            if (nodeModels.size() > 1) {
+                // 判断是否为条件分支,根据父节点确定分支类型
+                NodeModel nextParentNode = nodeModels.get(0).getParentNode();
+                if (TaskType.conditionNode.eq(nextParentNode.getType())) {
+                    // 4,条件分支 8,并发分支 9,包容分支
+                    nodeType = nextParentNode.getParentNode().getType();
+                }
+            }
+            nodeModelsMap.put("nodeType", nodeType);
+            nodeModelsMap.put("nodeModels", nodeModels.stream().map(nodeModel -> {
+                Map<String, Object> map = new HashMap<>();
+                map.put("nodeName", nodeModel.getNodeName());
+                map.put("nodeKey", nodeModel.getNodeKey());
+                map.put("nodeAssigneeList", nodeModel.getNodeAssigneeList());
+                map.put("nodeCandidate", nodeModel.getNodeCandidate());
+                map.put("selectMode", nodeModel.getSelectMode());
+                return map;
+            }).toList());
+        }
+        return nodeModelsMap;
+    }
+
     @Override
     public boolean viewed(Long taskId) {
         return flowLongEngine.taskService().viewTask(taskId, FlowHelper.getFlwTaskActor());
@@ -362,6 +399,14 @@ public class ProcessTaskServiceImpl implements IProcessTaskService {
     @Transactional(rollbackFor = Exception.class)
     @Override
     public boolean consent(TaskApprovalDTO dto) {
+        // 判断是否修改模型
+        if (MapUtils.isNotEmpty(dto.getAssigneeMap())) {
+
+            // 传递动态分配处理人员
+            FlowDataTransfer.dynamicAssignee(Collections.unmodifiableMap(dto.getAssigneeMap()));
+        }
+
+        // 获取任务,保存表单
         FlwTask flwTask = this.getFlwTask(dto.getTaskId());
         FlowHelper.setProcessApprovalOpinion(dto.getContent());
         ApiAssert.fail(!flwProcessFormService.saveForm(flwTask.getInstanceId(), dto.getProcessForm()), "保存保单内容失败");