天天看点

基于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详细介绍给大家。