Commit 9c9f2812e9dc95095be0dc5bece7ad9417b1310c
1 parent
0d886dc4
fix: 添加buildTimeoutBoundaryEvent方法
Showing
1 changed file
with
49 additions
and
43 deletions
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java
| @@ -10,7 +10,6 @@ import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.B | @@ -10,7 +10,6 @@ import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.B | ||
| 10 | import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.ConditionGroups; | 10 | import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.ConditionGroups; |
| 11 | import cn.iocoder.yudao.module.bpm.enums.definition.*; | 11 | import cn.iocoder.yudao.module.bpm.enums.definition.*; |
| 12 | import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; | 12 | import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; |
| 13 | -import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants; | ||
| 14 | import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants; | 13 | import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants; |
| 15 | import cn.iocoder.yudao.module.bpm.framework.flowable.core.listener.BpmCopyTaskDelegate; | 14 | import cn.iocoder.yudao.module.bpm.framework.flowable.core.listener.BpmCopyTaskDelegate; |
| 16 | import cn.iocoder.yudao.module.bpm.framework.flowable.core.listener.BpmTriggerTaskDelegate; | 15 | import cn.iocoder.yudao.module.bpm.framework.flowable.core.listener.BpmTriggerTaskDelegate; |
| @@ -84,7 +83,7 @@ public class SimpleModelUtils { | @@ -84,7 +83,7 @@ public class SimpleModelUtils { | ||
| 84 | traverseNodeToBuildFlowNode(startNode, process); | 83 | traverseNodeToBuildFlowNode(startNode, process); |
| 85 | 84 | ||
| 86 | // 3. 构建并添加节点之间的连线 Sequence Flow | 85 | // 3. 构建并添加节点之间的连线 Sequence Flow |
| 87 | - EndEvent endEvent = BpmnModelUtils.getEndEvent(bpmnModel); | 86 | + EndEvent endEvent = getEndEvent(bpmnModel); |
| 88 | traverseNodeToBuildSequenceFlow(process, startNode, endEvent.getId()); | 87 | traverseNodeToBuildSequenceFlow(process, startNode, endEvent.getId()); |
| 89 | 88 | ||
| 90 | // 4. 自动布局 | 89 | // 4. 自动布局 |
| @@ -364,7 +363,7 @@ public class SimpleModelUtils { | @@ -364,7 +363,7 @@ public class SimpleModelUtils { | ||
| 364 | userTask.setName(node.getName()); | 363 | userTask.setName(node.getName()); |
| 365 | 364 | ||
| 366 | // 人工审批 | 365 | // 人工审批 |
| 367 | - addExtensionElement(userTask, BpmnModelConstants.USER_TASK_APPROVE_TYPE, BpmUserTaskApproveTypeEnum.USER.getType()); | 366 | + addExtensionElement(userTask, USER_TASK_APPROVE_TYPE, BpmUserTaskApproveTypeEnum.USER.getType()); |
| 368 | // 候选人策略为发起人自己 | 367 | // 候选人策略为发起人自己 |
| 369 | addCandidateElements(BpmTaskCandidateStrategyEnum.START_USER.getStrategy(), null, userTask); | 368 | addCandidateElements(BpmTaskCandidateStrategyEnum.START_USER.getStrategy(), null, userTask); |
| 370 | // 添加表单字段权限属性元素 | 369 | // 添加表单字段权限属性元素 |
| @@ -415,25 +414,17 @@ public class SimpleModelUtils { | @@ -415,25 +414,17 @@ public class SimpleModelUtils { | ||
| 415 | */ | 414 | */ |
| 416 | private BoundaryEvent buildUserTaskTimeoutBoundaryEvent(UserTask userTask, | 415 | private BoundaryEvent buildUserTaskTimeoutBoundaryEvent(UserTask userTask, |
| 417 | BpmSimpleModelNodeVO.TimeoutHandler timeoutHandler) { | 416 | BpmSimpleModelNodeVO.TimeoutHandler timeoutHandler) { |
| 418 | - // 1.1 定时器边界事件 | ||
| 419 | - // TODO @lesan:一些 BoundaryEvent timeout 的,可以做一些基础的设置么? | ||
| 420 | - BoundaryEvent boundaryEvent = new BoundaryEvent(); | ||
| 421 | - boundaryEvent.setId("Event-" + IdUtil.fastUUID()); | ||
| 422 | - boundaryEvent.setCancelActivity(false); // 设置关联的任务为不会被中断 | ||
| 423 | - boundaryEvent.setAttachedToRef(userTask); | ||
| 424 | - // 1.2 定义超时时间、最大提醒次数 | ||
| 425 | - TimerEventDefinition eventDefinition = new TimerEventDefinition(); | ||
| 426 | - eventDefinition.setTimeDuration(timeoutHandler.getTimeDuration()); | 417 | + // 1. 创建 Timeout Boundary Event |
| 418 | + String timeCycle = null; | ||
| 427 | if (Objects.equals(BpmUserTaskTimeoutHandlerTypeEnum.REMINDER.getType(), timeoutHandler.getType()) && | 419 | if (Objects.equals(BpmUserTaskTimeoutHandlerTypeEnum.REMINDER.getType(), timeoutHandler.getType()) && |
| 428 | timeoutHandler.getMaxRemindCount() != null && timeoutHandler.getMaxRemindCount() > 1) { | 420 | timeoutHandler.getMaxRemindCount() != null && timeoutHandler.getMaxRemindCount() > 1) { |
| 429 | - eventDefinition.setTimeCycle(String.format("R%d/%s", | ||
| 430 | - timeoutHandler.getMaxRemindCount(), timeoutHandler.getTimeDuration())); | 421 | + timeCycle = String.format("R%d/%s", |
| 422 | + timeoutHandler.getMaxRemindCount(), timeoutHandler.getTimeDuration()); | ||
| 431 | } | 423 | } |
| 432 | - boundaryEvent.addEventDefinition(eventDefinition); | 424 | + BoundaryEvent boundaryEvent = buildTimeoutBoundaryEvent(userTask, BpmBoundaryEventTypeEnum.USER_TASK_TIMEOUT.getType(), |
| 425 | + timeoutHandler.getTimeDuration(), timeCycle, null); | ||
| 433 | 426 | ||
| 434 | - // 2.1 添加定时器边界事件类型 | ||
| 435 | - addExtensionElement(boundaryEvent, BOUNDARY_EVENT_TYPE, BpmBoundaryEventTypeEnum.USER_TASK_TIMEOUT.getType()); | ||
| 436 | - // 2.2 添加超时执行动作元素 | 427 | + // 2 添加超时执行动作元素 |
| 437 | addExtensionElement(boundaryEvent, USER_TASK_TIMEOUT_HANDLER_TYPE, timeoutHandler.getType()); | 428 | addExtensionElement(boundaryEvent, USER_TASK_TIMEOUT_HANDLER_TYPE, timeoutHandler.getType()); |
| 438 | return boundaryEvent; | 429 | return boundaryEvent; |
| 439 | } | 430 | } |
| @@ -516,7 +507,7 @@ public class SimpleModelUtils { | @@ -516,7 +507,7 @@ public class SimpleModelUtils { | ||
| 516 | BpmUserTaskApproveMethodEnum approveMethodEnum = BpmUserTaskApproveMethodEnum.valueOf(approveMethod); | 507 | BpmUserTaskApproveMethodEnum approveMethodEnum = BpmUserTaskApproveMethodEnum.valueOf(approveMethod); |
| 517 | Assert.notNull(approveMethodEnum, "审批方式({})不能为空", approveMethodEnum); | 508 | Assert.notNull(approveMethodEnum, "审批方式({})不能为空", approveMethodEnum); |
| 518 | // 添加审批方式的扩展属性 | 509 | // 添加审批方式的扩展属性 |
| 519 | - addExtensionElement(userTask, BpmnModelConstants.USER_TASK_APPROVE_METHOD, approveMethod); | 510 | + addExtensionElement(userTask, USER_TASK_APPROVE_METHOD, approveMethod); |
| 520 | if (approveMethodEnum == BpmUserTaskApproveMethodEnum.RANDOM) { | 511 | if (approveMethodEnum == BpmUserTaskApproveMethodEnum.RANDOM) { |
| 521 | // 随机审批,不需要设置多实例属性 | 512 | // 随机审批,不需要设置多实例属性 |
| 522 | return; | 513 | return; |
| @@ -723,21 +714,14 @@ public class SimpleModelUtils { | @@ -723,21 +714,14 @@ public class SimpleModelUtils { | ||
| 723 | 714 | ||
| 724 | // 2. 添加接收任务的 Timer Boundary Event | 715 | // 2. 添加接收任务的 Timer Boundary Event |
| 725 | if (node.getDelaySetting() != null) { | 716 | if (node.getDelaySetting() != null) { |
| 726 | - // 2.1 定时器边界事件 | ||
| 727 | - // TODO @lesan:一些 BoundaryEvent timeout 的,可以做一些基础的设置么? | ||
| 728 | - BoundaryEvent boundaryEvent = new BoundaryEvent(); | ||
| 729 | - boundaryEvent.setId("Event-" + IdUtil.fastUUID()); | ||
| 730 | - boundaryEvent.setCancelActivity(false); | ||
| 731 | - boundaryEvent.setAttachedToRef(receiveTask); | ||
| 732 | - // 2.2 定义超时时间 | ||
| 733 | - TimerEventDefinition eventDefinition = new TimerEventDefinition(); | 717 | + BoundaryEvent boundaryEvent = null; |
| 734 | if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerTypeEnum.FIXED_DATE_TIME.getType())) { | 718 | if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerTypeEnum.FIXED_DATE_TIME.getType())) { |
| 735 | - eventDefinition.setTimeDuration(node.getDelaySetting().getDelayTime()); | 719 | + boundaryEvent = buildTimeoutBoundaryEvent(receiveTask, BpmBoundaryEventTypeEnum.DELAY_TIMER_TIMEOUT.getType(), |
| 720 | + node.getDelaySetting().getDelayTime(), null, null); | ||
| 736 | } else if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerTypeEnum.FIXED_TIME_DURATION.getType())) { | 721 | } else if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerTypeEnum.FIXED_TIME_DURATION.getType())) { |
| 737 | - eventDefinition.setTimeDate(node.getDelaySetting().getDelayTime()); | 722 | + boundaryEvent = buildTimeoutBoundaryEvent(receiveTask, BpmBoundaryEventTypeEnum.DELAY_TIMER_TIMEOUT.getType(), |
| 723 | + null, null, node.getDelaySetting().getDelayTime()); | ||
| 738 | } | 724 | } |
| 739 | - boundaryEvent.addEventDefinition(eventDefinition); | ||
| 740 | - addExtensionElement(boundaryEvent, BOUNDARY_EVENT_TYPE, BpmBoundaryEventTypeEnum.DELAY_TIMER_TIMEOUT.getType()); | ||
| 741 | flowElements.add(boundaryEvent); | 725 | flowElements.add(boundaryEvent); |
| 742 | } | 726 | } |
| 743 | return flowElements; | 727 | return flowElements; |
| @@ -870,19 +854,14 @@ public class SimpleModelUtils { | @@ -870,19 +854,14 @@ public class SimpleModelUtils { | ||
| 870 | 854 | ||
| 871 | // 7. 超时设置 | 855 | // 7. 超时设置 |
| 872 | if (childProcessSetting.getTimeoutSetting() != null) { | 856 | if (childProcessSetting.getTimeoutSetting() != null) { |
| 873 | - // TODO @lesan:一些 BoundaryEvent timeout 的,可以做一些基础的设置么? | ||
| 874 | - BoundaryEvent boundaryEvent = new BoundaryEvent(); | ||
| 875 | - boundaryEvent.setId("Event-" + IdUtil.fastUUID()); | ||
| 876 | - boundaryEvent.setCancelActivity(false); | ||
| 877 | - boundaryEvent.setAttachedToRef(callActivity); | ||
| 878 | - TimerEventDefinition eventDefinition = new TimerEventDefinition(); | ||
| 879 | - if (childProcessSetting.getTimeoutSetting().getType().equals(BpmDelayTimerTypeEnum.FIXED_DATE_TIME.getType())) { | ||
| 880 | - eventDefinition.setTimeDuration(childProcessSetting.getTimeoutSetting().getTimeExpression()); | ||
| 881 | - } else if (childProcessSetting.getTimeoutSetting().getType().equals(BpmDelayTimerTypeEnum.FIXED_TIME_DURATION.getType())) { | ||
| 882 | - eventDefinition.setTimeDate(childProcessSetting.getTimeoutSetting().getTimeExpression()); | 857 | + BoundaryEvent boundaryEvent = null; |
| 858 | + if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerTypeEnum.FIXED_DATE_TIME.getType())) { | ||
| 859 | + boundaryEvent = buildTimeoutBoundaryEvent(callActivity, BpmBoundaryEventTypeEnum.DELAY_TIMER_TIMEOUT.getType(), | ||
| 860 | + node.getDelaySetting().getDelayTime(), null, null); | ||
| 861 | + } else if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerTypeEnum.FIXED_TIME_DURATION.getType())) { | ||
| 862 | + boundaryEvent = buildTimeoutBoundaryEvent(callActivity, BpmBoundaryEventTypeEnum.CHILD_PROCESS_TIMEOUT.getType(), | ||
| 863 | + null, null, node.getDelaySetting().getDelayTime()); | ||
| 883 | } | 864 | } |
| 884 | - boundaryEvent.addEventDefinition(eventDefinition); | ||
| 885 | - addExtensionElement(boundaryEvent, BOUNDARY_EVENT_TYPE, BpmBoundaryEventTypeEnum.CHILD_PROCESS_TIMEOUT.getType()); | ||
| 886 | flowElements.add(boundaryEvent); | 865 | flowElements.add(boundaryEvent); |
| 887 | } | 866 | } |
| 888 | 867 | ||
| @@ -903,6 +882,33 @@ public class SimpleModelUtils { | @@ -903,6 +882,33 @@ public class SimpleModelUtils { | ||
| 903 | return id + "_join"; | 882 | return id + "_join"; |
| 904 | } | 883 | } |
| 905 | 884 | ||
| 885 | + private static BoundaryEvent buildTimeoutBoundaryEvent(Activity attachedToRef, Integer type, | ||
| 886 | + String timeDuration, | ||
| 887 | + String timeCycle, | ||
| 888 | + String timeDate) { | ||
| 889 | + // 1.1 定时器边界事件 | ||
| 890 | + BoundaryEvent boundaryEvent = new BoundaryEvent(); | ||
| 891 | + boundaryEvent.setId("Event-" + IdUtil.fastUUID()); | ||
| 892 | + boundaryEvent.setCancelActivity(false); // 设置关联的任务为不会被中断 | ||
| 893 | + boundaryEvent.setAttachedToRef(attachedToRef); | ||
| 894 | + // 1.2 定义超时时间表达式 | ||
| 895 | + TimerEventDefinition eventDefinition = new TimerEventDefinition(); | ||
| 896 | + if (ObjUtil.isNotNull(timeDuration)) { | ||
| 897 | + eventDefinition.setTimeDuration(timeDuration); | ||
| 898 | + } | ||
| 899 | + if (ObjUtil.isNotNull(timeDuration)) { | ||
| 900 | + eventDefinition.setTimeCycle(timeCycle); | ||
| 901 | + } | ||
| 902 | + if (ObjUtil.isNotNull(timeDate)) { | ||
| 903 | + eventDefinition.setTimeDate(timeDate); | ||
| 904 | + } | ||
| 905 | + boundaryEvent.addEventDefinition(eventDefinition); | ||
| 906 | + | ||
| 907 | + // 2.1 添加定时器边界事件类型 | ||
| 908 | + addExtensionElement(boundaryEvent, BOUNDARY_EVENT_TYPE, type); | ||
| 909 | + return boundaryEvent; | ||
| 910 | + } | ||
| 911 | + | ||
| 906 | // ========== SIMPLE 流程预测相关的方法 ========== | 912 | // ========== SIMPLE 流程预测相关的方法 ========== |
| 907 | 913 | ||
| 908 | public static List<BpmSimpleModelNodeVO> simulateProcess(BpmSimpleModelNodeVO rootNode, Map<String, Object> variables) { | 914 | public static List<BpmSimpleModelNodeVO> simulateProcess(BpmSimpleModelNodeVO rootNode, Map<String, Object> variables) { |