Commit bc4427aca54755bc2661bf0254acd46e2c351482
1 parent
b2b2b497
BPM:完善 task 转派的实现
Showing
6 changed files
with
55 additions
and
56 deletions
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
| ... | ... | @@ -53,7 +53,9 @@ public interface ErrorCodeConstants { |
| 53 | 53 | ErrorCode TASK_ADD_SIGN_USER_NOT_EXIST = new ErrorCode(1_009_005_009, "任务加签:选择的用户不存在"); |
| 54 | 54 | ErrorCode TASK_ADD_SIGN_TYPE_ERROR = new ErrorCode(1_009_005_010, "任务加签:当前任务已经{},不能{}"); |
| 55 | 55 | ErrorCode TASK_ADD_SIGN_USER_REPEAT = new ErrorCode(1_009_005_011, "任务加签失败,加签人与现有审批人[{}]重复"); |
| 56 | - ErrorCode TASK_SUB_SIGN_NO_PARENT = new ErrorCode(1_009_005_011, "任务减签失败,被减签的任务必须是通过加签生成的任务"); | |
| 56 | + ErrorCode TASK_SUB_SIGN_NO_PARENT = new ErrorCode(1_009_005_012, "任务减签失败,被减签的任务必须是通过加签生成的任务"); | |
| 57 | + ErrorCode TASK_TRANSFER_FAIL_USER_REPEAT = new ErrorCode(1_009_005_013, "任务转办失败,转办人和当前审批人为同一人"); | |
| 58 | + ErrorCode TASK_TRANSFER_FAIL_USER_NOT_EXISTS = new ErrorCode(1_009_005_014, "任务转办失败,转办人不存在"); | |
| 57 | 59 | |
| 58 | 60 | // ========== 流程任务分配规则 1-009-006-000 TODO 芋艿:这里要改下 ========== |
| 59 | 61 | ErrorCode TASK_CREATE_FAIL_NO_CANDIDATE_USER = new ErrorCode(1_009_006_003, "操作失败,原因:找不到任务的审批人!"); | ... | ... |
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmCommentTypeEnum.java
| ... | ... | @@ -18,9 +18,10 @@ public enum BpmCommentTypeEnum { |
| 18 | 18 | CANCEL("3", "已取消", ""), |
| 19 | 19 | BACK("4", "退回", "{}"), // 直接使用用户填写的原因 |
| 20 | 20 | DELEGATE_START("5", "委派发起", "[{}]将任务委派给[{}],委派理由为:{}"), |
| 21 | - DELEGATE_END("6", "委派完成", "[{}]将任务委派给[{}],委派理由为:{}"), | |
| 22 | - ADD_SIGN("7", "加签", "[{}]{}给了[{}],理由为:{}"), | |
| 23 | - SUB_SIGN("8", "减签", "[{}]操作了【减签】,审批人[{}]的任务被取消"), | |
| 21 | + DELEGATE_END("6", "委派完成", "[{}]完成委派任务,任务重新回到[{}]手中,审批建议为:{}"), | |
| 22 | + TRANSFER("7", "转派", "[{}]将任务转派给[{}],转派理由为:{}"), | |
| 23 | + ADD_SIGN("8", "加签", "[{}]{}给了[{}],理由为:{}"), | |
| 24 | + SUB_SIGN("9", "减签", "[{}]操作了【减签】,审批人[{}]的任务被取消"), | |
| 24 | 25 | ; |
| 25 | 26 | |
| 26 | 27 | /** | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java
| ... | ... | @@ -118,14 +118,6 @@ public class BpmTaskController { |
| 118 | 118 | return success(true); |
| 119 | 119 | } |
| 120 | 120 | |
| 121 | - @PutMapping("/update-assignee") | |
| 122 | - @Operation(summary = "更新任务的负责人", description = "用于【流程详情】的【转派】按钮") | |
| 123 | - @PreAuthorize("@ss.hasPermission('bpm:task:update')") | |
| 124 | - public CommonResult<Boolean> updateTaskAssignee(@Valid @RequestBody BpmTaskUpdateAssigneeReqVO reqVO) { | |
| 125 | - taskService.updateTaskAssignee(getLoginUserId(), reqVO); | |
| 126 | - return success(true); | |
| 127 | - } | |
| 128 | - | |
| 129 | 121 | @GetMapping("/list-by-return") |
| 130 | 122 | @Operation(summary = "获取所有可回退的节点", description = "用于【流程详情】的【回退】按钮") |
| 131 | 123 | @Parameter(name = "taskId", description = "当前任务ID", required = true) |
| ... | ... | @@ -145,13 +137,21 @@ public class BpmTaskController { |
| 145 | 137 | } |
| 146 | 138 | |
| 147 | 139 | @PutMapping("/delegate") |
| 148 | - @Operation(summary = "委派任务", description = "用于【流程详情】的【委派】按钮。和向前【加签】有点像,唯一区别是【委托】没有单独创立任务") | |
| 140 | + @Operation(summary = "委派任务", description = "用于【流程详情】的【委派】按钮") | |
| 149 | 141 | @PreAuthorize("@ss.hasPermission('bpm:task:update')") |
| 150 | 142 | public CommonResult<Boolean> delegateTask(@Valid @RequestBody BpmTaskDelegateReqVO reqVO) { |
| 151 | 143 | taskService.delegateTask(getLoginUserId(), reqVO); |
| 152 | 144 | return success(true); |
| 153 | 145 | } |
| 154 | 146 | |
| 147 | + @PutMapping("/transfer") | |
| 148 | + @Operation(summary = "转派任务", description = "用于【流程详情】的【转派】按钮") | |
| 149 | + @PreAuthorize("@ss.hasPermission('bpm:task:update')") | |
| 150 | + public CommonResult<Boolean> transferTask(@Valid @RequestBody BpmTaskTransferReqVO reqVO) { | |
| 151 | + taskService.transferTask(getLoginUserId(), reqVO); | |
| 152 | + return success(true); | |
| 153 | + } | |
| 154 | + | |
| 155 | 155 | @PutMapping("/create-sign") |
| 156 | 156 | @Operation(summary = "加签", description = "before 前加签,after 后加签") |
| 157 | 157 | @PreAuthorize("@ss.hasPermission('bpm:task:update')") | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskUpdateAssigneeReqVO.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskTransferReqVO.java
| ... | ... | @@ -6,9 +6,9 @@ import lombok.Data; |
| 6 | 6 | import jakarta.validation.constraints.NotEmpty; |
| 7 | 7 | import jakarta.validation.constraints.NotNull; |
| 8 | 8 | |
| 9 | -@Schema(description = "管理后台 - 流程任务的更新负责人的 Request VO") | |
| 9 | +@Schema(description = "管理后台 - 流程任务的转办 Request VO") | |
| 10 | 10 | @Data |
| 11 | -public class BpmTaskUpdateAssigneeReqVO { | |
| 11 | +public class BpmTaskTransferReqVO { | |
| 12 | 12 | |
| 13 | 13 | @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| 14 | 14 | @NotEmpty(message = "任务编号不能为空") |
| ... | ... | @@ -18,4 +18,8 @@ public class BpmTaskUpdateAssigneeReqVO { |
| 18 | 18 | @NotNull(message = "新审批人的用户编号不能为空") |
| 19 | 19 | private Long assigneeUserId; |
| 20 | 20 | |
| 21 | + @Schema(description = "转办原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "做不了决定,需要你先帮忙瞅瞅") | |
| 22 | + @NotEmpty(message = "转办原因不能为空") | |
| 23 | + private String reason; | |
| 24 | + | |
| 21 | 25 | } | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java
| ... | ... | @@ -87,15 +87,7 @@ public interface BpmTaskService { |
| 87 | 87 | * @param userId 用户编号 |
| 88 | 88 | * @param reqVO 分配请求 |
| 89 | 89 | */ |
| 90 | - void updateTaskAssignee(Long userId, BpmTaskUpdateAssigneeReqVO reqVO); | |
| 91 | - | |
| 92 | - /** | |
| 93 | - * 将流程任务分配给指定用户 | |
| 94 | - * | |
| 95 | - * @param id 流程任务编号 | |
| 96 | - * @param userId 用户编号 | |
| 97 | - */ | |
| 98 | - void updateTaskAssignee(String id, Long userId); | |
| 90 | + void transferTask(Long userId, BpmTaskTransferReqVO reqVO); | |
| 99 | 91 | |
| 100 | 92 | /** |
| 101 | 93 | * 创建 Task 拓展记录 | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
| ... | ... | @@ -179,7 +179,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 179 | 179 | |
| 180 | 180 | // 情况三:审批普通的任务。大多数情况下,都是这样 |
| 181 | 181 | // 3.1 更新 task 状态、原因 |
| 182 | - updateTaskStatus(task.getId(), BpmTaskStatustEnum.APPROVE.getStatus()); | |
| 182 | + updateTaskStatusAndReason(task.getId(), BpmTaskStatustEnum.APPROVE.getStatus(), reqVO.getReason()); | |
| 183 | 183 | // 3.2 添加评论 |
| 184 | 184 | taskService.addComment(task.getId(), task.getProcessInstanceId(), |
| 185 | 185 | BpmCommentTypeEnum.APPROVE.getType(), reqVO.getReason()); |
| ... | ... | @@ -317,19 +317,6 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 317 | 317 | // .setEndTime(LocalDateTime.now()).setReason(reqVO.getReason())); |
| 318 | 318 | } |
| 319 | 319 | |
| 320 | - @Override | |
| 321 | - public void updateTaskAssignee(Long userId, BpmTaskUpdateAssigneeReqVO reqVO) { | |
| 322 | - // 校验任务存在 | |
| 323 | - Task task = validateTask(userId, reqVO.getId()); | |
| 324 | - // 更新负责人 | |
| 325 | - updateTaskAssignee(task.getId(), reqVO.getAssigneeUserId()); | |
| 326 | - } | |
| 327 | - | |
| 328 | - @Override | |
| 329 | - public void updateTaskAssignee(String id, Long userId) { | |
| 330 | - taskService.setAssignee(id, String.valueOf(userId)); | |
| 331 | - } | |
| 332 | - | |
| 333 | 320 | /** |
| 334 | 321 | * 更新流程任务的 status 状态 |
| 335 | 322 | * |
| ... | ... | @@ -599,41 +586,54 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 599 | 586 | public void delegateTask(Long userId, BpmTaskDelegateReqVO reqVO) { |
| 600 | 587 | String taskId = reqVO.getId(); |
| 601 | 588 | // 1.1 校验任务 |
| 602 | - Task task = validateTaskCanDelegate(userId, reqVO); | |
| 589 | + Task task = validateTask(userId, reqVO.getId()); | |
| 590 | + if (task.getAssignee().equals(reqVO.getDelegateUserId().toString())) { // 校验当前审批人和被委派人不是同一人 | |
| 591 | + throw exception(TASK_DELEGATE_FAIL_USER_REPEAT); | |
| 592 | + } | |
| 603 | 593 | // 1.2 校验目标用户存在 |
| 604 | 594 | AdminUserRespDTO delegateUser = adminUserApi.getUser(reqVO.getDelegateUserId()); |
| 605 | 595 | if (delegateUser == null) { |
| 606 | 596 | throw exception(TASK_DELEGATE_FAIL_USER_NOT_EXISTS); |
| 607 | 597 | } |
| 608 | 598 | |
| 609 | - // 2. 添加审批意见 | |
| 599 | + // 2. 添加委托意见 | |
| 610 | 600 | AdminUserRespDTO currentUser = adminUserApi.getUser(userId); |
| 611 | 601 | taskService.addComment(taskId, task.getProcessInstanceId(), BpmCommentTypeEnum.DELEGATE_START.getType(), |
| 612 | 602 | BpmCommentTypeEnum.DELEGATE_START.formatComment(currentUser.getNickname(), delegateUser.getNickname(), reqVO.getReason())); |
| 613 | 603 | |
| 614 | 604 | // 3.1 设置任务所有人 (owner) 为原任务的处理人 (assignee) |
| 615 | 605 | taskService.setOwner(taskId, task.getAssignee()); |
| 616 | - // 3.2 执行委派,将任务委派给 receiveId | |
| 606 | + // 3.2 执行委派,将任务委派给 delegateUser | |
| 617 | 607 | taskService.delegateTask(taskId, reqVO.getDelegateUserId().toString()); |
| 618 | - // 3.3 更新 task 状态 + 原因 | |
| 619 | - updateTaskStatusAndReason(taskId, BpmTaskStatustEnum.DELEGATE.getStatus(), reqVO.getReason()); | |
| 608 | + // 3.3 更新 task 状态。 | |
| 609 | + // 为什么不更新原因?因为原因目前主要给审批通过、不通过时使用 | |
| 610 | + updateTaskStatus(taskId, BpmTaskStatustEnum.DELEGATE.getStatus()); | |
| 620 | 611 | } |
| 621 | 612 | |
| 622 | - /** | |
| 623 | - * 校验任务委派参数 | |
| 624 | - * | |
| 625 | - * @param userId 用户编号 | |
| 626 | - * @param reqVO 任务编号,接收人ID | |
| 627 | - * @return 当前任务信息 | |
| 628 | - */ | |
| 629 | - private Task validateTaskCanDelegate(Long userId, BpmTaskDelegateReqVO reqVO) { | |
| 630 | - // 校验任务 | |
| 613 | + @Override | |
| 614 | + public void transferTask(Long userId, BpmTaskTransferReqVO reqVO) { | |
| 615 | + String taskId = reqVO.getId(); | |
| 616 | + // 1.1 校验任务 | |
| 631 | 617 | Task task = validateTask(userId, reqVO.getId()); |
| 632 | - // 校验当前审批人和被委派人不是同一人 | |
| 633 | - if (task.getAssignee().equals(reqVO.getDelegateUserId().toString())) { | |
| 634 | - throw exception(TASK_DELEGATE_FAIL_USER_REPEAT); | |
| 618 | + if (task.getAssignee().equals(reqVO.getAssigneeUserId().toString())) { // 校验当前审批人和被转派人不是同一人 | |
| 619 | + throw exception(TASK_TRANSFER_FAIL_USER_REPEAT); | |
| 635 | 620 | } |
| 636 | - return task; | |
| 621 | + // 1.2 校验目标用户存在 | |
| 622 | + AdminUserRespDTO assigneeUser = adminUserApi.getUser(reqVO.getAssigneeUserId()); | |
| 623 | + if (assigneeUser == null) { | |
| 624 | + throw exception(TASK_TRANSFER_FAIL_USER_NOT_EXISTS); | |
| 625 | + } | |
| 626 | + | |
| 627 | + // 2. 添加委托意见 | |
| 628 | + AdminUserRespDTO currentUser = adminUserApi.getUser(userId); | |
| 629 | + taskService.addComment(taskId, task.getProcessInstanceId(), BpmCommentTypeEnum.TRANSFER.getType(), | |
| 630 | + BpmCommentTypeEnum.TRANSFER.formatComment(currentUser.getNickname(), assigneeUser.getNickname(), reqVO.getReason())); | |
| 631 | + | |
| 632 | + // 3.1 设置任务所有人 (owner) 为原任务的处理人 (assignee) | |
| 633 | + taskService.setOwner(taskId, task.getAssignee()); | |
| 634 | + // 3.2 执行转派(审批人),将任务转派给 assigneeUser | |
| 635 | + // 委托( delegate)和转派(transfer)的差别,就在这块的调用!!!! | |
| 636 | + taskService.setAssignee(taskId, reqVO.getAssigneeUserId().toString()); | |
| 637 | 637 | } |
| 638 | 638 | |
| 639 | 639 | @Override | ... | ... |