天天看點

基于ProcessMaker\Nayra引擎的工作流開發之(一)工作原理

在談工作流開發之前,請先了解下BPMN規範,BPMN規範定義了用圖元如何定義一個業務流程圖。BPMN的主要目标就是要提供被所有業務使用者了解的一套标記語言,包括業務分析者、軟體開發者以及業務管理者與監察者。

下面是一個請假流程的基于BPMN的業務流程圖

基于ProcessMaker\Nayra引擎的工作流開發之(一)工作原理

一個最簡單的流程也要至少包括 啟動事件 ,任務,結束事件 ,順序流,網關(可以沒有)。轉化為BPMN标記語言如下

<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" 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:pm="http://processmaker.com/BPMN/2.0/Schema.xsd" xmlns:tns="http://sourceforge.net/bpmn/definitions/_1530553328908" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://bpmn.io/schema/bpmn" exporter="ProcessMaker Modeler" exporterVersion="1.0" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL http://bpmn.sourceforge.net/schemas/BPMN20.xsd">
  <bpmn:process id="ProcessId" name="ProcessName" isExecutable="true">
    <bpmn:startEvent id="node_1" name="送出申請">
      <bpmn:outgoing>node_9</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:endEvent id="node_2" name="結束">
      <bpmn:incoming>node_18</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:task id="node_3" name="人事審批" pm:assignment="requester">
      <bpmn:incoming>node_14</bpmn:incoming>
      <bpmn:outgoing>node_19</bpmn:outgoing>
    </bpmn:task>
    <bpmn:task id="node_4" name="部門上司審批" pm:assignment="requester">
      <bpmn:incoming>node_16</bpmn:incoming>
      <bpmn:outgoing>node_21</bpmn:outgoing>
    </bpmn:task>
    <bpmn:parallelGateway id="node_5" name="" gatewayDirection="Diverging">
      <bpmn:incoming>node_12</bpmn:incoming>
      <bpmn:outgoing>node_14</bpmn:outgoing>
      <bpmn:outgoing>node_16</bpmn:outgoing>
    </bpmn:parallelGateway>
    <bpmn:task id="node_6" name="直屬上司審批" pm:assignment="requester">
      <bpmn:incoming>node_9</bpmn:incoming>
      <bpmn:outgoing>node_12</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="node_9" name="New Sequence Flow" sourceRef="node_1" targetRef="node_6" pm:startEvent="" />
    <bpmn:sequenceFlow id="node_12" name="New Sequence Flow" sourceRef="node_6" targetRef="node_5" pm:startEvent="" />
    <bpmn:sequenceFlow id="node_14" name="New Sequence Flow" sourceRef="node_5" targetRef="node_3" pm:startEvent="" />
    <bpmn:sequenceFlow id="node_16" name="New Sequence Flow" sourceRef="node_5" targetRef="node_4" pm:startEvent="" />
    <bpmn:task id="node_17" name="行政歸檔" pm:assignment="requester">
      <bpmn:incoming>node_19</bpmn:incoming>
      <bpmn:incoming>node_21</bpmn:incoming>
      <bpmn:outgoing>node_18</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="node_18" name="New Sequence Flow" sourceRef="node_17" targetRef="node_2" pm:startEvent="" />
    <bpmn:sequenceFlow id="node_19" name="New Sequence Flow" sourceRef="node_3" targetRef="node_17" pm:startEvent="" />
    <bpmn:sequenceFlow id="node_21" name="New Sequence Flow" sourceRef="node_4" targetRef="node_17" pm:startEvent="" />
  </bpmn:process>
  <bpmndi:BPMNDiagram id="BPMNDiagramId">
    <bpmndi:BPMNPlane id="BPMNPlaneId" bpmnElement="ProcessId">
      <bpmndi:BPMNShape id="node_1_di" bpmnElement="node_1">
        <dc:Bounds x="0" y="250" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="node_2_di" bpmnElement="node_2">
        <dc:Bounds x="840" y="250" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="node_3_di" bpmnElement="node_3">
        <dc:Bounds x="430" y="140" width="116" height="76" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="node_4_di" bpmnElement="node_4">
        <dc:Bounds x="430" y="310" width="116" height="76" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="node_5_di" bpmnElement="node_5">
        <dc:Bounds x="330" y="250" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="node_6_di" bpmnElement="node_6">
        <dc:Bounds x="110" y="230" width="116" height="76" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="node_9_di" bpmnElement="node_9">
        <di:waypoint x="18" y="268" />
        <di:waypoint x="168.5" y="268" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="node_12_di" bpmnElement="node_12">
        <di:waypoint x="168" y="268" />
        <di:waypoint x="348" y="268" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="node_14_di" bpmnElement="node_14">
        <di:waypoint x="348" y="268" />
        <di:waypoint x="400" y="178.5" />
        <di:waypoint x="488.5" y="178.5" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="node_16_di" bpmnElement="node_16">
        <di:waypoint x="348" y="268" />
        <di:waypoint x="348" y="348.5" />
        <di:waypoint x="488.5" y="348.5" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="node_17_di" bpmnElement="node_17">
        <dc:Bounds x="630" y="230" width="116" height="76" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="node_18_di" bpmnElement="node_18">
        <di:waypoint x="688" y="268" />
        <di:waypoint x="858" y="268" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="node_19_di" bpmnElement="node_19">
        <di:waypoint x="488" y="178" />
        <di:waypoint x="688.5" y="268.5" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="node_21_di" bpmnElement="node_21">
        <di:waypoint x="488" y="348" />
        <di:waypoint x="688.5" y="268.5" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>
           

如果想要詳細了解BPMN這塊内容,推薦大家一個文章:http://www.mossle.com/docs/jbpm4devguide/html/bpmn2.html

ProcessMaker\Nayra是php的開源擴充程式,是執行BPMN檔案實作工作流業務流轉的引擎程式,使用composer可以簡單友善的加載到自己的程式裡,執行如下指令即可

composer require processmaker/nayra
           

源碼位址為:https://github.com/ProcessMaker/nayra,大家可以去看下幫助文檔。

開發工作流軟體的業務邏輯如下圖所示:

基于ProcessMaker\Nayra引擎的工作流開發之(一)工作原理

1.管理者編輯流程圖:管理者使用支援BPMN規範的編輯軟體編輯流程圖,定義好流程執行中每一步的流轉順序和規則,确定每一步執行任務的人員或組織,編輯使用者申請時需要填寫的表單。

2.使用者申請流程:使用者填好指定表單,觸發啟動事件,程式開始流轉至下一步執行人。

3.流程流轉:流程按照流程圖所規定的順序和規則,傳遞給指定人員執行,該人員執行完後流轉至下一人員。

4.完成需求:流程流轉時觸發結束事件,流程結束,使用者的申請完成。

了解完一般工作流的業務需求後,那麼在技術上該怎麼實作呢?

如下圖所示:

基于ProcessMaker\Nayra引擎的工作流開發之(一)工作原理

1.編輯流程圖:将編寫的BPMN檔案及所有節點的屬性寫入到資料庫中,将對應表單寫入到資料庫中。

2.啟動流程:使用者填寫對應表單後,用ProcessMaker\Nayra引擎觸發BPMN流程的啟動事件,通過引擎獲得下一步流轉的任務,持久化這一步任務及使用者資料到資料庫中。

3.流程流轉:當指定人員完成目前任務,擷取之前持久化的資料,通過這些資料告知引擎程式已經流轉的過程,引擎自動流轉至下一步任務,繼續寫入到資料庫中,等待下一步使用者繼續執行此步過程。

4.結束流程:引擎會自動判斷程式是否流轉到了結束事件,自動觸發結束事件方法,流程執行完畢。

我們可以發現最關鍵一步就是如果調用引擎觸發啟動事件,任務流轉,結束事件,以及如何擷取要持久化的資料,我們會在下一節https://blog.csdn.net/u011115903/article/details/100770049詳細介紹給大家。