From 6388950ab2b6db8d25a209789064d270da1e0846 Mon Sep 17 00:00:00 2001 From: "zhijiantianya@gmail.com" Date: Mon, 9 Oct 2023 20:57:23 +0800 Subject: [PATCH] =?UTF-8?q?code=20review=EF=BC=9A=E3=80=90=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E3=80=91=E2=80=94=E2=80=94=20=E5=8A=A0?= =?UTF-8?q?=E7=AD=BE=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/SymbolConstant.java | 1 + .../module/bpm/enums/ErrorCodeConstants.java | 1 + .../bpm/enums/task/BpmCommentTypeEnum.java | 2 + .../task/BpmProcessInstanceResultEnum.java | 17 +- .../enums/task/BpmTaskAddSignTypeEnum.java | 1 + .../admin/task/BpmTaskController.java | 12 +- .../task/vo/task/BpmTaskAddSignReqVO.java | 4 +- .../bpm/convert/task/BpmTaskConvert.java | 1 + .../bpm/dal/mysql/task/BpmTaskExtMapper.java | 5 +- .../bpm/service/task/BpmTaskService.java | 14 +- .../bpm/service/task/BpmTaskServiceImpl.java | 157 +++++++++++------- 11 files changed, 133 insertions(+), 82 deletions(-) diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/SymbolConstant.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/SymbolConstant.java index a73ff7d30..48e380219 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/SymbolConstant.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/SymbolConstant.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.framework.common.enums; +// TODO 这种简单的,暂时不用枚举哈,直接代码里写死就好啦; /** * 符号常量 */ diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java index 76c91a255..51eebda23 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java @@ -54,6 +54,7 @@ public interface ErrorCodeConstants { ErrorCode TASK_ADD_SIGN_TYPE_ERROR = new ErrorCode(1_009_005_010, "任务加签:当前任务已经{},不能{}"); ErrorCode TASK_ADD_SIGN_USER_REPEAT = new ErrorCode(1_009_005_011, "任务加签失败,加签人与现有审批人[{}]重复"); ErrorCode TASK_SUB_SIGN_NO_PARENT = new ErrorCode(1_009_005_011, "任务减签失败,被减签的任务必须是通过加签生成的任务"); + // ========== 流程任务分配规则 1-009-006-000 ========== ErrorCode TASK_ASSIGN_RULE_EXISTS = new ErrorCode(1_009_006_000, "流程({}) 的任务({}) 已经存在分配规则"); ErrorCode TASK_ASSIGN_RULE_NOT_EXISTS = new ErrorCode(1_009_006_001, "流程任务分配规则不存在"); diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmCommentTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmCommentTypeEnum.java index 98e175e3f..b4809b83f 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmCommentTypeEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmCommentTypeEnum.java @@ -14,6 +14,7 @@ public enum BpmCommentTypeEnum { REJECT(2, "不通过"), CANCEL(3, "已取消"), + // TODO @海:18 行可以去掉哈;这个是之前为了 status 隔离用的; // ========== 流程任务独有的状态 ========== BACK(4, "退回"), // 退回 @@ -22,6 +23,7 @@ public enum BpmCommentTypeEnum { SUB_SIGN(7,"减签"), ; + // TODO @海:字段叫 type 更合适噢 /** * 结果 */ diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java index 0fbb5d58f..aca732ba9 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java @@ -26,20 +26,20 @@ public enum BpmProcessInstanceResultEnum { BACK(5, "驳回"), // 退回 DELEGATE(6, "委派"), /** - * 源任务已经审批完成,但是它使用了后加签,后加签的任务未完成,源任务就会是这个状态 - * 例如:A审批, A 后加签了 B ,并且审批通过了任务,但是 B 还未审批,则当前任务状态为 待后加签任务完成 + * 【加签】源任务已经审批完成,但是它使用了后加签,后加签的任务未完成,源任务就会是这个状态 + * 例如:A审批, A 后加签了 B,并且审批通过了任务,但是 B 还未审批,则当前任务状态为“待后加签任务完成” */ - ADD_SIGN_AFTER(7, "待后加签任务完成"), + ADD_SIGN_AFTER(7, "待后加签任务完成"), // TODO @海:这个定义,是不是 通过(待后加签任务完成),相当于是 APPROVE 的特殊状态 /** - * 源任务未审批,但是向前加签了,所以源任务状态变为 待前加签任务完成 - * 例如:A审批, A 前加签了 B ,B 还未审核 + * 【加签】源任务未审批,但是向前加签了,所以源任务状态变为“待前加签任务完成” + * 例如:A 审批, A 前加签了 B,B 还未审核 */ - ADD_SIGN_BEFORE(8, "待前加签任务完成"), + ADD_SIGN_BEFORE(8, "待前加签任务完成"), // TODO @海:这个定义,是不是 处理中(待前加签任务审批),相当于是 PROCESS 的特殊状态 /** - * 后加签任务被创建时的初始状态 + * 【加签】后加签任务被创建时的初始状态 * 因为需要源任务先完成,才能到后加签的人来审批,所以加了一个状态区分 */ - WAIT_BEFORE_TASK(9, "待前置任务完成"); + WAIT_BEFORE_TASK(9, "待前置任务完成"); // TODO @海:这个定义,是不是 处理中(待前置任务审批),相当于是 PROCESS 的特殊状态 /** * 结果 @@ -66,6 +66,7 @@ public enum BpmProcessInstanceResultEnum { ADD_SIGN_AFTER.getResult()); } + // TODO @海:静态变量,需要放到成员变量前面;另外,如果是复数,可以加 S(ES) 或者 LIST /** * 能被减签的状态 */ diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmTaskAddSignTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmTaskAddSignTypeEnum.java index 3b46b6f25..3bf41a153 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmTaskAddSignTypeEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmTaskAddSignTypeEnum.java @@ -36,5 +36,6 @@ public enum BpmTaskAddSignTypeEnum { } return null; } + } \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java index 2f0e2db2a..694b35da4 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java @@ -100,23 +100,29 @@ public class BpmTaskController { return success(true); } + // TODO @海:权限统一使用 bpm:task:update;是否可以加减签,可以交给后续的权限配置实现; @PutMapping("/add-sign") - @Operation(summary = "加签", description = "before, after为前加签后加签") + @Operation(summary = "加签", description = "before 前加签,after 后加签") @PreAuthorize("@ss.hasPermission('bpm:task:add-sign')") public CommonResult addSign(@Valid @RequestBody BpmTaskAddSignReqVO reqVO) { + // TODO @海:userId 建议作为第一个参数;一般是,谁做了什么操作;另外,addSignTask,保持风格统一哈; taskService.addSign(reqVO,getLoginUserId()); return success(true); } + // TODO @海:权限统一使用 bpm:task:update;是否可以加减签,可以交给后续的权限配置实现; @PutMapping("/sub-sign") - @Operation(summary = "减签", description = "") + @Operation(summary = "减签") @PreAuthorize("@ss.hasPermission('bpm:task:sub-sign')") + // TODO @海: @RequestBody BpmTaskSubSignReqVO 应该是一个空格;然后参数名可以简写成 reqVO; public CommonResult subSign(@Valid @RequestBody BpmTaskSubSignReqVO bpmTaskSubSignReqVO) { taskService.subSign(bpmTaskSubSignReqVO,getLoginUserId()); return success(true); } + + // TODO @海:是不是 url 和方法名,叫 get-child-task-list,更抽象和复用一些? @GetMapping("/get-sub-sign") - @Operation(summary = "获取能被减签的任务", description = "") + @Operation(summary = "获取能被减签的任务") @PreAuthorize("@ss.hasPermission('bpm:task:sub-sign')") public CommonResult> getChildrenTaskList(@RequestParam("taskId") String taskId) { return success(taskService.getChildrenTaskList(taskId)); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskAddSignReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskAddSignReqVO.java index 88b123ce8..f4b9ac0ac 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskAddSignReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskAddSignReqVO.java @@ -12,7 +12,7 @@ import java.util.Set; public class BpmTaskAddSignReqVO { @Schema(description = "加签的用户 ID") - @NotEmpty(message = "加签用户ID不能为空") + @NotEmpty(message = "加签用户 ID 不能为空") private Set userIdList; @Schema(description = "加签类型,before 向前加签,after 向后加签") @@ -23,7 +23,9 @@ public class BpmTaskAddSignReqVO { @NotEmpty(message = "加签原因不能为空") private String reason; + // TODO @海:重要参数,可以放到最前面哈; @Schema(description = "需要加签的任务 ID") @NotEmpty(message = "任务编号不能为空") private String id; + } \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java index 05fcb1df4..9a0006e8d 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java @@ -147,6 +147,7 @@ public interface BpmTaskConvert { .setDefinitionKey(element.getId())); } + // TODO @海:可以使用 mapstruct 映射么? default TaskEntityImpl convert(TaskEntityImpl task,TaskEntityImpl parentTask){ task.setCategory(parentTask.getCategory()); task.setDescription(parentTask.getDescription()); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmTaskExtMapper.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmTaskExtMapper.java index 9b0fe8bb1..a9031b3b6 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmTaskExtMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmTaskExtMapper.java @@ -32,7 +32,8 @@ public interface BpmTaskExtMapper extends BaseMapperX { return selectOne(BpmTaskExtDO::getTaskId, taskId); } - default void updateBatchByTaskIdList(List taskIdList, BpmTaskExtDO entity){ - update(entity,new LambdaQueryWrapper().in(BpmTaskExtDO::getTaskId, taskIdList)); + default void updateBatchByTaskIdList(List taskIdList, BpmTaskExtDO updateObj) { + update(updateObj, new LambdaQueryWrapper().in(BpmTaskExtDO::getTaskId, taskIdList)); } + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java index 3a7f84c07..229e68d23 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java @@ -65,8 +65,8 @@ public interface BpmTaskService { /** - * 通过任务 ID 集合,获取任务扩展表信息集合 - * @param taskIdList 任务 ID + * 通过任务 ID 集合,获取任务扩展表信息集合 // TODO @海洋:方法注释,和下面的参数,需要空一行 + * @param taskIdList 任务 ID 集合 * @return 任务列表 */ List getTaskListByTaskIdList(List taskIdList); @@ -158,22 +158,26 @@ public interface BpmTaskService { /** * 任务加签 - * @param reqVO 被加签的用户和任务ID,加签类型 + * + * @param reqVO 被加签的用户和任务 ID,加签类型 * @param userId 当前用户 ID */ void addSign(BpmTaskAddSignReqVO reqVO, Long userId); /** - * 减签 - * @param bpmTaskSubSignReqVO 被减签的任务ID,理由 + * 任务减签名 + * + * @param bpmTaskSubSignReqVO 被减签的任务 ID,理由 * @param loginUserId 当前用户ID */ void subSign(BpmTaskSubSignReqVO bpmTaskSubSignReqVO, Long loginUserId); /** * 获取指定任务的子任务和审批人信息 + * * @param taskId 指定任务ID * @return 子任务列表 */ List getChildrenTaskList(String taskId); + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index b99b0c73d..371c30d84 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -218,12 +218,15 @@ public class BpmTaskServiceImpl implements BpmTaskService { approveDelegateTask(reqVO, task); return; } + // 情况二:后加签的任务 - if(BpmTaskAddSignTypeEnum.AFTER.getType().equals(task.getScopeType())) { - //后加签处理 + if (BpmTaskAddSignTypeEnum.AFTER.getType().equals(task.getScopeType())) { + // 后加签处理 + // TODO @海洋:这个是不是 approveAfterSignTask handleAfterSignTask(task, reqVO); return; } + // 情况三:自己审批的任务,调用 complete 去完成任务 // 完成任务,审批通过 taskService.complete(task.getId(), instance.getProcessVariables()); @@ -231,31 +234,34 @@ public class BpmTaskServiceImpl implements BpmTaskService { taskExtMapper.updateByTaskId( new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()) .setReason(reqVO.getReason())); - //处理加签任务 - this.handleParentTask(task); + // 处理加签任务 + handleParentTask(task); } /** - * 当前任务存在后加签任务,则不能马上完成,需要一个中间状态,并激活剩余所有子任务 + * 审批通过存在“后加签”的任务。 + * + * 注意:该任务不能马上完成,需要一个中间状态(ADD_SIGN_AFTER),并激活剩余所有子任务(PROCESS)为可审批处理 + * * @param task 当前任务 * @param reqVO 前端请求参数 */ private void handleAfterSignTask(Task task,BpmTaskApproveReqVO reqVO){ - //1.有向后加签,则该任务状态临时设置为 等待后加签任务完成 状态 + // 1. 有向后加签,则该任务状态临时设置为 ADD_SIGN_AFTER 状态 taskExtMapper.updateByTaskId( new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.ADD_SIGN_AFTER.getResult()) .setReason(reqVO.getReason()).setEndTime(LocalDateTime.now())); - //2. 激活子任务 + + // 2. 激活子任务 List childrenTaskIdList = getChildrenTaskIdList(task.getId()); for (String childrenTaskId : childrenTaskIdList) { taskService.resolveTask(childrenTaskId); } - //更新任务扩展表中子任务为进行中 + // 更新任务扩展表中子任务为进行中 taskExtMapper.updateBatchByTaskIdList(childrenTaskIdList, new BpmTaskExtDO().setResult(BpmProcessInstanceResultEnum.PROCESS.getResult())); } - /** * 处理当前任务的父任务 * @@ -263,62 +269,70 @@ public class BpmTaskServiceImpl implements BpmTaskService { */ private void handleParentTask(Task task) { String parentTaskId = task.getParentTaskId(); + // TODO @ 海:if return 原则 if (StrUtil.isNotBlank(parentTaskId)) { - //1. 判断当前任务的父任务是否还有子任务 + // 1. 判断当前任务的父任务是否还有子任务 long subTaskCount = getSubTaskCount(parentTaskId); + // TODO @ 海:if >= 0 return;这样括号又可以少一层; if (subTaskCount == 0) { - //2. 获取父任务 + // 2. 获取父任务 Task parentTask = validateTaskExist(parentTaskId); + + // 3. 情况一:处理向前加签 String scopeType = parentTask.getScopeType(); - //3. 处理向前加签 if (BpmTaskAddSignTypeEnum.BEFORE.getType().equals(scopeType)) { - //3.1 如果是向前加签的任务,则调用 resolveTask 指派父任务,将 owner 重新赋值给父任务的 assignee + // 3.1 如果是向前加签的任务,则调用 resolveTask 指派父任务,将 owner 重新赋值给父任务的 assignee taskService.resolveTask(parentTaskId); - //3.2 更新任务拓展表为处理中 + // 3.2 更新任务拓展表为处理中 taskExtMapper.updateByTaskId( new BpmTaskExtDO().setTaskId(parentTask.getId()).setResult(BpmProcessInstanceResultEnum.PROCESS.getResult())); - }else if (BpmTaskAddSignTypeEnum.AFTER.getType().equals(scopeType)) { - //4. 处理向后加签 + } else if (BpmTaskAddSignTypeEnum.AFTER.getType().equals(scopeType)) { + // 3. 情况二:处理向后加签 handleAfterSign(parentTask); } - //5. 子任务已处理完成,清空 scopeType 字段,修改 parentTask 信息,方便后续可以继续向前后向后加签 + + // 4. 子任务已处理完成,清空 scopeType 字段,修改 parentTask 信息,方便后续可以继续向前后向后加签 // 再查询一次的原因是避免报错:Task was updated by another transaction concurrently // 因为前面处理后可能会导致 parentTask rev 字段被修改,需要重新获取最新的 parentTask = getTask(parentTaskId); - if(parentTask !=null){ - //为空的情况是:已经通过 handleAfterSign 方法将任务完成了,所以 ru_task 表会查不到数据 + // TODO @ 海:if return 原则; + if (parentTask != null) { + // 为空的情况是:已经通过 handleAfterSign 方法将任务完成了,所以 ru_task 表会查不到数据 clearTaskScopeTypeAndSave(parentTask); } - } } } + // TODO @海:这个方法的 4.1 从 1 开始计数哈;另外;看看能不能用 if return 进一步简化代码的层级; /** * 处理后加签任务 * * @param parentTask 当前审批任务的父任务 */ private void handleAfterSign(Task parentTask) { + // TODO @海:这个方法在注释下。感觉整体是,先完成自己;然后递归处理父节点;但是完成机子被放到了 5.1,就感觉上有点割裂; String parentTaskId = parentTask.getId(); //4.1 更新 parentTask 的任务拓展表为通过 BpmTaskExtDO currentTaskExt = taskExtMapper.selectByTaskId(parentTask.getId()); BpmTaskExtDO currentTaskUpdateEntity = new BpmTaskExtDO().setTaskId(parentTask.getId()) .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()); if (currentTaskExt.getEndTime() == null) { - //有这个判断是因为 - //4.2 以前没设置过结束时间,才去设置 + // 有这个判断是因为 + // 4.2 以前没设置过结束时间,才去设置 currentTaskUpdateEntity.setEndTime(LocalDateTime.now()); } taskExtMapper.updateByTaskId(currentTaskUpdateEntity); - //5. 继续往上处理,父任务继续往上查询 - //5.1 先完成自己 + + // 5. 继续往上处理,父任务继续往上查询 + // 5.1 先完成自己 taskService.complete(parentTaskId); + // 5.2 如果有父级,递归查询上级任务是否都已经完成 + // TODO @海:这块待讨论,脑子略乱;感觉 handleAfterSign 的后半段,和 handleParentTask 有点重叠??? if (StrUtil.isNotEmpty(parentTask.getParentTaskId())) { - //5.2 如果有父级,递归查询上级任务是否都已经完成 - //判断整条链路的任务是否完成 - //例如从 A 任务加签了一个 B 任务, B 任务又加签了一个 C 任务,C任务加签了 D 任务 - //此时,D 任务完成,要一直往上找到祖先任务 A ,调用 complete 方法完成 A 任务 + // 判断整条链路的任务是否完成 + // 例如从 A 任务加签了一个 B 任务,B 任务又加签了一个 C 任务,C 任务加签了 D 任务 + // 此时,D 任务完成,要一直往上找到祖先任务 A调用 complete 方法完成 A 任务 boolean allChildrenTaskFinish = true; while (StrUtil.isNotBlank(parentTask.getParentTaskId())) { parentTask = validateTaskExist(parentTask.getParentTaskId()); @@ -327,23 +341,23 @@ public class BpmTaskServiceImpl implements BpmTaskService { break; } boolean currentTaskFinish = BpmProcessInstanceResultEnum.isEndResult(bpmTaskExtDO.getResult()); - //5.3 如果 allChildrenTaskFinish 已经被赋值为 false ,则不会再赋值为 true,因为整个链路没有完成 + // 5.3 如果 allChildrenTaskFinish 已经被赋值为 false ,则不会再赋值为 true,因为整个链路没有完成 if (allChildrenTaskFinish) { allChildrenTaskFinish = currentTaskFinish; } if (!currentTaskFinish) { - //6 处理非完成状态的任务 - //6.1 判断当前任务的父任务是否还有子任务 + // 6 处理非完成状态的任务 + // 6.1 判断当前任务的父任务是否还有子任务 Long subTaskCount = getSubTaskCount(bpmTaskExtDO.getTaskId()); if (subTaskCount == 0) { - //6.2 没有子任务,判断当前任务状态是否为 ADD_SIGN_BEFORE 待前加签任务完成 + // 6.2 没有子任务,判断当前任务状态是否为 ADD_SIGN_BEFORE 待前加签任务完成 if (BpmProcessInstanceResultEnum.ADD_SIGN_BEFORE.getResult().equals(bpmTaskExtDO.getResult())) { - //6.3 需要修改该任务状态为处理中 + // 6.3 需要修改该任务状态为处理中 taskService.resolveTask(bpmTaskExtDO.getTaskId()); bpmTaskExtDO.setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); taskExtMapper.updateByTaskId(bpmTaskExtDO); } - //6.4 清空 scopeType 字段,用于任务没有子任务时使用该方法,方便任务可以再次被不同的方式加签 + // 6.4 清空 scopeType 字段,用于任务没有子任务时使用该方法,方便任务可以再次被不同的方式加签 parentTask = getTask(bpmTaskExtDO.getTaskId()); if (parentTask != null) { clearTaskScopeTypeAndSave(parentTask); @@ -352,7 +366,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { } } if (allChildrenTaskFinish) { - //7. 完成最后的顶级祖先任务 + // 7. 完成最后的顶级祖先任务 taskService.complete(parentTask.getId()); } } @@ -369,15 +383,16 @@ public class BpmTaskServiceImpl implements BpmTaskService { taskService.saveTask(task); } + // TODO @海:Sub 还有 Child 感觉整体用词不是很统一;是不是要统一下;然后 Sub 还可以指的减签;看看是不是名词确实得一致哈; /** * 获取子任务个数 * - * @param parentTaskId 父类ID + * @param parentTaskId 父任务 ID * @return 剩余子任务个数 */ private Long getSubTaskCount(String parentTaskId) { String tableName = managementService.getTableName(TaskEntity.class); - String sql = "select count(1) from " + tableName + " where PARENT_TASK_ID_=#{parentTaskId}"; + String sql = "SELECT COUNT(1) from " + tableName + " WHERE PARENT_TASK_ID_=#{parentTaskId}"; return taskService.createNativeTaskQuery().sql(sql).parameter("parentTaskId", parentTaskId).count(); } @@ -454,10 +469,10 @@ public class BpmTaskServiceImpl implements BpmTaskService { @Override public void createTaskExt(Task task) { - BpmTaskExtDO taskExtDO = - BpmTaskConvert.INSTANCE.convert2TaskExt(task).setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); - //向后加签生成的任务,状态不能为进行中,需要等前面父任务完成 - if(BpmTaskAddSignTypeEnum.AFTER_CHILDREN_TASK.getType().equals(task.getScopeType())){ + BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task) + .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); + // 向后加签生成的任务,状态不能为进行中,需要等前面父任务完成 + if (BpmTaskAddSignTypeEnum.AFTER_CHILDREN_TASK.getType().equals(task.getScopeType())) { taskExtDO.setResult(BpmProcessInstanceResultEnum.WAIT_BEFORE_TASK.getResult()); } taskExtMapper.insert(taskExtDO); @@ -526,7 +541,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { private Task validateTaskExist(String id){ Task task = taskService.createTaskQuery().taskId(id).singleResult(); - if(task == null){ + if (task == null) { throw exception(TASK_NOT_EXISTS); } return task; @@ -691,37 +706,43 @@ public class BpmTaskServiceImpl implements BpmTaskService { @Override @Transactional(rollbackFor = Exception.class) public void addSign(BpmTaskAddSignReqVO reqVO, Long userId) { + // TODO @海:// 后面要有个空格;中英文之间,也要有空格;例如说:// 1. 获取和校验任务 //1.获取和校验任务 TaskEntityImpl taskEntity = validateAddSign(userId, reqVO); + // TODO @海:每个变量,以及相关逻辑,一定要和自己的逻辑块呆在一起。例如说这里的 currentUser 获取,应该在 4. 那块 AdminUserRespDTO currentUser = adminUserApi.getUser(userId); List userList = adminUserApi.getUserList(reqVO.getUserIdList()); if (CollUtil.isEmpty(userList)) { throw exception(TASK_ADD_SIGN_USER_NOT_EXIST); } - //2.处理当前任务 - //2.1 开启计数功能 + // TODO @海:大的逻辑块之间,最好有一个空格。这样的目的,是避免逻辑堆砌在一起,方便流量; + // 2.处理当前任务 + // 2.1 开启计数功能 // TODO @海:这个目的可以写下; taskEntity.setCountEnabled(true); + // TODO @海:可以直接 if,不搞一个变量哈 boolean addSignToBefore = reqVO.getType().equals(BpmTaskAddSignTypeEnum.BEFORE.getType()); if (addSignToBefore) { - //2.2 向前加签,设置 owner ,置空 assign ,等子任务都完成后,再调用 resolveTask 重新将 owner 设置为 assign - //原因是:不能和向前加签的子任务一起审批,需要等前面的子任务都完成才能审批 + // 2.2 向前加签,设置 owner,置空 assign。等子任务都完成后,再调用 resolveTask 重新将 owner 设置为 assign + // 原因是:不能和向前加签的子任务一起审批,需要等前面的子任务都完成才能审批 taskEntity.setOwner(taskEntity.getAssignee()); taskEntity.setAssignee(null); - //2.3 更新扩展表状态 + // 2.3 更新扩展表状态 taskExtMapper.updateByTaskId( new BpmTaskExtDO().setTaskId(taskEntity.getId()) .setResult(BpmProcessInstanceResultEnum.ADD_SIGN_BEFORE.getResult()) .setReason(reqVO.getReason())); } - //2.4 记录加签方式,完成任务时需要用到判断 + // 2.4 记录加签方式,完成任务时需要用到判断 taskEntity.setScopeType(reqVO.getType()); - //2.5 保存当前任务修改后的值 + // 2.5 保存当前任务修改后的值 taskService.saveTask(taskEntity); - //3. 处理加签任务 - this.createSignSubTasks(convertList(reqVO.getUserIdList(), String::valueOf), taskEntity); - //4. 记录加签 comment,拼接结果为: [当前用户]向前加签/向后加签给了[多个用户],理由为:reason - String comment = StrUtil.format("[{}]{}给了[{}],理由为:{}", currentUser.getNickname(), BpmTaskAddSignTypeEnum.formatDesc(reqVO.getType()), + // 3. 创建加签任务 + createSignSubTasks(convertList(reqVO.getUserIdList(), String::valueOf), taskEntity); + + // 4. 记录加签 comment,拼接结果为: [当前用户]向前加签/向后加签给了[多个用户],理由为:reason + // TODO @海:BpmCommentTypeEnum 可以加一个 comment 字段,作为评论模版,统一管理; + String comment = StrUtil.format("[{}]{}给了[{}],理由为:{}", currentUser.getNickname(), BpmTaskAddSignTypeEnum.formatDesc(reqVO.getType()), String.join(SymbolConstant.D, convertList(userList, AdminUserRespDTO::getNickname)), reqVO.getReason()); taskService.addComment(reqVO.getId(), taskEntity.getProcessInstanceId(), BpmCommentTypeEnum.ADD_SIGN.getResult().toString(), comment); @@ -729,7 +750,10 @@ public class BpmTaskServiceImpl implements BpmTaskService { /** - * 校验任务存在和 存在 向前加签 的任务,则不能 向后加签,存在 向后加签 则不能 向前加签 + * 校验任务的加签是否一致 + * + * 1. 如果存在“向前加签”的任务,则不能“向后加签” + * 2. 如果存在“向后加签”的任务,则不能“向前加签” * * @param userId 当前用户 ID * @param reqVO 请求参数,包含任务 ID 和加签类型 @@ -737,18 +761,22 @@ public class BpmTaskServiceImpl implements BpmTaskService { */ private TaskEntityImpl validateAddSign(Long userId, BpmTaskAddSignReqVO reqVO) { TaskEntityImpl taskEntity = (TaskEntityImpl) validateTask(userId, reqVO.getId()); - //向前加签和向后加签不能同时存在 + // 向前加签和向后加签不能同时存在 if (StrUtil.isNotBlank(taskEntity.getScopeType()) && !BpmTaskAddSignTypeEnum.AFTER_CHILDREN_TASK.getDesc().equals(taskEntity.getScopeType())) { + // TODO @海:下面这个判断,是不是可以写上面这个判断后面? + // TODO @海:一个小技巧,如果写不等于的时候,一般可以用 ObjectUtil.notEquals,这样少一层取反,理解起来简单点; if (!taskEntity.getScopeType().equals(reqVO.getType())) { throw exception(TASK_ADD_SIGN_TYPE_ERROR, BpmTaskAddSignTypeEnum.formatDesc(taskEntity.getScopeType()), BpmTaskAddSignTypeEnum.formatDesc(reqVO.getType())); } } - //同一个 key 的任务,审批人不重复 + // 同一个 key 的任务,审批人不重复 List taskList = taskService.createTaskQuery().processInstanceId(taskEntity.getProcessInstanceId()) .taskDefinitionKey(taskEntity.getTaskDefinitionKey()).list(); + // TODO @海:这里是不是 Task::getAssignee 解析成 List 下面会更简洁一点? List currentAssigneeList = convertList(taskList, Task::getAssignee); + // TODO @海:frontAssigneeList 改成 addAssigneeList,新增的;避免和 front 前端这样界面耦合的名词哈; List frontAssigneeList = convertList(reqVO.getUserIdList(), String::valueOf); currentAssigneeList.retainAll(frontAssigneeList); if (CollUtil.isNotEmpty(currentAssigneeList)) { @@ -761,20 +789,22 @@ public class BpmTaskServiceImpl implements BpmTaskService { /** * 创建加签子任务 * - * @param addSingUserIdList 被加签的用户ID + * @param addSingUserIdList 被加签的用户 ID * @param taskEntity 被加签的任务 */ private void createSignSubTasks(List addSingUserIdList, TaskEntityImpl taskEntity) { + // TODO @海:可以 if return;这样括号层级少一点;下面的 if (StrUtil.isNotBlank(addSignId)) { 也是类似; if (CollUtil.isNotEmpty(addSingUserIdList)) { - // 创建加签人的新任务,全部基于 taskEntity 为父任务来创建 + // 创建加签人的新任务,全部基于 taskEntity 为父任务来创建 addSingUserIdList.forEach(addSignId -> { if (StrUtil.isNotBlank(addSignId)) { - this.createSubTask(taskEntity, addSignId); + createSubTask(taskEntity, addSignId); } }); } } + // TODO @海:这个是不是命名上,要和 createSignSubTasks 保持一致? /** * 创建子任务 * @@ -783,18 +813,19 @@ public class BpmTaskServiceImpl implements BpmTaskService { * @return */ private void createSubTask(TaskEntityImpl parentTask, String assignee) { - //1.生成子任务 + // 1. 生成子任务 TaskEntityImpl task = (TaskEntityImpl) taskService.newTask(IdUtil.fastSimpleUUID()); task = BpmTaskConvert.INSTANCE.convert(task,parentTask); if (BpmTaskAddSignTypeEnum.BEFORE.getType().equals(parentTask.getScopeType())) { - // 2. 前加签,才设置审批人,否则设置 owner + // 2.1 前加签,才设置审批人,否则设置 owner task.setAssignee(assignee); } else { - //2.2 设置 owner 不设置 assignee 是因为不能同时审批,需要等父任务完成 + // 2.2.1 设置 owner 不设置 assignee 是因为不能同时审批,需要等父任务完成 task.setOwner(assignee); - //2.3 设置向后加签任务的 scopeType 为 afterChildrenTask,用于设置任务扩展表的状态 + // 2.2.2 设置向后加签任务的 scopeType 为 afterChildrenTask,用于设置任务扩展表的状态 task.setScopeType(BpmTaskAddSignTypeEnum.AFTER_CHILDREN_TASK.getType()); } + // 2. 保存子任务 taskService.saveTask(task); }