写在前面
考虑这样的场景,用户提交了工单,该工单等待审批,但是用户发现部分信息填写错误,需要重新填写,此时就可以通过信号边界事件完成,下面来看下如何实现。
1:测试
1.1:流程设计
- 效果图

如下是定义信号和使用信号:


- 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/test">
<signal id="changeSignalA" name="changeSignalA" activiti:scope="global"></signal>
<process id="mySignalBoundarEventA" name="信号边界事件A" isExecutable="true">
<documentation>signalBoundary</documentation>
<startEvent id="startevent1" name="Start"></startEvent>
<endEvent id="endevent1" name="End"></endEvent>
<userTask id="usertask1" name="填写工单" activiti:assignee="signalUser1">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler">false</modeler:initiator-can-complete>
</extensionElements>
</userTask>
<userTask id="usertask2" name="审批" activiti:assignee="signalUser2">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler">false</modeler:initiator-can-complete>
</extensionElements>
</userTask>
<userTask id="usertask3" name="修改工单" activiti:assignee="signalUser3">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler">false</modeler:initiator-can-complete>
</extensionElements>
</userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
<sequenceFlow id="flow4" sourceRef="usertask3" targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow5" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
<boundaryEvent id="boundarysignal1" name="Signal" attachedToRef="usertask2" cancelActivity="true">
<signalEventDefinition signalRef="changeSignalA"></signalEventDefinition>
</boundaryEvent>
<sequenceFlow id="flow6" sourceRef="boundarysignal1" targetRef="usertask3"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_mySignalBoundarEventA">
<bpmndi:BPMNPlane bpmnElement="mySignalBoundarEventA" id="BPMNPlane_mySignalBoundarEventA">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="210.0" y="170.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="960.0" y="170.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
<omgdc:Bounds height="55.0" width="105.0" x="420.0" y="160.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
<omgdc:Bounds height="55.0" width="105.0" x="690.0" y="160.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="boundarysignal1" id="BPMNShape_boundarysignal1">
<omgdc:Bounds height="30.0" width="30.0" x="728.0" y="202.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">
<omgdc:Bounds height="55.0" width="105.0" x="560.0" y="320.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="245.0" y="187.0"></omgdi:waypoint>
<omgdi:waypoint x="420.0" y="187.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="525.0" y="187.0"></omgdi:waypoint>
<omgdi:waypoint x="690.0" y="187.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
<omgdi:waypoint x="560.0" y="347.0"></omgdi:waypoint>
<omgdi:waypoint x="472.0" y="347.0"></omgdi:waypoint>
<omgdi:waypoint x="472.0" y="215.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
<omgdi:waypoint x="795.0" y="187.0"></omgdi:waypoint>
<omgdi:waypoint x="960.0" y="187.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
<omgdi:waypoint x="743.0" y="232.0"></omgdi:waypoint>
<omgdi:waypoint x="612.0" y="320.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
1.2:部署流程
/**
* 部署流程定义
*/
@Test
public void deploy() {
Deployment deployment = repositoryService.createDeployment() // 创建部署
.addClasspathResource("com/jh/activiti/signal_boundary.bpmn20.xml") // 加载流程资源文件
.name("信号边界事件") // 流程名称
.deploy(); // 部署
System.out.println("流程部署ID:" + deployment.getId());
System.out.println("流程部署Name:" + deployment.getName());
}


1.3:启动流程实例
// 创建流程实例
@Test
public void createProcessInstance() {
ProcessInstance pi = runtimeService.startProcessInstanceByKey("mySignalBoundarEventA"); // 流程定义表的KEY字段值
System.out.println("流程实例ID:" + pi.getId());
System.out.println("流程定义ID:" + pi.getProcessDefinitionId());
}
1.4:完成任务
如下是填写工单任务:

- 完成
填写工单任务
@Test
public void completeWithSignal() {
// 填写工单->审批工单(不完成,直接发出信号)->修改工单->填写工单->审批工单->结束
// 订阅信号
/*List<Execution> changeSignalList = runtimeService.createExecutionQuery().signalEventSubscriptionName("changeSignalA").list();
System.out.println(changeSignalList);
System.out.println(changeSignalList.size());*/
taskService.complete("1035007"); // 填写工单
// runtimeService.signalEventReceived("changeSignalA"); // 审批工单(不完成,直接发出信号)
// taskService.complete("487503"); // 修改工单
// taskService.complete("490002"); // 填写工单
// taskService.complete("492504"); // 审批工单->结束
}
生成审批任务:

- 发出信号,让任务重新流转回
填写工单
@Test
public void completeWithSignal() {
// 填写工单->审批工单(不完成,直接发出信号)->修改工单->填写工单->审批工单->结束
// 订阅信号
/*List<Execution> changeSignalList = runtimeService.createExecutionQuery().signalEventSubscriptionName("changeSignalA").list();
System.out.println(changeSignalList);
System.out.println(changeSignalList.size());*/
// taskService.complete("1035007"); // 填写工单
runtimeService.signalEventReceived("changeSignalA"); // 审批工单(不完成,直接发出信号)
// taskService.complete("487503"); // 修改工单
// taskService.complete("490002"); // 填写工单
// taskService.complete("492504"); // 审批工单->结束
}

后续就可以继续按照正常流程来完成任务了。
版权声明:本文为wang0907原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。