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 | 207 | } |
| 208 | 208 | |
| 209 | 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 | 211 | // 3.2 预测未运行节点的审批信息 |
| 214 | 212 | List<ActivityNode> simulateActivityNodes = getSimulateApproveNodeList(startUserId, bpmnModel, |
| 215 | 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 | 35 | PageResult<Task> getTaskTodoPage(Long userId, BpmTaskPageReqVO pageReqVO); |
| 36 | 36 | |
| 37 | 37 | /** |
| 38 | - * 获得用户在指定流程下,首个需要处理(待办)的任务 | |
| 38 | + * 获得用户(待办)的任务。 | |
| 39 | + * 1、根据 id 查询待办任务 | |
| 40 | + * 2、如果任务不存在,获取指定流程下,首个需要处理任务 | |
| 39 | 41 | * |
| 40 | 42 | * @param userId 用户编号 |
| 43 | + * @param id 任务编号 | |
| 41 | 44 | * @param processInstanceId 流程实例编号 |
| 42 | 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 | 133 | } |
| 134 | 134 | |
| 135 | 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 | 143 | if (todoTask == null) { |
| 158 | 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 | 150 | // 3. 转换返回 |
| 164 | 151 | BpmnModel bpmnModel = bpmProcessDefinitionService.getProcessDefinitionBpmnModel(todoTask.getProcessDefinitionId()); |
| ... | ... | @@ -178,6 +165,40 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 178 | 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 | 202 | @Override |
| 182 | 203 | public PageResult<HistoricTaskInstance> getTaskDonePage(Long userId, BpmTaskPageReqVO pageVO) { |
| 183 | 204 | HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery() |
| ... | ... | @@ -1230,7 +1251,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 1230 | 1251 | PROCESS_INSTANCE_VARIABLE_SKIP_START_USER_NODE, String.class)); |
| 1231 | 1252 | if (userTaskElement.getId().equals(START_USER_NODE_ID) |
| 1232 | 1253 | && (skipStartUserNodeFlag == null // 目的:一般是“主流程”,发起人节点,自动通过审核 |
| 1233 | - || Boolean.TRUE.equals(skipStartUserNodeFlag)) // 目的:一般是“子流程”,发起人节点,按配置自动通过审核 | |
| 1254 | + || Boolean.TRUE.equals(skipStartUserNodeFlag)) // 目的:一般是“子流程”,发起人节点,按配置自动通过审核 | |
| 1234 | 1255 | && ObjUtil.notEqual(returnTaskFlag, Boolean.TRUE)) { |
| 1235 | 1256 | getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) |
| 1236 | 1257 | .setReason(BpmReasonEnum.ASSIGN_START_USER_APPROVE_WHEN_SKIP_START_USER_NODE.getReason())); | ... | ... |