Commit ffa7c246cfafacc53c326b0d86ded26712402943
1 parent
62a1fa82
【问题修复】 同一个人多个待办任务,获取待办任务,优先查询传递的 taskId
Showing
3 changed files
with
50 additions
and
28 deletions
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())); |