一:需求
在流程定义中在任务结点的 assignee 固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn 文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。
针对这种情况可以给任务设置多个候选人,可以从候选人中选择参与者来完成任务。
流程简介
第一步:查询组任务
指定候选人,查询该候选人当前的待办任务。候选人不能办理任务。
第二步:拾取(claim)任务
该组任务的所有候选人都能拾取。
将候选人的组任务,变成个人任务。原来候选人就变成了该任务的负责人。
如果拾取后不想办理该任务?
需要将已经拾取的个人任务归还到组里边,将个人任务变成了组任务。
第三步:查询个人任务
查询方式同个人任务部分,根据assignee 查询用户负责的个人任务。第四步:办理个人任务
二:设置任务候选人
三:实现
3.1前置方法
ProcessEngine processEngine; @Before public void connection() { ProcessEngineConfiguration processEngineConfigurationFromResource = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml"); processEngine = processEngineConfigurationFromResource.buildProcessEngine(); }
3.2流程部署
//1.流程部署 @Test public void createDeployment() { System.out.println(processEngine); RepositoryService repositoryService = processEngine.getRepositoryService(); Deployment deployment = repositoryService.createDeployment() .addClasspathResource("holiday.bpmn") .name("请假流程-组任务") .key("myHoliday") .deploy(); System.out.println(deployment.getName()); System.out.println(deployment.getKey()); System.out.println(deployment.getId()); }
3.3创建流程实例
//2.创建流程实例 @Test public void startProcessInstance() { RuntimeService runtimeService = processEngine.getRuntimeService(); //动态指定任务执行人 Map assigneesMap = new HashMap(); //请假人 assigneesMap.put("tianyan", "tianyan"); //部门经理 assigneesMap.put("douying", "douying"); assigneesMap.put("guo", "guo"); assigneesMap.put("xuediao", "xuediao"); //人事 assigneesMap.put("fenghe", "fenghe"); //设置请假天数 //赋值并启动 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1", assigneesMap); System.out.println(processInstance.getName()); System.out.println(processInstance.getDeploymentId()); System.out.println(processInstance.getActivityId()); }
3.4单人任务查询和处理任务
//3.单人任务查询和处理任务 @Test public void findPersonalTaskList() { TaskService taskService = processEngine.getTaskService(); List<Task> list = taskService.createTaskQuery() .processDefinitionKey("myProcess_1") .taskAssignee("fenghe").list(); Iterator<Task> iterator = list.iterator(); while (iterator.hasNext()) { Task next = iterator.next(); System.out.println(next); //4.处理任务 processEngine.getTaskService().complete(next.getId()); System.out.println("完成任务"); } }
3.5.组任务查询
@Test public void findGroupTaskList() { TaskService taskService = processEngine.getTaskService(); //任务没被拾取之前,任何候选人都可以查看 List<Task> list = taskService.createTaskQuery().processDefinitionKey("myProcess_1").taskCandidateUser("douying").list(); Iterator<Task> iterator = list.iterator(); while (iterator.hasNext()) { Task next = iterator.next(); System.out.println(next); } }
3.6任务拾取
@Test //5.任务拾取 public void claimTask() { TaskService taskService = processEngine.getTaskService(); Task task = taskService.createTaskQuery()// .taskId("7502") .taskCandidateUser("douying")//douying拾取任务 .singleResult(); if (task != null) { taskService.claim("7502", "douying"); System.out.println("任务拾取成功"); } }
3.7归还任务or交接任务
//6.归还任务or交接任务 @Test public void setAssigneeToGroupTask() { // 查询任务使用TaskService TaskService taskService = processEngine.getTaskService(); // 当前待办任务 String taskId = "7502"; // 任务负责人 String userId = "douying"; // 校验userId是否是taskId的负责人,如果是负责人才可以归还组任务 Task task = taskService.createTaskQuery().taskId(taskId) .taskAssignee(userId).singleResult(); if (task != null) { // 如果设置为null,归还组任务,该任务没有负责人,可以指定给其他的候选人(不存在的候选人也可以) taskService.setAssignee(taskId, null); } }