Configuración
Breadcrumbs

Workflows en XML

La configuración de los workflows se puede realizar también de forma manual mediante un fichero XML. Este proceso es de por sí más complicado porque hay que conocer a priori el formato que va a tener la definición de un workflow de Activiti. Por suerte estos ficheros XML suelen seguir un esquema donde tenemos establecido cuál va a ser la estructura de estos ficheros. Para el caso que nos ocupa se puede consultar en https://www.omg.org/spec/BPMN/2.0/PDF.

Observando el contenido del fichero se puede dividir el mismo en dos partes bien diferenciadas. 

En primer lugar está la definición de la secuencia de workflows y las tareas que ejecutan cada una de estas secuencias. 

En segundo lugar se establece la estructura gráfica que permitirá poder utilizar el front de administración comentado en el punto anterior. Para poder generar esta estructura gráfica es necesario abrirlo y  guardarlo en un primer momento con la utilidad Yaoqiang BPMN Editor.

Como muestra de configuración vamos a indicar el formato del diagrama generado con Activiti. Se ven claramente las zonas donde se definen las actividades que realiza cada secuencia del workflow:

<serviceTask id="PROCESSOWNER_NOTIFICATION" name="P.Owner notification" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.SentNotificationJavaDelegate">
      <extensionElements>
        <activiti:field name="notificationCode" stringValue="7" />
      </extensionElements>
      <incoming>flow1</incoming>
      <outgoing>flowN2</outgoing>
    </serviceTask>

Se define la tarea PROCESSOWNER_NOTIFICATION y la clase Java que se encarga de implementarla. Vemos también que nos indica que quien origina esta tarea es la secuencia del workflow llamada “flow1” y que cuando termine se ejecutará la tarea “flowN2”.


Un ejemplo donde se definen estas secuencias del workflow sería:

<sequenceFlow id="flow1" sourceRef="Event_Start" targetRef="PROCESSOWNER_NOTIFICATION" />

<sequenceFlow id="flowN2" sourceRef="PROCESSOWNER_NOTIFICATION" targetRef="PROCESSOWNER_VALIDATOR" />


Se puede observar que se indica el nombre de la secuencia del workflow, quien lo puede originar (sourceRef) y qué tarea se va a ejecutar (targetRef).

Para el siguiente workflow

https://lh7-rt.googleusercontent.com/docsz/AD_4nXdu6wnLgS87BJAsWvrmpYgq7AJRPIwBtJwVxPLkwU41W7wlwgRvn288_JnC_dr42JOBXwRrmPEr8kbSVSQwbYEsXFvHjndC3aefJPD6FN-887fVgxDJl4QinJy-DrBr2tRCSRVReXnQ2gUvnv5O_SJexXOp?key=VuGvqD0xqkUCXHbH5grjaQ


El xml generado sería el siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="DC" xmlns:xsd="http://www.w3.org/2001/XMLSchema " xmlns:yaoqiang="http://bpmn.sourceforge.net " id="_1613572957230" name="" targetNamespace="DC" exporter="Yaoqiang BPMN Editor" exporterVersion="5.3" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL http://bpmn.sourceforge.net/schemas/BPMN20.xsd">
  <process id="ADHERENCE" name="Request of adherence" processType="None" isClosed="false" isExecutable="true">
    <extensionElements>
      <yaoqiang:description />
      <yaoqiang:pageFormat height="841.8897637795276" imageableHeight="831.8897637795276" imageableWidth="588.1102362204724" imageableX="5.0" imageableY="5.0" orientation="0" width="598.1102362204724" />
      <yaoqiang:page background="#FFFFFF" horizontalCount="1" verticalCount="1" />
    </extensionElements>
    <startEvent id="Event_Start" name="Start">
      <outgoing>flow1</outgoing>
      <outputSet />
    </startEvent>
    <serviceTask id="DATA_OWNER_NOTIFICATION" name="Owner notification" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.SentNotificationJavaDelegate">
      <extensionElements>
        <activiti:field name="notificationCode" stringValue="20" />
      </extensionElements>
      <incoming>flow1</incoming>
      <outgoing>flow2</outgoing>
    </serviceTask>
    <userTask id="DATA_OWNER_VALIDATOR" name="Data owner validation" implementation="##unspecified">
      <extensionElements>
        <activiti:field name="validatorRole" stringValue="data_owner" />
      </extensionElements>
      <incoming>flow2</incoming>
      <outgoing>Flow3_OK</outgoing>
      <outgoing>Flow3_KO</outgoing>
      <multiInstanceLoopCharacteristics activiti:collection="MODULE_ORGANIZATIONAL_UNIT">
        <completionCondition xsi:type="tFormalExpression">${ACCEPTED != 'true'}</completionCondition>
      </multiInstanceLoopCharacteristics>
    </userTask>
    <serviceTask id="END_KO_NOTIFICATION" name="Event KO notification" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.SentNotificationJavaDelegate">
      <extensionElements>
        <activiti:field name="notificationCode" stringValue="11" />
      </extensionElements>
      <incoming>CANCEL</incoming>
      <outgoing>Flow_065hvgf</outgoing>
    </serviceTask>
    <serviceTask id="FINAL_EXEC" name="End" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.LastExecutionJavaDelegate">
      <incoming>Flow3_OK</incoming>
      <outgoing>Flow_1uee4uh</outgoing>
    </serviceTask>
    <serviceTask id="FINAL_REJECT_EXEC" name="Reject" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.LastExecutionJavaDelegate">
      <incoming>Flow3_KO</incoming>
      <outgoing>KO</outgoing>
    </serviceTask>
    <serviceTask id="CANCEL_EXEC" name="Cancel" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.CancelTaskWorkflowDelegate">
      <incoming>KO</incoming>
      <outgoing>CANCEL</outgoing>
    </serviceTask>
    <endEvent id="Event_End" name="End">
      <incoming>Flow_065hvgf</incoming>
      <incoming>Flow_03tyub3</incoming>
      <inputSet />
    </endEvent>
    <sequenceFlow id="flow1" sourceRef="Event_Start" targetRef="DATA_OWNER_NOTIFICATION" />
    <sequenceFlow id="flow2" sourceRef="DATA_OWNER_NOTIFICATION" targetRef="DATA_OWNER_VALIDATOR" />
    <sequenceFlow id="Flow3_OK" sourceRef="DATA_OWNER_VALIDATOR" targetRef="FINAL_EXEC">
      <conditionExpression xsi:type="tFormalExpression">${ACCEPTED == 'true'}</conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="Flow3_KO" sourceRef="DATA_OWNER_VALIDATOR" targetRef="FINAL_REJECT_EXEC">
      <conditionExpression xsi:type="tFormalExpression">${ACCEPTED == 'false'}</conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="KO" sourceRef="FINAL_REJECT_EXEC" targetRef="CANCEL_EXEC" />
    <sequenceFlow id="CANCEL" sourceRef="CANCEL_EXEC" targetRef="END_KO_NOTIFICATION" />
    <sequenceFlow id="Flow_1uee4uh" sourceRef="FINAL_EXEC" targetRef="END_OK_NOTIFICATION" />
    <sequenceFlow id="Flow_065hvgf" sourceRef="END_KO_NOTIFICATION" targetRef="Event_End" />
    <serviceTask id="END_OK_NOTIFICATION" name="Event OK notification" activiti:class="com.anjana.hermes.functionalities.SentNotificationJavaDelegate">
      <extensionElements>
        <activiti:field name="notificationCode" stringValue="10" />
      </extensionElements>
      <incoming>Flow_1uee4uh</incoming>
      <outgoing>Flow_03tyub3</outgoing>
    </serviceTask>
    <sequenceFlow id="Flow_03tyub3" sourceRef="END_OK_NOTIFICATION" targetRef="Event_End" />
  </process>
  <bpmndi:BPMNDiagram id="Yaoqiang_Diagram-ADHERENCE_-_ARCHITECT" name="Untitled Diagram" resolution="96">
    <bpmndi:BPMNPlane bpmnElement="ADHERENCE">
      <bpmndi:BPMNEdge id="Yaoqiang-CANCEL" bpmnElement="CANCEL">
        <di:waypoint x="742" y="264" />
        <di:waypoint x="817" y="264" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="906.33" y="253.58" width="6" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Yaoqiang-KO" bpmnElement="KO">
        <di:waypoint x="589" y="264" />
        <di:waypoint x="657" y="264" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="761.32" y="253.58" width="6" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Yaoqiang-Flow3_KO" bpmnElement="Flow3_KO">
        <di:waypoint x="342" y="217" />
        <di:waypoint x="423" y="217" />
        <di:waypoint x="423" y="280" />
        <di:waypoint x="504" y="280" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="414.5" y="230.08" width="119" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Yaoqiang-Flow3_OK" bpmnElement="Flow3_OK">
        <di:waypoint x="342" y="217" />
        <di:waypoint x="423" y="217" />
        <di:waypoint x="423" y="160" />
        <di:waypoint x="504" y="160" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="417" y="182.08" width="114" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Yaoqiang-flow2" bpmnElement="flow2">
        <di:waypoint x="197.32352941176464" y="216" />
        <di:waypoint x="257.32352941176464" y="216" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="224.32" y="206.08" width="6" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Yaoqiang-flow1" bpmnElement="flow1">
        <di:waypoint x="52.32285357569175" y="216" />
        <di:waypoint x="112.32352941176464" y="216" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="79.32" y="206.08" width="6" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_1uee4uh_di" bpmnElement="Flow_1uee4uh">
        <di:waypoint x="589" y="160" />
        <di:waypoint x="820" y="160" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_065hvgf_di" bpmnElement="Flow_065hvgf">
        <di:waypoint x="902" y="264" />
        <di:waypoint x="950" y="264" />
        <di:waypoint x="950" y="217" />
        <di:waypoint x="1004" y="217" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_03tyub3_di" bpmnElement="Flow_03tyub3">
        <di:waypoint x="920" y="180" />
        <di:waypoint x="952" y="180" />
        <di:waypoint x="952" y="217" />
        <di:waypoint x="1004" y="217" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="Yaoqiang-Event_Start" bpmnElement="Event_Start">
        <dc:Bounds x="20" y="200" width="32" height="32" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="21.5" y="240.08" width="29" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Yaoqiang-DATA_OWNER_NOTIFICATION" bpmnElement="DATA_OWNER_NOTIFICATION">
        <dc:Bounds x="112" y="188.5" width="85" height="55" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="125.5" y="200.58" width="58" height="34.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Yaoqiang-DATA_OWNER_VALIDATOR" bpmnElement="DATA_OWNER_VALIDATOR">
        <dc:Bounds x="257" y="188.5" width="85" height="55" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="268" y="200.58" width="63" height="34.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Yaoqiang-FINAL_REJECT_EXEC" bpmnElement="FINAL_REJECT_EXEC">
        <dc:Bounds x="504" y="236" width="85" height="55" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="673.5" y="255.58" width="36" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Yaoqiang-CANCEL_EXEC" bpmnElement="CANCEL_EXEC">
        <dc:Bounds x="657" y="236" width="85" height="55" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="817" y="255.58" width="39" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Yaoqiang-FINAL_EXEC" bpmnElement="FINAL_EXEC">
        <dc:Bounds x="504" y="132" width="85" height="55" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="679.5" y="160.58" width="24" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Yaoqiang-END_OK_NOTIFICATION" bpmnElement="END_KO_NOTIFICATION">
        <dc:Bounds x="817" y="236" width="85" height="55" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="517.5" y="153.08" width="58" height="34.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_082ilpu_di" bpmnElement="END_OK_NOTIFICATION">
        <dc:Bounds x="820" y="140" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Yaoqiang-Event_End_KO" bpmnElement="Event_End">
        <dc:Bounds x="1004" y="201" width="32" height="32" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="1010" y="240" width="20" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>


Elementos del XML


  • Secuencia y tareas. Se pueden identificar los siguientes elementos en xml:

    • Tareas que se ejecutan de forma automática por el sistema, identificadas dentro del xml con las etiquetas serviceTask.

    • Tareas que se ejecutan mediante la interacción humana. Estas tareas están representadas dentro de las etiquetas userTask.

    • Definición de secuencias de ejecución, identificadas con las etiquetas sequenceFlow.

<process id="ADHERENCE" name="Request of adherence" processType="None" isClosed="false" isExecutable="true">
    <extensionElements>
      <yaoqiang:description />
      <yaoqiang:pageFormat height="841.8897637795276" imageableHeight="831.8897637795276" imageableWidth="588.1102362204724" imageableX="5.0" imageableY="5.0" orientation="0" width="598.1102362204724" />
      <yaoqiang:page background="#FFFFFF" horizontalCount="1" verticalCount="1" />
    </extensionElements>
    <startEvent id="Event_Start" name="Start">
      <outgoing>flow1</outgoing>
      <outputSet />
    </startEvent>
    <serviceTask id="DATA_OWNER_NOTIFICATION" name="Owner notification" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.SentNotificationJavaDelegate">
      <extensionElements>
        <activiti:field name="notificationCode" stringValue="20" />
      </extensionElements>
      <incoming>flow1</incoming>
      <outgoing>flow2</outgoing>
    </serviceTask>
    <userTask id="DATA_OWNER_VALIDATOR" name="Data owner validation" implementation="##unspecified">
      <extensionElements>
        <activiti:field name="validatorRole" stringValue="data_owner" />
      </extensionElements>
      <incoming>flow2</incoming>
      <outgoing>Flow3_OK</outgoing>
      <outgoing>Flow3_KO</outgoing>
      <multiInstanceLoopCharacteristics activiti:collection="MODULE_ORGANIZATIONAL_UNIT">
        <completionCondition xsi:type="tFormalExpression">${ACCEPTED != 'true'}</completionCondition>
      </multiInstanceLoopCharacteristics>
    </userTask>
    <serviceTask id="END_KO_NOTIFICATION" name="Event KO notification" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.SentNotificationJavaDelegate">
      <extensionElements>
        <activiti:field name="notificationCode" stringValue="11" />
      </extensionElements>
      <incoming>CANCEL</incoming>
      <outgoing>Flow_065hvgf</outgoing>
    </serviceTask>
    <serviceTask id="FINAL_EXEC" name="End" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.LastExecutionJavaDelegate">
      <incoming>Flow3_OK</incoming>
      <outgoing>Flow_1uee4uh</outgoing>
    </serviceTask>
    <serviceTask id="FINAL_REJECT_EXEC" name="Reject" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.LastExecutionJavaDelegate">
      <incoming>Flow3_KO</incoming>
      <outgoing>KO</outgoing>
    </serviceTask>
    <serviceTask id="CANCEL_EXEC" name="Cancel" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.CancelTaskWorkflowDelegate">
      <incoming>KO</incoming>
      <outgoing>CANCEL</outgoing>
    </serviceTask>
    <endEvent id="Event_End" name="End">
      <incoming>Flow_065hvgf</incoming>
      <incoming>Flow_03tyub3</incoming>
      <inputSet />
    </endEvent>
    <sequenceFlow id="flow1" sourceRef="Event_Start" targetRef="DATA_OWNER_NOTIFICATION" />
    <sequenceFlow id="flow2" sourceRef="DATA_OWNER_NOTIFICATION" targetRef="DATA_OWNER_VALIDATOR" />
    <sequenceFlow id="Flow3_OK" sourceRef="DATA_OWNER_VALIDATOR" targetRef="FINAL_EXEC">
      <conditionExpression xsi:type="tFormalExpression">${ACCEPTED == 'true'}</conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="Flow3_KO" sourceRef="DATA_OWNER_VALIDATOR" targetRef="FINAL_REJECT_EXEC">
      <conditionExpression xsi:type="tFormalExpression">${ACCEPTED == 'false'}</conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="KO" sourceRef="FINAL_REJECT_EXEC" targetRef="CANCEL_EXEC" />
    <sequenceFlow id="CANCEL" sourceRef="CANCEL_EXEC" targetRef="END_KO_NOTIFICATION" />
    <sequenceFlow id="Flow_1uee4uh" sourceRef="FINAL_EXEC" targetRef="END_OK_NOTIFICATION" />
    <sequenceFlow id="Flow_065hvgf" sourceRef="END_KO_NOTIFICATION" targetRef="Event_End" />
    <serviceTask id="END_OK_NOTIFICATION" name="Event OK notification" activiti:class="com.anjana.hermes.functionalities.SentNotificationJavaDelegate">
      <extensionElements>
        <activiti:field name="notificationCode" stringValue="10" />
      </extensionElements>
      <incoming>Flow_1uee4uh</incoming>
      <outgoing>Flow_03tyub3</outgoing>
    </serviceTask>
    <sequenceFlow id="Flow_03tyub3" sourceRef="END_OK_NOTIFICATION" targetRef="Event_End" />
  </process>

  

Entre las distintas tareas que se pueden definir en este momento hay implementadas las siguientes:


  • CancelTaskWorkflowDelegate. Esta tarea cancela el workflow indicado.

  • LastExecutionJavaDelegate. Llama al endpoint que se encarga de realizar la última ejecución del workflow dependiendo del objeto y tipo de objeto afectado.

  • SentNotificationJavaDelegate. Esta tarea se encarga de enviar notificaciones según la tarea de la que se trata y el estado de la misma.


Otra características de estas tareas es que se indica que secuencia del workflow es la que lo activa y cual es la siguiente secuencia a ejecutar. Esto se indica con las etiquetas incoming y outcoming.

<serviceTask id="FINAL_EXEC" name="End" implementation="##WebService" activiti:class="com.anjana.hermes.functionalities.LastExecutionJavaDelegate">
      <incoming>Flow3_OK</incoming>
      <outgoing>Flow_1uee4uh</outgoing>
</serviceTask>


En la definición  de las secuencias del workflow se puede especificar una condición que cuando sea verdadera se ejecutará esa secuencia. Esta característica junto con la anterior de las tareas donde se especifica el siguiente paso a ejecutar nos permitirá poder definir las bifurcaciones dentro del workflow.


<sequenceFlow id="Flow3_OK" sourceRef="DATA_OWNER_VALIDATOR" targetRef="FINAL_EXEC">
      <conditionExpression xsi:type="tFormalExpression">${ACCEPTED == 'true'}</conditionExpression>
</sequenceFlow>


Las tareas de usuario se utilizan para poder tener la validación previa de una determinada tarea automática si así fuera necesario. Los elementos de esta tarea son los siguientes:


https://lh7-rt.googleusercontent.com/docsz/AD_4nXdHOU71tT1HhD3cf7jPLKd2hrL7fmYb0ZyLSVsbALzY-DpzdNkvS4MLiRm_4fyPDjNqCQxNrwXQf8Me9w49MxxfAHh6IIv8_04KPlN54jiSNnCZMjipuMP8W29HkUUGyHGQqzXpiMFzUAyqSCkMK1f3muA0?key=VuGvqD0xqkUCXHbH5grjaQ


  • activity:field name=”validatorRole”. Indica el role de quien tiene que realizar la validación.

  • incoming. Indica la secuencia del workflow que origina esta tarea.

  • outgoing. Indica que secuencia del workflow se generará según la respuesta dada. En el ejemplo definimos dos posibilidades que se corresponden con una validación correcta o incorrecta.

  • completionCondition. Condición que se tiene que cumplir para considerar la tarea como finalizada.


La forma de orquestar las distintas tareas, tanto automáticas como no automáticas se realiza mediante las secuencias del workflow explicada más arriba.

  • Definición de estructura gráfica. Recordamos que esta definición se establece abriendo y guardando el xml mediante la aplicación Yaoqiang BPMN Editor.

<bpmndi:BPMNDiagram id="Yaoqiang_Diagram-ADHERENCE_-_ARCHITECT" name="Untitled Diagram" resolution="96">
    <bpmndi:BPMNPlane bpmnElement="ADHERENCE">
      <bpmndi:BPMNEdge id="Yaoqiang-CANCEL" bpmnElement="CANCEL">
        <di:waypoint x="742" y="264" />
        <di:waypoint x="817" y="264" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="906.33" y="253.58" width="6" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Yaoqiang-KO" bpmnElement="KO">
        <di:waypoint x="589" y="264" />
        <di:waypoint x="657" y="264" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="761.32" y="253.58" width="6" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Yaoqiang-Flow3_KO" bpmnElement="Flow3_KO">
        <di:waypoint x="342" y="217" />
        <di:waypoint x="423" y="217" />
        <di:waypoint x="423" y="280" />
        <di:waypoint x="504" y="280" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="414.5" y="230.08" width="119" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Yaoqiang-Flow3_OK" bpmnElement="Flow3_OK">
        <di:waypoint x="342" y="217" />
        <di:waypoint x="423" y="217" />
        <di:waypoint x="423" y="160" />
        <di:waypoint x="504" y="160" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="417" y="182.08" width="114" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Yaoqiang-flow2" bpmnElement="flow2">
        <di:waypoint x="197.32352941176464" y="216" />
        <di:waypoint x="257.32352941176464" y="216" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="224.32" y="206.08" width="6" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Yaoqiang-flow1" bpmnElement="flow1">
        <di:waypoint x="52.32285357569175" y="216" />
        <di:waypoint x="112.32352941176464" y="216" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="79.32" y="206.08" width="6" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_1uee4uh_di" bpmnElement="Flow_1uee4uh">
        <di:waypoint x="589" y="160" />
        <di:waypoint x="820" y="160" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_065hvgf_di" bpmnElement="Flow_065hvgf">
        <di:waypoint x="902" y="264" />
        <di:waypoint x="950" y="264" />
        <di:waypoint x="950" y="217" />
        <di:waypoint x="1004" y="217" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_03tyub3_di" bpmnElement="Flow_03tyub3">
        <di:waypoint x="920" y="180" />
        <di:waypoint x="952" y="180" />
        <di:waypoint x="952" y="217" />
        <di:waypoint x="1004" y="217" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="Yaoqiang-Event_Start" bpmnElement="Event_Start">
        <dc:Bounds x="20" y="200" width="32" height="32" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="21.5" y="240.08" width="29" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Yaoqiang-DATA_OWNER_NOTIFICATION" bpmnElement="DATA_OWNER_NOTIFICATION">
        <dc:Bounds x="112" y="188.5" width="85" height="55" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="125.5" y="200.58" width="58" height="34.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Yaoqiang-DATA_OWNER_VALIDATOR" bpmnElement="DATA_OWNER_VALIDATOR">
        <dc:Bounds x="257" y="188.5" width="85" height="55" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="268" y="200.58" width="63" height="34.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Yaoqiang-FINAL_REJECT_EXEC" bpmnElement="FINAL_REJECT_EXEC">
        <dc:Bounds x="504" y="236" width="85" height="55" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="673.5" y="255.58" width="36" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Yaoqiang-CANCEL_EXEC" bpmnElement="CANCEL_EXEC">
        <dc:Bounds x="657" y="236" width="85" height="55" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="817" y="255.58" width="39" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Yaoqiang-FINAL_EXEC" bpmnElement="FINAL_EXEC">
        <dc:Bounds x="504" y="132" width="85" height="55" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="679.5" y="160.58" width="24" height="19.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Yaoqiang-END_OK_NOTIFICATION" bpmnElement="END_KO_NOTIFICATION">
        <dc:Bounds x="817" y="236" width="85" height="55" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="517.5" y="153.08" width="58" height="34.84" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_082ilpu_di" bpmnElement="END_OK_NOTIFICATION">
        <dc:Bounds x="820" y="140" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Yaoqiang-Event_End_KO" bpmnElement="Event_End">
        <dc:Bounds x="1004" y="201" width="32" height="32" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="1010" y="240" width="20" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>