Activiti学习之对用户任务进行操作

在Activiti中任务是一个重要的概念,业务需求可以分为不同任务类型:
- 用户任务
- 脚本任务
- WebService任务
- 邮件任务
- Mule任务
- ·····
下面来介绍一下用户任务的使用方法。

1、创建用户和用户组

创建用户信息和组信息及其关联信息请参照上一篇教程:Activiti学习之用户与组

2、新建流程图

通过Eclipse的activiti插件绘制的流程图,增加一个用户任务,并指定任务的候选组为group1,该用户组下的用户都可以领取并完成该任务:
Activiti学习之对用户任务进行操作_第1张图片
XML代码如下:


<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文件夹,运行程序
Activiti学习之对用户任务进行操作_第2张图片

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 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 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 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 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完成");
        }
    }
}

通过上面的代码就可以完成整个任务的流程
- 启动流程
- 查询任务
- 领取任务
- 完成任务
- 流程结束

你可能感兴趣的:(activiti)