Commit ffa7c246cfafacc53c326b0d86ded26712402943

Authored by jason
1 parent 62a1fa82

【问题修复】 同一个人多个待办任务,获取待办任务,优先查询传递的 taskId

yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
@@ -207,9 +207,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -207,9 +207,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
207 } 207 }
208 208
209 // 3.1 计算当前登录用户的待办任务 209 // 3.1 计算当前登录用户的待办任务
210 - // TODO @jason:有一个极端情况,如果一个用户有 2 个 task A 和 B,A 已经通过,B 需要审核。这个时,通过 A 进来,todo 拿到  
211 - // B,会不会表单权限不一致哈。  
212 - BpmTaskRespVO todoTask = taskService.getFirstTodoTask(loginUserId, reqVO.getProcessInstanceId()); 210 + BpmTaskRespVO todoTask = taskService.getTodoTask(loginUserId, reqVO.getTaskId(), reqVO.getProcessInstanceId());
213 // 3.2 预测未运行节点的审批信息 211 // 3.2 预测未运行节点的审批信息
214 List<ActivityNode> simulateActivityNodes = getSimulateApproveNodeList(startUserId, bpmnModel, 212 List<ActivityNode> simulateActivityNodes = getSimulateApproveNodeList(startUserId, bpmnModel,
215 processDefinitionInfo, 213 processDefinitionInfo,
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java
@@ -35,13 +35,16 @@ public interface BpmTaskService { @@ -35,13 +35,16 @@ public interface BpmTaskService {
35 PageResult<Task> getTaskTodoPage(Long userId, BpmTaskPageReqVO pageReqVO); 35 PageResult<Task> getTaskTodoPage(Long userId, BpmTaskPageReqVO pageReqVO);
36 36
37 /** 37 /**
38 - * 获得用户在指定流程下,首个需要处理(待办)的任务 38 + * 获得用户(待办)的任务。
  39 + * 1、根据 id 查询待办任务
  40 + * 2、如果任务不存在,获取指定流程下,首个需要处理任务
39 * 41 *
40 * @param userId 用户编号 42 * @param userId 用户编号
  43 + * @param id 任务编号
41 * @param processInstanceId 流程实例编号 44 * @param processInstanceId 流程实例编号
42 * @return 待办任务 45 * @return 待办任务
43 */ 46 */
44 - BpmTaskRespVO getFirstTodoTask(Long userId, String processInstanceId); 47 + BpmTaskRespVO getTodoTask(Long userId, String id, String processInstanceId);
45 48
46 /** 49 /**
47 * 获得已办的流程任务分页 50 * 获得已办的流程任务分页
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
@@ -133,32 +133,19 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -133,32 +133,19 @@ public class BpmTaskServiceImpl implements BpmTaskService {
133 } 133 }
134 134
135 @Override 135 @Override
136 - public BpmTaskRespVO getFirstTodoTask(Long userId, String processInstanceId) {  
137 - if (processInstanceId == null) {  
138 - return null;  
139 - }  
140 - // 1. 查询所有任务  
141 - List<Task> tasks = taskService.createTaskQuery()  
142 - .active()  
143 - .processInstanceId(processInstanceId)  
144 - .includeTaskLocalVariables()  
145 - .includeProcessVariables()  
146 - .orderByTaskCreateTime().asc() // 按创建时间升序  
147 - .list();  
148 - if (CollUtil.isEmpty(tasks)) {  
149 - return null; 136 + public BpmTaskRespVO getTodoTask(Long userId, String id, String processInstanceId) {
  137 + // 1.1 获取指定的用户待办任务
  138 + Task todoTask = getMyTodoTask(userId, id);
  139 + if (todoTask == null) {
  140 + // 1.2 获取不到,则获取该流程实例下,第一个用户的待办任务
  141 + todoTask = getFirstMyTodoTask(userId, processInstanceId);
150 } 142 }
151 -  
152 - // 2.1 查询我的首个任务  
153 - Task todoTask = CollUtil.findOne(tasks, task -> {  
154 - return isAssignUserTask(userId, task) // 当前用户为审批人  
155 - || isAddSignUserTask(userId, task); // 当前用户为加签人(为了减签)  
156 - });  
157 if (todoTask == null) { 143 if (todoTask == null) {
158 return null; 144 return null;
159 } 145 }
160 - // 2.2 查询该任务的子任务  
161 - List<Task> childrenTasks = getAllChildrenTaskListByParentTaskId(todoTask.getId(), tasks); 146 +
  147 + // 2.查询该任务的子任务
  148 + List<Task> childrenTasks = getAllChildrenTaskListByParentTaskId(todoTask.getId(), CollUtil.newArrayList(todoTask));
162 149
163 // 3. 转换返回 150 // 3. 转换返回
164 BpmnModel bpmnModel = bpmProcessDefinitionService.getProcessDefinitionBpmnModel(todoTask.getProcessDefinitionId()); 151 BpmnModel bpmnModel = bpmProcessDefinitionService.getProcessDefinitionBpmnModel(todoTask.getProcessDefinitionId());
@@ -178,6 +165,40 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -178,6 +165,40 @@ public class BpmTaskServiceImpl implements BpmTaskService {
178 .setNodeType(nodeType).setSignEnable(signEnable).setReasonRequire(reasonRequire); 165 .setNodeType(nodeType).setSignEnable(signEnable).setReasonRequire(reasonRequire);
179 } 166 }
180 167
  168 + private Task getMyTodoTask(Long userId, String id) {
  169 + if (StrUtil.isEmpty(id)) {
  170 + return null;
  171 + }
  172 + Task task = getTask(id);
  173 + if (task == null) {
  174 + return null;
  175 + }
  176 + if (!isAssignUserTask(userId, task) && !isAddSignUserTask(userId, task)) {
  177 + return null;
  178 + }
  179 + return task;
  180 + }
  181 +
  182 + private Task getFirstMyTodoTask(Long userId, String processInstanceId) {
  183 + if (processInstanceId == null) {
  184 + return null;
  185 + }
  186 + // 1. 查询所有任务
  187 + List<Task> tasks = taskService.createTaskQuery()
  188 + .active()
  189 + .processInstanceId(processInstanceId)
  190 + .includeTaskLocalVariables()
  191 + .includeProcessVariables()
  192 + .orderByTaskCreateTime().asc() // 按创建时间升序
  193 + .list();
  194 +
  195 + // 2. 查询我的首个任务
  196 + return CollUtil.findOne(tasks, task -> {
  197 + return isAssignUserTask(userId, task) // 当前用户为审批人
  198 + || isAddSignUserTask(userId, task); // 当前用户为加签人(为了减签)
  199 + });
  200 + }
  201 +
181 @Override 202 @Override
182 public PageResult<HistoricTaskInstance> getTaskDonePage(Long userId, BpmTaskPageReqVO pageVO) { 203 public PageResult<HistoricTaskInstance> getTaskDonePage(Long userId, BpmTaskPageReqVO pageVO) {
183 HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery() 204 HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery()
@@ -1230,7 +1251,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -1230,7 +1251,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
1230 PROCESS_INSTANCE_VARIABLE_SKIP_START_USER_NODE, String.class)); 1251 PROCESS_INSTANCE_VARIABLE_SKIP_START_USER_NODE, String.class));
1231 if (userTaskElement.getId().equals(START_USER_NODE_ID) 1252 if (userTaskElement.getId().equals(START_USER_NODE_ID)
1232 && (skipStartUserNodeFlag == null // 目的:一般是“主流程”,发起人节点,自动通过审核 1253 && (skipStartUserNodeFlag == null // 目的:一般是“主流程”,发起人节点,自动通过审核
1233 - || Boolean.TRUE.equals(skipStartUserNodeFlag)) // 目的:一般是“子流程”,发起人节点,按配置自动通过审核 1254 + || Boolean.TRUE.equals(skipStartUserNodeFlag)) // 目的:一般是“子流程”,发起人节点,按配置自动通过审核
1234 && ObjUtil.notEqual(returnTaskFlag, Boolean.TRUE)) { 1255 && ObjUtil.notEqual(returnTaskFlag, Boolean.TRUE)) {
1235 getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) 1256 getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId())
1236 .setReason(BpmReasonEnum.ASSIGN_START_USER_APPROVE_WHEN_SKIP_START_USER_NODE.getReason())); 1257 .setReason(BpmReasonEnum.ASSIGN_START_USER_APPROVE_WHEN_SKIP_START_USER_NODE.getReason()));