fix: 修复流程分支节点预测问题

This commit is contained in:
lizhixian 2025-02-17 10:28:11 +08:00
parent 3d20ce1a9b
commit 1023afda40
1 changed files with 26 additions and 20 deletions

View File

@ -32,7 +32,7 @@ import static org.flowable.bpmn.constants.BpmnXMLConstants.FLOWABLE_EXTENSIONS_P
/** /**
* BPMN Model 操作工具类目前分成三部分 * BPMN Model 操作工具类目前分成三部分
* * <p>
* 1. BPMN 修改 + 解析元素相关的方法 * 1. BPMN 修改 + 解析元素相关的方法
* 2. BPMN 简单查找相关的方法 * 2. BPMN 简单查找相关的方法
* 3. BPMN 复杂遍历相关的方法 * 3. BPMN 复杂遍历相关的方法
@ -105,8 +105,8 @@ public class BpmnModelUtils {
* 给节点添加候选人元素 * 给节点添加候选人元素
* *
* @param candidateStrategy 候选人策略 * @param candidateStrategy 候选人策略
* @param candidateParam 候选人参数允许空 * @param candidateParam 候选人参数允许空
* @param flowElement 节点 * @param flowElement 节点
*/ */
public static void addCandidateElements(Integer candidateStrategy, String candidateParam, FlowElement flowElement) { public static void addCandidateElements(Integer candidateStrategy, String candidateParam, FlowElement flowElement) {
addExtensionElement(flowElement, BpmnModelConstants.USER_TASK_CANDIDATE_STRATEGY, addExtensionElement(flowElement, BpmnModelConstants.USER_TASK_CANDIDATE_STRATEGY,
@ -150,9 +150,9 @@ public class BpmnModelUtils {
/** /**
* 解析审批类型 * 解析审批类型
* *
* @see BpmUserTaskApproveTypeEnum
* @param userTask 任务节点 * @param userTask 任务节点
* @return 审批类型 * @return 审批类型
* @see BpmUserTaskApproveTypeEnum
*/ */
public static Integer parseApproveType(FlowElement userTask) { public static Integer parseApproveType(FlowElement userTask) {
return NumberUtils.parseInt(parseExtensionElement(userTask, BpmnModelConstants.USER_TASK_APPROVE_TYPE)); return NumberUtils.parseInt(parseExtensionElement(userTask, BpmnModelConstants.USER_TASK_APPROVE_TYPE));
@ -162,7 +162,7 @@ public class BpmnModelUtils {
* 添加任务拒绝处理元素 * 添加任务拒绝处理元素
* *
* @param rejectHandler 任务拒绝处理 * @param rejectHandler 任务拒绝处理
* @param userTask 任务节点 * @param userTask 任务节点
*/ */
public static void addTaskRejectElements(BpmSimpleModelNodeVO.RejectHandler rejectHandler, UserTask userTask) { public static void addTaskRejectElements(BpmSimpleModelNodeVO.RejectHandler rejectHandler, UserTask userTask) {
if (rejectHandler == null) { if (rejectHandler == null) {
@ -196,9 +196,9 @@ public class BpmnModelUtils {
/** /**
* 给节点添加用户任务的审批人与发起人相同时处理类型枚举 * 给节点添加用户任务的审批人与发起人相同时处理类型枚举
* *
* @see BpmUserTaskAssignStartUserHandlerTypeEnum
* @param assignStartUserHandlerType 发起人处理类型 * @param assignStartUserHandlerType 发起人处理类型
* @param userTask 任务节点 * @param userTask 任务节点
* @see BpmUserTaskAssignStartUserHandlerTypeEnum
*/ */
public static void addAssignStartUserHandlerType(Integer assignStartUserHandlerType, UserTask userTask) { public static void addAssignStartUserHandlerType(Integer assignStartUserHandlerType, UserTask userTask) {
if (assignStartUserHandlerType == null) { if (assignStartUserHandlerType == null) {
@ -210,9 +210,9 @@ public class BpmnModelUtils {
/** /**
* 给节点添加用户任务的审批人为空时处理类型枚举 * 给节点添加用户任务的审批人为空时处理类型枚举
* *
* @see BpmUserTaskAssignEmptyHandlerTypeEnum
* @param emptyHandler 空处理 * @param emptyHandler 空处理
* @param userTask 任务节点 * @param userTask 任务节点
* @see BpmUserTaskAssignEmptyHandlerTypeEnum
*/ */
public static void addAssignEmptyHandlerType(BpmSimpleModelNodeVO.AssignEmptyHandler emptyHandler, UserTask userTask) { public static void addAssignEmptyHandlerType(BpmSimpleModelNodeVO.AssignEmptyHandler emptyHandler, UserTask userTask) {
if (emptyHandler == null) { if (emptyHandler == null) {
@ -256,7 +256,7 @@ public class BpmnModelUtils {
* 给节点添加表单字段权限元素 * 给节点添加表单字段权限元素
* *
* @param fieldsPermissions 表单字段权限 * @param fieldsPermissions 表单字段权限
* @param flowElement 节点 * @param flowElement 节点
*/ */
public static void addFormFieldsPermission(List<Map<String, String>> fieldsPermissions, FlowElement flowElement) { public static void addFormFieldsPermission(List<Map<String, String>> fieldsPermissions, FlowElement flowElement) {
if (CollUtil.isNotEmpty(fieldsPermissions)) { if (CollUtil.isNotEmpty(fieldsPermissions)) {
@ -267,7 +267,7 @@ public class BpmnModelUtils {
/** /**
* 解析表单字段权限 * 解析表单字段权限
* *
* @param bpmnModel bpmnModel 对象 * @param bpmnModel bpmnModel 对象
* @param flowElementId 元素 ID * @param flowElementId 元素 ID
* @return 表单字段权限 * @return 表单字段权限
*/ */
@ -313,7 +313,7 @@ public class BpmnModelUtils {
/** /**
* 解析操作按钮设置 * 解析操作按钮设置
* *
* @param bpmnModel bpmnModel 对象 * @param bpmnModel bpmnModel 对象
* @param flowElementId 元素 ID * @param flowElementId 元素 ID
* @return 操作按钮设置 * @return 操作按钮设置
*/ */
@ -762,9 +762,9 @@ public class BpmnModelUtils {
// 情况StartEvent/EndEvent/UserTask/ServiceTask // 情况StartEvent/EndEvent/UserTask/ServiceTask
if (currentElement instanceof StartEvent if (currentElement instanceof StartEvent
|| currentElement instanceof EndEvent || currentElement instanceof EndEvent
|| currentElement instanceof UserTask || currentElement instanceof UserTask
|| currentElement instanceof ServiceTask) { || currentElement instanceof ServiceTask) {
// 添加元素 // 添加元素
FlowNode flowNode = (FlowNode) currentElement; FlowNode flowNode = (FlowNode) currentElement;
resultElements.add(flowNode); resultElements.add(flowNode);
@ -778,10 +778,16 @@ public class BpmnModelUtils {
if (currentElement instanceof ExclusiveGateway) { if (currentElement instanceof ExclusiveGateway) {
// 查找满足条件的 SequenceFlow 路径 // 查找满足条件的 SequenceFlow 路径
Gateway gateway = (Gateway) currentElement; Gateway gateway = (Gateway) currentElement;
SequenceFlow matchSequenceFlow = CollUtil.findOne(gateway.getOutgoingFlows(), SequenceFlow matchSequenceFlow;
flow -> ObjUtil.notEqual(gateway.getDefaultFlow(), flow.getId()) //流程首次发起时variables值一定为空会导致条件表达式解析错误导致预测节点缺失
//流程第一次发起时variables条件值一定为空发生异常会导致后续分支节点无法预测 if (null == variables) {
|| (null != variables && evalConditionExpress(variables, flow.getConditionExpression()))); 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())));
}
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()));
@ -831,7 +837,7 @@ public class BpmnModelUtils {
* 计算条件表达式是否为 true 满足条件 * 计算条件表达式是否为 true 满足条件
* *
* @param variables 流程实例 * @param variables 流程实例
* @param express 条件表达式 * @param express 条件表达式
* @return 是否满足条件 * @return 是否满足条件
*/ */
public static boolean evalConditionExpress(Map<String, Object> variables, String express) { public static boolean evalConditionExpress(Map<String, Object> variables, String express) {