工作流引擎平台
将工作流的定义流程业务化,能够通过可视的、易理解的、规范化的操作方式来让业务人员定义工作流。
中国式工作流之痛
动态流程表单、人员分配自由跳转、会签多实例 、难用的 API等等这些坑,您或者已经踩过、或者正在奔坑而去
1.
2.
开源工作流的交互设计较差,在使用过程中需要配置大量编程领域的元素,大部分情况下业务人员不能直接上手或改动相关流程
3.
通用的工作流几乎不存在,重型的工作流有人吐槽太重了,轻的有人吐槽功能不够,最后的结果基本就是做二次开发
# CHAPTER 1
# CHAPTER 2
简单易用适合较复杂场景的中国式审批流
基于流程引擎平台开发的流程系统已在生产上平稳运行良久,生产已验证
- 前端流程设计器,采用 Vue3 ElementPlus + JsPlumb 实现,支持可任意托拉拽与任意连线绘制流程图
- 服务端架构,基于最新稳定版本SpringCloud 微服务架构,助力企业数字化中台建设
完美兼容主流技术栈

# PRESENTING CODE
🔥🔥🔥 对比传统 BPM 优点 🔥🔥🔥
- 解决传统 BPM 流程复杂点难扩展、后期维护闹心、各种数据统计恶心等痛点问题
- 支持 Online 自动建表设计,以便未来好统计数据。自动增删改查,零编码一键发起
- 实现真正的低代码开发,非常简单的 Online 一键流程设计与一键申请办公
- 有一套较规范且简单的开发流程,同时满足 Online 开发设计与定制化开发设计
- 前后端完全自研可控,二开非常简单自由且符合较复杂中国式审批场景
- 相对于传统 BPM 工作流引擎与工单逻辑是分开的,方便未来数据统计
- 目前工作流相关表 14 张,比传统 BPM 几十张表少很多,学习成本低
功能列表
强大流程设计器
可视化编排具有自适应布局的特性,使其远超过市面上同类竞品并成为秒杀级别产品。


vs
三步搞定流程设计
完成基础信息设置
可视化表单拖拽
流程审批设计



# PRESENTING CODE
快速构建流程示例视频
# PRESENTING CODE
表单动态字段流程示例视频
# PRESENTING CODE
父子表流程示例视频
# PRESENTING CODE
富文本、附件流程示例视频
# PRESENTING CODE
自动创建表流程示例视频
引擎能力支撑
# PRESENTING CODE
-
支持基础的多种审批模式:支持抄送、审批、触发器、条件分支、并行分支等
-
中国式工作流审批过程支持:
- 正常配置人员、动态分配、动态计算分配人员,动态计算节点增量任务,驳回任意节点。
-
可不等待兄弟任务、支持业务侧开启和计算任务,不满足条件可继续流转下一节点。
- 完备传统流程生命周期,流程任意节点驳回、交接等复杂业务场景支持。
节点概述
# PRESENTING CODE
- 节点根据业务场景分为:发起节点、串行节点、并行节点、结束节点、虚拟节点。 主要基于传统BPM使用的感受,考虑到传统BPM类型过多复杂且极少用,故本工作流系统仅分6种节点类型,常使用的主要是串行、并行节点。
- 串行顾名思义流程只有一个分支往下走,并行则表示流程可以同时流转到多个分支,只要掌握这个概念,使用会非常简单。这样设计的原因是传统的BPM有各种的节点或网关,但实际上使用的很少,网关本系统采用串行+条件 或 并行+条件来代替。
任务概述
# PRESENTING CODE
- 个人任务:表示由某个人来办理这个任务
- 角色任务: 表示拥有同一个角色的人都可以办理,谁先办理属于谁
-
或签任务:表示该节点下所有任务类型都必须是或签,一人办理完则其他兄弟任务都结束
- 会签任务在本系统中采用多个节点任务来表达一个节点同时需多个人来办理的情况
流转概述
# PRESENTING CODE
- 正常分配:指可指定一个人或一个角色来办理
- 动态分配则表示根据某个SPEL表达式来动态指定某个人
- 动态计算则表示根据多个角色或多个人,业务侧手动调用节点任务增量接口,来动态计算和生成多个节点任务
/**
* 启动节点时拦截方法
* @param runJobVO 运行任务
*/
void start(RunJobVO runJobVO);
/**
* 审批节点前拦截方法
* @param runJobVO 运行任务
*/
void before(RunJobVO runJobVO);
/**
* 节点结束拦截方法
* @param runJobVO 运行任务
*/
void complete(RunJobVO runJobVO);
/**
* 审批节点后拦截方法
* @param runJobVO 运行任务
*/
void after(RunJobVO runJobVO);
/**
* 驳回后拦截方法
* @param runJobVO 运行任务
*/
void reject(RunJobVO runJobVO);
/**
* 被驳回后拦截方法
* @param runJobVO 运行任务
*/
void rejected(RunJobVO runJobVO);
# PRESENTING CODE
代码动态计算
{
"nodeList": [
{
"type": "start",
"nodeName": "开始",
"icon": null,
"attrs": {
"pcTodoUrl": null,
"pcFinishUrl": null
},
"clazz": {
"clazz": null,
"methods": null
},
"defJob": {
"jobName": "任务名称",
"userId": null,
"roleId": null
},
"jobSize": 1,
"id": "1661145449179000002",
"height": 50,
"x": 210,
"width": 50,
"y": 205
}
],
"linkList": [
{
"type": "link",
"label": "",
"sourceId": "1661145449179000002",
"targetId": "1661145452800000003",
"attrs": {
"varKey": null,
"varVal": null
},
"id": "1661145456855000004",
"icon": null
}
],
"attrs": {
"id": "1661145437059000001"
},
"status": "0"
}
# PRESENTING CODE
JSON 驱动流程
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<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:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1561702890882" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema">
<process id="leave" isClosed="false" isExecutable="true" name="请假流程图" processType="None">
<documentation id="leave_D_1"><![CDATA[请假流程图]]></documentation>
<startEvent id="startevent1" name="Start"/>
<endEvent id="endevent1" name="End"/>
<userTask activiti:assignee="employee" activiti:exclusive="true" id="usertask1" name="员工请假"/>
<userTask activiti:candidateGroups="manager" activiti:exclusive="true" id="usertask2" name="经理审批"/>
<userTask activiti:candidateGroups="boss" activiti:exclusive="true" id="usertask3" name="总经理审批"/>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"/>
<sequenceFlow id="flow2" name="${flag == true}" sourceRef="usertask2" targetRef="endevent1">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${flag == true}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow3" name="${flag == true}" sourceRef="usertask3" targetRef="endevent1">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${flag == true}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow4" name="${flag == false}" sourceRef="usertask2" targetRef="usertask1">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${flag == false}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow5" name="${flag == false}" sourceRef="usertask3" targetRef="usertask1">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${flag == false}]]></conditionExpression>
</sequenceFlow>
<exclusiveGateway gatewayDirection="Unspecified" id="exclusivegateway1" name="Exclusive Gateway"/>
<sequenceFlow id="flow6" sourceRef="usertask1" targetRef="exclusivegateway1"/>
<sequenceFlow id="flow7" name="${day <= 2}" sourceRef="exclusivegateway1" targetRef="usertask2">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${day <= 2}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow8" name="${day > 2}" sourceRef="exclusivegateway1" targetRef="usertask3">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${day > 2}]]></conditionExpression>
</sequenceFlow>
</process>
<bpmndi:BPMNDiagram documentation="background=#3C3F41;count=1;horizontalcount=1;orientation=0;width=842.4;height=1195.2;imageableWidth=832.4;imageableHeight=1185.2;imageableX=5.0;imageableY=5.0" id="Diagram-_1" name="New Diagram">
<bpmndi:BPMNPlane bpmnElement="leave">
<bpmndi:BPMNShape bpmnElement="startevent1" id="Shape-startevent1">
<omgdc:Bounds height="32.0" width="32.0" x="355.0" y="48.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="Shape-endevent1">
<omgdc:Bounds height="32.0" width="32.0" x="355.0" y="362.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask1" id="Shape-usertask1">
<omgdc:Bounds height="55.0" width="105.0" x="320.0" y="112.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask2" id="Shape-usertask2">
<omgdc:Bounds height="55.0" width="105.0" x="170.0" y="240.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask3" id="Shape-usertask3">
<omgdc:Bounds height="55.0" width="105.0" x="480.0" y="242.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="Shape-exclusivegateway1" isMarkerVisible="false">
<omgdc:Bounds height="32.0" width="32.0" x="352.0" y="247.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1" sourceElement="startevent1" targetElement="usertask1">
<omgdi:waypoint x="371.0" y="80.0"/>
<omgdi:waypoint x="371.0" y="112.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2" sourceElement="usertask2" targetElement="endevent1">
<omgdi:waypoint x="222.0" y="295.0"/>
<omgdi:waypoint x="222.0" y="379.0"/>
<omgdi:waypoint x="355.0312805773287" y="379.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="100.0" x="183.0" y="309.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3" sourceElement="usertask3" targetElement="endevent1">
<omgdi:waypoint x="532.0" y="297.0"/>
<omgdi:waypoint x="532.0" y="379.0"/>
<omgdi:waypoint x="386.9687194226713" y="379.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="100.0" x="483.0" y="309.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4" sourceElement="usertask2" targetElement="usertask1">
<omgdi:waypoint x="222.0" y="240.0"/>
<omgdi:waypoint x="222.0" y="139.0"/>
<omgdi:waypoint x="320.0" y="139.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="100.0" x="170.0" y="191.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5" sourceElement="usertask3" targetElement="usertask1">
<omgdi:waypoint x="532.0" y="242.0"/>
<omgdi:waypoint x="532.0" y="139.0"/>
<omgdi:waypoint x="425.0" y="139.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="100.0" x="485.0" y="191.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6" sourceElement="usertask1" targetElement="exclusivegateway1">
<omgdi:waypoint x="368.0" y="167.0"/>
<omgdi:waypoint x="368.0" y="247.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7" sourceElement="exclusivegateway1" targetElement="usertask2">
<omgdi:waypoint x="352.0" y="263.0"/>
<omgdi:waypoint x="275.0" y="267.5"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="100.0" x="283.0" y="247.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8" sourceElement="exclusivegateway1" targetElement="usertask3">
<omgdi:waypoint x="384.0" y="263.0"/>
<omgdi:waypoint x="480.0" y="269.5"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="100.0" x="400.0" y="247.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
全流程监控留痕



感谢观看
试用请扫码联系我们

json-flow
By 冷冷
json-flow
- 152