💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
``` 组任务办理流程:查询组任务->拾取(claim)任务->查询个人待办任务->办理个人任务 除此之外还可以进行任务归还、任务交接。 ``` :-: ![](https://img.kancloud.cn/31/99/3199fc5fcb0ba433726e05cedff89f53_1233x205.png) 文件:`evection-candidate.bpmn` 示例源码:*/activit-01/src/test/java/-/TestCandidate* 代码如下: ```java /** * 测试候选人 */ public class TestCandidate { /** * 流程部署 */ @Test public void testDeployment() { //1、创建ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2、获取RepositoryServcie RepositoryService repositoryService = processEngine.getRepositoryService(); //3、使用service进行流程的部署,定义一个流程的名字,把bpmn和png部署到数据中 Deployment deploy = repositoryService.createDeployment() .name("出差申请流程-Candidate") .addClasspathResource("bpmn/evection-candidate.bpmn") .addClasspathResource("bpmn/image/evection-candidate.png") .deploy(); //4、输出部署信息 System.out.println("流程部署id=" + deploy.getId()); System.out.println("流程部署名字=" + deploy.getName()); } /** * 启动流程 */ @Test public void testStartProcess() { //获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取RunTimeService RuntimeService runtimeService = processEngine.getRuntimeService(); //流程定义Key String key = "testCandidate"; //启动流程 runtimeService.startProcessInstanceByKey(key); } /** * >>>>>>>>>>1. 查询组任务<<<<<<<<<< * 1)查询该候选人当前的待办任务。 * 2)候选人不能立即办理任务。 */ @Test public void findGroupTaskList() { //流程定义的Key String key = "testCandidate"; //任务候选人 String candidateUser = "wangwu"; //获取引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService TaskService taskService = processEngine.getTaskService(); //查询组任务 List<Task> taskList = taskService.createTaskQuery() .processDefinitionKey(key) .taskCandidateUser(candidateUser) //根据候选人查询任务 .list(); for (Task task : taskList) { System.out.println("流程实例ID=" + task.getProcessInstanceId()); System.out.println("任务id=" + task.getId()); System.out.println("任务负责人=" + task.getAssignee()); System.out.println("任务名称=" + task.getName()); System.out.println(); } //流程实例ID=35001 //任务id=37502 //任务负责人=null //任务名称=部门经理审批 } /** * >>>>>>>>>>2. 候选人拾取任务<<<<<<<<<< * 1)该组任务的所有候选人都能拾取。 * 2)将候选人的组任务,变成个人任务。原来候选人就变成了该任务的负责人。 * 3)如果拾取后不想办理该任务, 需要将已经拾取的个人任务归还到组里边,将个人任务变成了组任务。 */ @Test public void claimTask() { //当前任务的id String taskId = "37502"; //任务候选人 String candidateUser = "wangwu"; //获取引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService TaskService taskService = processEngine.getTaskService(); //查询任务 Task task = taskService.createTaskQuery() .taskId(taskId) .taskCandidateUser(candidateUser) .singleResult(); if (task != null) { //拾取任务 taskService.claim(taskId, candidateUser); //taskid-37502-用户-wangwu-拾取任务完成 System.out.println("taskid-" + taskId + "-用户-" + candidateUser + "-拾取任务完成"); } else { System.out.println("taskid-" + taskId + "-用户-" + candidateUser + "-没有要拾取的任务"); } } /** * >>>>>>>>>>3. 查询个人待办任务<<<<<<<<<< */ @Test public void findPersonalTaskList() { //流程定义key String processDefinitionKey = "testCandidate"; //任务负责人 String assignee = "wangwu"; //获取processEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //创建TaskService TaskService taskService = processEngine.getTaskService(); List<Task> list = taskService.createTaskQuery() .processDefinitionKey(processDefinitionKey) .taskAssignee(assignee) .list(); for (Task task : list) { System.out.println("流程实例id:" + task.getProcessInstanceId()); System.out.println("任务id:" + task.getId()); System.out.println("任务负责人:" + task.getAssignee()); System.out.println("任务名称:" + task.getName()); System.out.println(); } //流程实例id:35001 //任务id:37502 //任务负责人:wangwu //任务名称:部门经理审批 } /** * >>>>>>>>>>4. 办理个人任务<<<<<<<<<< */ @Test public void completeTask() { //流程定义的Key String key = "testCandidate"; //任务负责人 String assingee = "wangwu"; //获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取taskservice TaskService taskService = processEngine.getTaskService(); //查询任务 Task task = taskService.createTaskQuery() .processDefinitionKey(key) .taskAssignee(assingee) .singleResult(); if (task != null) { //根据任务id来完成任务 taskService.complete(task.getId()); System.out.println(assingee + " 完成了任务,任务id=" + task.getId()); } else { System.out.println(assingee + "没有要完成的任务!"); } } /** * 任务的归还 * 1) 如果拾取任务后不想办理该任务, 需要将已经拾取的个人任务归还到组里边,将个人任务变成了组任务。 */ @Test public void testAssigneeToGroupTask() { //当前任务的id String taskId = "67502"; //任务负责人 String assignee = "wangwu"; //获取引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService TaskService taskService = processEngine.getTaskService(); //根据key 和负责人来查询任务 Task task = taskService.createTaskQuery() .taskId(taskId) .taskAssignee(assignee) .singleResult(); if (task != null) { //归还任务 ,就是把负责人设置为空 taskService.setAssignee(taskId, null); System.out.println("taskid-" + taskId + "-归还任务完成"); } else { System.out.println(assignee + "没有要归还的任务!"); } } /** * 任务的交接 */ @Test public void testAssigneeToCandidateUser() { //获取引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService TaskService taskService = processEngine.getTaskService(); //当前任务的id String taskId = "67502"; //任务负责人 String assignee = "wangwu"; //任务候选人 String candidateUser = "lisi"; //根据key 和负责人来查询任务 Task task = taskService.createTaskQuery() .taskId(taskId) .taskAssignee(assignee) .singleResult(); if (task != null) { //交接任务 ,就是把负责人 设置为空 taskService.setAssignee(taskId, candidateUser); System.out.println("taskid-" + taskId + "-交接任务完成"); } else { System.out.println(assignee + "没有要交接的任务!"); } } } ``` 数据库中查看: ```sql #任务执行表,记录当前执行的任务,当任务是组任务时,所有assignee为空,当拾取任务后该字段就是拾取用户的id mysql> select * from act_ru_task; +-------+------+---------------+---------------+-----------------------+--------------...------+-----. .. | ID_ | REV_ | EXECUTION_ID_ | PROC_INST_ID_ | PROC_DEF_ID_ | NAME_ | ...| ASSIGNEE_ ... +-------+------+---------------+---------------+-----------------------+--------------+-------------... | 50002 | 1 | 47502 | 47501 | testCandidate:1:32504 | 部门经理审批 ...| NULL |... +-------+------+---------------+---------------+-----------------------+--------------+-------------... #记录任务参与者 #记录当前参与任务用户或组,当前任务如果设置了候选人,会向该表插入候选人记录,有几个候选就插入几个 #与表act_ru_identitylink对应的还有一张历史表act_hi_identitylink, #向act_ru_identitylink插入记录的同时也会向历史表插入记录。 mysql> select * from act_ru_identitylink; +-------+------+-----------+-------------+----------+----------+---------------+--------------+ | ID_ | REV_ | GROUP_ID_ | TYPE_ | USER_ID_ | TASK_ID_ | PROC_INST_ID_ | PROC_DEF_ID_ | +-------+------+-----------+-------------+----------+----------+---------------+--------------+ | 47506 | 1 | NULL | participant | 汤姆 | NULL | 47501 | NULL | | 50003 | 1 | NULL | candidate | lisi | 50002 | NULL | NULL | | 50004 | 1 | NULL | participant | lisi | NULL | 47501 | NULL | | 50005 | 1 | NULL | candidate | wangwu | 50002 | NULL | NULL | | 50006 | 1 | NULL | participant | wangwu | NULL | 47501 | NULL | +-------+------+-----------+-------------+----------+----------+---------------+--------------+ ```