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