Browse Source

review: 代码审查

lizhixian 6 months ago
parent
commit
cb3467ada2

+ 6 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java

@@ -1,9 +1,12 @@
 package cn.iocoder.yudao.module.bpm.controller.admin.task;
 package cn.iocoder.yudao.module.bpm.controller.admin.task;
 
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
+import cn.iocoder.yudao.framework.common.util.string.StrUtils;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
 import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
 import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
@@ -163,6 +166,9 @@ public class BpmProcessInstanceController {
     @Parameter(name = "id", description = "流程实例的编号", required = true)
     @Parameter(name = "id", description = "流程实例的编号", required = true)
     @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
     @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
     public CommonResult<BpmApprovalDetailRespVO> getApprovalDetail(@Valid BpmApprovalDetailReqVO reqVO) {
     public CommonResult<BpmApprovalDetailRespVO> getApprovalDetail(@Valid BpmApprovalDetailReqVO reqVO) {
+        if (StrUtil.isNotEmpty(reqVO.getProcessVariablesStr())){
+            reqVO.setProcessVariables(JsonUtils.parseObject(reqVO.getProcessVariablesStr(),Map.class));
+        }
         return success(processInstanceService.getApprovalDetail(getLoginUserId(), reqVO));
         return success(processInstanceService.getApprovalDetail(getLoginUserId(), reqVO));
     }
     }
 
 

+ 1 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailReqVO.java

@@ -19,7 +19,7 @@ public class BpmApprovalDetailReqVO {
     private Map<String, Object> processVariables; // 使用场景:同 processDefinitionId,用于流程预测
     private Map<String, Object> processVariables; // 使用场景:同 processDefinitionId,用于流程预测
 
 
     @Schema(description = "流程变量")
     @Schema(description = "流程变量")
-    private String processVariablesStr; // 使用场景:同 processDefinitionId,用于流程预测
+    private String processVariablesStr; //解决 GET 无法传递对象的问题,最终转换成 processVariables 变量
 
 
     @Schema(description = "流程实例的编号", example = "1024")
     @Schema(description = "流程实例的编号", example = "1024")
     private String processInstanceId;  // 使用场景:流程已发起时候传流程实例 ID
     private String processInstanceId;  // 使用场景:流程已发起时候传流程实例 ID

+ 3 - 10
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java

@@ -778,16 +778,9 @@ public class BpmnModelUtils {
         if (currentElement instanceof ExclusiveGateway) {
         if (currentElement instanceof ExclusiveGateway) {
             // 查找满足条件的 SequenceFlow 路径
             // 查找满足条件的 SequenceFlow 路径
             Gateway gateway = (Gateway) currentElement;
             Gateway gateway = (Gateway) currentElement;
-            SequenceFlow matchSequenceFlow;
-            //流程首次发起时,variables值一定为空,会导致条件表达式解析错误导致预测节点缺失
-            if (null == variables) {
-                matchSequenceFlow = CollUtil.findOne(gateway.getOutgoingFlows(),
-                        flow -> ObjUtil.notEqual(gateway.getDefaultFlow(), flow.getId()));
-            } else {
-                matchSequenceFlow = CollUtil.findOne(gateway.getOutgoingFlows(),
-                        flow -> ObjUtil.notEqual(gateway.getDefaultFlow(), flow.getId())
-                                && (evalConditionExpress(variables, flow.getConditionExpression())));
-            }
+            SequenceFlow matchSequenceFlow = CollUtil.findOne(gateway.getOutgoingFlows(),
+                    flow -> ObjUtil.notEqual(gateway.getDefaultFlow(), flow.getId())
+                            && (evalConditionExpress(variables, flow.getConditionExpression())));
             if (matchSequenceFlow == null) {
             if (matchSequenceFlow == null) {
                 matchSequenceFlow = CollUtil.findOne(gateway.getOutgoingFlows(),
                 matchSequenceFlow = CollUtil.findOne(gateway.getOutgoingFlows(),
                         flow -> ObjUtil.equal(gateway.getDefaultFlow(), flow.getId()));
                         flow -> ObjUtil.equal(gateway.getDefaultFlow(), flow.getId()));

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

@@ -7,7 +7,6 @@ import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.hutool.json.JSONUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.date.DateUtils;
 import cn.iocoder.yudao.framework.common.util.date.DateUtils;
 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
@@ -29,7 +28,6 @@ import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum;
 import cn.iocoder.yudao.module.bpm.enums.task.BpmReasonEnum;
 import cn.iocoder.yudao.module.bpm.enums.task.BpmReasonEnum;
 import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
 import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker;
-import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.strategy.dept.BpmTaskCandidateStartUserSelectStrategy;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants;
@@ -167,9 +165,6 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
         HistoricProcessInstance historicProcessInstance = null; // 流程实例
         HistoricProcessInstance historicProcessInstance = null; // 流程实例
         Integer processInstanceStatus = BpmProcessInstanceStatusEnum.NOT_START.getStatus(); // 流程状态
         Integer processInstanceStatus = BpmProcessInstanceStatusEnum.NOT_START.getStatus(); // 流程状态
         Map<String, Object> processVariables = reqVO.getProcessVariables(); // 流程变量
         Map<String, Object> processVariables = reqVO.getProcessVariables(); // 流程变量
-        if (reqVO.getProcessVariablesStr() != null){
-            processVariables = JSONUtil.parseObj(reqVO.getProcessVariablesStr());
-        }
         // 1.2 如果是流程已发起的场景,则使用流程实例的数据
         // 1.2 如果是流程已发起的场景,则使用流程实例的数据
         if (reqVO.getProcessInstanceId() != null) {
         if (reqVO.getProcessInstanceId() != null) {
             historicProcessInstance = getHistoricProcessInstance(reqVO.getProcessInstanceId());
             historicProcessInstance = getHistoricProcessInstance(reqVO.getProcessInstanceId());
@@ -213,8 +208,11 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
         // TODO @jason:有一个极端情况,如果一个用户有 2 个 task A 和 B,A 已经通过,B 需要审核。这个时,通过 A 进来,todo 拿到
         // TODO @jason:有一个极端情况,如果一个用户有 2 个 task A 和 B,A 已经通过,B 需要审核。这个时,通过 A 进来,todo 拿到
         // B,会不会表单权限不一致哈。
         // B,会不会表单权限不一致哈。
         BpmTaskRespVO todoTask = taskService.getFirstTodoTask(loginUserId, reqVO.getProcessInstanceId());
         BpmTaskRespVO todoTask = taskService.getFirstTodoTask(loginUserId, reqVO.getProcessInstanceId());
-
-        // 3.2 预测未运行节点的审批信息
+        // 3.2 流程首次发起时,variables值一定为空,会导致条件表达式解析错误导致预测节点缺失
+        if (null == processVariables) {
+            processVariables = new HashMap<>();
+        }
+        // 3.3 预测未运行节点的审批信息
         List<ActivityNode> simulateActivityNodes = getSimulateApproveNodeList(startUserId, bpmnModel,
         List<ActivityNode> simulateActivityNodes = getSimulateApproveNodeList(startUserId, bpmnModel,
                 processDefinitionInfo,
                 processDefinitionInfo,
                 processVariables, activities);
                 processVariables, activities);
@@ -697,17 +695,16 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
     private void validateStartUserSelectAssignees(Long userId, ProcessDefinition definition,
     private void validateStartUserSelectAssignees(Long userId, ProcessDefinition definition,
             Map<String, List<Long>> startUserSelectAssignees, Map<String,Object> variables) {
             Map<String, List<Long>> startUserSelectAssignees, Map<String,Object> variables) {
         // 1.获取预测的节点信息
         // 1.获取预测的节点信息
-        BpmApprovalDetailReqVO detailReqVO = new BpmApprovalDetailReqVO();
-        detailReqVO.setProcessVariables(variables);
-        detailReqVO.setProcessDefinitionId(definition.getId());
-        BpmApprovalDetailRespVO respVO = getApprovalDetail(userId, detailReqVO);
-        List<ActivityNode> activityNodes = respVO.getActivityNodes();
+        BpmApprovalDetailRespVO detailRespVO = getApprovalDetail(userId, new BpmApprovalDetailReqVO()
+                .setProcessDefinitionId(definition.getId())
+                .setProcessVariables(variables));
+        List<ActivityNode> activityNodes = detailRespVO.getActivityNodes();
         if (CollUtil.isEmpty(activityNodes)){
         if (CollUtil.isEmpty(activityNodes)){
             return;
             return;
         }
         }
-        //移除掉不是发起人自选审批人节点
-        activityNodes.removeIf(task -> null == task.getCandidateStrategy() || !task.getCandidateStrategy().equals(BpmTaskCandidateStrategyEnum.START_USER_SELECT.getStrategy()));
-        // 2. 流程发起时要先获取当前流程的预测走向节点,发起时只校验预测的节点发起人自选审批人的审批人和抄送人是否都配置了
+        // 2.移除掉不是发起人自选审批人节点
+        activityNodes.removeIf(task -> Objects.equals(BpmTaskCandidateStrategyEnum.START_USER_SELECT.getStrategy(), task. getCandidateStrategy()));
+        // 3.流程发起时要先获取当前流程的预测走向节点,发起时只校验预测的节点发起人自选审批人的审批人和抄送人是否都配置了
         activityNodes.forEach(task -> {
         activityNodes.forEach(task -> {
             List<Long> assignees = startUserSelectAssignees != null ? startUserSelectAssignees.get(task.getId()) : null;
             List<Long> assignees = startUserSelectAssignees != null ? startUserSelectAssignees.get(task.getId()) : null;
             if (CollUtil.isEmpty(assignees)) {
             if (CollUtil.isEmpty(assignees)) {