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");