Commit 8a3264cfd34b37fe49081c906d50615a1742e5e1

Authored by smallNorthLee
1 parent 5e15a100

review: 代码审查,方法抽取

yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java
@@ -808,53 +808,26 @@ public class BpmnModelUtils { @@ -808,53 +808,26 @@ public class BpmnModelUtils {
808 // 情况:ExclusiveGateway 排它,只有一个满足条件的。如果没有,就走默认的 808 // 情况:ExclusiveGateway 排它,只有一个满足条件的。如果没有,就走默认的
809 if (currentElement instanceof ExclusiveGateway) { 809 if (currentElement instanceof ExclusiveGateway) {
810 // 查找满足条件的 SequenceFlow 路径 810 // 查找满足条件的 SequenceFlow 路径
811 - Gateway gateway = (Gateway) currentElement;  
812 - // TODO @小北:当一个网关节点下存在多个满足的并行节点时,只查询一个节点流程流转会存在问题。需要优化,具体见issue:https://github.com/YunaiV/ruoyi-vue-pro/issues/761  
813 - SequenceFlow matchSequenceFlow = CollUtil.findOne(gateway.getOutgoingFlows(),  
814 - flow -> ObjUtil.notEqual(gateway.getDefaultFlow(), flow.getId())  
815 - && (evalConditionExpress(variables, flow.getConditionExpression())));  
816 - if (matchSequenceFlow == null) {  
817 - matchSequenceFlow = CollUtil.findOne(gateway.getOutgoingFlows(),  
818 - flow -> ObjUtil.equal(gateway.getDefaultFlow(), flow.getId()));  
819 - // 特殊:没有默认的情况下,并且只有 1 个条件,则认为它是默认的  
820 - if (matchSequenceFlow == null && gateway.getOutgoingFlows().size() == 1) {  
821 - matchSequenceFlow = gateway.getOutgoingFlows().get(0);  
822 - }  
823 - } 811 + SequenceFlow matchSequenceFlow = findMatchSequenceFlow((Gateway) currentElement, variables);
824 // 遍历满足条件的 SequenceFlow 路径 812 // 遍历满足条件的 SequenceFlow 路径
825 if (matchSequenceFlow != null) { 813 if (matchSequenceFlow != null) {
826 simulateNextFlowElements(matchSequenceFlow.getTargetFlowElement(), variables, resultElements, visitElements); 814 simulateNextFlowElements(matchSequenceFlow.getTargetFlowElement(), variables, resultElements, visitElements);
827 } 815 }
828 - return;  
829 } 816 }
830 -  
831 // 情况:InclusiveGateway 包容,多个满足条件的。如果没有,就走默认的 817 // 情况:InclusiveGateway 包容,多个满足条件的。如果没有,就走默认的
832 - if (currentElement instanceof InclusiveGateway) { 818 + else if (currentElement instanceof InclusiveGateway) {
833 // 查找满足条件的 SequenceFlow 路径 819 // 查找满足条件的 SequenceFlow 路径
834 - Gateway gateway = (Gateway) currentElement;  
835 - Collection<SequenceFlow> matchSequenceFlows = CollUtil.filterNew(gateway.getOutgoingFlows(),  
836 - flow -> ObjUtil.notEqual(gateway.getDefaultFlow(), flow.getId())  
837 - && evalConditionExpress(variables, flow.getConditionExpression()));  
838 - if (CollUtil.isEmpty(matchSequenceFlows)) {  
839 - matchSequenceFlows = CollUtil.filterNew(gateway.getOutgoingFlows(),  
840 - flow -> ObjUtil.equal(gateway.getDefaultFlow(), flow.getId()));  
841 - // 特殊:没有默认的情况下,并且只有 1 个条件,则认为它是默认的  
842 - if (CollUtil.isEmpty(matchSequenceFlows) && gateway.getOutgoingFlows().size() == 1) {  
843 - matchSequenceFlows = gateway.getOutgoingFlows();  
844 - }  
845 - } 820 + Collection<SequenceFlow> matchSequenceFlows = findMatchSequenceFlows((Gateway) currentElement, variables);
846 // 遍历满足条件的 SequenceFlow 路径 821 // 遍历满足条件的 SequenceFlow 路径
847 matchSequenceFlows.forEach( 822 matchSequenceFlows.forEach(
848 flow -> simulateNextFlowElements(flow.getTargetFlowElement(), variables, resultElements, visitElements)); 823 flow -> simulateNextFlowElements(flow.getTargetFlowElement(), variables, resultElements, visitElements));
849 } 824 }
850 -  
851 // 情况:ParallelGateway 并行,都满足,都走 825 // 情况:ParallelGateway 并行,都满足,都走
852 - if (currentElement instanceof ParallelGateway) { 826 + else if (currentElement instanceof ParallelGateway) {
853 Gateway gateway = (Gateway) currentElement; 827 Gateway gateway = (Gateway) currentElement;
854 // 遍历子节点 828 // 遍历子节点
855 gateway.getOutgoingFlows().forEach( 829 gateway.getOutgoingFlows().forEach(
856 nextElement -> simulateNextFlowElements(nextElement.getTargetFlowElement(), variables, resultElements, visitElements)); 830 nextElement -> simulateNextFlowElements(nextElement.getTargetFlowElement(), variables, resultElements, visitElements));
857 - return;  
858 } 831 }
859 } 832 }
860 833
@@ -911,8 +884,25 @@ public class BpmnModelUtils { @@ -911,8 +884,25 @@ public class BpmnModelUtils {
911 */ 884 */
912 private static void handleExclusiveGateway(Gateway gateway, BpmnModel bpmnModel, 885 private static void handleExclusiveGateway(Gateway gateway, BpmnModel bpmnModel,
913 Map<String, Object> variables, List<FlowNode> nextFlowNodes) { 886 Map<String, Object> variables, List<FlowNode> nextFlowNodes) {
914 - // TODO @小北: 这里和 simulateNextFlowElements 中有重复代码,是否重构??每个网关节点拆分出方法应该比较合理化,@芋艿  
915 - // TODO @小北:ok,把 simulateNextFlowElements 里面处理网关的,复用这个方法,可以么? 887 + // 查找满足条件的 SequenceFlow 路径
  888 + SequenceFlow matchSequenceFlow = findMatchSequenceFlow(gateway, variables);
  889 + // 遍历满足条件的 SequenceFlow 路径
  890 + if (matchSequenceFlow != null) {
  891 + FlowElement targetElement = bpmnModel.getFlowElement(matchSequenceFlow.getTargetRef());
  892 + if (targetElement instanceof FlowNode) {
  893 + nextFlowNodes.add((FlowNode) targetElement);
  894 + }
  895 + }
  896 + }
  897 +
  898 + /**
  899 + * 处理排它网关(Exclusive Gateway),选择符合条件的路径
  900 + *
  901 + * @param gateway 排他网关
  902 + * @param variables 流程变量
  903 + * @return 符合条件的路径
  904 + */
  905 + private static SequenceFlow findMatchSequenceFlow(Gateway gateway, Map<String, Object> variables){
916 SequenceFlow matchSequenceFlow = CollUtil.findOne(gateway.getOutgoingFlows(), 906 SequenceFlow matchSequenceFlow = CollUtil.findOne(gateway.getOutgoingFlows(),
917 flow -> ObjUtil.notEqual(gateway.getDefaultFlow(), flow.getId()) 907 flow -> ObjUtil.notEqual(gateway.getDefaultFlow(), flow.getId())
918 && (evalConditionExpress(variables, flow.getConditionExpression()))); 908 && (evalConditionExpress(variables, flow.getConditionExpression())));
@@ -924,13 +914,7 @@ public class BpmnModelUtils { @@ -924,13 +914,7 @@ public class BpmnModelUtils {
924 matchSequenceFlow = gateway.getOutgoingFlows().get(0); 914 matchSequenceFlow = gateway.getOutgoingFlows().get(0);
925 } 915 }
926 } 916 }
927 - // 遍历满足条件的 SequenceFlow 路径  
928 - if (matchSequenceFlow != null) {  
929 - FlowElement targetElement = bpmnModel.getFlowElement(matchSequenceFlow.getTargetRef());  
930 - if (targetElement instanceof FlowNode) {  
931 - nextFlowNodes.add((FlowNode) targetElement);  
932 - }  
933 - } 917 + return matchSequenceFlow;
934 } 918 }
935 919
936 /** 920 /**
@@ -943,6 +927,26 @@ public class BpmnModelUtils { @@ -943,6 +927,26 @@ public class BpmnModelUtils {
943 */ 927 */
944 private static void handleInclusiveGateway(Gateway gateway, BpmnModel bpmnModel, 928 private static void handleInclusiveGateway(Gateway gateway, BpmnModel bpmnModel,
945 Map<String, Object> variables, List<FlowNode> nextFlowNodes) { 929 Map<String, Object> variables, List<FlowNode> nextFlowNodes) {
  930 + // 查找满足条件的 SequenceFlow 路径集合
  931 + Collection<SequenceFlow> matchSequenceFlows = findMatchSequenceFlows(gateway, variables);
  932 + // 遍历满足条件的 SequenceFlow 路径,获取目标节点
  933 + matchSequenceFlows.forEach(flow -> {
  934 + FlowElement targetElement = bpmnModel.getFlowElement(flow.getTargetRef());
  935 + if (targetElement instanceof FlowNode) {
  936 + nextFlowNodes.add((FlowNode) targetElement);
  937 + }
  938 + });
  939 + }
  940 +
  941 + /**
  942 + * 处理排它网关(Inclusive Gateway),选择符合条件的路径
  943 + *
  944 + * @param gateway 排他网关
  945 + * @param variables 流程变量
  946 + * @return 符合条件的路径
  947 + */
  948 + private static Collection<SequenceFlow> findMatchSequenceFlows(Gateway gateway, Map<String, Object> variables) {
  949 + // 查找满足条件的 SequenceFlow 路径
946 Collection<SequenceFlow> matchSequenceFlows = CollUtil.filterNew(gateway.getOutgoingFlows(), 950 Collection<SequenceFlow> matchSequenceFlows = CollUtil.filterNew(gateway.getOutgoingFlows(),
947 flow -> ObjUtil.notEqual(gateway.getDefaultFlow(), flow.getId()) 951 flow -> ObjUtil.notEqual(gateway.getDefaultFlow(), flow.getId())
948 && evalConditionExpress(variables, flow.getConditionExpression())); 952 && evalConditionExpress(variables, flow.getConditionExpression()));
@@ -954,15 +958,10 @@ public class BpmnModelUtils { @@ -954,15 +958,10 @@ public class BpmnModelUtils {
954 matchSequenceFlows = gateway.getOutgoingFlows(); 958 matchSequenceFlows = gateway.getOutgoingFlows();
955 } 959 }
956 } 960 }
957 - // 遍历满足条件的 SequenceFlow 路径,获取目标节点  
958 - matchSequenceFlows.forEach(flow -> {  
959 - FlowElement targetElement = bpmnModel.getFlowElement(flow.getTargetRef());  
960 - if (targetElement instanceof FlowNode) {  
961 - nextFlowNodes.add((FlowNode) targetElement);  
962 - }  
963 - }); 961 + return matchSequenceFlows;
964 } 962 }
965 963
  964 +
966 /** 965 /**
967 * 处理并行网关 966 * 处理并行网关
968 * 967 *