一:前言
众所周知:Activiti只提供了完成方法
taskService.complete(taskId)
,没有提供所谓的退回或者跳转方法,作为一个工作流框架不提供这个功能感觉就像缺了一个胳膊,如果想控制从后面一个节点退回到前面某个节点或者从前面某个节点跳转到后面某个节点就要自己想办法了,主要有两种方式:
一:通过使用排它网关Gateway,配置不同的条件来指定跳转节点的目标节点,如果节点流转比较多就会导致流程图的线比较多,不太灵活,一般用于节点之间跳转比较固定的流程。
二:自定义Command来实现:
- Activiti7工作流引擎:节点动态跳转
- Activiti7工作流引擎:高阶篇(二) 前进和后退任务
二:BPMN
当流程图的节点比较多又比较复杂时,对节点的排版布局很重要,好的排版布局看起来比较清晰,最好不要出现线与线之间有过多的交汇,更不要出现线与线之间重合,可以通过改变节点的布局方向来调整:
- 横向:所有节点在水平线一条线上。
- 纵向:所有节点在垂直一条线上。
- 混合:根据流程图的复杂性,灵活排版。
<process id="GatewayLeaveProcess" isClosed="false" isExecutable="true" name="请假流程" processType="None">
<startEvent id="_2" name="StartEvent"/>
<userTask activiti:assignee="${initiator}" activiti:exclusive="true" id="initiator" name="发起人"/>
<userTask activiti:exclusive="true" id="vgmApprove" name="副总经理审批"/>
<exclusiveGateway gatewayDirection="Unspecified" id="_5"/>
<sequenceFlow id="_6" sourceRef="_2" targetRef="initiator"/>
<sequenceFlow id="_7" sourceRef="initiator" targetRef="vgmApprove"/>
<sequenceFlow id="_8" sourceRef="vgmApprove" targetRef="_5"/>
<userTask activiti:exclusive="true" id="gmApprove" name="总经理审批"/>
<sequenceFlow id="_10" name="同意" sourceRef="_5" targetRef="gmApprove">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[${vgmResult==1}]]>
</conditionExpression>
</sequenceFlow>
<sequenceFlow id="_3" name="不同意" sourceRef="_5" targetRef="initiator">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[${vgmResult==0}]]>
</conditionExpression>
</sequenceFlow>
<exclusiveGateway gatewayDirection="Unspecified" id="_4"/>
<sequenceFlow id="_9" sourceRef="gmApprove" targetRef="_4"/>
<endEvent id="end"/>
<sequenceFlow id="_12" name="同意" sourceRef="_4" targetRef="end">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[${gmResult == 1}]]>
</conditionExpression>
</sequenceFlow>
<sequenceFlow id="_13" name="不同意" sourceRef="_4" targetRef="vgmApprove">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[${gmResult == 0}]]>
</conditionExpression>
</sequenceFlow>
</process>
三:代码
repositoryService.createDeployment()
.addClasspathResource("processes/GatewayLeaveProcess.bpmn")
.name("请假流程")
.deploy();
Map<String, Object> variables = new HashMap<>();
variables.put("initiator", "huihui");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("GatewayLeaveProcess", variables);
// 1.发起人
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
taskService.complete(task.getId());
// 2.副总经理审批(不同意)
Map<String, Object> variables2 = new HashMap<>();
variables2.put("vgmResult", 0);
task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
taskService.setAssignee(task.getId(), "monday");
taskService.complete(task.getId(), variables2);
四:阅读
曾经以为
老去是很遥远的事情
突然发现
年轻已经是很久以前的事了
时光好不经用
抬眼已是半生
真正让人焦虑的
不是孤单
不是贫穷
更不是衰老
而是到了中年
你才发现
你从来没有按照自己喜欢的方式活过
这烟火人家
事事值得
事事也遗憾