Commit c629fd22086cdaf48d8e4633e399ac1ab3b122c5
1 parent
bc781d94
code review:工作流逻辑
Showing
6 changed files
with
75 additions
and
43 deletions
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmCommentTypeEnum.java
| ... | ... | @@ -20,15 +20,17 @@ public enum BpmCommentTypeEnum { |
| 20 | 20 | ; |
| 21 | 21 | |
| 22 | 22 | /** |
| 23 | - * 结果 | |
| 23 | + * 操作类型 | |
| 24 | 24 | */ |
| 25 | 25 | private final Integer type; |
| 26 | + // TODO @海:desc 可以改成 name;相当于操作名; | |
| 26 | 27 | /** |
| 27 | - * 描述 | |
| 28 | + * 操作名字 | |
| 28 | 29 | */ |
| 29 | 30 | private final String desc; |
| 31 | + // TODO @海:直接改成 comment 哈;简单一点; | |
| 30 | 32 | /** |
| 31 | - * 模板信息 | |
| 33 | + * 操作描述 | |
| 32 | 34 | */ |
| 33 | 35 | private final String templateComment; |
| 34 | 36 | ... | ... |
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmTaskAddSignTypeEnum.java
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java
| ... | ... | @@ -74,6 +74,7 @@ public class BpmTaskController { |
| 74 | 74 | return success(true); |
| 75 | 75 | } |
| 76 | 76 | |
| 77 | + // TODO @海:/return-list,不用带 get; | |
| 77 | 78 | @GetMapping("/get-return-list") |
| 78 | 79 | @Operation(summary = "获取所有可回退的节点", description = "用于【流程详情】的【回退】按钮") |
| 79 | 80 | @Parameter(name = "taskId", description = "当前任务ID", required = true) |
| ... | ... | @@ -98,6 +99,7 @@ public class BpmTaskController { |
| 98 | 99 | return success(true); |
| 99 | 100 | } |
| 100 | 101 | |
| 102 | + // TODO @海:create-sign?创建加签任务; | |
| 101 | 103 | @PutMapping("/add-sign") |
| 102 | 104 | @Operation(summary = "加签", description = "before 前加签,after 后加签") |
| 103 | 105 | @PreAuthorize("@ss.hasPermission('bpm:task:update')") |
| ... | ... | @@ -106,6 +108,7 @@ public class BpmTaskController { |
| 106 | 108 | return success(true); |
| 107 | 109 | } |
| 108 | 110 | |
| 111 | + // TODO @海:delete-sign?删除加签任务;然后 @DeleteMapping;这样感觉可以保持统一; | |
| 109 | 112 | @PutMapping("/sub-sign") |
| 110 | 113 | @Operation(summary = "减签") |
| 111 | 114 | @PreAuthorize("@ss.hasPermission('bpm:task:update')") |
| ... | ... | @@ -114,6 +117,8 @@ public class BpmTaskController { |
| 114 | 117 | return success(true); |
| 115 | 118 | } |
| 116 | 119 | |
| 120 | + // TODO @海:/children-list,不用带 task 和 get; | |
| 121 | + // TODO @海:taskId 是不是改成 parentId?另外,它的 swagger 注解也加下哈; | |
| 117 | 122 | @GetMapping("/get-children-task-list") |
| 118 | 123 | @Operation(summary = "获取能被减签的任务") |
| 119 | 124 | @PreAuthorize("@ss.hasPermission('bpm:task:update')") | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java
| ... | ... | @@ -167,13 +167,17 @@ public interface BpmTaskConvert { |
| 167 | 167 | default List<BpmTaskSubSignRespVO> convertList(List<BpmTaskExtDO> bpmTaskExtDOList, |
| 168 | 168 | Map<Long, AdminUserRespDTO> userMap, |
| 169 | 169 | Map<String, Task> idTaskMap){ |
| 170 | - return CollectionUtils.convertList(bpmTaskExtDOList, task->{ | |
| 170 | + return CollectionUtils.convertList(bpmTaskExtDOList, task -> { | |
| 171 | + // TODO @海:setId、name,可以链式调用 | |
| 171 | 172 | BpmTaskSubSignRespVO bpmTaskSubSignRespVO = new BpmTaskSubSignRespVO(); |
| 172 | 173 | bpmTaskSubSignRespVO.setName(task.getName()); |
| 173 | 174 | bpmTaskSubSignRespVO.setId(task.getTaskId()); |
| 174 | 175 | Task sourceTask = idTaskMap.get(task.getTaskId()); |
| 176 | + // TODO @海:下面这行注释,应该放到 idTaskMap.get(task.getTaskId()) 上面;原因是,应该注释之后,下面的逻辑是个整体; | |
| 175 | 177 | // 后加签任务不会直接设置 assignee ,所以不存在 assignee 的情况,则去取 owner |
| 178 | + // TODO @海:可以使用 ObjUtil.default 方法 | |
| 176 | 179 | String assignee = StrUtil.isNotEmpty(sourceTask.getAssignee()) ? sourceTask.getAssignee() : sourceTask.getOwner(); |
| 180 | + // TODO @海:这里可以使用 MapUtils.findAndThen 写起来更简单一点; | |
| 177 | 181 | AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(assignee)); |
| 178 | 182 | if (assignUser != null) { |
| 179 | 183 | bpmTaskSubSignRespVO.setAssigneeUser(convert3(assignUser)); |
| ... | ... | @@ -184,10 +188,11 @@ public interface BpmTaskConvert { |
| 184 | 188 | |
| 185 | 189 | /** |
| 186 | 190 | * 转换任务为父子级 |
| 191 | + * | |
| 187 | 192 | * @param sourceList 原始数据 |
| 188 | 193 | * @return 转换后的父子级数组 |
| 189 | 194 | */ |
| 190 | - default List<BpmTaskRespVO> convertChildrenList(List<BpmTaskRespVO> sourceList){ | |
| 195 | + default List<BpmTaskRespVO> convertChildrenList(List<BpmTaskRespVO> sourceList) { | |
| 191 | 196 | List<BpmTaskRespVO> childrenTaskList = CollectionUtils.filterList(sourceList, r -> StrUtil.isNotEmpty(r.getParentTaskId())); |
| 192 | 197 | Map<String, List<BpmTaskRespVO>> parentChildrenTaskListMap = CollectionUtils.convertMultiMap(childrenTaskList, BpmTaskRespVO::getParentTaskId); |
| 193 | 198 | for (BpmTaskRespVO bpmTaskRespVO : sourceList) { |
| ... | ... | @@ -195,4 +200,5 @@ public interface BpmTaskConvert { |
| 195 | 200 | } |
| 196 | 201 | return CollectionUtils.filterList(sourceList, r -> StrUtil.isEmpty(r.getParentTaskId())); |
| 197 | 202 | } |
| 203 | + | |
| 198 | 204 | } | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
| ... | ... | @@ -240,6 +240,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 240 | 240 | handleParentTask(task); |
| 241 | 241 | } |
| 242 | 242 | |
| 243 | + // TODO @海:我们是不是加签统一认为是 SIGN,这样 SIGN_AFTER 就是后置;SIGN_BEFORE 就是前置; | |
| 243 | 244 | /** |
| 244 | 245 | * 审批通过存在“后加签”的任务。 |
| 245 | 246 | * <p> |
| ... | ... | @@ -265,7 +266,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 265 | 266 | } |
| 266 | 267 | |
| 267 | 268 | /** |
| 268 | - * 处理当前任务的父任务 | |
| 269 | + * 处理当前任务的父任务,主要处理“加签”的情况 | |
| 269 | 270 | * |
| 270 | 271 | * @param task 当前任务 |
| 271 | 272 | */ |
| ... | ... | @@ -274,25 +275,27 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 274 | 275 | if (StrUtil.isBlank(parentTaskId)) { |
| 275 | 276 | return; |
| 276 | 277 | } |
| 278 | + // TODO @海洋:279 这个判断就不需要啦;括号层级少一级噢; | |
| 277 | 279 | if (StrUtil.isNotBlank(parentTaskId)) { |
| 278 | 280 | // 1. 判断当前任务的父任务是否还有子任务 |
| 279 | 281 | Long childrenTaskCount = getChildrenTaskCount(parentTaskId); |
| 280 | 282 | if (childrenTaskCount > 0) { |
| 281 | 283 | return; |
| 282 | 284 | } |
| 285 | + // TODO @海:如果非向前、向后加签,就直接 return 掉;就是把 3. 那判断做次提前;万一有别的父子任务经过这个逻辑,其实我们是不处理的,对哇? | |
| 283 | 286 | // 2. 获取父任务 |
| 284 | 287 | Task parentTask = validateTaskExist(parentTaskId); |
| 285 | 288 | |
| 286 | - // 3. 情况一:处理向前加签 | |
| 289 | + // 3.1 情况一:处理向前加签 | |
| 287 | 290 | String scopeType = parentTask.getScopeType(); |
| 288 | 291 | if (BpmTaskAddSignTypeEnum.BEFORE.getType().equals(scopeType)) { |
| 289 | - // 3.1 如果是向前加签的任务,则调用 resolveTask 指派父任务,将 owner 重新赋值给父任务的 assignee | |
| 292 | + // 3.1.1 如果是向前加签的任务,则调用 resolveTask 指派父任务,将 owner 重新赋值给父任务的 assignee,这样它就可以被审批 | |
| 290 | 293 | taskService.resolveTask(parentTaskId); |
| 291 | - // 3.2 更新任务拓展表为处理中 | |
| 294 | + // 3.1.2 更新任务拓展表为处理中 | |
| 292 | 295 | taskExtMapper.updateByTaskId( |
| 293 | 296 | new BpmTaskExtDO().setTaskId(parentTask.getId()).setResult(BpmProcessInstanceResultEnum.PROCESS.getResult())); |
| 294 | 297 | } else if (BpmTaskAddSignTypeEnum.AFTER.getType().equals(scopeType)) { |
| 295 | - // 3. 情况二:处理向后加签 | |
| 298 | + // 3.2 情况二:处理向后加签 | |
| 296 | 299 | handleAfterSign(parentTask); |
| 297 | 300 | } |
| 298 | 301 | |
| ... | ... | @@ -308,42 +311,43 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 308 | 311 | } |
| 309 | 312 | } |
| 310 | 313 | |
| 314 | + // TODO @海:可以把这个方法名,改成 handleParentTaskForAfterSign。= = 虽然这个名字也有点丑,但是目的是体现出它是 handleParentTask 的一种衍生 | |
| 311 | 315 | /** |
| 312 | 316 | * 处理后加签任务 |
| 313 | 317 | * |
| 314 | 318 | * @param parentTask 当前审批任务的父任务 |
| 315 | 319 | */ |
| 320 | + // TODO @海:这个逻辑,怎么感觉可以是 parentTask 的 parent,再去调用 handleParentTask 方法;可以微信聊下; | |
| 316 | 321 | private void handleAfterSign(Task parentTask) { |
| 317 | 322 | String parentTaskId = parentTask.getId(); |
| 318 | - //1. 更新 parentTask 的任务拓展表为通过,并调用 complete 完成自己 | |
| 323 | + // 1. 更新 parentTask 的任务拓展表为通过,并调用 complete 完成自己 | |
| 319 | 324 | BpmTaskExtDO currentTaskExt = taskExtMapper.selectByTaskId(parentTask.getId()); |
| 320 | - BpmTaskExtDO currentTaskUpdateEntity = new BpmTaskExtDO().setTaskId(parentTask.getId()) | |
| 325 | + BpmTaskExtDO currentTaskExtUpdateObj = new BpmTaskExtDO().setTaskId(parentTask.getId()) | |
| 321 | 326 | .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()); |
| 322 | 327 | if (currentTaskExt.getEndTime() == null) { |
| 323 | 328 | // 1.1 有这个判断是因为,以前没设置过结束时间,才去设置 |
| 324 | - currentTaskUpdateEntity.setEndTime(LocalDateTime.now()); | |
| 329 | + currentTaskExtUpdateObj.setEndTime(LocalDateTime.now()); | |
| 325 | 330 | } |
| 326 | - // 1.2 完成自己 | |
| 327 | - taskExtMapper.updateByTaskId(currentTaskUpdateEntity); | |
| 331 | + taskExtMapper.updateByTaskId(currentTaskExtUpdateObj); | |
| 332 | + // 1.2 完成自己(因为它已经没有子任务,所以也可以完成) | |
| 328 | 333 | taskService.complete(parentTaskId); |
| 329 | 334 | |
| 330 | 335 | // 2. 如果有父级,递归查询上级任务是否都已经完成 |
| 331 | 336 | if (StrUtil.isEmpty(parentTask.getParentTaskId())) { |
| 332 | 337 | return; |
| 333 | 338 | } |
| 334 | - // TODO @海:这块待讨论,脑子略乱;感觉 handleAfterSign 的后半段,和 handleParentTask 有点重叠??? | |
| 335 | 339 | // 2.1 判断整条链路的任务是否完成 |
| 336 | 340 | // 例如从 A 任务加签了一个 B 任务,B 任务又加签了一个 C 任务,C 任务加签了 D 任务 |
| 337 | 341 | // 此时,D 任务完成,要一直往上找到祖先任务 A调用 complete 方法完成 A 任务 |
| 338 | 342 | boolean allChildrenTaskFinish = true; |
| 339 | 343 | while (StrUtil.isNotBlank(parentTask.getParentTaskId())) { |
| 340 | 344 | parentTask = validateTaskExist(parentTask.getParentTaskId()); |
| 341 | - BpmTaskExtDO bpmTaskExtDO = taskExtMapper.selectByTaskId(parentTask.getId()); | |
| 342 | - if (bpmTaskExtDO == null) { | |
| 345 | + BpmTaskExtDO parentTaskExt = taskExtMapper.selectByTaskId(parentTask.getId()); | |
| 346 | + if (parentTaskExt == null) { | |
| 343 | 347 | break; |
| 344 | 348 | } |
| 345 | - boolean currentTaskFinish = BpmProcessInstanceResultEnum.isEndResult(bpmTaskExtDO.getResult()); | |
| 346 | - // 2.2 如果 allChildrenTaskFinish 已经被赋值为 false ,则不会再赋值为 true,因为整个链路没有完成 | |
| 349 | + boolean currentTaskFinish = BpmProcessInstanceResultEnum.isEndResult(parentTaskExt.getResult()); | |
| 350 | + // 2.2 如果 allChildrenTaskFinish 已经被赋值为 false,则不会再赋值为 true,因为整个链路没有完成 | |
| 347 | 351 | if (allChildrenTaskFinish) { |
| 348 | 352 | allChildrenTaskFinish = currentTaskFinish; |
| 349 | 353 | } |
| ... | ... | @@ -354,19 +358,19 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 354 | 358 | |
| 355 | 359 | // 3 处理非完成状态的任务 |
| 356 | 360 | // 3.1 判断当前任务的父任务是否还有子任务 |
| 357 | - Long childrenTaskCount = getChildrenTaskCount(bpmTaskExtDO.getTaskId()); | |
| 361 | + Long childrenTaskCount = getChildrenTaskCount(parentTaskExt.getTaskId()); | |
| 358 | 362 | if (childrenTaskCount > 0) { |
| 359 | 363 | continue; |
| 360 | 364 | } |
| 361 | 365 | // 3.2 没有子任务,判断当前任务状态是否为 ADD_SIGN_BEFORE 待前加签任务完成 |
| 362 | - if (BpmProcessInstanceResultEnum.ADD_SIGN_BEFORE.getResult().equals(bpmTaskExtDO.getResult())) { | |
| 366 | + if (BpmProcessInstanceResultEnum.ADD_SIGN_BEFORE.getResult().equals(parentTaskExt.getResult())) { | |
| 363 | 367 | // 3.3 需要修改该任务状态为处理中 |
| 364 | - taskService.resolveTask(bpmTaskExtDO.getTaskId()); | |
| 365 | - bpmTaskExtDO.setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); | |
| 366 | - taskExtMapper.updateByTaskId(bpmTaskExtDO); | |
| 368 | + taskService.resolveTask(parentTaskExt.getTaskId()); | |
| 369 | + parentTaskExt.setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); | |
| 370 | + taskExtMapper.updateByTaskId(parentTaskExt); | |
| 367 | 371 | } |
| 368 | 372 | // 3.4 清空 scopeType 字段,用于任务没有子任务时使用该方法,方便任务可以再次被不同的方式加签 |
| 369 | - parentTask = validateTaskExist(bpmTaskExtDO.getTaskId()); | |
| 373 | + parentTask = validateTaskExist(parentTaskExt.getTaskId()); | |
| 370 | 374 | clearTaskScopeTypeAndSave(parentTask); |
| 371 | 375 | } |
| 372 | 376 | |
| ... | ... | @@ -387,7 +391,6 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 387 | 391 | taskService.saveTask(task); |
| 388 | 392 | } |
| 389 | 393 | |
| 390 | - | |
| 391 | 394 | /** |
| 392 | 395 | * 获取子任务个数 |
| 393 | 396 | * |
| ... | ... | @@ -741,8 +744,8 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 741 | 744 | |
| 742 | 745 | // 4. 记录加签 comment,拼接结果为: [当前用户]向前加签/向后加签给了[多个用户],理由为:reason |
| 743 | 746 | AdminUserRespDTO currentUser = adminUserApi.getUser(userId); |
| 744 | - String comment = StrUtil.format(BpmCommentTypeEnum.ADD_SIGN.getTemplateComment(), currentUser.getNickname(), BpmTaskAddSignTypeEnum.formatDesc(reqVO.getType()), | |
| 745 | - String.join(",", convertList(userList, AdminUserRespDTO::getNickname)), reqVO.getReason()); | |
| 747 | + String comment = StrUtil.format(BpmCommentTypeEnum.ADD_SIGN.getTemplateComment(), currentUser.getNickname(), | |
| 748 | + BpmTaskAddSignTypeEnum.formatDesc(reqVO.getType()), String.join(",", convertList(userList, AdminUserRespDTO::getNickname)), reqVO.getReason()); | |
| 746 | 749 | taskService.addComment(reqVO.getId(), taskEntity.getProcessInstanceId(), |
| 747 | 750 | BpmCommentTypeEnum.ADD_SIGN.getType().toString(), comment); |
| 748 | 751 | } |
| ... | ... | @@ -780,6 +783,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 780 | 783 | return taskEntity; |
| 781 | 784 | } |
| 782 | 785 | |
| 786 | + // TODO @海:方法名,要不改成 createSignTask; | |
| 783 | 787 | /** |
| 784 | 788 | * 创建加签子任务 |
| 785 | 789 | * |
| ... | ... | @@ -799,19 +803,19 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 799 | 803 | } |
| 800 | 804 | } |
| 801 | 805 | |
| 806 | + // TODO @海:注释要不改成,创建加签子任务;然后方法名,就是 createSignTask;因为它还是在创建加签任务,目前哈; | |
| 802 | 807 | /** |
| 803 | 808 | * 创建子任务 |
| 804 | 809 | * |
| 805 | 810 | * @param parentTask 父任务 |
| 806 | 811 | * @param assignee 子任务的执行人 |
| 807 | - * @return | |
| 808 | 812 | */ |
| 809 | 813 | private void createChildrenTask(TaskEntityImpl parentTask, String assignee) { |
| 810 | 814 | // 1. 生成子任务 |
| 811 | 815 | TaskEntityImpl task = (TaskEntityImpl) taskService.newTask(IdUtil.fastSimpleUUID()); |
| 812 | 816 | task = BpmTaskConvert.INSTANCE.convert(task, parentTask); |
| 813 | 817 | if (BpmTaskAddSignTypeEnum.BEFORE.getType().equals(parentTask.getScopeType())) { |
| 814 | - // 2.1 前加签,才设置审批人,否则设置 owner | |
| 818 | + // 2.1 前加签,设置审批人 | |
| 815 | 819 | task.setAssignee(assignee); |
| 816 | 820 | } else { |
| 817 | 821 | // 2.2.1 设置 owner 不设置 assignee 是因为不能同时审批,需要等父任务完成 |
| ... | ... | @@ -826,8 +830,11 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 826 | 830 | @Override |
| 827 | 831 | @Transactional(rollbackFor = Exception.class) |
| 828 | 832 | public void subSignTask(Long userId, BpmTaskSubSignReqVO reqVO) { |
| 833 | + // 1.1 校验 task 可以被减签 | |
| 829 | 834 | Task task = validateSubSign(reqVO.getId()); |
| 835 | + // TODO @海:adminUserApi.getUser(userId) 是不是应该放到 3. 那; | |
| 830 | 836 | AdminUserRespDTO user = adminUserApi.getUser(userId); |
| 837 | + // 1.2 校验取消人存在 | |
| 831 | 838 | AdminUserRespDTO cancelUser = null; |
| 832 | 839 | if (StrUtil.isNotBlank(task.getAssignee())) { |
| 833 | 840 | cancelUser = adminUserApi.getUser(NumberUtils.parseLong(task.getAssignee())); |
| ... | ... | @@ -836,20 +843,22 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 836 | 843 | cancelUser = adminUserApi.getUser(NumberUtils.parseLong(task.getOwner())); |
| 837 | 844 | } |
| 838 | 845 | Assert.notNull(cancelUser, "任务中没有所有者和审批人,数据错误"); |
| 839 | - //1. 获取所有需要删除的任务 ID ,包含当前任务和所有子任务 | |
| 846 | + | |
| 847 | + // TODO @海:1. 和 2. 可以写一行注释;其实就是删除任务,和它的子任务;本质上,1. 和 2. 还有 3. 是一块逻辑,写成 1.1 1.2 1.3 会更易懂 | |
| 848 | + // 1. 获取所有需要删除的任务 ID ,包含当前任务和所有子任务 | |
| 840 | 849 | List<String> allTaskIdList = getAllChildTaskIds(task.getId()); |
| 841 | - //2. 删除任务和所有子任务 | |
| 850 | + // 2. 删除任务和所有子任务 | |
| 842 | 851 | taskService.deleteTasks(allTaskIdList); |
| 843 | - //3. 修改扩展表状态为取消 | |
| 852 | + // 3. 修改扩展表状态为取消 | |
| 844 | 853 | taskExtMapper.updateBatchByTaskIdList(allTaskIdList, new BpmTaskExtDO().setResult(BpmProcessInstanceResultEnum.CANCEL.getResult()) |
| 845 | 854 | .setReason(StrUtil.format("由于{}操作[减签],任务被取消", user.getNickname()))); |
| 846 | - //4.记录日志到父任务中 先记录日志是因为,通过 handleParentTask 方法之后,任务可能被完成了,并且不存在了,会报异常,所以先记录 | |
| 855 | + | |
| 856 | + // 4. 记录日志到父任务中。先记录日志是因为,通过 handleParentTask 方法之后,任务可能被完成了,并且不存在了,会报异常,所以先记录 | |
| 847 | 857 | String comment = StrUtil.format(BpmCommentTypeEnum.SUB_SIGN.getTemplateComment(), user.getNickname(), cancelUser.getNickname()); |
| 848 | 858 | taskService.addComment(task.getParentTaskId(), task.getProcessInstanceId(), |
| 849 | 859 | BpmCommentTypeEnum.SUB_SIGN.getType().toString(), comment); |
| 850 | - //5. 处理当前任务的父任务 | |
| 851 | - this.handleParentTask(task); | |
| 852 | - | |
| 860 | + // 5. 处理当前任务的父任务 | |
| 861 | + handleParentTask(task); | |
| 853 | 862 | } |
| 854 | 863 | |
| 855 | 864 | /** |
| ... | ... | @@ -860,7 +869,8 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 860 | 869 | */ |
| 861 | 870 | private Task validateSubSign(String id) { |
| 862 | 871 | Task task = validateTaskExist(id); |
| 863 | - //必须有parentId | |
| 872 | + // 必须有 parentId | |
| 873 | + // TODO @海:是不是通过 scopeType 去判断更合适哈?因为别的情况下,也可能有 parentId | |
| 864 | 874 | if (StrUtil.isEmpty(task.getParentTaskId())) { |
| 865 | 875 | throw exception(TASK_SUB_SIGN_NO_PARENT); |
| 866 | 876 | } |
| ... | ... | @@ -875,6 +885,8 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 875 | 885 | */ |
| 876 | 886 | public List<String> getAllChildTaskIds(String parentTaskId) { |
| 877 | 887 | List<String> allChildTaskIds = new ArrayList<>(); |
| 888 | + // TODO @海:这里可以把递归改成 for 循环,可以试试看哈;整体思路,是一层一层查询;然后判断某一层查不出来了,就是结束了; | |
| 889 | + // 最好不用无限递归,一般是 for (int i = 0; i < Short.MAX),避免脏数据导致无限递归; | |
| 878 | 890 | //1. 先将自己放入 |
| 879 | 891 | allChildTaskIds.add(parentTaskId); |
| 880 | 892 | //2. 递归获取子级 |
| ... | ... | @@ -896,6 +908,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 896 | 908 | } |
| 897 | 909 | } |
| 898 | 910 | |
| 911 | + // TODO @海:一般情况下,除非对性能特别有要求,才只查询 ID_ 单字段;一般层级不多,数据量不大;其实整查就好啦,无非是带宽稍微浪费电,但是基本看不出啥性能差距; | |
| 899 | 912 | /** |
| 900 | 913 | * 获取指定父级任务的所有子任务 ID 集合 |
| 901 | 914 | * |
| ... | ... | @@ -911,16 +924,21 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 911 | 924 | |
| 912 | 925 | @Override |
| 913 | 926 | public List<BpmTaskSubSignRespVO> getChildrenTaskList(String taskId) { |
| 927 | + // 1. 只查询进行中的任务 | |
| 914 | 928 | List<String> childrenTaskIdList = getChildrenTaskIdList(taskId); |
| 915 | 929 | if (CollUtil.isEmpty(childrenTaskIdList)) { |
| 916 | 930 | return Collections.emptyList(); |
| 917 | 931 | } |
| 918 | - //1. 只查询进行中的任务 | |
| 932 | + // TODO @海:bpmTaskExtDOList 可以改成 taskExtList;因为当前已经在 bpm 模块,不用前缀;然后,DO 一般情况下不用带; | |
| 919 | 933 | List<BpmTaskExtDO> bpmTaskExtDOList = taskExtMapper.selectProcessListByTaskIds(childrenTaskIdList); |
| 920 | - //2. 后加签的任务,可能不存在 assignee,所以还需要查询 owner | |
| 934 | + | |
| 935 | + // 2. 后加签的任务,可能不存在 assignee,所以还需要查询 owner | |
| 936 | + // TODO @海:1. 和 2. 是不是有点重复哈;1. 先查询到了子节点,然后返回了 ids 集合;然后又去 in 查询了一次。。。。按道理,taskService 查询 taskList 就完事? | |
| 921 | 937 | List<Task> taskList = taskService.createTaskQuery().taskIds(childrenTaskIdList).list(); |
| 922 | 938 | Map<String, Task> idTaskMap = convertMap(taskList, TaskInfo::getId); |
| 923 | - //3. 将 owner 和 assignee 统一到一个集合中 | |
| 939 | + | |
| 940 | + // 3. 将 owner 和 assignee 统一到一个集合中 | |
| 941 | + // TODO @海:下面 userId 的获取,可以考虑抽个小方法; | |
| 924 | 942 | List<Long> userIds = taskList.stream() |
| 925 | 943 | .flatMap(control -> |
| 926 | 944 | Stream.of(control.getAssignee(), control.getOwner()) |
| ... | ... | @@ -931,4 +949,5 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 931 | 949 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); |
| 932 | 950 | return BpmTaskConvert.INSTANCE.convertList(bpmTaskExtDOList, userMap, idTaskMap); |
| 933 | 951 | } |
| 952 | + | |
| 934 | 953 | } | ... | ... |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserService.java