package com.iailab.module.bpm.service.task; import com.iailab.framework.common.pojo.PageResult; import com.iailab.framework.common.util.collection.CollectionUtils; import com.iailab.module.bpm.controller.admin.task.vo.task.*; import com.iailab.module.bpm.enums.definition.BpmUserTaskTimeoutHandlerTypeEnum; import org.flowable.bpmn.model.UserTask; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.task.api.Task; import org.flowable.task.api.TaskInfo; import org.flowable.task.api.history.HistoricTaskInstance; import javax.validation.Valid; import java.util.Collection; import java.util.List; import java.util.Map; /** * æµç¨‹ä»»åŠ¡å®žä¾‹ Service æŽ¥å£ * * @author jason * @author 芋é“æºç */ public interface BpmTaskService { // ========== Query 查询相关方法 ========== /** * 获得待办的æµç¨‹ä»»åŠ¡åˆ†é¡µ * * @param userId ç”¨æˆ·ç¼–å· * @param pageReqVO 分页请求 * @return æµç¨‹ä»»åŠ¡åˆ†é¡µ */ PageResult<Task> getTaskTodoPage(Long userId, BpmTaskPageReqVO pageReqVO); /** * 获得用户在指定æµç¨‹ä¸‹ï¼Œé¦–个需è¦å¤„ç†ï¼ˆå¾…办)的任务 * * @param userId ç”¨æˆ·ç¼–å· * @param processInstanceId æµç¨‹å®žä¾‹ç¼–å· * @return 待办任务 */ BpmTaskRespVO getFirstTodoTask(Long userId, String processInstanceId); /** * 获得已办的æµç¨‹ä»»åŠ¡åˆ†é¡µ * * @param userId ç”¨æˆ·ç¼–å· * @param pageReqVO 分页请求 * @return æµç¨‹ä»»åŠ¡åˆ†é¡µ */ PageResult<HistoricTaskInstance> getTaskDonePage(Long userId, BpmTaskPageReqVO pageReqVO); /** * 获得全部的æµç¨‹ä»»åŠ¡åˆ†é¡µ * * @param userId ç”¨æˆ·ç¼–å· * @param pageReqVO 分页请求 * @return æµç¨‹ä»»åŠ¡åˆ†é¡µ */ PageResult<HistoricTaskInstance> getTaskPage(Long userId, BpmTaskPageReqVO pageReqVO); /** * 获得æµç¨‹ä»»åŠ¡ Map * * @param processInstanceIds æµç¨‹å®žä¾‹çš„ç¼–å·æ•°ç»„ * @return æµç¨‹ä»»åŠ¡ Map */ default Map<String, List<Task>> getTaskMapByProcessInstanceIds(List<String> processInstanceIds) { return CollectionUtils.convertMultiMap(getTasksByProcessInstanceIds(processInstanceIds), Task::getProcessInstanceId); } /** * 获得æµç¨‹ä»»åŠ¡åˆ—表 * * @param processInstanceIds æµç¨‹å®žä¾‹çš„ç¼–å·æ•°ç»„ * @return æµç¨‹ä»»åŠ¡åˆ—表 */ List<Task> getTasksByProcessInstanceIds(List<String> processInstanceIds); /** * 获得指定æµç¨‹å®žä¾‹çš„æµç¨‹ä»»åŠ¡åˆ—表,包括所有状æ€çš„ * * @param processInstanceId æµç¨‹å®žä¾‹çš„ç¼–å· * @param asc 是å¦å‡åº * @return æµç¨‹ä»»åŠ¡åˆ—表 */ List<HistoricTaskInstance> getTaskListByProcessInstanceId(String processInstanceId, Boolean asc); /** * 获å–任务 * * @param id ä»»åŠ¡ç¼–å· * @return 任务 */ Task getTask(String id); /** * 获å–历å²ä»»åŠ¡ * * @param id ä»»åŠ¡ç¼–å· * @return 历å²ä»»åŠ¡ */ HistoricTaskInstance getHistoricTask(String id); /** * 获å–历å²ä»»åŠ¡åˆ—表 * * @param taskIds 任务编å·é›†åˆ * @return 历å²ä»»åŠ¡åˆ—表 */ List<HistoricTaskInstance> getHistoricTasks(Collection<String> taskIds); /** * æ ¹æ®æ¡ä»¶æŸ¥è¯¢æ£åœ¨è¿›è¡Œä¸çš„任务 * * @param processInstanceId æµç¨‹å®žä¾‹ç¼–å·ï¼Œä¸å…许为空 * @param assigned 是å¦åˆ†é…了审批人,å…许空 * @param taskDefineKey 任务定义 Key,å…许空 */ List<Task> getRunningTaskListByProcessInstanceId(String processInstanceId, Boolean assigned, String taskDefineKey); /** * 获å–当å‰ä»»åŠ¡çš„å¯é€€å›žçš„ UserTask é›†åˆ * * @param id 当å‰çš„任务 ID * @return å¯ä»¥é€€å›žçš„节点列表 */ List<UserTask> getUserTaskListByReturn(String id); /** * 获å–指定任务的å任务列表(多层) * * @param parentTaskId 父任务 ID * @param tasks 任务列表 * @return å任务列表 */ <T extends TaskInfo> List<T> getAllChildrenTaskListByParentTaskId(String parentTaskId, List<T> tasks); /** * 获å–指定任务的å任务列表 * * @param parentTaskId 父任务ID * @return å任务列表 */ List<Task> getTaskListByParentTaskId(String parentTaskId); /** * 获得指定æµç¨‹å®žä¾‹çš„活动实例列表 * * @param processInstanceId æµç¨‹å®žä¾‹çš„ç¼–å· * @return 活动实例列表 */ List<HistoricActivityInstance> getActivityListByProcessInstanceId(String processInstanceId); /** * 获得执行编å·å¯¹åº”的活动实例 * * @param executionId æ‰§è¡Œç¼–å· * @return 活动实例 */ List<HistoricActivityInstance> getHistoricActivityListByExecutionId(String executionId); // ========== Update 写入相关方法 ========== /** * 通过任务 * * @param userId ç”¨æˆ·ç¼–å· * @param reqVO 通过请求 */ void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO); /** * ä¸é€šè¿‡ä»»åŠ¡ * * @param userId ç”¨æˆ·ç¼–å· * @param reqVO ä¸é€šè¿‡è¯·æ±‚ */ void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO); /** * å°†æµç¨‹ä»»åŠ¡åˆ†é…给指定用户 * * @param userId ç”¨æˆ·ç¼–å· * @param reqVO 分é…请求 */ void transferTask(Long userId, BpmTaskTransferReqVO reqVO); /** * 将指定æµç¨‹å®žä¾‹çš„ã€è¿›è¡Œä¸çš„æµç¨‹ä»»åŠ¡ï¼Œç§»åŠ¨åˆ°ç»“æŸèŠ‚点 * * @param processInstanceId æµç¨‹ç¼–å· */ void moveTaskToEnd(String processInstanceId); /** * 将任务退回到指定的 targetDefinitionKey ä½ç½® * * @param userId ç”¨æˆ·ç¼–å· * @param reqVO 退回的任务key和当å‰æ‰€åœ¨çš„任务ID */ void returnTask(Long userId, BpmTaskReturnReqVO reqVO); /** * 将指定任务委派给其他人处ç†ï¼Œç‰æŽ¥æ”¶äººå¤„ç†åŽå†å›žåˆ°åŽŸå®¡æ‰¹äººæ‰‹ä¸å®¡æ‰¹ * * @param userId ç”¨æˆ·ç¼–å· * @param reqVO 被委派人和被委派的任务编å·ç†ç”±å‚æ•° */ void delegateTask(Long userId, BpmTaskDelegateReqVO reqVO); /** * ä»»åŠ¡åŠ ç¾ * * @param userId è¢«åŠ ç¾çš„用户和任务 IDï¼ŒåŠ ç¾ç±»åž‹ * @param reqVO 当å‰ç”¨æˆ· ID */ void createSignTask(Long userId, BpmTaskSignCreateReqVO reqVO); /** * 任务å‡ç¾ * * @param userId 当å‰ç”¨æˆ·ID * @param reqVO 被å‡ç¾çš„任务 ID,ç†ç”± */ void deleteSignTask(Long userId, BpmTaskSignDeleteReqVO reqVO); /** * 抄é€ä»»åŠ¡ * * @param userId ç”¨æˆ·ç¼–å· * @param reqVO 通过请求 */ void copyTask(Long userId, @Valid BpmTaskCopyReqVO reqVO); // ========== Event 事件相关方法 ========== /** * å¤„ç† Task 创建事件,目å‰æ˜¯ * <p> * 1. 更新它的状æ€ä¸ºå®¡æ‰¹ä¸ * 2. 处ç†è‡ªåŠ¨é€šè¿‡çš„情况,例如说:1ï¼‰æ— å®¡æ‰¹äººæ—¶ï¼Œæ˜¯å¦è‡ªåŠ¨é€šè¿‡ã€ä¸é€šè¿‡ï¼›2)éžã€äººå·¥å®¡æ ¸ã€‘时,是å¦è‡ªåŠ¨é€šè¿‡ã€ä¸é€šè¿‡ * <p> * 注æ„:它的触å‘时机,晚于 {@link #processTaskAssigned(Task)} ä¹‹åŽ * * @param task 任务实体 */ void processTaskCreated(Task task); /** * å¤„ç† Task å–消事件,目å‰æ˜¯æ›´æ–°å®ƒçš„状æ€ä¸ºå·²å–消 * * @param taskId ä»»åŠ¡çš„ç¼–å· */ void processTaskCanceled(String taskId); /** * å¤„ç† Task 设置审批人事件,目å‰æ˜¯å‘é€å®¡æ‰¹æ¶ˆæ¯ * * @param task 任务实体 */ void processTaskAssigned(Task task); /** * å¤„ç† Task 审批超时事件,å¯èƒ½ä¼šå¤„ç†å¤šä¸ªå½“å‰å®¡æ‰¹ä¸çš„任务 * * @param processInstanceId æµç¨‹ç¤ºä¾‹ç¼–å· * @param taskDefineKey 任务 Key * @param handlerType 处ç†ç±»åž‹ï¼Œå‚è§ {@link BpmUserTaskTimeoutHandlerTypeEnum} */ void processTaskTimeout(String processInstanceId, String taskDefineKey, Integer handlerType); }