Activiti 开发案例之动态指派任务
- 2019 年 12 月 5 日
- 笔记
流程图

以上是一个请假的流程图,以下为流程任务节点描述:
- 员工发起请假流程
- 部门经理审批
- 同意则进入人事审批
- 拒绝则调整申请或者直接结束流程
- 人事审批通过则进入销假环节
- 人事审批拒绝则调整申请或者直接结束流程
- 员工销假结束流程
任务分配
员工发起申请
ProcessInstance process = runtimeService.startProcessInstanceByKey("leave",businessKey, variables); Task task = taskService.createTaskQuery().processInstanceId(process.getId()).active().singleResult(); //此时,应删除掉流程图中赋值的角色,否则会重复 taskService.addCandidateGroup(task.getId(),"部门经理");
部门经理审批
通过逻辑:
Map<String,Object> variables=new HashMap<String,Object>(); variables.put("approve", "true"); Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).active().singleResult(); //一定要认领任务之后,重新获取当前任务,然后分配角色。 taskService.claim(taskId, userId); taskService.complete(taskId, variables); task = taskService.createTaskQuery().processInstanceId(process.getId()).active().singleResult(); //此时,应删除掉流程图中赋值的角色,否则会重复 taskService.addCandidateGroup(task.getId(),"人事");
拒绝逻辑:
Map<String,Object> variables=new HashMap<String,Object>(); variables.put("approve", "false"); Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).active().singleResult(); //一定要认领任务之后,重新获取当前任务,然后分配角色。 taskService.claim(taskId, userId); taskService.complete(taskId, variables); task = taskService.createTaskQuery().processInstanceId(process.getId()).active().singleResult(); //applyId为申请人ID taskService.addCandidateUser(task.getId(),applyId);
待办任务
API 查询
TaskQuery taskQuery = taskService.createTaskQuery(); List<Task> list = taskQuery.taskCandidateOrAssigned(userId)
使用API的话,需要做视图映射。
SQL 查询
-- 多个用户或者角色可以用 IN select distinct RES.* from ACT_RU_TASK RES left join ACT_RU_IDENTITYLINK I on I.TASK_ID_ = RES.ID_ WHERE SUSPENSION_STATE_ = '1' AND ( RES.ASSIGNEE_ ='99' or (RES.ASSIGNEE_ is null AND ( I.USER_ID_ = '99' or I.GROUP_ID_ = '部门经理' )))
扩展
如果办理人想原地改派任务,可以使用以下API
:
/** * 删除指派人重新指派 */ taskService.deleteCandidateUser(taskId,"原用户ID"); taskService.addCandidateUser(taskId,"新用户ID");