Commit c629fd22086cdaf48d8e4633e399ac1ab3b122c5

Authored by zhijiantianya@gmail.com
1 parent bc781d94

code review:工作流逻辑

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
@@ -17,6 +17,7 @@ import java.util.List; @@ -17,6 +17,7 @@ import java.util.List;
17 */ 17 */
18 public interface SocialUserService { 18 public interface SocialUserService {
19 19
  20 + // TODO @芋艿:需要传递 userType
20 /** 21 /**
21 * 获得社交平台的授权 URL 22 * 获得社交平台的授权 URL
22 * 23 *