1 组任务

1.1 概述

  • 在流程定义中的任务结点的assignee固定设置任务负责人,如果临时任务负责人变更则需要修改流程定义,系统的可扩展性差。针对这种情况可以给任务设置多个候选人,可以从候选人中选择参与者来完成任务。

1.2 设置任务候选人

  • 在流程图中任务结点的配置中设置Candidate users,多个候选人之间用逗号隔开。

设置任务候选人.png

  • 查看holiday.bpmn文件:
  1. <process id="holiday" name="请假申请流程" isExecutable="true">
  2. <startEvent id="startevent1" name="开始"></startEvent>
  3. <userTask id="usertask1" name="填写请假申请单" activiti:assignee="张三"></userTask>
  4. <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
  5. <userTask id="usertask2" name="部门经理审批" activiti:candidateUsers="李四,王五"></userTask>
  6. <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
  7. <userTask id="usertask3" name="总经理审批" activiti:assignee="赵六"></userTask>
  8. <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="usertask3"></sequenceFlow>
  9. <endEvent id="endevent1" name="结束"></endEvent>
  10. <sequenceFlow id="flow4" sourceRef="usertask3" targetRef="endevent1"></sequenceFlow>
  11. </process>
  • 我们可以看到部门经理审批的审核人已经设置为”李四,王五”这样的一组候选人了。

1.3 组任务的办理流程

  • Activiti7进阶之组任务和网关 - 图2查询组任务:
    • 指定候选人,查询该候选人当前的待办任务。
    • 候选人不能办理任务。
  • Activiti7进阶之组任务和网关 - 图3拾取(claim)任务:
    • 该组任务的所有候选人都能拾取任务。
    • 所谓的拾取任务就是将候选热的组任务变成个人任务,即原来的候选人变成了任务的负责人。
    • 如果拾取任务后不想办理任务,只需要将已经拾取的个人任务归还到组里面,那么此时的个人任务将变为组任务。
  • Activiti7进阶之组任务和网关 - 图4查询个人任务:
    • 查询方式同个人任务部分,根据assignee查询用户负责的个人任务。
  • Activiti7进阶之组任务和网关 - 图5办理个人任务。

1.4 组任务办理流程的应用示例

1.4.1 准备工作

  • 创建请假流程的BPMN文件(其中填写请假申请单的assignee是张三,部门经理审批的candidate users是李四,王五,总经理审批的assignee是赵六):

创建请假申请流程的bmpn文件.jpg

  • 部署流程定义以及启动流程实例:
  1. package com.sunxiaping;
  2. import org.activiti.engine.ProcessEngine;
  3. import org.activiti.engine.ProcessEngineConfiguration;
  4. import org.activiti.engine.RepositoryService;
  5. import org.activiti.engine.RuntimeService;
  6. import org.activiti.engine.repository.Deployment;
  7. import org.activiti.engine.runtime.ProcessInstance;
  8. import org.junit.Before;
  9. import org.junit.Test;
  10. /**
  11. * @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
  12. * @version 1.0
  13. * 2020-08-10 21:37
  14. */
  15. public class GroupTest {
  16. ProcessEngine processEngine = null;
  17. @Before
  18. public void before() {
  19. ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
  20. processEngine = configuration.buildProcessEngine();
  21. }
  22. @Test
  23. public void after() {
  24. if (processEngine != null) {
  25. processEngine.close();
  26. }
  27. }
  28. /**
  29. * 部署流程定义
  30. */
  31. @Test
  32. public void testDeployment() {
  33. RepositoryService repositoryService = processEngine.getRepositoryService();
  34. Deployment deployment = repositoryService.createDeployment()
  35. .addClasspathResource("diagram/holiday.bpmn")
  36. .addClasspathResource("diagram/holiday.png")
  37. .name("请假申请流程")
  38. .deploy();
  39. String id = deployment.getId();
  40. System.out.println("流程部署的id = " + id);
  41. String name = deployment.getName();
  42. System.out.println("流程部署的名称 = " + name);
  43. }
  44. /**
  45. * 启动流程实例
  46. */
  47. @Test
  48. public void testStartProcessInstance() {
  49. String processDefinitionKey = "holiday";
  50. RuntimeService runtimeService = processEngine.getRuntimeService();
  51. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
  52. String id = processInstance.getId();
  53. System.out.println("流程实例的id = " + id);
  54. }
  55. }

1.4.2 张三完成请假申请任务

  • 示例:
  1. package com.sunxiaping;
  2. import org.activiti.engine.*;
  3. import org.activiti.engine.repository.Deployment;
  4. import org.activiti.engine.runtime.ProcessInstance;
  5. import org.activiti.engine.task.Task;
  6. import org.junit.Before;
  7. import org.junit.Test;
  8. import java.util.List;
  9. /**
  10. * @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
  11. * @version 1.0
  12. * 2020-08-10 21:37
  13. */
  14. public class GroupTest {
  15. ProcessEngine processEngine = null;
  16. @Before
  17. public void before() {
  18. ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
  19. processEngine = configuration.buildProcessEngine();
  20. }
  21. @Test
  22. public void after() {
  23. if (processEngine != null) {
  24. processEngine.close();
  25. }
  26. }
  27. /**
  28. * 部署流程定义
  29. */
  30. @Test
  31. public void testDeployment() {
  32. RepositoryService repositoryService = processEngine.getRepositoryService();
  33. Deployment deployment = repositoryService.createDeployment()
  34. .addClasspathResource("diagram/holiday.bpmn")
  35. .addClasspathResource("diagram/holiday.png")
  36. .name("请假申请流程")
  37. .deploy();
  38. String id = deployment.getId();
  39. System.out.println("流程部署的id = " + id);
  40. String name = deployment.getName();
  41. System.out.println("流程部署的名称 = " + name);
  42. }
  43. /**
  44. * 启动流程实例
  45. */
  46. @Test
  47. public void testStartProcessInstance() {
  48. String processDefinitionKey = "holiday";
  49. RuntimeService runtimeService = processEngine.getRuntimeService();
  50. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
  51. String id = processInstance.getId();
  52. System.out.println("流程实例的id = " + id);
  53. }
  54. /**
  55. * 张三完成请假申请任务
  56. */
  57. @Test
  58. public void testTaskZhangsan() {
  59. String processDefinitionKey = "holiday";
  60. String assignee = "张三";
  61. TaskService taskService = processEngine.getTaskService();
  62. List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
  63. for (Task task : taskList) {
  64. String taskId = task.getId();
  65. System.out.println("任务的id = " + taskId);
  66. taskService.complete(taskId);
  67. }
  68. }
  69. }

1.4.3 李四查询组任务

  • 示例:
  1. package com.sunxiaping;
  2. import org.activiti.engine.*;
  3. import org.activiti.engine.repository.Deployment;
  4. import org.activiti.engine.runtime.ProcessInstance;
  5. import org.activiti.engine.task.Task;
  6. import org.junit.Before;
  7. import org.junit.Test;
  8. import java.util.List;
  9. /**
  10. * @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
  11. * @version 1.0
  12. * 2020-08-10 21:37
  13. */
  14. public class GroupTest {
  15. ProcessEngine processEngine = null;
  16. @Before
  17. public void before() {
  18. ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
  19. processEngine = configuration.buildProcessEngine();
  20. }
  21. @Test
  22. public void after() {
  23. if (processEngine != null) {
  24. processEngine.close();
  25. }
  26. }
  27. /**
  28. * 部署流程定义
  29. */
  30. @Test
  31. public void testDeployment() {
  32. RepositoryService repositoryService = processEngine.getRepositoryService();
  33. Deployment deployment = repositoryService.createDeployment()
  34. .addClasspathResource("diagram/holiday.bpmn")
  35. .addClasspathResource("diagram/holiday.png")
  36. .name("请假申请流程")
  37. .deploy();
  38. String id = deployment.getId();
  39. System.out.println("流程部署的id = " + id);
  40. String name = deployment.getName();
  41. System.out.println("流程部署的名称 = " + name);
  42. }
  43. /**
  44. * 启动流程实例
  45. */
  46. @Test
  47. public void testStartProcessInstance() {
  48. String processDefinitionKey = "holiday";
  49. RuntimeService runtimeService = processEngine.getRuntimeService();
  50. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
  51. String id = processInstance.getId();
  52. System.out.println("流程实例的id = " + id);
  53. }
  54. /**
  55. * 张三完成请假申请任务
  56. */
  57. @Test
  58. public void testTaskZhangsan() {
  59. String processDefinitionKey = "holiday";
  60. String assignee = "张三";
  61. TaskService taskService = processEngine.getTaskService();
  62. List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
  63. for (Task task : taskList) {
  64. String taskId = task.getId();
  65. System.out.println("任务的id = " + taskId);
  66. taskService.complete(taskId);
  67. }
  68. }
  69. /**
  70. * 查询候选人组任务
  71. */
  72. @Test
  73. public void testQueryCandidateGroupTask() {
  74. String processDefinitionKey = "holiday";
  75. String candidateUser = "李四";
  76. TaskService taskService = processEngine.getTaskService();
  77. //查询组任务
  78. List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
  79. for (Task task : taskList) {
  80. String taskId = task.getId();
  81. System.out.println("任务的id = " + taskId);
  82. String processInstanceId = task.getProcessInstanceId();
  83. System.out.println("流程实例的id = " + processInstanceId);
  84. String name = task.getName();
  85. System.out.println("任务名称 = " + name);
  86. String assignee = task.getAssignee(); //null,说明当前的张三只是一个候选人,不是任务的负责人
  87. System.out.println("任务的负责人是 = " + assignee);
  88. }
  89. }
  90. }

1.4.4 李四拾取任务

  • 示例:
  1. package com.sunxiaping;
  2. import org.activiti.engine.*;
  3. import org.activiti.engine.repository.Deployment;
  4. import org.activiti.engine.runtime.ProcessInstance;
  5. import org.activiti.engine.task.Task;
  6. import org.junit.Before;
  7. import org.junit.Test;
  8. import java.util.List;
  9. /**
  10. * @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
  11. * @version 1.0
  12. * 2020-08-10 21:37
  13. */
  14. public class GroupTest {
  15. ProcessEngine processEngine = null;
  16. @Before
  17. public void before() {
  18. ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
  19. processEngine = configuration.buildProcessEngine();
  20. }
  21. @Test
  22. public void after() {
  23. if (processEngine != null) {
  24. processEngine.close();
  25. }
  26. }
  27. /**
  28. * 部署流程定义
  29. */
  30. @Test
  31. public void testDeployment() {
  32. RepositoryService repositoryService = processEngine.getRepositoryService();
  33. Deployment deployment = repositoryService.createDeployment()
  34. .addClasspathResource("diagram/holiday.bpmn")
  35. .addClasspathResource("diagram/holiday.png")
  36. .name("请假申请流程")
  37. .deploy();
  38. String id = deployment.getId();
  39. System.out.println("流程部署的id = " + id);
  40. String name = deployment.getName();
  41. System.out.println("流程部署的名称 = " + name);
  42. }
  43. /**
  44. * 启动流程实例
  45. */
  46. @Test
  47. public void testStartProcessInstance() {
  48. String processDefinitionKey = "holiday";
  49. RuntimeService runtimeService = processEngine.getRuntimeService();
  50. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
  51. String id = processInstance.getId();
  52. System.out.println("流程实例的id = " + id);
  53. }
  54. /**
  55. * 张三完成请假申请任务
  56. */
  57. @Test
  58. public void testTaskZhangsan() {
  59. String processDefinitionKey = "holiday";
  60. String assignee = "张三";
  61. TaskService taskService = processEngine.getTaskService();
  62. List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
  63. for (Task task : taskList) {
  64. String taskId = task.getId();
  65. System.out.println("任务的id = " + taskId);
  66. taskService.complete(taskId);
  67. }
  68. }
  69. /**
  70. * 查询候选人组任务
  71. */
  72. @Test
  73. public void testQueryCandidateGroupTask() {
  74. String processDefinitionKey = "holiday";
  75. String candidateUser = "李四";
  76. TaskService taskService = processEngine.getTaskService();
  77. //查询组任务
  78. List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
  79. for (Task task : taskList) {
  80. String taskId = task.getId();
  81. System.out.println("任务的id = " + taskId);
  82. String processInstanceId = task.getProcessInstanceId();
  83. System.out.println("流程实例的id = " + processInstanceId);
  84. String name = task.getName();
  85. System.out.println("任务名称 = " + name);
  86. String assignee = task.getAssignee(); //null,说明当前的张三只是一个候选人,不是任务的负责人
  87. System.out.println("任务的负责人是 = " + assignee);
  88. }
  89. }
  90. /**
  91. * 用户拾取组任务:将候选人的组任务,变成个人任务。
  92. * 注意:
  93. * ①即使该用户不是候选人也能拾取,建议拾取的时候校验是否有资格拾取任务。
  94. * ②组任务拾取之后,该任务就有负责人了,通过候选人将查询不到该任务
  95. */
  96. @Test
  97. public void testClaimTask() {
  98. String processDefinitionKey = "holiday";
  99. String candidateUser = "李四";
  100. TaskService taskService = processEngine.getTaskService();
  101. //查询组任务
  102. List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
  103. for (Task task : taskList) {
  104. String taskId = task.getId();
  105. System.out.println("任务的id = " + taskId);
  106. taskService.claim(taskId,candidateUser);
  107. System.out.println("任务拾取完毕");
  108. }
  109. }
  110. }

1.4.5 李四查询任务并完成任务

  • 示例:
  1. package com.sunxiaping;
  2. import org.activiti.engine.*;
  3. import org.activiti.engine.repository.Deployment;
  4. import org.activiti.engine.runtime.ProcessInstance;
  5. import org.activiti.engine.task.Task;
  6. import org.junit.Before;
  7. import org.junit.Test;
  8. import java.util.List;
  9. /**
  10. * @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
  11. * @version 1.0
  12. * 2020-08-10 21:37
  13. */
  14. public class GroupTest {
  15. ProcessEngine processEngine = null;
  16. @Before
  17. public void before() {
  18. ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
  19. processEngine = configuration.buildProcessEngine();
  20. }
  21. @Test
  22. public void after() {
  23. if (processEngine != null) {
  24. processEngine.close();
  25. }
  26. }
  27. /**
  28. * 部署流程定义
  29. */
  30. @Test
  31. public void testDeployment() {
  32. RepositoryService repositoryService = processEngine.getRepositoryService();
  33. Deployment deployment = repositoryService.createDeployment()
  34. .addClasspathResource("diagram/holiday.bpmn")
  35. .addClasspathResource("diagram/holiday.png")
  36. .name("请假申请流程")
  37. .deploy();
  38. String id = deployment.getId();
  39. System.out.println("流程部署的id = " + id);
  40. String name = deployment.getName();
  41. System.out.println("流程部署的名称 = " + name);
  42. }
  43. /**
  44. * 启动流程实例
  45. */
  46. @Test
  47. public void testStartProcessInstance() {
  48. String processDefinitionKey = "holiday";
  49. RuntimeService runtimeService = processEngine.getRuntimeService();
  50. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
  51. String id = processInstance.getId();
  52. System.out.println("流程实例的id = " + id);
  53. }
  54. /**
  55. * 张三完成请假申请任务
  56. */
  57. @Test
  58. public void testTaskZhangsan() {
  59. String processDefinitionKey = "holiday";
  60. String assignee = "张三";
  61. TaskService taskService = processEngine.getTaskService();
  62. List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
  63. for (Task task : taskList) {
  64. String taskId = task.getId();
  65. System.out.println("任务的id = " + taskId);
  66. taskService.complete(taskId);
  67. }
  68. }
  69. /**
  70. * 查询候选人组任务
  71. */
  72. @Test
  73. public void testQueryCandidateGroupTask() {
  74. String processDefinitionKey = "holiday";
  75. String candidateUser = "李四";
  76. TaskService taskService = processEngine.getTaskService();
  77. //查询组任务
  78. List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
  79. for (Task task : taskList) {
  80. String taskId = task.getId();
  81. System.out.println("任务的id = " + taskId);
  82. String processInstanceId = task.getProcessInstanceId();
  83. System.out.println("流程实例的id = " + processInstanceId);
  84. String name = task.getName();
  85. System.out.println("任务名称 = " + name);
  86. String assignee = task.getAssignee(); //null,说明当前的张三只是一个候选人,不是任务的负责人
  87. System.out.println("任务的负责人是 = " + assignee);
  88. }
  89. }
  90. /**
  91. * 用户拾取组任务:将候选人的组任务,变成个人任务。
  92. * 注意:
  93. * ①即使该用户不是候选人也能拾取,建议拾取的时候校验是否有资格拾取任务。
  94. * ②组任务拾取之后,该任务就有负责人了,通过候选人将查询不到该任务
  95. */
  96. @Test
  97. public void testClaimTask() {
  98. String processDefinitionKey = "holiday";
  99. String candidateUser = "李四";
  100. TaskService taskService = processEngine.getTaskService();
  101. //查询组任务
  102. List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
  103. for (Task task : taskList) {
  104. String taskId = task.getId();
  105. System.out.println("任务的id = " + taskId);
  106. taskService.claim(taskId,candidateUser);
  107. System.out.println("任务拾取完毕");
  108. }
  109. }
  110. /**
  111. * 查询任务并完成任务
  112. */
  113. @Test
  114. public void testCompleteTask(){
  115. String processDefinitionKey = "holiday";
  116. String assignee = "李四";
  117. TaskService taskService = processEngine.getTaskService();
  118. List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
  119. for (Task task : taskList) {
  120. String taskId = task.getId();
  121. System.out.println("任务的id = " + taskId);
  122. taskService.complete(taskId);
  123. }
  124. }
  125. }

1.4.6 当前用户归还组任务

  • 示例:
  1. package com.sunxiaping;
  2. import org.activiti.engine.*;
  3. import org.activiti.engine.repository.Deployment;
  4. import org.activiti.engine.runtime.ProcessInstance;
  5. import org.activiti.engine.task.Task;
  6. import org.junit.Before;
  7. import org.junit.Test;
  8. import java.util.List;
  9. /**
  10. * @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
  11. * @version 1.0
  12. * 2020-08-10 21:37
  13. */
  14. public class GroupTest {
  15. ProcessEngine processEngine = null;
  16. @Before
  17. public void before() {
  18. ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
  19. processEngine = configuration.buildProcessEngine();
  20. }
  21. @Test
  22. public void after() {
  23. if (processEngine != null) {
  24. processEngine.close();
  25. }
  26. }
  27. /**
  28. * 部署流程定义
  29. */
  30. @Test
  31. public void testDeployment() {
  32. RepositoryService repositoryService = processEngine.getRepositoryService();
  33. Deployment deployment = repositoryService.createDeployment()
  34. .addClasspathResource("diagram/holiday.bpmn")
  35. .addClasspathResource("diagram/holiday.png")
  36. .name("请假申请流程")
  37. .deploy();
  38. String id = deployment.getId();
  39. System.out.println("流程部署的id = " + id);
  40. String name = deployment.getName();
  41. System.out.println("流程部署的名称 = " + name);
  42. }
  43. /**
  44. * 启动流程实例
  45. */
  46. @Test
  47. public void testStartProcessInstance() {
  48. String processDefinitionKey = "holiday";
  49. RuntimeService runtimeService = processEngine.getRuntimeService();
  50. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
  51. String id = processInstance.getId();
  52. System.out.println("流程实例的id = " + id);
  53. }
  54. /**
  55. * 张三完成请假申请任务
  56. */
  57. @Test
  58. public void testTaskZhangsan() {
  59. String processDefinitionKey = "holiday";
  60. String assignee = "张三";
  61. TaskService taskService = processEngine.getTaskService();
  62. List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
  63. for (Task task : taskList) {
  64. String taskId = task.getId();
  65. System.out.println("任务的id = " + taskId);
  66. taskService.complete(taskId);
  67. }
  68. }
  69. /**
  70. * 查询候选人组任务
  71. */
  72. @Test
  73. public void testQueryCandidateGroupTask() {
  74. String processDefinitionKey = "holiday";
  75. String candidateUser = "李四";
  76. TaskService taskService = processEngine.getTaskService();
  77. //查询组任务
  78. List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
  79. for (Task task : taskList) {
  80. String taskId = task.getId();
  81. System.out.println("任务的id = " + taskId);
  82. String processInstanceId = task.getProcessInstanceId();
  83. System.out.println("流程实例的id = " + processInstanceId);
  84. String name = task.getName();
  85. System.out.println("任务名称 = " + name);
  86. String assignee = task.getAssignee(); //null,说明当前的张三只是一个候选人,不是任务的负责人
  87. System.out.println("任务的负责人是 = " + assignee);
  88. }
  89. }
  90. /**
  91. * 用户拾取组任务:将候选人的组任务,变成个人任务。
  92. * 注意:
  93. * ①即使该用户不是候选人也能拾取,建议拾取的时候校验是否有资格拾取任务。
  94. * ②组任务拾取之后,该任务就有负责人了,通过候选人将查询不到该任务
  95. */
  96. @Test
  97. public void testClaimTask() {
  98. String processDefinitionKey = "holiday";
  99. String candidateUser = "李四";
  100. TaskService taskService = processEngine.getTaskService();
  101. //查询组任务
  102. List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
  103. for (Task task : taskList) {
  104. String taskId = task.getId();
  105. System.out.println("任务的id = " + taskId);
  106. taskService.claim(taskId,candidateUser);
  107. System.out.println("任务拾取完毕");
  108. }
  109. }
  110. /**
  111. * 归还组任务
  112. * 说明:建议归还任务前校验用户是否是该任务的负责人,也可以通过setAssignee方法将任务委托给其他用户负责,注意被委托的用户可以不是候选人(建议不要这么做)
  113. */
  114. @Test
  115. public void testUnclaim(){
  116. String processDefinitionKey = "holiday";
  117. String assignee = "李四";
  118. TaskService taskService = processEngine.getTaskService();
  119. List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
  120. for (Task task : taskList) {
  121. String taskId = task.getId();
  122. System.out.println("任务的id = " + taskId);
  123. // 如果设置为null,归还组任务,该 任务没有负责人
  124. taskService.setAssignee(taskId, null);
  125. }
  126. }
  127. // /**
  128. // * 查询任务并完成任务
  129. // */
  130. // @Test
  131. // public void testCompleteTask(){
  132. // String processDefinitionKey = "holiday";
  133. //
  134. // String assignee = "李四";
  135. //
  136. // TaskService taskService = processEngine.getTaskService();
  137. //
  138. // List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
  139. //
  140. // for (Task task : taskList) {
  141. // String taskId = task.getId();
  142. // System.out.println("任务的id = " + taskId);
  143. //
  144. // taskService.complete(taskId);
  145. // }
  146. // }
  147. }

1.4.7 任务交接

  • 任务交接就是任务负责人将任务交给其它候选人办理该任务。
  • 示例:
  1. package com.sunxiaping;
  2. import org.activiti.engine.*;
  3. import org.activiti.engine.repository.Deployment;
  4. import org.activiti.engine.runtime.ProcessInstance;
  5. import org.activiti.engine.task.Task;
  6. import org.junit.Before;
  7. import org.junit.Test;
  8. import java.util.List;
  9. /**
  10. * @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
  11. * @version 1.0
  12. * 2020-08-10 21:37
  13. */
  14. public class GroupTest {
  15. ProcessEngine processEngine = null;
  16. @Before
  17. public void before() {
  18. ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
  19. processEngine = configuration.buildProcessEngine();
  20. }
  21. @Test
  22. public void after() {
  23. if (processEngine != null) {
  24. processEngine.close();
  25. }
  26. }
  27. /**
  28. * 部署流程定义
  29. */
  30. @Test
  31. public void testDeployment() {
  32. RepositoryService repositoryService = processEngine.getRepositoryService();
  33. Deployment deployment = repositoryService.createDeployment()
  34. .addClasspathResource("diagram/holiday.bpmn")
  35. .addClasspathResource("diagram/holiday.png")
  36. .name("请假申请流程")
  37. .deploy();
  38. String id = deployment.getId();
  39. System.out.println("流程部署的id = " + id);
  40. String name = deployment.getName();
  41. System.out.println("流程部署的名称 = " + name);
  42. }
  43. /**
  44. * 启动流程实例
  45. */
  46. @Test
  47. public void testStartProcessInstance() {
  48. String processDefinitionKey = "holiday";
  49. RuntimeService runtimeService = processEngine.getRuntimeService();
  50. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
  51. String id = processInstance.getId();
  52. System.out.println("流程实例的id = " + id);
  53. }
  54. /**
  55. * 张三完成请假申请任务
  56. */
  57. @Test
  58. public void testTaskZhangsan() {
  59. String processDefinitionKey = "holiday";
  60. String assignee = "张三";
  61. TaskService taskService = processEngine.getTaskService();
  62. List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
  63. for (Task task : taskList) {
  64. String taskId = task.getId();
  65. System.out.println("任务的id = " + taskId);
  66. taskService.complete(taskId);
  67. }
  68. }
  69. /**
  70. * 查询候选人组任务
  71. */
  72. @Test
  73. public void testQueryCandidateGroupTask() {
  74. String processDefinitionKey = "holiday";
  75. String candidateUser = "李四";
  76. TaskService taskService = processEngine.getTaskService();
  77. //查询组任务
  78. List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
  79. for (Task task : taskList) {
  80. String taskId = task.getId();
  81. System.out.println("任务的id = " + taskId);
  82. String processInstanceId = task.getProcessInstanceId();
  83. System.out.println("流程实例的id = " + processInstanceId);
  84. String name = task.getName();
  85. System.out.println("任务名称 = " + name);
  86. String assignee = task.getAssignee(); //null,说明当前的张三只是一个候选人,不是任务的负责人
  87. System.out.println("任务的负责人是 = " + assignee);
  88. }
  89. }
  90. /**
  91. * 用户拾取组任务:将候选人的组任务,变成个人任务。
  92. * 注意:
  93. * ①即使该用户不是候选人也能拾取,建议拾取的时候校验是否有资格拾取任务。
  94. * ②组任务拾取之后,该任务就有负责人了,通过候选人将查询不到该任务
  95. */
  96. @Test
  97. public void testClaimTask() {
  98. String processDefinitionKey = "holiday";
  99. String candidateUser = "李四";
  100. TaskService taskService = processEngine.getTaskService();
  101. //查询组任务
  102. List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
  103. for (Task task : taskList) {
  104. String taskId = task.getId();
  105. System.out.println("任务的id = " + taskId);
  106. taskService.claim(taskId, candidateUser);
  107. System.out.println("任务拾取完毕");
  108. }
  109. }
  110. /**
  111. * 任务交接
  112. */
  113. @Test
  114. public void testExchangeTask() {
  115. String processDefinitionKey = "holiday";
  116. String assignee = "李四";
  117. TaskService taskService = processEngine.getTaskService();
  118. List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
  119. for (Task task : taskList) {
  120. String taskId = task.getId();
  121. System.out.println("任务的id = " + taskId);
  122. taskService.setAssignee(taskId, "王五");
  123. }
  124. }
  125. // /**
  126. // * 归还组任务
  127. // * 说明:建议归还任务前校验用户是否是该任务的负责人,也可以通过setAssignee方法将任务委托给其他用户负责,注意被委托的用户可以不是候选人(建议不要这么做)
  128. // */
  129. // @Test
  130. // public void testUnclaim() {
  131. // String processDefinitionKey = "holiday";
  132. //
  133. // String assignee = "李四";
  134. //
  135. // TaskService taskService = processEngine.getTaskService();
  136. //
  137. // List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
  138. //
  139. // for (Task task : taskList) {
  140. // String taskId = task.getId();
  141. // System.out.println("任务的id = " + taskId);
  142. //
  143. // // 如果设置为null,归还组任务,该 任务没有负责人
  144. // taskService.setAssignee(taskId, null);
  145. // }
  146. // }
  147. // /**
  148. // * 查询任务并完成任务
  149. // */
  150. // @Test
  151. // public void testCompleteTask(){
  152. // String processDefinitionKey = "holiday";
  153. //
  154. // String assignee = "李四";
  155. //
  156. // TaskService taskService = processEngine.getTaskService();
  157. //
  158. // List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
  159. //
  160. // for (Task task : taskList) {
  161. // String taskId = task.getId();
  162. // System.out.println("任务的id = " + taskId);
  163. //
  164. // taskService.complete(taskId);
  165. // }
  166. // }
  167. }

1.4.8 数据库表操作

  • act_ru_task:任务执行表,记录当前执行的任务,由于该任务当前是组任务,所有的assignee为空,当拾取任务后该字段就是拾取用户的id。

act_ru_task任务执行表.jpg

  • act_ru_identitylink:任务参与者,记录当前参与任务用户或组,当前任务如果设置了候选人,会向该表插入候选人记录,有几个候选人就插入几个。

act_ru_identitylink任务参与者表.jpg

  • act_ru_identitylink对应一张历史表act_hi_identitylink,向act_ru_identitylink插入记录的同时也会向历史表插入记录。

act_hi_identitylink任务参与者历史表.jpg

2 网关

2.1 排他网关

2.1.1 什么是排他网关?

  • 排他网关(异或网关或基于数据的排他网关),用来在流程中实现决策。当流程执行到这个网关的时候,所有分支都会判断条件是否为true,如果为true则执行该分支。

注意:

  • 排他网关只会选择一个为true的分支执行(即使有两个分支条件都为true,排他网关也只会选择一条分支去执行)。

2.1.2 流程定义

  • 如果不用排他网关,如果条件都满足或都不满足,流程就结束(异常结束)了。

不使用排他网关.png

  • 如果使用了排他网关来决定分支的走向,如下:

使用排他网关.png

注意:

  • 如果从网关出去的所有分支都不满足条件,系统将抛出异常。换言之,经过排他网关有且仅有一条分支。

2.2 并行网关

2.2.1 什么是并行网关?

  • 并行网关允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进入和外出的顺序流的。
  • Fork分支:并行后的所有外出顺序流,为每个顺序流都创建一个并行分支。
  • Join汇聚:所有到达并行网关,在此等待的进入分支,直到所有进入顺序流的分支都到达以后,流程就会通过汇聚网关。

注意:

  • 如果桶一个并行网关有多个进入和多个外出顺序流,它就同时具有分支和汇聚功能。这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。
  • 和其他网关不同的是,并行网关并不会解析条件。即使顺序流中定义了条件,也会被忽略。

2.2.2 流程定义

并行网关.png

2.3 包含网关

2.3.1 什么是包含网关?

  • 包含网关可以看做是排他网关和并行网关的结合体。和排他网关一样,你可以在外出顺序流上定义条件,包含网关会解析它们。但是主要的区别是包含网关可以选择多于一条顺序流,这和并行网关一样。
  • 包含网关的功能是基于进入和外出顺序流的:
  • 分支:所有外出顺序流的条件都会被解析,结果为true的顺序流会以并行方式继续执行,会为每个顺序流创建一个分支。
  • 汇聚:所有并行分支到达包含网关,会进入等待状态,直到每个包含流程的进入顺序流的分支都到达。这是和并行网关的最大不同。换言之,包含网关只会等待被选中执行了的进入顺序流。在汇聚之后,流程会穿过包含网关继续执行。

2.3.2 流程定义

  • 企业体检流程,公司全体员工进行常规项检查、抽血化验,公司管理层除常规检查和抽血化验还要进行增加项检查。

包含网关.png