Activiti6.0 (fünf) die Verwendung eines exklusiven Gateways

Inhaltsverzeichnis

I. Einleitung

Zwei exklusive Gateway-Nutzung

1. Zeichnen Sie ein Flussdiagramm

2. Führen Sie das exklusive Gateway aus

3. Beurteilung komplexer Bedingungen


I. Einleitung

Im vorherigen Artikel wurde erwähnt, dass Sie bei mehreren ausgehenden Leitungen Prozessvariablen verwenden können, um die Prozesszeile zu steuern. Das exklusive Gateway von Activiti legt im Wesentlichen die Bedingungen für jede ausgehende Leitung nach dem Gateway fest und entfernt die standardmäßige ausgehende Leitung und dann von top top Fahren Sie mit dem nächsten Urteil fort. Wenn die Bedingung erfüllt oder bedingungslos ist, wird sie als erfüllt betrachtet und die ausgehende Leitung wird direkt ausgeführt. Über das exklusive Gateway kann auch die standardmäßige ausgehende Leitung festgelegt werden, dh die standardmäßige ausgehende Leitung Zeile wird ausgeführt, wenn nicht alle ausgehenden Zeilen erfüllt sind.

Im Wesentlichen besteht der einzige Vorteil des exklusiven Gateways darin, dass auf dem exklusiven Gateway eine Reihe von Attributen festgelegt werden können, um die Reihenfolge der Beurteilung zu steuern und das gesamte Flussdiagramm übersichtlich zu gestalten.

Zwei exklusive Gateway-Nutzung

1. Zeichnen Sie ein Flussdiagramm

Nehmen Sie das Genehmigungsverfahren für die Erstattung als Beispiel. Wenn die Erstattungskosten weniger als 1000 betragen, wenden Sie sich direkt an den Abteilungsleiter, um die Ausgangslinie zu genehmigen. Ich habe die Ausgangslinie direkt als Standardausgangslinie festgelegt, sodass die Online-Bedingungen nicht festgelegt werden können Wenn die Kosten größer als 1000 und kleiner als 1500 sind, gehen Sie. Der General Manager genehmigt die Linie. Wenn sie größer als 1500 ist, genehmigt der Vorsitzende die Linie

Die Urteilsreihenfolge exklusiver Gateways kann ebenfalls festgelegt werden:

Die obige Abbildung zeigt, dass nach dem Entfernen der Genehmigung des Standard-Line-Out-Abteilungsleiters zunächst beurteilt wird, ob die Bedingungen für das Genehmigungs-Line-Out des General Managers erfüllt sind, und dann direkt übertragen wird.

Die XML-Datei lautet übrigens wie folgt:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
  <process id="exclusive" name="排他网关测试" isExecutable="true">
    <startEvent id="startEvent1"></startEvent>
    <userTask id="sid-F713E5EC-5EB6-4923-823A-0D490B996316" name="费用报销申请" activiti:candidateUsers="test">
      <extensionElements>
        <modeler:user-info-firstname-test xmlns:modeler="http://activiti.com/modeler"><![CDATA[test]]></modeler:user-info-firstname-test>
        <modeler:activiti-idm-candidate-user xmlns:modeler="http://activiti.com/modeler"><![CDATA[true]]></modeler:activiti-idm-candidate-user>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <exclusiveGateway id="sid-B2A37F07-424D-4797-A7C6-65E15AB760FD" default="sid-084F6369-265A-4D96-BB4D-59E84CD807CD"></exclusiveGateway>
    <userTask id="sid-E11FAB26-51D9-458F-82F8-1AE58674382B" name="部分经理审批" activiti:candidateUsers="admin">
      <extensionElements>
        <modeler:user-info-email-admin xmlns:modeler="http://activiti.com/modeler"><![CDATA[admin]]></modeler:user-info-email-admin>
        <modeler:user-info-lastname-admin xmlns:modeler="http://activiti.com/modeler"><![CDATA[Administrator]]></modeler:user-info-lastname-admin>
        <modeler:activiti-idm-candidate-user xmlns:modeler="http://activiti.com/modeler"><![CDATA[true]]></modeler:activiti-idm-candidate-user>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <userTask id="sid-BEEF4475-13D5-4A8E-9E04-3A452589BBC3" name="总经理审批" activiti:candidateUsers="test">
      <extensionElements>
        <modeler:user-info-firstname-test xmlns:modeler="http://activiti.com/modeler"><![CDATA[test]]></modeler:user-info-firstname-test>
        <modeler:activiti-idm-candidate-user xmlns:modeler="http://activiti.com/modeler"><![CDATA[true]]></modeler:activiti-idm-candidate-user>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <userTask id="sid-B9246DF5-40EB-4D9A-BF58-07E5391C6C58" name="董事长审批" activiti:candidateUsers="test">
      <extensionElements>
        <modeler:user-info-firstname-test xmlns:modeler="http://activiti.com/modeler"><![CDATA[test]]></modeler:user-info-firstname-test>
        <modeler:activiti-idm-candidate-user xmlns:modeler="http://activiti.com/modeler"><![CDATA[true]]></modeler:activiti-idm-candidate-user>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <endEvent id="sid-153A62CA-FAE5-4123-85C3-875FAE7361E7"></endEvent>
    <sequenceFlow id="sid-A29C31A7-AF17-4B31-972F-53ACC7C0DAE3" sourceRef="startEvent1" targetRef="sid-F713E5EC-5EB6-4923-823A-0D490B996316"></sequenceFlow>
    <sequenceFlow id="sid-A9D7094B-636A-49C9-877D-0A456A21A3A5" sourceRef="sid-F713E5EC-5EB6-4923-823A-0D490B996316" targetRef="sid-B2A37F07-424D-4797-A7C6-65E15AB760FD"></sequenceFlow>
    <sequenceFlow id="sid-7E8068C4-BDAA-4596-8465-6674E2A1B8AD" sourceRef="sid-BEEF4475-13D5-4A8E-9E04-3A452589BBC3" targetRef="sid-153A62CA-FAE5-4123-85C3-875FAE7361E7"></sequenceFlow>
    <sequenceFlow id="sid-BD130ADC-D94C-4332-9FBB-EC05554EF9EA" sourceRef="sid-B9246DF5-40EB-4D9A-BF58-07E5391C6C58" targetRef="sid-153A62CA-FAE5-4123-85C3-875FAE7361E7"></sequenceFlow>
    <sequenceFlow id="sid-24D74804-6EB7-426A-88D4-B622CC042178" sourceRef="sid-E11FAB26-51D9-458F-82F8-1AE58674382B" targetRef="sid-153A62CA-FAE5-4123-85C3-875FAE7361E7"></sequenceFlow>
    <sequenceFlow id="sid-084F6369-265A-4D96-BB4D-59E84CD807CD" name="默认出线" sourceRef="sid-B2A37F07-424D-4797-A7C6-65E15AB760FD" targetRef="sid-E11FAB26-51D9-458F-82F8-1AE58674382B"></sequenceFlow>
    <sequenceFlow id="sid-AA4D4312-5345-40CB-98D6-E28B700D49AA" name="费用大于1000小于1500" sourceRef="sid-B2A37F07-424D-4797-A7C6-65E15AB760FD" targetRef="sid-BEEF4475-13D5-4A8E-9E04-3A452589BBC3">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${money >= 1000 && money <= 1500}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-A910EEF7-72DD-4371-9E1A-5AE5C82D90B6" name="费用大于1500" sourceRef="sid-B2A37F07-424D-4797-A7C6-65E15AB760FD" targetRef="sid-B9246DF5-40EB-4D9A-BF58-07E5391C6C58">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${money > 1500}]]></conditionExpression>
    </sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_exclusive">
    <bpmndi:BPMNPlane bpmnElement="exclusive" id="BPMNPlane_exclusive">
      <bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1">
        <omgdc:Bounds height="30.0" width="30.0" x="100.0" y="163.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-F713E5EC-5EB6-4923-823A-0D490B996316" id="BPMNShape_sid-F713E5EC-5EB6-4923-823A-0D490B996316">
        <omgdc:Bounds height="80.0" width="100.0" x="178.0" y="135.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-B2A37F07-424D-4797-A7C6-65E15AB760FD" id="BPMNShape_sid-B2A37F07-424D-4797-A7C6-65E15AB760FD">
        <omgdc:Bounds height="40.0" width="40.0" x="389.0" y="155.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-E11FAB26-51D9-458F-82F8-1AE58674382B" id="BPMNShape_sid-E11FAB26-51D9-458F-82F8-1AE58674382B">
        <omgdc:Bounds height="80.0" width="100.0" x="509.0" y="15.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-BEEF4475-13D5-4A8E-9E04-3A452589BBC3" id="BPMNShape_sid-BEEF4475-13D5-4A8E-9E04-3A452589BBC3">
        <omgdc:Bounds height="80.0" width="100.0" x="509.0" y="138.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-B9246DF5-40EB-4D9A-BF58-07E5391C6C58" id="BPMNShape_sid-B9246DF5-40EB-4D9A-BF58-07E5391C6C58">
        <omgdc:Bounds height="80.0" width="100.0" x="510.0" y="255.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-153A62CA-FAE5-4123-85C3-875FAE7361E7" id="BPMNShape_sid-153A62CA-FAE5-4123-85C3-875FAE7361E7">
        <omgdc:Bounds height="28.0" width="28.0" x="750.0" y="164.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="sid-A9D7094B-636A-49C9-877D-0A456A21A3A5" id="BPMNEdge_sid-A9D7094B-636A-49C9-877D-0A456A21A3A5">
        <omgdi:waypoint x="278.0" y="175.0"></omgdi:waypoint>
        <omgdi:waypoint x="389.0" y="175.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-084F6369-265A-4D96-BB4D-59E84CD807CD" id="BPMNEdge_sid-084F6369-265A-4D96-BB4D-59E84CD807CD">
        <omgdi:waypoint x="420.5740740740741" y="166.57407407407408"></omgdi:waypoint>
        <omgdi:waypoint x="509.37344398340247" y="95.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-7E8068C4-BDAA-4596-8465-6674E2A1B8AD" id="BPMNEdge_sid-7E8068C4-BDAA-4596-8465-6674E2A1B8AD">
        <omgdi:waypoint x="609.0" y="178.0"></omgdi:waypoint>
        <omgdi:waypoint x="750.0" y="178.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-A910EEF7-72DD-4371-9E1A-5AE5C82D90B6" id="BPMNEdge_sid-A910EEF7-72DD-4371-9E1A-5AE5C82D90B6">
        <omgdi:waypoint x="420.0907407407407" y="183.90925925925927"></omgdi:waypoint>
        <omgdi:waypoint x="510.0" y="255.29900332225913"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-A29C31A7-AF17-4B31-972F-53ACC7C0DAE3" id="BPMNEdge_sid-A29C31A7-AF17-4B31-972F-53ACC7C0DAE3">
        <omgdi:waypoint x="129.99471655268036" y="177.60191018001734"></omgdi:waypoint>
        <omgdi:waypoint x="178.0" y="176.3274336283186"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-BD130ADC-D94C-4332-9FBB-EC05554EF9EA" id="BPMNEdge_sid-BD130ADC-D94C-4332-9FBB-EC05554EF9EA">
        <omgdi:waypoint x="610.0" y="266.3235294117647"></omgdi:waypoint>
        <omgdi:waypoint x="751.855601632158" y="184.96516965214465"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-24D74804-6EB7-426A-88D4-B622CC042178" id="BPMNEdge_sid-24D74804-6EB7-426A-88D4-B622CC042178">
        <omgdi:waypoint x="609.0" y="85.0"></omgdi:waypoint>
        <omgdi:waypoint x="751.9950990400243" y="170.79705942401463"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-AA4D4312-5345-40CB-98D6-E28B700D49AA" id="BPMNEdge_sid-AA4D4312-5345-40CB-98D6-E28B700D49AA">
        <omgdi:waypoint x="428.1875" y="175.8125"></omgdi:waypoint>
        <omgdi:waypoint x="509.0" y="177.16387959866222"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

2. Führen Sie das exklusive Gateway aus

Die spezifische Verwendung ist genau die gleiche wie bei der vorherigen. Dies gilt auch dann, wenn die Geldvariable auf den Wert des Links zur Genehmigung der Kostenerstattung gesetzt ist und dann die aktuelle Aufgabe abgeschlossen ist. Activiti ruft automatisch den Gateway-Ausgang ab und beurteilt die Bedingungen anhand von oben nach unten und beenden, wenn es erfüllt ist. Beachten Sie die Bedingungen. Es gilt als erfüllt, wenn es leer ist.

@Test
    public void exclusiveGatewayTest() {
        // 1、发布流程
        Deployment deployment = repositoryService.createDeployment().name("排他网关流程").addClasspathResource("processes/exclusiveGateway.bpmn20.xml").deploy();

        // 2、启动一个流程实例
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("exclusive");

        // 3、查询所有任务
        List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).list();

        Task task = tasks.get(0);
        // 4、完成费用报销审批环节任务的同时设置流程变量,来告诉Activiti该走哪条线
        Map<String, Object> variables = new HashMap<>();
        variables.put("money", 1600);
        taskService.complete(task.getId(), variables);
    }

Sie können den Prozessfluss testen, indem Sie den Wert der Geldvariablen ändern. Bei der tatsächlichen Verwendung muss die Unternehmensseite natürlich nur die Bedingungen der Prozesslinie verwenden, und die spezifischen Werte können selbst gespeichert werden.

3. Beurteilung komplexer Bedingungen

In der tatsächlichen Verwendung können unsere Beurteilungsbedingungen sehr kompliziert sein und viel Geschäftslogik beinhalten. Wenn Sie sich nur auf den bedingten Ausdruck in $ {} verlassen, ist dies möglicherweise nicht erfüllt. Zu diesem Zeitpunkt können Sie eine benutzerdefinierte Beurteilungsmethode für einen benutzerdefinierten Service hinzufügen Klasse in geschweiften Klammern, wie z. B. $ {conditionService.checkCondition (Ausführung)}, Ausführung ist eine Schnittstelle von Activiti, wird automatisch eingefügt, wenn der Fluss beurteilt wird, und der conditionService muss zur Verwaltung auch an Spring übergeben werden. Das heißt, die Annotation @Service wird hinzugefügt

Die benutzerdefinierte Klasse lautet wie folgt:

@Service
@Slf4j
public class ConditionService {

    public boolean checkCondition(Execution execution) {
        ExecutionEntity executionEntity = (ExecutionEntity) execution;
        // 此处可以做业务判断
        log.info("tacheId:{}", executionEntity.getActivityId());
        log.info("tacheName:{}", executionEntity.getCurrentFlowElement().getName());
        return true;
    }
}

Dann wird die der Flusslinie entsprechende Beurteilungsbedingung ebenfalls in $ {conditionService.checkCondition (Ausführung)} geändert und dann ausgeführt.

Da es jedes Mal true zurückgibt, kann es zufällig die Ausführungsreihenfolge des nächsten exklusiven Gateways überprüfen. Aus dem Obigen geht hervor, dass nach dem Entfernen der ausgehenden Standardleitung durch das Gateway mit der Genehmigung des General Managers begonnen wird. Dann mit der aktuellen Aufgabe nach Abschluss sollte auch die Zustimmung des General Managers sein ~

Das Anzeigen der aktuellen Aufgabendaten der Datenbank ist ebenfalls korrekt ~

Ich denke du magst

Origin blog.csdn.net/m0_38001814/article/details/104182756
Empfohlen
Rangfolge