update - 完善 BPMN 协议转换逻辑

This commit is contained in:
wangli 2023-11-17 00:06:08 +08:00
parent f04abb0960
commit 8d79f2a11b
3 changed files with 160 additions and 98 deletions

View File

@ -0,0 +1,63 @@
package cn.axzo.workflow.core.common.utils;
import cn.axzo.workflow.common.model.request.bpmn.BpmnCondition;
/**
* 表达式翻译器
*
* @author wangli
* @since 2023/11/16 23:30
*/
public final class BpmnExpressionTranslator {
private BpmnExpressionTranslator() {}
public static String translateNumber(BpmnCondition condition) {
StringBuilder sb = new StringBuilder();
if ("between".equals(condition.getOperator())) {
sb.append("var:")
.append(condition.getLeftOperator())
.append("('")
.append(condition.getFieldCode())
.append("', ")
.append(condition.getLeftValue())
.append(")")
.append(" && ")
.append("var:")
.append(condition.getRightOperator())
.append("('")
.append(condition.getFieldCode())
.append("', ")
.append(condition.getRightValue())
.append(")");
} else {
sb.append("var:")
.append(condition.getOperator())
.append("('")
.append(condition.getFieldCode())
.append("', ")
.append(condition.getDefaultValue())
.append(")");
}
return sb.toString();
}
public static String translateRadio(BpmnCondition condition) {
StringBuilder sb = new StringBuilder();
//TODO
return sb.toString();
}
public static String translateCheckbox(BpmnCondition condition) {
StringBuilder sb = new StringBuilder();
//TODO
return sb.toString();
}
public static String translateString(BpmnCondition condition) {
StringBuilder sb = new StringBuilder();
//TODO
return sb.toString();
}
}

View File

@ -393,36 +393,37 @@ public final class BpmnJsonConverterUtil {
} else if (Lists.newArrayList(preNodeIds).size() == 1 && !NODE_CONDITION.equals(bpmnJsonNode.getType())) {
mainProcess.addFlowElement(convertJsonToElement(SequenceFlow.class, bpmnJsonNode, mainProcess));
} else {
// 网关的 SequenceFlow, 需要在这里设置网关的 DefaultFlow, 同时也需要解析这些 SequenceFlow 的条件
// 将网关分支的最末级节点 ID 关联到网关的 children 节点上网关协议转换才算闭环
Arrays.stream(preNodeIds).forEach(income -> {
bpmnJsonNode.setIncoming(Lists.newArrayList(income));
FlowElement sequenceFlow = convertJsonToElement(SequenceFlow.class, bpmnJsonNode, mainProcess);
mainProcess.addFlowElement(sequenceFlow);
setDefaultFlow(bpmnJsonNode, mainProcess, sequenceFlow);
});
}
// 只有网关才会涉及到 branch
List<String> conditions = new ArrayList<>();
List<String> branchLastNodeIds = new ArrayList<>();
if (!CollectionUtils.isEmpty(bpmnJsonNode.getBranches())) {
Gateway gateway = (Gateway) flowElement;
for (BpmnJsonNode branch : bpmnJsonNode.getBranches()) {
// branch == node_condition
if (Objects.nonNull(branch.getChildren())) {
conditions.add(create(branch.getChildren(), mainProcess, bpmnModel, flowElement.getId()));
} else {
bpmnJsonNode.getChildren().setIncoming(Lists.newArrayList(bpmnJsonNode.getId()));
FlowElement sequenceFlow = convertJsonToElement(SequenceFlow.class, bpmnJsonNode.getChildren(),
mainProcess);
mainProcess.addFlowElement(sequenceFlow);
BpmnJsonNode nextJsonNode = Objects.isNull(branch.getChildren()) ? bpmnJsonNode.getChildren() :
branch.getChildren();
nextJsonNode.setIncoming(Lists.newArrayList(gateway.getId()));
// 判断这个是不是默认流
if (Objects.nonNull(branch.getProperty()) && Boolean.TRUE.equals(branch.getProperty().getDefaultBranch())) {
Gateway gateway = (Gateway) flowElement;
gateway.setDefaultFlow(sequenceFlow.getId());
}
// node_condition 放入计算节点的上级属性中方便顺序流转换器对条件进行处理
nextJsonNode.setPreJsonNode(branch);
SequenceFlow sequenceFlow = (SequenceFlow) convertJsonToElement(SequenceFlow.class, nextJsonNode,
mainProcess);
mainProcess.addFlowElement(sequenceFlow);
// 设置网关默认流
if (Objects.nonNull(branch.getProperty()) && Boolean.TRUE.equals(branch.getProperty().getDefaultBranch())) {
gateway.setDefaultFlow(sequenceFlow.getId());
}
if (Objects.nonNull(branch.getChildren())) {
branchLastNodeIds.add(create(branch.getChildren(), mainProcess, bpmnModel));
}
}
}
@ -432,12 +433,10 @@ public final class BpmnJsonConverterUtil {
if (Objects.isNull(children) || Objects.equals(NODE_EMPTY, children.getType()) || !StringUtils.hasLength(children.getId())) {
return flowElement.getId();
} else {
if (!CollectionUtils.isEmpty(conditions)) {
// 由于不是通过 create 方法解析 node_condition, 所以单独用一个字段来传递它
children.setPreJsonNode(bpmnJsonNode);
return create(children, mainProcess, bpmnModel, conditions.toArray(new String[0]));
if (CollectionUtils.isEmpty(branchLastNodeIds)) {
return create(children, mainProcess, bpmnModel, flowElement.getId());
}
return create(children, mainProcess, bpmnModel, flowElement.getId());
return create(children, mainProcess, bpmnModel, branchLastNodeIds.toArray(new String[0]));
}
}

View File

@ -79,7 +79,7 @@
<jsonValue><![CDATA[{"id":"1","parentId":"0","type":"NODE_STARTER","name":"发起人"}]]></jsonValue>
</extensionElements>
</userTask>
<sequenceFlow id="SequenceFlowId_8e353e5818344191a2cfd7f38bee6710" sourceRef="startEventNode"
<sequenceFlow id="SequenceFlowId_cfb406084aa14934a68dabc8583b17de" sourceRef="startEventNode"
targetRef="1"></sequenceFlow>
<userTask id="2" name="一级审批" flowable:assignee="${assigneeName}"
flowable:skipExpression="${_INTERNAL_SKIP_USER_TASK}">
@ -145,10 +145,11 @@
<completionCondition>${nrOfInstances == nrOfCompletedInstances}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<sequenceFlow id="SequenceFlowId_fc554bfb59f741db937cad57e35a097a" sourceRef="1" targetRef="2"></sequenceFlow>
<sequenceFlow id="SequenceFlowId_6a8071c849854242904efe3dbcaa92cc" sourceRef="1" targetRef="2"></sequenceFlow>
<exclusiveGateway id="3" name="排它网关"
default="SequenceFlowId_78565be4afe34c83958b99f0a04c6e63"></exclusiveGateway>
<sequenceFlow id="SequenceFlowId_43aa19e917dd4cf7a4e9100b816f2de4" sourceRef="2" targetRef="3"></sequenceFlow>
default="SequenceFlowId_180b9ce16f3049cd8e93036ab3b7d93a"></exclusiveGateway>
<sequenceFlow id="SequenceFlowId_c65a855af7394c4f9fb2a9e7d37bffdd" sourceRef="2" targetRef="3"></sequenceFlow>
<sequenceFlow id="SequenceFlowId_7ba21602ba2240b68bba3262e3305b19" sourceRef="3" targetRef="7"></sequenceFlow>
<userTask id="7" name="条件1审核节点" flowable:assignee="${assigneeName}"
flowable:skipExpression="${_INTERNAL_SKIP_USER_TASK}">
<extensionElements>
@ -213,7 +214,6 @@
<completionCondition>${nrOfInstances == nrOfCompletedInstances}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<sequenceFlow id="SequenceFlowId_b6cd939ce7704661ba661ca682dbc024" sourceRef="3" targetRef="7"></sequenceFlow>
<serviceTask id="8" name="条件1抄送节点">
<extensionElements>
<nodeType><![CDATA[NODE_CARBON_COPY]]></nodeType>
@ -221,7 +221,8 @@
<![CDATA[{"id":"8","parentId":"7","type":"NODE_CARBON_COPY","name":"条件1抄送节点"}]]></jsonValue>
</extensionElements>
</serviceTask>
<sequenceFlow id="SequenceFlowId_ada2b583302e4d61bc9636e830948992" sourceRef="7" targetRef="8"></sequenceFlow>
<sequenceFlow id="SequenceFlowId_5f3f0fc3cc7945d3a85df2d83e92a076" sourceRef="7" targetRef="8"></sequenceFlow>
<sequenceFlow id="SequenceFlowId_5639fdc0199949be8e27f5ab771117e3" sourceRef="3" targetRef="9"></sequenceFlow>
<receiveTask id="9" name="条件2业务节点">
<extensionElements>
<nodeType><![CDATA[NODE_BUSINESS]]></nodeType>
@ -229,7 +230,6 @@
<![CDATA[{"id":"9","parentId":"5","type":"NODE_BUSINESS","name":"条件2业务节点","property":{"approvalMethod":"nobody","isMultiTask":true,"groupsType":"and"}}]]></jsonValue>
</extensionElements>
</receiveTask>
<sequenceFlow id="SequenceFlowId_efe82a3aa4bf4e7a8ae4b70128da75c1" sourceRef="3" targetRef="9"></sequenceFlow>
<userTask id="10" name="条件2审批节点" flowable:assignee="${assigneeName}"
flowable:skipExpression="${_INTERNAL_SKIP_USER_TASK}">
<extensionElements>
@ -253,7 +253,7 @@
<completionCondition>${nrOfInstances == nrOfCompletedInstances}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<sequenceFlow id="SequenceFlowId_7f64c1f2d23f49988d0c55db2767e374" sourceRef="9" targetRef="10"></sequenceFlow>
<sequenceFlow id="SequenceFlowId_32c6e1520b004fa799dfbd8032cc2663" sourceRef="9" targetRef="10"></sequenceFlow>
<userTask id="13" name="业务节点有审批人" flowable:assignee="${assigneeName}">
<extensionElements>
<flowable:executionListener event="start"
@ -276,8 +276,8 @@
<completionCondition>${nrOfInstances == nrOfCompletedInstances}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<sequenceFlow id="SequenceFlowId_70f9983c76c647988b3393de3e96c901" sourceRef="10" targetRef="13"></sequenceFlow>
<sequenceFlow id="SequenceFlowId_78565be4afe34c83958b99f0a04c6e63" sourceRef="3" targetRef="11"></sequenceFlow>
<sequenceFlow id="SequenceFlowId_e75b300b48b645acab032cee2cb7550d" sourceRef="10" targetRef="13"></sequenceFlow>
<sequenceFlow id="SequenceFlowId_180b9ce16f3049cd8e93036ab3b7d93a" sourceRef="3" targetRef="11"></sequenceFlow>
<serviceTask id="11" name="主流程抄送节点">
<extensionElements>
<nodeType><![CDATA[NODE_CARBON_COPY]]></nodeType>
@ -285,16 +285,16 @@
<![CDATA[{"id":"11","parentId":"3","type":"NODE_CARBON_COPY","name":"主流程抄送节点"}]]></jsonValue>
</extensionElements>
</serviceTask>
<sequenceFlow id="SequenceFlowId_62c9b56969134213a32bc9ee64235ae9" sourceRef="8" targetRef="11"></sequenceFlow>
<sequenceFlow id="SequenceFlowId_112e496257bb4060a6a8c422aa3b52bf" sourceRef="13" targetRef="11"></sequenceFlow>
<sequenceFlow id="SequenceFlowId_ae7ec83595e04b69a7927e2e3788d088" sourceRef="8" targetRef="11"></sequenceFlow>
<sequenceFlow id="SequenceFlowId_592c79d29f6d4eb08e525d8744860d5d" sourceRef="13" targetRef="11"></sequenceFlow>
<endEvent id="endEventNode"></endEvent>
<sequenceFlow id="SequenceFlowId_1d2b292c6be54882a5eebfaff6efd276" sourceRef="11"
<sequenceFlow id="SequenceFlowId_ae627745e0b642bd9b0cc17ed0693114" sourceRef="11"
targetRef="endEventNode"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_id">
<bpmndi:BPMNPlane bpmnElement="id" id="BPMNPlane_id">
<bpmndi:BPMNShape bpmnElement="11" id="BPMNShape_11">
<omgdc:Bounds height="60.0" width="100.0" x="920.0" y="101.0"></omgdc:Bounds>
<omgdc:Bounds height="60.0" width="100.0" x="920.0" y="158.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="1" id="BPMNShape_1">
<omgdc:Bounds height="60.0" width="100.0" x="80.0" y="130.0"></omgdc:Bounds>
@ -303,7 +303,7 @@
<omgdc:Bounds height="60.0" width="100.0" x="230.0" y="130.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="13" id="BPMNShape_13">
<omgdc:Bounds height="60.0" width="100.0" x="770.0" y="230.0"></omgdc:Bounds>
<omgdc:Bounds height="60.0" width="100.0" x="770.0" y="30.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="3" id="BPMNShape_3">
<omgdc:Bounds height="40.0" width="40.0" x="380.0" y="140.0"></omgdc:Bounds>
@ -312,94 +312,94 @@
<omgdc:Bounds height="30.0" width="30.0" x="0.0" y="145.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="7" id="BPMNShape_7">
<omgdc:Bounds height="60.0" width="100.0" x="470.0" y="0.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="8" id="BPMNShape_8">
<omgdc:Bounds height="60.0" width="100.0" x="620.0" y="0.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="9" id="BPMNShape_9">
<omgdc:Bounds height="60.0" width="100.0" x="470.0" y="260.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endEventNode" id="BPMNShape_endEventNode">
<omgdc:Bounds height="30.0" width="30.0" x="1070.0" y="116.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="10" id="BPMNShape_10">
<bpmndi:BPMNShape bpmnElement="8" id="BPMNShape_8">
<omgdc:Bounds height="60.0" width="100.0" x="620.0" y="260.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_112e496257bb4060a6a8c422aa3b52bf"
id="BPMNEdge_SequenceFlowId_112e496257bb4060a6a8c422aa3b52bf">
<omgdi:waypoint x="870.0" y="260.0"></omgdi:waypoint>
<omgdi:waypoint x="882.0" y="260.0"></omgdi:waypoint>
<omgdi:waypoint x="882.0" y="131.0"></omgdi:waypoint>
<omgdi:waypoint x="920.0" y="131.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_ada2b583302e4d61bc9636e830948992"
id="BPMNEdge_SequenceFlowId_ada2b583302e4d61bc9636e830948992">
<bpmndi:BPMNShape bpmnElement="9" id="BPMNShape_9">
<omgdc:Bounds height="60.0" width="100.0" x="470.0" y="0.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endEventNode" id="BPMNShape_endEventNode">
<omgdc:Bounds height="30.0" width="30.0" x="1070.0" y="173.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="10" id="BPMNShape_10">
<omgdc:Bounds height="60.0" width="100.0" x="620.0" y="0.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_32c6e1520b004fa799dfbd8032cc2663"
id="BPMNEdge_SequenceFlowId_32c6e1520b004fa799dfbd8032cc2663">
<omgdi:waypoint x="570.0" y="30.0"></omgdi:waypoint>
<omgdi:waypoint x="582.0" y="30.0"></omgdi:waypoint>
<omgdi:waypoint x="582.0" y="30.000000000000007"></omgdi:waypoint>
<omgdi:waypoint x="620.0" y="30.000000000000007"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_fc554bfb59f741db937cad57e35a097a"
id="BPMNEdge_SequenceFlowId_fc554bfb59f741db937cad57e35a097a">
<omgdi:waypoint x="180.0" y="160.0"></omgdi:waypoint>
<omgdi:waypoint x="230.0" y="160.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_43aa19e917dd4cf7a4e9100b816f2de4"
id="BPMNEdge_SequenceFlowId_43aa19e917dd4cf7a4e9100b816f2de4">
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_c65a855af7394c4f9fb2a9e7d37bffdd"
id="BPMNEdge_SequenceFlowId_c65a855af7394c4f9fb2a9e7d37bffdd">
<omgdi:waypoint x="330.0" y="160.0"></omgdi:waypoint>
<omgdi:waypoint x="380.0" y="160.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_70f9983c76c647988b3393de3e96c901"
id="BPMNEdge_SequenceFlowId_70f9983c76c647988b3393de3e96c901">
<omgdi:waypoint x="720.0" y="290.0"></omgdi:waypoint>
<omgdi:waypoint x="732.0" y="290.0"></omgdi:waypoint>
<omgdi:waypoint x="732.0" y="260.0"></omgdi:waypoint>
<omgdi:waypoint x="770.0" y="260.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_b6cd939ce7704661ba661ca682dbc024"
id="BPMNEdge_SequenceFlowId_b6cd939ce7704661ba661ca682dbc024">
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_5639fdc0199949be8e27f5ab771117e3"
id="BPMNEdge_SequenceFlowId_5639fdc0199949be8e27f5ab771117e3">
<omgdi:waypoint x="420.0" y="150.0"></omgdi:waypoint>
<omgdi:waypoint x="432.0" y="150.0"></omgdi:waypoint>
<omgdi:waypoint x="432.0" y="30.000000000000007"></omgdi:waypoint>
<omgdi:waypoint x="470.0" y="30.000000000000007"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_7f64c1f2d23f49988d0c55db2767e374"
id="BPMNEdge_SequenceFlowId_7f64c1f2d23f49988d0c55db2767e374">
<omgdi:waypoint x="570.0" y="290.0"></omgdi:waypoint>
<omgdi:waypoint x="620.0" y="290.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_62c9b56969134213a32bc9ee64235ae9"
id="BPMNEdge_SequenceFlowId_62c9b56969134213a32bc9ee64235ae9">
<omgdi:waypoint x="720.0" y="30.0"></omgdi:waypoint>
<omgdi:waypoint x="732.0" y="30.0"></omgdi:waypoint>
<omgdi:waypoint x="732.0" y="131.0"></omgdi:waypoint>
<omgdi:waypoint x="920.0" y="131.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_1d2b292c6be54882a5eebfaff6efd276"
id="BPMNEdge_SequenceFlowId_1d2b292c6be54882a5eebfaff6efd276">
<omgdi:waypoint x="1020.0" y="131.0"></omgdi:waypoint>
<omgdi:waypoint x="1070.0" y="131.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_8e353e5818344191a2cfd7f38bee6710"
id="BPMNEdge_SequenceFlowId_8e353e5818344191a2cfd7f38bee6710">
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_cfb406084aa14934a68dabc8583b17de"
id="BPMNEdge_SequenceFlowId_cfb406084aa14934a68dabc8583b17de">
<omgdi:waypoint x="30.0" y="160.0"></omgdi:waypoint>
<omgdi:waypoint x="80.0" y="160.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_78565be4afe34c83958b99f0a04c6e63"
id="BPMNEdge_SequenceFlowId_78565be4afe34c83958b99f0a04c6e63">
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_5f3f0fc3cc7945d3a85df2d83e92a076"
id="BPMNEdge_SequenceFlowId_5f3f0fc3cc7945d3a85df2d83e92a076">
<omgdi:waypoint x="570.0" y="290.0"></omgdi:waypoint>
<omgdi:waypoint x="620.0" y="290.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_ae7ec83595e04b69a7927e2e3788d088"
id="BPMNEdge_SequenceFlowId_ae7ec83595e04b69a7927e2e3788d088">
<omgdi:waypoint x="720.0" y="290.0"></omgdi:waypoint>
<omgdi:waypoint x="732.0" y="290.0"></omgdi:waypoint>
<omgdi:waypoint x="732.0" y="188.0"></omgdi:waypoint>
<omgdi:waypoint x="920.0" y="188.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_592c79d29f6d4eb08e525d8744860d5d"
id="BPMNEdge_SequenceFlowId_592c79d29f6d4eb08e525d8744860d5d">
<omgdi:waypoint x="870.0" y="60.0"></omgdi:waypoint>
<omgdi:waypoint x="882.0" y="60.0"></omgdi:waypoint>
<omgdi:waypoint x="882.0" y="188.0"></omgdi:waypoint>
<omgdi:waypoint x="920.0" y="188.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_ae627745e0b642bd9b0cc17ed0693114"
id="BPMNEdge_SequenceFlowId_ae627745e0b642bd9b0cc17ed0693114">
<omgdi:waypoint x="1020.0" y="188.0"></omgdi:waypoint>
<omgdi:waypoint x="1070.0" y="188.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_180b9ce16f3049cd8e93036ab3b7d93a"
id="BPMNEdge_SequenceFlowId_180b9ce16f3049cd8e93036ab3b7d93a">
<omgdi:waypoint x="420.0" y="160.0"></omgdi:waypoint>
<omgdi:waypoint x="434.0" y="160.0"></omgdi:waypoint>
<omgdi:waypoint x="434.0" y="131.0"></omgdi:waypoint>
<omgdi:waypoint x="920.0" y="131.0"></omgdi:waypoint>
<omgdi:waypoint x="434.0" y="188.0"></omgdi:waypoint>
<omgdi:waypoint x="920.0" y="188.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_efe82a3aa4bf4e7a8ae4b70128da75c1"
id="BPMNEdge_SequenceFlowId_efe82a3aa4bf4e7a8ae4b70128da75c1">
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_7ba21602ba2240b68bba3262e3305b19"
id="BPMNEdge_SequenceFlowId_7ba21602ba2240b68bba3262e3305b19">
<omgdi:waypoint x="420.0" y="170.0"></omgdi:waypoint>
<omgdi:waypoint x="432.0" y="170.0"></omgdi:waypoint>
<omgdi:waypoint x="432.0" y="290.0"></omgdi:waypoint>
<omgdi:waypoint x="470.0" y="290.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_6a8071c849854242904efe3dbcaa92cc"
id="BPMNEdge_SequenceFlowId_6a8071c849854242904efe3dbcaa92cc">
<omgdi:waypoint x="180.0" y="160.0"></omgdi:waypoint>
<omgdi:waypoint x="230.0" y="160.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlowId_e75b300b48b645acab032cee2cb7550d"
id="BPMNEdge_SequenceFlowId_e75b300b48b645acab032cee2cb7550d">
<omgdi:waypoint x="720.0" y="30.0"></omgdi:waypoint>
<omgdi:waypoint x="732.0" y="30.0"></omgdi:waypoint>
<omgdi:waypoint x="732.0" y="60.00000000000001"></omgdi:waypoint>
<omgdi:waypoint x="770.0" y="60.00000000000001"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>