Commit 1023afda4051db10d7a3198a067a0b55461b7b1b
1 parent
3d20ce1a
fix: 修复流程分支节点预测问题
Showing
1 changed file
with
26 additions
and
20 deletions
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java
| @@ -32,7 +32,7 @@ import static org.flowable.bpmn.constants.BpmnXMLConstants.FLOWABLE_EXTENSIONS_P | @@ -32,7 +32,7 @@ import static org.flowable.bpmn.constants.BpmnXMLConstants.FLOWABLE_EXTENSIONS_P | ||
| 32 | 32 | ||
| 33 | /** | 33 | /** |
| 34 | * BPMN Model 操作工具类。目前分成三部分: | 34 | * BPMN Model 操作工具类。目前分成三部分: |
| 35 | - * | 35 | + * <p> |
| 36 | * 1. BPMN 修改 + 解析元素相关的方法 | 36 | * 1. BPMN 修改 + 解析元素相关的方法 |
| 37 | * 2. BPMN 简单查找相关的方法 | 37 | * 2. BPMN 简单查找相关的方法 |
| 38 | * 3. BPMN 复杂遍历相关的方法 | 38 | * 3. BPMN 复杂遍历相关的方法 |
| @@ -105,8 +105,8 @@ public class BpmnModelUtils { | @@ -105,8 +105,8 @@ public class BpmnModelUtils { | ||
| 105 | * 给节点添加候选人元素 | 105 | * 给节点添加候选人元素 |
| 106 | * | 106 | * |
| 107 | * @param candidateStrategy 候选人策略 | 107 | * @param candidateStrategy 候选人策略 |
| 108 | - * @param candidateParam 候选人参数,允许空 | ||
| 109 | - * @param flowElement 节点 | 108 | + * @param candidateParam 候选人参数,允许空 |
| 109 | + * @param flowElement 节点 | ||
| 110 | */ | 110 | */ |
| 111 | public static void addCandidateElements(Integer candidateStrategy, String candidateParam, FlowElement flowElement) { | 111 | public static void addCandidateElements(Integer candidateStrategy, String candidateParam, FlowElement flowElement) { |
| 112 | addExtensionElement(flowElement, BpmnModelConstants.USER_TASK_CANDIDATE_STRATEGY, | 112 | addExtensionElement(flowElement, BpmnModelConstants.USER_TASK_CANDIDATE_STRATEGY, |
| @@ -150,9 +150,9 @@ public class BpmnModelUtils { | @@ -150,9 +150,9 @@ public class BpmnModelUtils { | ||
| 150 | /** | 150 | /** |
| 151 | * 解析审批类型 | 151 | * 解析审批类型 |
| 152 | * | 152 | * |
| 153 | - * @see BpmUserTaskApproveTypeEnum | ||
| 154 | * @param userTask 任务节点 | 153 | * @param userTask 任务节点 |
| 155 | * @return 审批类型 | 154 | * @return 审批类型 |
| 155 | + * @see BpmUserTaskApproveTypeEnum | ||
| 156 | */ | 156 | */ |
| 157 | public static Integer parseApproveType(FlowElement userTask) { | 157 | public static Integer parseApproveType(FlowElement userTask) { |
| 158 | return NumberUtils.parseInt(parseExtensionElement(userTask, BpmnModelConstants.USER_TASK_APPROVE_TYPE)); | 158 | return NumberUtils.parseInt(parseExtensionElement(userTask, BpmnModelConstants.USER_TASK_APPROVE_TYPE)); |
| @@ -162,7 +162,7 @@ public class BpmnModelUtils { | @@ -162,7 +162,7 @@ public class BpmnModelUtils { | ||
| 162 | * 添加任务拒绝处理元素 | 162 | * 添加任务拒绝处理元素 |
| 163 | * | 163 | * |
| 164 | * @param rejectHandler 任务拒绝处理 | 164 | * @param rejectHandler 任务拒绝处理 |
| 165 | - * @param userTask 任务节点 | 165 | + * @param userTask 任务节点 |
| 166 | */ | 166 | */ |
| 167 | public static void addTaskRejectElements(BpmSimpleModelNodeVO.RejectHandler rejectHandler, UserTask userTask) { | 167 | public static void addTaskRejectElements(BpmSimpleModelNodeVO.RejectHandler rejectHandler, UserTask userTask) { |
| 168 | if (rejectHandler == null) { | 168 | if (rejectHandler == null) { |
| @@ -196,9 +196,9 @@ public class BpmnModelUtils { | @@ -196,9 +196,9 @@ public class BpmnModelUtils { | ||
| 196 | /** | 196 | /** |
| 197 | * 给节点添加用户任务的审批人与发起人相同时,处理类型枚举 | 197 | * 给节点添加用户任务的审批人与发起人相同时,处理类型枚举 |
| 198 | * | 198 | * |
| 199 | - * @see BpmUserTaskAssignStartUserHandlerTypeEnum | ||
| 200 | * @param assignStartUserHandlerType 发起人处理类型 | 199 | * @param assignStartUserHandlerType 发起人处理类型 |
| 201 | - * @param userTask 任务节点 | 200 | + * @param userTask 任务节点 |
| 201 | + * @see BpmUserTaskAssignStartUserHandlerTypeEnum | ||
| 202 | */ | 202 | */ |
| 203 | public static void addAssignStartUserHandlerType(Integer assignStartUserHandlerType, UserTask userTask) { | 203 | public static void addAssignStartUserHandlerType(Integer assignStartUserHandlerType, UserTask userTask) { |
| 204 | if (assignStartUserHandlerType == null) { | 204 | if (assignStartUserHandlerType == null) { |
| @@ -210,9 +210,9 @@ public class BpmnModelUtils { | @@ -210,9 +210,9 @@ public class BpmnModelUtils { | ||
| 210 | /** | 210 | /** |
| 211 | * 给节点添加用户任务的审批人为空时,处理类型枚举 | 211 | * 给节点添加用户任务的审批人为空时,处理类型枚举 |
| 212 | * | 212 | * |
| 213 | - * @see BpmUserTaskAssignEmptyHandlerTypeEnum | ||
| 214 | * @param emptyHandler 空处理 | 213 | * @param emptyHandler 空处理 |
| 215 | - * @param userTask 任务节点 | 214 | + * @param userTask 任务节点 |
| 215 | + * @see BpmUserTaskAssignEmptyHandlerTypeEnum | ||
| 216 | */ | 216 | */ |
| 217 | public static void addAssignEmptyHandlerType(BpmSimpleModelNodeVO.AssignEmptyHandler emptyHandler, UserTask userTask) { | 217 | public static void addAssignEmptyHandlerType(BpmSimpleModelNodeVO.AssignEmptyHandler emptyHandler, UserTask userTask) { |
| 218 | if (emptyHandler == null) { | 218 | if (emptyHandler == null) { |
| @@ -256,7 +256,7 @@ public class BpmnModelUtils { | @@ -256,7 +256,7 @@ public class BpmnModelUtils { | ||
| 256 | * 给节点添加表单字段权限元素 | 256 | * 给节点添加表单字段权限元素 |
| 257 | * | 257 | * |
| 258 | * @param fieldsPermissions 表单字段权限 | 258 | * @param fieldsPermissions 表单字段权限 |
| 259 | - * @param flowElement 节点 | 259 | + * @param flowElement 节点 |
| 260 | */ | 260 | */ |
| 261 | public static void addFormFieldsPermission(List<Map<String, String>> fieldsPermissions, FlowElement flowElement) { | 261 | public static void addFormFieldsPermission(List<Map<String, String>> fieldsPermissions, FlowElement flowElement) { |
| 262 | if (CollUtil.isNotEmpty(fieldsPermissions)) { | 262 | if (CollUtil.isNotEmpty(fieldsPermissions)) { |
| @@ -267,7 +267,7 @@ public class BpmnModelUtils { | @@ -267,7 +267,7 @@ public class BpmnModelUtils { | ||
| 267 | /** | 267 | /** |
| 268 | * 解析表单字段权限 | 268 | * 解析表单字段权限 |
| 269 | * | 269 | * |
| 270 | - * @param bpmnModel bpmnModel 对象 | 270 | + * @param bpmnModel bpmnModel 对象 |
| 271 | * @param flowElementId 元素 ID | 271 | * @param flowElementId 元素 ID |
| 272 | * @return 表单字段权限 | 272 | * @return 表单字段权限 |
| 273 | */ | 273 | */ |
| @@ -313,7 +313,7 @@ public class BpmnModelUtils { | @@ -313,7 +313,7 @@ public class BpmnModelUtils { | ||
| 313 | /** | 313 | /** |
| 314 | * 解析操作按钮设置 | 314 | * 解析操作按钮设置 |
| 315 | * | 315 | * |
| 316 | - * @param bpmnModel bpmnModel 对象 | 316 | + * @param bpmnModel bpmnModel 对象 |
| 317 | * @param flowElementId 元素 ID | 317 | * @param flowElementId 元素 ID |
| 318 | * @return 操作按钮设置 | 318 | * @return 操作按钮设置 |
| 319 | */ | 319 | */ |
| @@ -762,9 +762,9 @@ public class BpmnModelUtils { | @@ -762,9 +762,9 @@ public class BpmnModelUtils { | ||
| 762 | 762 | ||
| 763 | // 情况:StartEvent/EndEvent/UserTask/ServiceTask | 763 | // 情况:StartEvent/EndEvent/UserTask/ServiceTask |
| 764 | if (currentElement instanceof StartEvent | 764 | if (currentElement instanceof StartEvent |
| 765 | - || currentElement instanceof EndEvent | ||
| 766 | - || currentElement instanceof UserTask | ||
| 767 | - || currentElement instanceof ServiceTask) { | 765 | + || currentElement instanceof EndEvent |
| 766 | + || currentElement instanceof UserTask | ||
| 767 | + || currentElement instanceof ServiceTask) { | ||
| 768 | // 添加元素 | 768 | // 添加元素 |
| 769 | FlowNode flowNode = (FlowNode) currentElement; | 769 | FlowNode flowNode = (FlowNode) currentElement; |
| 770 | resultElements.add(flowNode); | 770 | resultElements.add(flowNode); |
| @@ -778,10 +778,16 @@ public class BpmnModelUtils { | @@ -778,10 +778,16 @@ public class BpmnModelUtils { | ||
| 778 | if (currentElement instanceof ExclusiveGateway) { | 778 | if (currentElement instanceof ExclusiveGateway) { |
| 779 | // 查找满足条件的 SequenceFlow 路径 | 779 | // 查找满足条件的 SequenceFlow 路径 |
| 780 | Gateway gateway = (Gateway) currentElement; | 780 | Gateway gateway = (Gateway) currentElement; |
| 781 | - SequenceFlow matchSequenceFlow = CollUtil.findOne(gateway.getOutgoingFlows(), | ||
| 782 | - flow -> ObjUtil.notEqual(gateway.getDefaultFlow(), flow.getId()) | ||
| 783 | - //流程第一次发起时,variables条件值一定为空,发生异常会导致后续分支节点无法预测, | ||
| 784 | - || (null != variables && evalConditionExpress(variables, flow.getConditionExpression()))); | 781 | + SequenceFlow matchSequenceFlow; |
| 782 | + //流程首次发起时,variables值一定为空,会导致条件表达式解析错误导致预测节点缺失 | ||
| 783 | + if (null == variables) { | ||
| 784 | + matchSequenceFlow = CollUtil.findOne(gateway.getOutgoingFlows(), | ||
| 785 | + flow -> ObjUtil.notEqual(gateway.getDefaultFlow(), flow.getId())); | ||
| 786 | + } else { | ||
| 787 | + matchSequenceFlow = CollUtil.findOne(gateway.getOutgoingFlows(), | ||
| 788 | + flow -> ObjUtil.notEqual(gateway.getDefaultFlow(), flow.getId()) | ||
| 789 | + && (evalConditionExpress(variables, flow.getConditionExpression()))); | ||
| 790 | + } | ||
| 785 | if (matchSequenceFlow == null) { | 791 | if (matchSequenceFlow == null) { |
| 786 | matchSequenceFlow = CollUtil.findOne(gateway.getOutgoingFlows(), | 792 | matchSequenceFlow = CollUtil.findOne(gateway.getOutgoingFlows(), |
| 787 | flow -> ObjUtil.equal(gateway.getDefaultFlow(), flow.getId())); | 793 | flow -> ObjUtil.equal(gateway.getDefaultFlow(), flow.getId())); |
| @@ -831,7 +837,7 @@ public class BpmnModelUtils { | @@ -831,7 +837,7 @@ public class BpmnModelUtils { | ||
| 831 | * 计算条件表达式是否为 true 满足条件 | 837 | * 计算条件表达式是否为 true 满足条件 |
| 832 | * | 838 | * |
| 833 | * @param variables 流程实例 | 839 | * @param variables 流程实例 |
| 834 | - * @param express 条件表达式 | 840 | + * @param express 条件表达式 |
| 835 | * @return 是否满足条件 | 841 | * @return 是否满足条件 |
| 836 | */ | 842 | */ |
| 837 | public static boolean evalConditionExpress(Map<String, Object> variables, String express) { | 843 | public static boolean evalConditionExpress(Map<String, Object> variables, String express) { |