一: 需求
在流程定义中在任务结点的 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);
- }
- }
Activiti(四)任务组
来源: http://www.bubuko.com/infodetail-3496861.html