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