Explorar o código

feat:审批通过时,查询下一个执行节点,校验流程执行正确与否

smallNorthLee hai 5 meses
pai
achega
6e2d00d561

+ 6 - 4
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java

@@ -169,7 +169,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
         Long startUserId = loginUserId; // 流程发起人
         HistoricProcessInstance historicProcessInstance = null; // 流程实例
         Integer processInstanceStatus = BpmProcessInstanceStatusEnum.NOT_START.getStatus(); // 流程状态
-        Map<String, Object> processVariables = reqVO.getProcessVariables(); // 流程变量
+        Map<String, Object> processVariables = new HashMap<>(); // 流程变量
         // 1.2 如果是流程已发起的场景,则使用流程实例的数据
         if (reqVO.getProcessInstanceId() != null) {
             historicProcessInstance = getHistoricProcessInstance(reqVO.getProcessInstanceId());
@@ -180,10 +180,12 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
             processInstanceStatus = FlowableUtils.getProcessInstanceStatus(historicProcessInstance);
             // 合并 DB 和前端传递的流量变量,以前端的为主
             Map<String, Object> historicVariables = historicProcessInstance.getProcessVariables();
-            if (CollUtil.isNotEmpty(processVariables)) {
-                historicVariables.putAll(processVariables);
+            if (CollUtil.isNotEmpty(historicVariables)) {
+                processVariables.putAll(historicVariables);
             }
-            processVariables = historicVariables;
+        }
+        if (CollUtil.isNotEmpty(reqVO.getProcessVariables())) {
+            processVariables.putAll(reqVO.getProcessVariables());
         }
         // 1.3 读取其它相关数据
         ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition(

+ 5 - 2
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java

@@ -531,6 +531,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
             // 校验传递的参数中是否为下一个将要执行的任务节点
             Map<String, Object> variables = validateAndSetNextAssignees(task.getTaskDefinitionKey(), reqVO.getVariables(),
                     bpmnModel, reqVO.getNextAssignees(), instance);
+            runtimeService.setVariables(task.getProcessInstanceId(), variables);
             taskService.complete(task.getId(), variables, true);
         } else {
             taskService.complete(task.getId());
@@ -555,6 +556,10 @@ public class BpmTaskServiceImpl implements BpmTaskService {
      */
     private Map<String, Object> validateAndSetNextAssignees(String taskDefinitionKey, Map<String, Object> variables, BpmnModel bpmnModel,
                                        Map<String, List<Long>> nextAssignees, ProcessInstance processInstance) {
+        // 下一个节点参数为空,不做处理,表示流程正常流转,无需选择下一个节点的审判人
+        if (CollUtil.isEmpty(nextAssignees)){
+            return variables;
+        }
         // 1. 获取当前任务节点的信息
         FlowElement flowElement = bpmnModel.getFlowElement(taskDefinitionKey);
         // 2. 获取下一个将要执行的节点集合
@@ -587,7 +592,6 @@ public class BpmTaskServiceImpl implements BpmTaskService {
                 // 4.3.3 校验通过的全部节点和审批人
                 allNextAssignees.put(nextFlowNode.getId(), nextAssignees.get(nextFlowNode.getId()));
             }
-            // TODO @小北:加一个“审批人选择”的校验;
         }
         // variables 是存储动态表单到 local 任务级别。过滤一下,避免 ProcessInstance 系统级的变量被占用
         Map<String, Object> newVariables = FlowableUtils.filterTaskFormVariable(variables);
@@ -599,7 +603,6 @@ public class BpmTaskServiceImpl implements BpmTaskService {
             newVariables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_APPROVE_USER_SELECT_ASSIGNEES, hisProcessVariables);
             // 设置流程变量,发起人自选,后续的节点或者回退后再或者驳回重新发起的场景可能存在发起人自选或者审批人自选,所以中两个变量值要保持一致,否则会查询不到审批人
             newVariables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES, hisProcessVariables);
-            runtimeService.setVariables(processInstance.getProcessInstanceId(), newVariables);
         }
         return newVariables;
     }