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 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()));
... ...