在日常项目开发中,我们经常会用到各种审批工作流,比如K2工作流,但是K2基于.net平台,对Java系列框架支撑受限,且不开源要付费,另外,K2暴露出来的问题也日益明显,比如单据出错率高,不易维护。因此,选择合适的审批流引擎无疑可以提升开发效率,降低开发成本,Activiti应运而生。Activiti是一个业务流程管理(BPM)和开源工作流系统,适用于开发人员和系统管理员。其核心是超快速,稳定的BPMN2流程引擎。它易于与 Spring集成使用,基于BPMN2, 但又相对于JBPM易于使用,以及原生支持Spring,与Spring boot集成较好,本文抛砖引玉,浅谈Activiti核心接口以及相关表。
Activiti七大接口
Activiti的主要分为七大类接口,如下图所示:
- RepositoryService:提供一系列管理流程部署和流程定义的API。
- RuntimeService:在流程运行时对流程实例进行管理与控制。
- TaskService:对流程任务进行管理,例如任务提醒、任务完成和创建任务等。
- IdentityService:提供对流程角色数据进行管理的API,这些角色数据包括用户组、用户及它们之间的关系。
- ManagementService:提供对流程引擎进行管理和维护的服务。
- HistoryService:对流程的历史数据进行操作,包括查询、删除这些历史数据。
- FormService:表单服务。
Activiti相关表
Activiti总共涉及20多个表,比如,流程部署表(act_re_deployment ),流程定义表(act_re_procdef ),资源文件表(act_ge_bytearray ),系统配置表(act_ge_property),流程实例运行时执行对象表(act_ru_execution )流程实例运行时身份联系表(act_ru_identitylink),流程实例运行时用户任务表(act_ru_task ),活动节点历史表(act_hi_actinst ),身份联系表历史(act_hi_identitylink ),流程实例表历史(act_hi_procinst ),历史任务表(act_hi_taskinst),如下图所示:
- Fact_ge_ 通用数据表,ge是general的缩写。
- act_hi_ 历史数据表,hi是history的缩写,对应HistoryService接口。
- act_id_ 身份数据表,id是identity的缩写,对应IdentityService接口。
- act_re_ 流程存储表,re是repository的缩写,对应RepositoryService接口,存储流程部署和流程定义等静态数据。
- ct_ru_ 运行时数据表,ru是runtime的缩写,对应RuntimeService接口和TaskService接口,存储流程实例和用户任务等动态数据。
Activiti designer
Activiti的易用性有一点是体现在有强大的流程设计器,可以部署到tomcat上,在线编辑,支持顺序,分支网关以及条件等,设计器如下图所示::
当然除了通过设计器以外,我们也可以通过编辑XML方式来进行简单的流程设计,因为设计完成的流程图本身就是以XML的形式存在的,便于部署。
流程对应的XML文件如下:
<?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="ChangeCompanyProcess" name="ChangeCompanyProcess" isExecutable="true">
<documentation>新公司变更流程</documentation>
<startEvent id="start"></startEvent>
<userTask id="hrDept" name="人力资源部">
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="secondHrOwners" activiti:elementVariable="secondHrOwner">
<completionCondition>${nrOfCompletedInstances == 1}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<userTask id="businessGm" name="业务GM">
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="businessGmOwners" activiti:elementVariable="businessGmOwner">
<completionCondition>${nrOfCompletedInstances == 1}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<exclusiveGateway id="sid-EA364D7B-3E99-4689-B5D5-D1EE9A621BE8"></exclusiveGateway>
<userTask id="firstTrusteeOffice" name="一级董办">
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="firstTrusteeOwners" activiti:elementVariable="firstTrusteeOwner">
<completionCondition>${nrOfCompletedInstances == 1}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<userTask id="firstAdminDept" name="一级行政部">
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="firstAdminOwners" activiti:elementVariable="firstAdminOwner">
<completionCondition>${nrOfCompletedInstances == 1}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<userTask id="firstTaxDept" name="一级税务管理">
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="firstTaxOwners" activiti:elementVariable="firstTaxOwner">
<completionCondition>${nrOfCompletedInstances == 1}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<sequenceFlow id="sid-2D38FD88-0B5E-4D81-8F38-215851CEB585" sourceRef="firstAdminDept" targetRef="firstTaxDept"></sequenceFlow>
<sequenceFlow id="sid-10F4BA21-3291-4F16-9C81-C68F152054EE" sourceRef="firstTrusteeOffice" targetRef="firstTaxDept"></sequenceFlow>
<userTask id="businessEvp" name="业务EVP">
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="businessEvpOwners" activiti:elementVariable="businessEvpOwner">
<completionCondition>${nrOfCompletedInstances == 1}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<userTask id="functionalEvp" name="职能EVP">
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="functionalEvpOwners" activiti:elementVariable="functionalEvpOwner">
<completionCondition>${nrOfCompletedInstances == nrOfInstances}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<exclusiveGateway id="sid-02ECFDB6-6AE4-4D1B-ADE2-1D444A2C9060"></exclusiveGateway>
<sequenceFlow id="sid-855104D5-A104-4DF4-96CD-3AFAF467B715" sourceRef="functionalEvp" targetRef="sid-02ECFDB6-6AE4-4D1B-ADE2-1D444A2C9060"></sequenceFlow>
<userTask id="martin" name="Martin">
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="martionOwners" activiti:elementVariable="martinOwner">
<completionCondition>${nrOfCompletedInstances == 1}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<userTask id="secondAdminDept" name="二级行政部">
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="secondAdminOwners" activiti:elementVariable="secondAdminOwner">
<completionCondition>${nrOfCompletedInstances == 1}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<endEvent id="end" name="end"></endEvent>
<sequenceFlow id="sid-784DBBAA-4931-484A-9AAF-920AF1322F6F" name="境外主体" sourceRef="sid-EA364D7B-3E99-4689-B5D5-D1EE9A621BE8" targetRef="firstTrusteeOffice">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${domesticFlag=='N'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-29763544-90B1-43EE-A372-F31D4A2ECDBD" name="境外主体" sourceRef="sid-02ECFDB6-6AE4-4D1B-ADE2-1D444A2C9060" targetRef="martin">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${domesticFlag=='N'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-C5EB4E3C-D402-4529-8205-1B45111554BB" sourceRef="start" targetRef="hrDept"></sequenceFlow>
<userTask id="bgFinanceManageGm" name="BG财管GM">
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="bgFinanceOwners" activiti:elementVariable="bgFinanceOwner">
<completionCondition>${nrOfCompletedInstances == 1}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<userTask id="castFinanceManageGm" name="投前投后财管GM">
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="castFinanceOwners" activiti:elementVariable="castFinanceOwner">
<completionCondition>${nrOfCompletedInstances == 1}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<exclusiveGateway id="sid-DBC30CE6-6C18-4DB6-800B-4CF4B55B6197"></exclusiveGateway>
<sequenceFlow id="sid-B950F9F2-EB64-437D-9AE3-A1CC60597A04" sourceRef="hrDept" targetRef="sid-DBC30CE6-6C18-4DB6-800B-4CF4B55B6197"></sequenceFlow>
<exclusiveGateway id="sid-1E9083BB-5730-4D97-99A1-6921BDA63A36"></exclusiveGateway>
<sequenceFlow id="sid-387709CC-6BDA-4B74-9432-EA18BA0A9D6D" sourceRef="castFinanceManageGm" targetRef="sid-EA364D7B-3E99-4689-B5D5-D1EE9A621BE8"></sequenceFlow>
<sequenceFlow id="sid-04A3DF55-2A00-4929-8F61-1D6D41C3AE8C" sourceRef="bgFinanceManageGm" targetRef="sid-EA364D7B-3E99-4689-B5D5-D1EE9A621BE8"></sequenceFlow>
<sequenceFlow id="sid-9FAB1E75-2BB4-4604-86DF-036B0127BC94" sourceRef="businessGm" targetRef="sid-EA364D7B-3E99-4689-B5D5-D1EE9A621BE8"></sequenceFlow>
<userTask id="secondTrusteeOffice" name="二级董办">
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="secondTrusteeOwners" activiti:elementVariable="secondTrusteeOwner">
<completionCondition>${nrOfCompletedInstances == 1}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<sequenceFlow id="sid-4CD9D996-B467-4C8C-8CD3-1694EBFC4767" sourceRef="martin" targetRef="secondTrusteeOffice"></sequenceFlow>
<sequenceFlow id="sid-D8F0E313-0753-439A-97E4-6032C9694F50" name="监事" sourceRef="sid-DBC30CE6-6C18-4DB6-800B-4CF4B55B6197" targetRef="sid-1E9083BB-5730-4D97-99A1-6921BDA63A36">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${supervisorFlag == 'Y'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-7B8238C2-41F3-48C9-818D-800DA6AA9F12" name="非监事" sourceRef="sid-DBC30CE6-6C18-4DB6-800B-4CF4B55B6197" targetRef="businessGm">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${supervisorFlag == 'N'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-48BCE65D-10CC-435F-8979-0CB461CE6F3F" name="境内主体" sourceRef="sid-EA364D7B-3E99-4689-B5D5-D1EE9A621BE8" targetRef="firstAdminDept">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${domesticFlag=='Y'}]]></conditionExpression>
</sequenceFlow>
<exclusiveGateway id="sid-D3C1E6D8-87D4-4049-B290-061FA68E716C"></exclusiveGateway>
<sequenceFlow id="sid-DE9EA774-91AF-4961-9D63-287B7939336C" sourceRef="firstTaxDept" targetRef="sid-D3C1E6D8-87D4-4049-B290-061FA68E716C"></sequenceFlow>
<sequenceFlow id="sid-6A38C9FD-24B1-437B-9163-50CB4AB8F9FE" name="经营主体" sourceRef="sid-1E9083BB-5730-4D97-99A1-6921BDA63A36" targetRef="bgFinanceManageGm">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${manageSubjectFlag=='Y'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-085ADDFE-C1C7-4266-BDCB-E5C9015A55DA" name="投资主体" sourceRef="sid-1E9083BB-5730-4D97-99A1-6921BDA63A36" targetRef="castFinanceManageGm">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${manageSubjectFlag=='N'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-C671709C-BE63-41B0-B654-CC5A23161AC9" name="经营主体" sourceRef="sid-D3C1E6D8-87D4-4049-B290-061FA68E716C" targetRef="businessEvp">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${manageSubjectFlag=='Y'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-6A296410-7725-4DF9-BB54-F2A6AF7AFF71" name="投资主体" sourceRef="sid-D3C1E6D8-87D4-4049-B290-061FA68E716C" targetRef="functionalEvp">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${manageSubjectFlag=='N'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-714C1FDD-246B-484C-9BBB-AC32E24331D7" sourceRef="businessEvp" targetRef="functionalEvp"></sequenceFlow>
<userTask id="secondTaxDept" name="二级税务">
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="secondTaxDeptOwners" activiti:elementVariable="secondTaxDeptOwner">
<completionCondition>${nrOfCompletedInstances == 1}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<sequenceFlow id="sid-43A58E0D-075F-465E-90B1-3EFF802D49C7" sourceRef="secondTrusteeOffice" targetRef="secondTaxDept"></sequenceFlow>
<sequenceFlow id="sid-A6DBAAB5-BCB2-4C60-9B54-F287024102FF" sourceRef="secondAdminDept" targetRef="secondTaxDept"></sequenceFlow>
<sequenceFlow id="sid-02BF6A3A-1B06-4E0F-BB8D-0EA436288836" sourceRef="secondTaxDept" targetRef="end"></sequenceFlow>
<exclusiveGateway id="sid-0A9B27CB-B119-400E-8C1E-4C9CDE3D725E"></exclusiveGateway>
<userTask id="secondMartin" name="二级Martin">
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="secondMartinOwners" activiti:elementVariable="secondMartin">
<completionCondition>${nrOfCompletedInstances == 1}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<sequenceFlow id="sid-062EC418-488D-4977-80FF-ED81D2BED5B6" sourceRef="secondMartin" targetRef="secondAdminDept"></sequenceFlow>
<sequenceFlow id="sid-7D83C3A1-90D2-4F10-A3D5-0DE1F8CF8F6A" name="境内主体" sourceRef="sid-02ECFDB6-6AE4-4D1B-ADE2-1D444A2C9060" targetRef="sid-0A9B27CB-B119-400E-8C1E-4C9CDE3D725E">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${domesticFlag=='Y'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-C9DFC3CD-E1A6-4A8D-8FA3-AB059F2876FC" name="自然人股东(N)" sourceRef="sid-0A9B27CB-B119-400E-8C1E-4C9CDE3D725E" targetRef="secondAdminDept">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${personHolderFlag=='N'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-340CBCA9-4F34-499C-BB13-A52D0B8A35BD" name="自然人股东(Y)" sourceRef="sid-0A9B27CB-B119-400E-8C1E-4C9CDE3D725E" targetRef="secondMartin">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${personHolderFlag=='Y'}]]></conditionExpression>
</sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_ChangeCompanyProcess">
<bpmndi:BPMNPlane bpmnElement="ChangeCompanyProcess" id="BPMNPlane_ChangeCompanyProcess">
<bpmndi:BPMNShape bpmnElement="start" id="BPMNShape_start">
<omgdc:Bounds height="30.0" width="30.0" x="45.0" y="163.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="hrDept" id="BPMNShape_hrDept">
<omgdc:Bounds height="80.0" width="100.0" x="105.0" y="138.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="businessGm" id="BPMNShape_businessGm">
<omgdc:Bounds height="80.0" width="100.0" x="450.0" y="240.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-EA364D7B-3E99-4689-B5D5-D1EE9A621BE8" id="BPMNShape_sid-EA364D7B-3E99-4689-B5D5-D1EE9A621BE8">
<omgdc:Bounds height="40.0" width="40.0" x="855.0" y="158.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="firstTrusteeOffice" id="BPMNShape_firstTrusteeOffice">
<omgdc:Bounds height="80.0" width="100.0" x="970.0" y="45.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="firstAdminDept" id="BPMNShape_firstAdminDept">
<omgdc:Bounds height="80.0" width="100.0" x="970.0" y="240.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="firstTaxDept" id="BPMNShape_firstTaxDept">
<omgdc:Bounds height="80.0" width="100.0" x="1120.0" y="138.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="businessEvp" id="BPMNShape_businessEvp">
<omgdc:Bounds height="80.0" width="100.0" x="1380.0" y="30.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="functionalEvp" id="BPMNShape_functionalEvp">
<omgdc:Bounds height="80.0" width="100.0" x="1380.0" y="138.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-02ECFDB6-6AE4-4D1B-ADE2-1D444A2C9060" id="BPMNShape_sid-02ECFDB6-6AE4-4D1B-ADE2-1D444A2C9060">
<omgdc:Bounds height="40.0" width="40.0" x="1555.0" y="158.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="martin" id="BPMNShape_martin">
<omgdc:Bounds height="80.0" width="100.0" x="1660.0" y="30.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="secondAdminDept" id="BPMNShape_secondAdminDept">
<omgdc:Bounds height="80.0" width="100.0" x="1815.0" y="240.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="end" id="BPMNShape_end">
<omgdc:Bounds height="28.0" width="28.0" x="2115.0" y="266.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="bgFinanceManageGm" id="BPMNShape_bgFinanceManageGm">
<omgdc:Bounds height="80.0" width="100.0" x="450.0" y="45.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="castFinanceManageGm" id="BPMNShape_castFinanceManageGm">
<omgdc:Bounds height="80.0" width="100.0" x="450.0" y="138.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-DBC30CE6-6C18-4DB6-800B-4CF4B55B6197" id="BPMNShape_sid-DBC30CE6-6C18-4DB6-800B-4CF4B55B6197">
<omgdc:Bounds height="40.0" width="40.0" x="250.0" y="158.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-1E9083BB-5730-4D97-99A1-6921BDA63A36" id="BPMNShape_sid-1E9083BB-5730-4D97-99A1-6921BDA63A36">
<omgdc:Bounds height="40.0" width="40.0" x="335.0" y="158.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="secondTrusteeOffice" id="BPMNShape_secondTrusteeOffice">
<omgdc:Bounds height="80.0" width="100.0" x="1815.0" y="30.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-D3C1E6D8-87D4-4049-B290-061FA68E716C" id="BPMNShape_sid-D3C1E6D8-87D4-4049-B290-061FA68E716C">
<omgdc:Bounds height="40.0" width="40.0" x="1265.0" y="158.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="secondTaxDept" id="BPMNShape_secondTaxDept">
<omgdc:Bounds height="80.0" width="100.0" x="1965.0" y="240.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-0A9B27CB-B119-400E-8C1E-4C9CDE3D725E" id="BPMNShape_sid-0A9B27CB-B119-400E-8C1E-4C9CDE3D725E">
<omgdc:Bounds height="40.0" width="40.0" x="1555.0" y="260.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="secondMartin" id="BPMNShape_secondMartin">
<omgdc:Bounds height="80.0" width="100.0" x="1680.0" y="360.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sid-02BF6A3A-1B06-4E0F-BB8D-0EA436288836" id="BPMNEdge_sid-02BF6A3A-1B06-4E0F-BB8D-0EA436288836">
<omgdi:waypoint x="2065.0" y="280.0"></omgdi:waypoint>
<omgdi:waypoint x="2115.0" y="280.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-B950F9F2-EB64-437D-9AE3-A1CC60597A04" id="BPMNEdge_sid-B950F9F2-EB64-437D-9AE3-A1CC60597A04">
<omgdi:waypoint x="205.0" y="178.2164502164502"></omgdi:waypoint>
<omgdi:waypoint x="250.41304347826087" y="178.41304347826087"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-062EC418-488D-4977-80FF-ED81D2BED5B6" id="BPMNEdge_sid-062EC418-488D-4977-80FF-ED81D2BED5B6">
<omgdi:waypoint x="1780.0" y="400.0"></omgdi:waypoint>
<omgdi:waypoint x="1865.0" y="400.0"></omgdi:waypoint>
<omgdi:waypoint x="1865.0" y="320.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-DE9EA774-91AF-4961-9D63-287B7939336C" id="BPMNEdge_sid-DE9EA774-91AF-4961-9D63-287B7939336C">
<omgdi:waypoint x="1220.0" y="178.2164502164502"></omgdi:waypoint>
<omgdi:waypoint x="1265.4130434782608" y="178.41304347826087"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-A6DBAAB5-BCB2-4C60-9B54-F287024102FF" id="BPMNEdge_sid-A6DBAAB5-BCB2-4C60-9B54-F287024102FF">
<omgdi:waypoint x="1915.0" y="280.0"></omgdi:waypoint>
<omgdi:waypoint x="1965.0" y="280.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-04A3DF55-2A00-4929-8F61-1D6D41C3AE8C" id="BPMNEdge_sid-04A3DF55-2A00-4929-8F61-1D6D41C3AE8C">
<omgdi:waypoint x="550.0" y="95.81910589357435"></omgdi:waypoint>
<omgdi:waypoint x="627.039514567212" y="112.48907921541895"></omgdi:waypoint>
<omgdi:waypoint x="859.1797063135739" y="173.8202936864261"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-714C1FDD-246B-484C-9BBB-AC32E24331D7" id="BPMNEdge_sid-714C1FDD-246B-484C-9BBB-AC32E24331D7">
<omgdi:waypoint x="1430.0" y="110.0"></omgdi:waypoint>
<omgdi:waypoint x="1430.0" y="138.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-784DBBAA-4931-484A-9AAF-920AF1322F6F" id="BPMNEdge_sid-784DBBAA-4931-484A-9AAF-920AF1322F6F">
<omgdi:waypoint x="875.5" y="158.5"></omgdi:waypoint>
<omgdi:waypoint x="875.5" y="85.0"></omgdi:waypoint>
<omgdi:waypoint x="970.0" y="85.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-2D38FD88-0B5E-4D81-8F38-215851CEB585" id="BPMNEdge_sid-2D38FD88-0B5E-4D81-8F38-215851CEB585">
<omgdi:waypoint x="1070.0" y="280.0"></omgdi:waypoint>
<omgdi:waypoint x="1170.0" y="280.0"></omgdi:waypoint>
<omgdi:waypoint x="1170.0" y="218.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-340CBCA9-4F34-499C-BB13-A52D0B8A35BD" id="BPMNEdge_sid-340CBCA9-4F34-499C-BB13-A52D0B8A35BD">
<omgdi:waypoint x="1575.5" y="299.5"></omgdi:waypoint>
<omgdi:waypoint x="1575.5" y="400.0"></omgdi:waypoint>
<omgdi:waypoint x="1680.0" y="400.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-29763544-90B1-43EE-A372-F31D4A2ECDBD" id="BPMNEdge_sid-29763544-90B1-43EE-A372-F31D4A2ECDBD">
<omgdi:waypoint x="1575.5" y="158.5"></omgdi:waypoint>
<omgdi:waypoint x="1575.5" y="70.0"></omgdi:waypoint>
<omgdi:waypoint x="1660.0" y="70.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-6A38C9FD-24B1-437B-9163-50CB4AB8F9FE" id="BPMNEdge_sid-6A38C9FD-24B1-437B-9163-50CB4AB8F9FE">
<omgdi:waypoint x="355.5" y="158.5"></omgdi:waypoint>
<omgdi:waypoint x="355.5" y="85.0"></omgdi:waypoint>
<omgdi:waypoint x="450.0" y="85.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-C671709C-BE63-41B0-B654-CC5A23161AC9" id="BPMNEdge_sid-C671709C-BE63-41B0-B654-CC5A23161AC9">
<omgdi:waypoint x="1285.5" y="158.5"></omgdi:waypoint>
<omgdi:waypoint x="1285.5" y="70.0"></omgdi:waypoint>
<omgdi:waypoint x="1380.0" y="70.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-387709CC-6BDA-4B74-9432-EA18BA0A9D6D" id="BPMNEdge_sid-387709CC-6BDA-4B74-9432-EA18BA0A9D6D">
<omgdi:waypoint x="550.0" y="178.0"></omgdi:waypoint>
<omgdi:waypoint x="855.0" y="178.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-48BCE65D-10CC-435F-8979-0CB461CE6F3F" id="BPMNEdge_sid-48BCE65D-10CC-435F-8979-0CB461CE6F3F">
<omgdi:waypoint x="875.5" y="197.5"></omgdi:waypoint>
<omgdi:waypoint x="875.5" y="280.0"></omgdi:waypoint>
<omgdi:waypoint x="970.0" y="280.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-10F4BA21-3291-4F16-9C81-C68F152054EE" id="BPMNEdge_sid-10F4BA21-3291-4F16-9C81-C68F152054EE">
<omgdi:waypoint x="1070.0" y="85.0"></omgdi:waypoint>
<omgdi:waypoint x="1170.0" y="85.0"></omgdi:waypoint>
<omgdi:waypoint x="1170.0" y="138.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-6A296410-7725-4DF9-BB54-F2A6AF7AFF71" id="BPMNEdge_sid-6A296410-7725-4DF9-BB54-F2A6AF7AFF71">
<omgdi:waypoint x="1304.5659722222222" y="178.43402777777777"></omgdi:waypoint>
<omgdi:waypoint x="1380.0" y="178.17301038062283"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-43A58E0D-075F-465E-90B1-3EFF802D49C7" id="BPMNEdge_sid-43A58E0D-075F-465E-90B1-3EFF802D49C7">
<omgdi:waypoint x="1915.0" y="70.0"></omgdi:waypoint>
<omgdi:waypoint x="2015.0" y="70.0"></omgdi:waypoint>
<omgdi:waypoint x="2015.0" y="240.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-C9DFC3CD-E1A6-4A8D-8FA3-AB059F2876FC" id="BPMNEdge_sid-C9DFC3CD-E1A6-4A8D-8FA3-AB059F2876FC">
<omgdi:waypoint x="1594.5328719723184" y="280.46712802768167"></omgdi:waypoint>
<omgdi:waypoint x="1815.0" y="280.08635578583767"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-9FAB1E75-2BB4-4604-86DF-036B0127BC94" id="BPMNEdge_sid-9FAB1E75-2BB4-4604-86DF-036B0127BC94">
<omgdi:waypoint x="550.0" y="266.4"></omgdi:waypoint>
<omgdi:waypoint x="859.2767295597484" y="182.27672955974842"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-4CD9D996-B467-4C8C-8CD3-1694EBFC4767" id="BPMNEdge_sid-4CD9D996-B467-4C8C-8CD3-1694EBFC4767">
<omgdi:waypoint x="1760.0" y="70.0"></omgdi:waypoint>
<omgdi:waypoint x="1815.0" y="70.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-085ADDFE-C1C7-4266-BDCB-E5C9015A55DA" id="BPMNEdge_sid-085ADDFE-C1C7-4266-BDCB-E5C9015A55DA">
<omgdi:waypoint x="374.56597222222223" y="178.43402777777777"></omgdi:waypoint>
<omgdi:waypoint x="450.0" y="178.17301038062283"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-855104D5-A104-4DF4-96CD-3AFAF467B715" id="BPMNEdge_sid-855104D5-A104-4DF4-96CD-3AFAF467B715">
<omgdi:waypoint x="1480.0" y="178.17182130584192"></omgdi:waypoint>
<omgdi:waypoint x="1555.4310344827586" y="178.4310344827586"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-7B8238C2-41F3-48C9-818D-800DA6AA9F12" id="BPMNEdge_sid-7B8238C2-41F3-48C9-818D-800DA6AA9F12">
<omgdi:waypoint x="270.5" y="197.5"></omgdi:waypoint>
<omgdi:waypoint x="270.5" y="280.0"></omgdi:waypoint>
<omgdi:waypoint x="450.0" y="280.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-C5EB4E3C-D402-4529-8205-1B45111554BB" id="BPMNEdge_sid-C5EB4E3C-D402-4529-8205-1B45111554BB">
<omgdi:waypoint x="75.0" y="178.0"></omgdi:waypoint>
<omgdi:waypoint x="105.0" y="178.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-D8F0E313-0753-439A-97E4-6032C9694F50" id="BPMNEdge_sid-D8F0E313-0753-439A-97E4-6032C9694F50">
<omgdi:waypoint x="289.5" y="178.5"></omgdi:waypoint>
<omgdi:waypoint x="335.5" y="178.5"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-7D83C3A1-90D2-4F10-A3D5-0DE1F8CF8F6A" id="BPMNEdge_sid-7D83C3A1-90D2-4F10-A3D5-0DE1F8CF8F6A">
<omgdi:waypoint x="1575.5" y="197.5"></omgdi:waypoint>
<omgdi:waypoint x="1575.5" y="260.5"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
Activiti流程部署
在利用Activiti Designer设计完流程后,Activiti同样支持快速发布流程:
Activiti流程管理
部署完流程,用户就可以提单,每提一个单据,Activiti会产生一个流程实例,通过管理界面可以实时查看用户单据的审批进度,贯穿流程(instance)到节点activity,再到任务(task)整条链路。
上图呈现了某个流程的所有单据,此时可以点击任意单据查看查看具体情况,如下图所示:
总结
Activiti以其与Spring boot继承较好,并且有专门的设计器和管理器,易于使用且功能强大,从流程实例Instance,到Activity,再到Task,贯穿整个流程,支持多实例会签等,本文主要初略的介绍了其主要功能和特点,后续一起深入探讨其技术特点和细节,由于作者水平有限,难免纰漏,欢迎指正。