目录
一、工作流的历史
二、BPMN介绍
三、实践举例:xx平台xxx商家合规治理任务优化项目(非真实场景)
1. 背景目标
2. 方案
3. SmartEngine详细介绍
四、总结与建议
1. 优点
2. 缺点
3. 建议
BPMN的理论基础
流程建模:BPMN使用不同的图形符号来表示业务流程中的各项活动、任务、决策和事件等。这些符号包括任务、网关、事件等,每个符号都有特定的含义和用法。
流程分析:通过BPMN模型,企业可以分析业务流程的效率、资源利用率和风险等,以便进行优化和改进。
流程执行:BPMN不仅是一种建模语言,还可以将建模的业务流程实际执行起来,并进行监控和控制。
BPMN的优势
传统使用场景
采购流程:通过BPMN建模,企业可以规范采购流程,包括需求确认、供应商选择、合同签订、物品收货等环节,提高采购效率。
请假审批流程:BPMN模型可以帮助企业规范请假审批流程,包括员工请假申请、直属主管审批、人力资源部门审批等环节,减少误差和纠纷。
客户投诉处理流程:利用BPMN,企业可以清晰地展示客户投诉处理流程,包括客户投诉登记、处理人员分配、处理过程跟踪、客户反馈等环节,提高客户满意度。
背景目标
商家合规治理手段的单一性和对线下人工的过度依赖方面需要优化,通过整合商家合规治理策略,并实现这些策略的可在线化配置。这一举措将打破传统的手工操作模式,允许业务方直接在系统中配置和更新治理策略,减少人工干预,提高治理效率。同时,在线化配置也便于策略的快速部署和灵活调整,以应对不同业务场景下的合规要求。
各商家的合规治理进度和状态的透明度方面需要优化,为改变这一现状,我们需要搭建一套高效的工作流引擎。该引擎将支持商家合规治理流程的编排和自动化流转,从任务触发到完成审核、记录反馈等各个环节都将实现自动化处理。同时,内置的进度跟踪机制将确保业务团队能够实时查看各商家的治理进度,及时发现问题并采取相应措施。这将大大提高治理的透明度和可控性。
评估治理成果和手段的有效性分析方面需要优化,将合规治理成果的数据可视化,通过强大的数据分析与可视化系统,我们将关键指标(如治理效率、违规率、改进情况等)以图表、报告等形式直观展现。同时,通过持续的数据分析与改进循环,我们将逐步优化治理策略和方式,最终形成商家合规治理的闭环机制。
方案
业务流程
系统架构图
流程编排
工作流技术选型
SmartEngine详细介绍
E-R图
CREATE TABLE `se_deployment_instance` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK' ,
`gmt_create` datetime(6) NOT NULL COMMENT 'create time' ,
`gmt_modified` datetime(6) NOT NULL COMMENT 'modification time' ,
`process_definition_id` varchar(255) NOT NULL COMMENT 'process definition id' ,
`process_definition_version` varchar(255) DEFAULT NULL COMMENT 'process definition version' ,
`process_definition_type` varchar(255) DEFAULT NULL COMMENT 'process definition type' ,
`process_definition_code` varchar(255) DEFAULT NULL COMMENT 'process definition code' ,
`process_definition_name` varchar(255) DEFAULT NULL COMMENT 'process definition name' ,
`process_definition_desc` varchar(255) DEFAULT NULL COMMENT 'process definition desc' ,
`process_definition_content` mediumtext NOT NULL COMMENT 'process definition content' ,
`deployment_user_id` varchar(128) NOT NULL COMMENT 'deployment user id' ,
`deployment_status` varchar(64) NOT NULL COMMENT 'deployment status' ,
`logic_status` varchar(64) NOT NULL COMMENT 'logic status' ,
PRIMARY KEY (`id`)
) COMMENT='流程定义表' ;
CREATE TABLE `se_process_instance` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK' ,
`gmt_create` datetime(6) NOT NULL COMMENT 'create time' ,
`gmt_modified` datetime(6) NOT NULL COMMENT 'modification time' ,
`process_definition_id_and_version` varchar(128) NOT NULL COMMENT 'process definition id and version' ,
`process_definition_type` varchar(255) DEFAULT NULL COMMENT 'process definition type' ,
`status` varchar(64) NOT NULL COMMENT ' 1.running 2.completed 3.aborted',
`parent_process_instance_id` bigint(20) unsigned DEFAULT NULL COMMENT 'parent process instance id' ,
`parent_execution_instance_id` bigint(20) unsigned DEFAULT NULL COMMENT 'parent execution instance id' ,
`start_user_id` varchar(128) DEFAULT NULL COMMENT 'start user id' ,
`biz_unique_id` varchar(255) DEFAULT NULL COMMENT 'biz unique id' ,
`reason` varchar(255) DEFAULT NULL COMMENT 'reason' ,
`comment` varchar(255) DEFAULT NULL COMMENT 'comment' ,
`title` varchar(255) DEFAULT NULL COMMENT 'title' ,
`tag` varchar(255) DEFAULT NULL COMMENT 'tag' ,
PRIMARY KEY (`id`)
) COMMENT='流程实例表' ;
CREATE TABLE `se_activity_instance` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK' ,
`gmt_create` datetime(6) NOT NULL COMMENT 'create time' ,
`gmt_modified` datetime(6) NOT NULL COMMENT 'modification time' ,
`process_instance_id` bigint(20) unsigned DEFAULT NULL COMMENT 'process instance id' ,
`process_definition_id_and_version` varchar(255) NOT NULL COMMENT 'process definition id and version' ,
`process_definition_activity_id` varchar(64) NOT NULL COMMENT 'process definition activity id' ,
PRIMARY KEY (`id`)
) COMMENT='活动节点实例表' ;
CREATE TABLE `se_task_instance` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK' ,
`gmt_create` datetime(6) NOT NULL COMMENT 'create time' ,
`gmt_modified` datetime(6) NOT NULL COMMENT 'modification time' ,
`process_instance_id` bigint(20) unsigned NOT NULL COMMENT 'process instance id' ,
`process_definition_id_and_version` varchar(128) DEFAULT NULL COMMENT 'process definition id and version' ,
`process_definition_type` varchar(255) DEFAULT NULL COMMENT 'process definition type' ,
`activity_instance_id` bigint(20) unsigned NOT NULL COMMENT 'activity instance id' ,
`process_definition_activity_id` varchar(255) NOT NULL COMMENT 'process definition activity id' ,
`execution_instance_id` bigint(20) unsigned NOT NULL COMMENT 'execution instance id' ,
`claim_user_id` varchar(255) DEFAULT NULL COMMENT 'claim user id' ,
`title` varchar(255) DEFAULT NULL COMMENT 'title' ,
`priority` int(11) DEFAULT 500 COMMENT 'priority' ,
`tag` varchar(255) DEFAULT NULL COMMENT 'tag' ,
`claim_time` datetime(6) DEFAULT NULL COMMENT 'claim time' ,
`complete_time` datetime(6) DEFAULT NULL COMMENT 'complete time' ,
`status` varchar(255) NOT NULL COMMENT 'status' ,
`comment` varchar(255) DEFAULT NULL COMMENT 'comment' ,
`extension` varchar(255) DEFAULT NULL COMMENT 'extension' ,
PRIMARY KEY (`id`)
) COMMENT='人工任务节点实例表' ;
CREATE TABLE `se_task_assignee_instance` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK' ,
`gmt_create` datetime(6) NOT NULL COMMENT 'create time' ,
`gmt_modified` datetime(6) NOT NULL COMMENT 'modification time' ,
`process_instance_id` bigint(20) unsigned NOT NULL COMMENT 'process instance id' ,
`task_instance_id` bigint(20) unsigned NOT NULL COMMENT 'task instance id' ,
`assignee_id` varchar(255) NOT NULL COMMENT 'assignee id' ,
`assignee_type` varchar(128) NOT NULL COMMENT 'assignee type' ,
PRIMARY KEY (`id`)
) COMMENT='人工任务节点代理人实例表' ;
CREATE TABLE `se_execution_instance` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK' ,
`gmt_create` datetime(6) NOT NULL COMMENT 'create time' ,
`gmt_modified` datetime(6) NOT NULL COMMENT 'modification time' ,
`process_instance_id` bigint(20) unsigned NOT NULL COMMENT 'process instance id' ,
`process_definition_id_and_version` varchar(255) NOT NULL COMMENT 'process definition id and version' ,
`process_definition_activity_id` varchar(255) NOT NULL COMMENT 'process definition activity id' ,
`activity_instance_id` bigint(20) unsigned NOT NULL COMMENT 'activity instance id' ,
`active` tinyint(4) NOT NULL COMMENT '1:active 0:inactive',
PRIMARY KEY (`id`)
) COMMENT='执行节点实例表-最细粒度的实例' ;
CREATE TABLE `se_variable_instance` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK' ,
`gmt_create` datetime(6) NOT NULL COMMENT 'create time' ,
`gmt_modified` datetime(6) NOT NULL COMMENT 'modification time' ,
`process_instance_id` bigint(20) unsigned NOT NULL COMMENT 'process instance id' ,
`execution_instance_id` bigint(20) unsigned DEFAULT NULL COMMENT 'execution instance id' ,
`field_key` varchar(128) NOT NULL COMMENT 'field key' ,
`field_type` varchar(128) NOT NULL COMMENT 'field type' ,
`field_double_value` decimal(65,30) DEFAULT NULL COMMENT 'field double value' ,
`field_long_value` bigint(20) DEFAULT NULL COMMENT 'field long value' ,
`field_string_value` varchar(4000) DEFAULT NULL COMMENT 'field string value' ,
PRIMARY KEY (`id`)
) COMMENT='执行节点变量量表' ;
代码实操
import com.alibaba.smart.framework.engine.SmartEngine;
import com.alibaba.smart.framework.engine.configuration.InstanceAccessor;
import com.alibaba.smart.framework.engine.configuration.ProcessEngineConfiguration;
import com.alibaba.smart.framework.engine.configuration.impl.DefaultProcessEngineConfiguration;
import com.alibaba.smart.framework.engine.configuration.impl.DefaultSmartEngine;
import com.alibaba.smart.framework.engine.exception.EngineException;
import com.alibaba.smart.framework.engine.service.command.RepositoryCommandService;
import com.alibaba.smart.framework.engine.util.IOUtil;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import java.io.InputStream;
import static org.springframework.core.Ordered.LOWEST_PRECEDENCE;
(LOWEST_PRECEDENCE)
(SmartEngine.class)
public class SmartEngineAutoConfiguration implements ApplicationContextAware {
private ApplicationContext applicationContext;
public SmartEngine constructSmartEngine() {
ProcessEngineConfiguration processEngineConfiguration = new DefaultProcessEngineConfiguration();
// 实现InstanceAccessor接口
processEngineConfiguration.setInstanceAccessor(new CustomInstanceAccessService());
SmartEngine smartEngine = new DefaultSmartEngine();
smartEngine.init(processEngineConfiguration);
// 加载流程定义
deployProcessDefinition(smartEngine);
return smartEngine;
}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
private class CustomInstanceAccessService implements InstanceAccessor {
public Object access(String name) {
return applicationContext.getBean(name);
}
}
private void deployProcessDefinition(SmartEngine smartEngine) {
RepositoryCommandService repositoryCommandService = smartEngine
.getRepositoryCommandService();
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
Resource[] resources = resolver.getResources("classpath*:/smart-engine/*.xml");
for (Resource resource : resources) {
InputStream inputStream = resource.getInputStream();
repositoryCommandService.deploy(inputStream);
IOUtil.closeQuietly(inputStream);
}
} catch (Exception e) {
throw new EngineException(e);
}
}
}
BMPN2.0 xml举例
<bpmn:definitions 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:modeler="http://camunda.org/schema/modeler/1.0" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Web Modeler" exporterVersion="b1a091a" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.5.0" camunda:diagramRelationId="2a2c997b-ff2f-49b0-9ba8-3c4860d223e7">
<bpmn:process id="Process_1qijgvk" name="test1" isExecutable="true">
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_0soou9n</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:sequenceFlow id="Flow_0soou9n" sourceRef="StartEvent_1" targetRef="Activity_02gdgyk" />
<bpmn:endEvent id="Event_1i2y4ym">
<bpmn:incoming>Flow_07mf0sc</bpmn:incoming>
<bpmn:incoming>Flow_1nd3369</bpmn:incoming>
<bpmn:incoming>Flow_160ji3a</bpmn:incoming>
</bpmn:endEvent>
<bpmn:exclusiveGateway id="Gateway_1kykneu" name="检查是否5天内完成治理">
<bpmn:extensionElements />
<bpmn:incoming>Flow_0exjsc9</bpmn:incoming>
<bpmn:outgoing>Flow_0hj860q</bpmn:outgoing>
<bpmn:outgoing>Flow_1oqjt08</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="Flow_0hj860q" name="否" sourceRef="Gateway_1kykneu" targetRef="Activity_1ms8vu6" />
<bpmn:serviceTask id="Activity_02gdgyk" name="站内通知商户去治理">
<bpmn:extensionElements />
<bpmn:incoming>Flow_0soou9n</bpmn:incoming>
<bpmn:outgoing>Flow_0exjsc9</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:sequenceFlow id="Flow_0exjsc9" sourceRef="Activity_02gdgyk" targetRef="Gateway_1kykneu" />
<bpmn:serviceTask id="Activity_1ms8vu6" name="发送sms通知商户">
<bpmn:incoming>Flow_0hj860q</bpmn:incoming>
<bpmn:outgoing>Flow_0bemgki</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:sequenceFlow id="Flow_0bemgki" sourceRef="Activity_1ms8vu6" targetRef="Gateway_1dyp6hh" />
<bpmn:sequenceFlow id="Flow_1oqjt08" name="是" sourceRef="Gateway_1kykneu" targetRef="Activity_1c9i1el" />
<bpmn:exclusiveGateway id="Gateway_1dyp6hh" name="是否10天内完成治理">
<bpmn:incoming>Flow_0bemgki</bpmn:incoming>
<bpmn:outgoing>Flow_07xq405</bpmn:outgoing>
<bpmn:outgoing>Flow_1w4qeti</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="Flow_07xq405" name="是" sourceRef="Gateway_1dyp6hh" targetRef="Activity_0m5dsna" />
<bpmn:serviceTask id="Activity_1c9i1el" name="发放奖励给到商户">
<bpmn:incoming>Flow_1oqjt08</bpmn:incoming>
<bpmn:outgoing>Flow_1t7ectj</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:sequenceFlow id="Flow_1t7ectj" sourceRef="Activity_1c9i1el" targetRef="Activity_1p6mkdy" />
<bpmn:task id="Activity_0m5dsna" name="任务完成">
<bpmn:incoming>Flow_07xq405</bpmn:incoming>
<bpmn:outgoing>Flow_07mf0sc</bpmn:outgoing>
</bpmn:task>
<bpmn:sequenceFlow id="Flow_07mf0sc" sourceRef="Activity_0m5dsna" targetRef="Event_1i2y4ym" />
<bpmn:sequenceFlow id="Flow_1w4qeti" name="否" sourceRef="Gateway_1dyp6hh" targetRef="Activity_1gud1rw" />
<bpmn:task id="Activity_1p6mkdy" name="任务完成">
<bpmn:incoming>Flow_1t7ectj</bpmn:incoming>
<bpmn:outgoing>Flow_1nd3369</bpmn:outgoing>
</bpmn:task>
<bpmn:sequenceFlow id="Flow_1nd3369" sourceRef="Activity_1p6mkdy" targetRef="Event_1i2y4ym" />
<bpmn:serviceTask id="Activity_1gud1rw" name="通知运营下线商户店铺">
<bpmn:incoming>Flow_1w4qeti</bpmn:incoming>
<bpmn:outgoing>Flow_0vr5zs3</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:sequenceFlow id="Flow_0vr5zs3" sourceRef="Activity_1gud1rw" targetRef="Activity_1pfbnmo" />
<bpmn:task id="Activity_1pfbnmo" name="任务结束">
<bpmn:incoming>Flow_0vr5zs3</bpmn:incoming>
<bpmn:outgoing>Flow_160ji3a</bpmn:outgoing>
</bpmn:task>
<bpmn:sequenceFlow id="Flow_160ji3a" sourceRef="Activity_1pfbnmo" targetRef="Event_1i2y4ym" />
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1qijgvk">
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="152" y="232" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_1kykneu_di" bpmnElement="Gateway_1kykneu" isMarkerVisible="true">
<dc:Bounds x="465" y="225" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="448" y="188" width="84" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_02gdgyk_di" bpmnElement="Activity_02gdgyk">
<dc:Bounds x="270" y="210" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1ms8vu6_di" bpmnElement="Activity_1ms8vu6">
<dc:Bounds x="630" y="210" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_1i2y4ym_di" bpmnElement="Event_1i2y4ym">
<dc:Bounds x="1182" y="232" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_1dyp6hh_di" bpmnElement="Gateway_1dyp6hh" isMarkerVisible="true">
<dc:Bounds x="825" y="225" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="810" y="285" width="79" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1c9i1el_di" bpmnElement="Activity_1c9i1el">
<dc:Bounds x="630" y="320" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0m5dsna_di" bpmnElement="Activity_0m5dsna">
<dc:Bounds x="950" y="210" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_0ab1d2g" bpmnElement="Activity_1p6mkdy">
<dc:Bounds x="840" y="320" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1gud1rw_di" bpmnElement="Activity_1gud1rw">
<dc:Bounds x="800" y="80" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_02s3tua" bpmnElement="Activity_1pfbnmo">
<dc:Bounds x="950" y="80" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_0soou9n_di" bpmnElement="Flow_0soou9n">
<di:waypoint x="188" y="250" />
<di:waypoint x="270" y="250" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0exjsc9_di" bpmnElement="Flow_0exjsc9">
<di:waypoint x="370" y="250" />
<di:waypoint x="465" y="250" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0hj860q_di" bpmnElement="Flow_0hj860q">
<di:waypoint x="515" y="250" />
<di:waypoint x="630" y="250" />
<bpmndi:BPMNLabel>
<dc:Bounds x="567" y="232" width="11" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1oqjt08_di" bpmnElement="Flow_1oqjt08">
<di:waypoint x="490" y="275" />
<di:waypoint x="490" y="360" />
<di:waypoint x="630" y="360" />
<bpmndi:BPMNLabel>
<dc:Bounds x="544" y="373" width="11" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0bemgki_di" bpmnElement="Flow_0bemgki">
<di:waypoint x="730" y="250" />
<di:waypoint x="825" y="250" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1t7ectj_di" bpmnElement="Flow_1t7ectj">
<di:waypoint x="730" y="360" />
<di:waypoint x="840" y="360" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_07mf0sc_di" bpmnElement="Flow_07mf0sc">
<di:waypoint x="1050" y="250" />
<di:waypoint x="1182" y="250" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_07xq405_di" bpmnElement="Flow_07xq405">
<di:waypoint x="875" y="250" />
<di:waypoint x="950" y="250" />
<bpmndi:BPMNLabel>
<dc:Bounds x="899" y="232" width="11" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1w4qeti_di" bpmnElement="Flow_1w4qeti">
<di:waypoint x="850" y="225" />
<di:waypoint x="850" y="160" />
<bpmndi:BPMNLabel>
<dc:Bounds x="853" y="186" width="11" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1nd3369_di" bpmnElement="Flow_1nd3369">
<di:waypoint x="940" y="360" />
<di:waypoint x="1120" y="360" />
<di:waypoint x="1120" y="250" />
<di:waypoint x="1182" y="250" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0vr5zs3_di" bpmnElement="Flow_0vr5zs3">
<di:waypoint x="900" y="120" />
<di:waypoint x="950" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_160ji3a_di" bpmnElement="Flow_160ji3a">
<di:waypoint x="1050" y="120" />
<di:waypoint x="1120" y="120" />
<di:waypoint x="1120" y="250" />
<di:waypoint x="1182" y="250" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
重要领域对象
SmartEngine引擎源码地址:https://github.com/alibaba/SmartEngine/tree/master
SmartEngine UserGuide: https://github.com/alibaba/SmartEngine/wiki/SmartEngine-UserGuide--Chinese-Version-%28%E4%B8%AD%E6%96%87%E7%89%88%29
Camunda开源流程设计器(支持在线和本地node.js部署两种方式):https://camunda.com/download/modeler/
Camunda设计器学习文档:https://docs.camunda.io/docs/components/modeler/bpmn/bpmn-primer/
优点
缺点
建议
往期回顾
文 / 冬冬
关注得物技术,每周一、三、五更新技术干货
要是觉得文章对你有帮助的话,欢迎评论转发点赞~
未经得物技术许可严禁转载,否则依法追究法律责任。
“
扫码添加小助手微信
如有任何疑问,或想要了解更多技术资讯,请添加小助手微信: