版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chq00788/article/details/76269398
在Activiti中任务是一个重要的概念,业务需求可以分为不同任务类型:
- 用户任务
- 脚本任务
- WebService任务
- 邮件任务
- Mule任务
- ·····
下面来介绍一下用户任务的使用方法。
1、创建用户和用户组
创建用户信息和组信息及其关联信息请参照上一篇教程:Activiti学习之用户与组
2、新建流程图
通过Eclipse的activiti插件绘制的流程图,增加一个用户任务,并指定任务的候选组为group1,该用户组下的用户都可以领取并完成该任务:
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: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">
<process id="userTaskProcess" name="user task process" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="User Task" activiti:candidateGroups="group1"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<endEvent id="endevent1" name="End"></endEvent>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_myProcess">
<bpmndi:BPMNPlane bpmnElement="userTaskProcess" id="BPMNPlane_myProcess">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="150.0" y="200.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
<omgdc:Bounds height="55.0" width="105.0" x="230.0" y="190.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="380.0" y="200.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="185.0" y="217.0"></omgdi:waypoint>
<omgdi:waypoint x="230.0" y="217.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="335.0" y="217.0"></omgdi:waypoint>
<omgdi:waypoint x="380.0" y="217.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
3、部署流程
将流程图文件放到项目当中的resources下的processes文件夹,运行程序
4、编写代码
利用spring boot 的单元测试来对该流程进行测试
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = SpringBootActivitiApplication.class)
public class UserTaskTest {
@Autowired
RuntimeService runtimeService;
@Autowired
TaskService taskService;
@Autowired
IdentityService identityService;
/**
* 启动流程
*/
@Test
public void testStartProcess() {
runtimeService.startProcessInstanceByKey("userTaskProcess");
}
/**
* 根据组查询任务
*/
@Test
public void testQueryTaskByGroup() {
List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("group1").list();
if (null != tasks && tasks.size() > 0) {
System.out.println(tasks.get(0).getName());
} else {
System.out.println("未查询到任务信息");
}
}
/**
* 根据用户查询任务
*/
@Test
public void testQueryTaskByAssignee() {
List<Task> tasks = taskService.createTaskQuery().taskAssignee("user1").list();
if (null != tasks && tasks.size() > 0) {
System.out.println(tasks.get(0).getName());
} else {
System.out.println("未查询到任务信息");
}
}
/**
* 领取任务
*/
@Test
public void testClaimTask() {
//根据用户ID查询任务信息
List<Task> tasks = taskService.createTaskQuery().taskCandidateOrAssigned("user1").list();
if (null != tasks && tasks.size() > 0) {
Task task = tasks.get(0);
//领取任务
taskService.claim(task.getId(), "user1");
} else {
System.out.println("未查询到任务信息");
}
}
/**
* 完成任务
*/
@Test
public void testCompleteTask() {
//查询任务执行人为user1的任务
List<Task> tasks = taskService.createTaskQuery().taskAssignee("user1").list();
if (null != tasks && tasks.size() > 0) {
Task task = tasks.get(0);
System.out.println(task.getName());
taskService.complete(task.getId());
System.out.println("任务:" + task.getName() + "已经被用户user1完成");
}
}
}
通过上面的代码就可以完成整个任务的流程
- 启动流程
- 查询任务
- 领取任务
- 完成任务
- 流程结束