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,7 +53,9 @@ public interface ErrorCodeConstants { | ||
| 53 | ErrorCode TASK_ADD_SIGN_USER_NOT_EXIST = new ErrorCode(1_009_005_009, "任务加签:选择的用户不存在"); | 53 | ErrorCode TASK_ADD_SIGN_USER_NOT_EXIST = new ErrorCode(1_009_005_009, "任务加签:选择的用户不存在"); |
| 54 | ErrorCode TASK_ADD_SIGN_TYPE_ERROR = new ErrorCode(1_009_005_010, "任务加签:当前任务已经{},不能{}"); | 54 | ErrorCode TASK_ADD_SIGN_TYPE_ERROR = new ErrorCode(1_009_005_010, "任务加签:当前任务已经{},不能{}"); |
| 55 | ErrorCode TASK_ADD_SIGN_USER_REPEAT = new ErrorCode(1_009_005_011, "任务加签失败,加签人与现有审批人[{}]重复"); | 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 | // ========== 流程任务分配规则 1-009-006-000 TODO 芋艿:这里要改下 ========== | 60 | // ========== 流程任务分配规则 1-009-006-000 TODO 芋艿:这里要改下 ========== |
| 59 | ErrorCode TASK_CREATE_FAIL_NO_CANDIDATE_USER = new ErrorCode(1_009_006_003, "操作失败,原因:找不到任务的审批人!"); | 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,9 +18,10 @@ public enum BpmCommentTypeEnum { | ||
| 18 | CANCEL("3", "已取消", ""), | 18 | CANCEL("3", "已取消", ""), |
| 19 | BACK("4", "退回", "{}"), // 直接使用用户填写的原因 | 19 | BACK("4", "退回", "{}"), // 直接使用用户填写的原因 |
| 20 | DELEGATE_START("5", "委派发起", "[{}]将任务委派给[{}],委派理由为:{}"), | 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,14 +118,6 @@ public class BpmTaskController { | ||
| 118 | return success(true); | 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 | @GetMapping("/list-by-return") | 121 | @GetMapping("/list-by-return") |
| 130 | @Operation(summary = "获取所有可回退的节点", description = "用于【流程详情】的【回退】按钮") | 122 | @Operation(summary = "获取所有可回退的节点", description = "用于【流程详情】的【回退】按钮") |
| 131 | @Parameter(name = "taskId", description = "当前任务ID", required = true) | 123 | @Parameter(name = "taskId", description = "当前任务ID", required = true) |
| @@ -145,13 +137,21 @@ public class BpmTaskController { | @@ -145,13 +137,21 @@ public class BpmTaskController { | ||
| 145 | } | 137 | } |
| 146 | 138 | ||
| 147 | @PutMapping("/delegate") | 139 | @PutMapping("/delegate") |
| 148 | - @Operation(summary = "委派任务", description = "用于【流程详情】的【委派】按钮。和向前【加签】有点像,唯一区别是【委托】没有单独创立任务") | 140 | + @Operation(summary = "委派任务", description = "用于【流程详情】的【委派】按钮") |
| 149 | @PreAuthorize("@ss.hasPermission('bpm:task:update')") | 141 | @PreAuthorize("@ss.hasPermission('bpm:task:update')") |
| 150 | public CommonResult<Boolean> delegateTask(@Valid @RequestBody BpmTaskDelegateReqVO reqVO) { | 142 | public CommonResult<Boolean> delegateTask(@Valid @RequestBody BpmTaskDelegateReqVO reqVO) { |
| 151 | taskService.delegateTask(getLoginUserId(), reqVO); | 143 | taskService.delegateTask(getLoginUserId(), reqVO); |
| 152 | return success(true); | 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 | @PutMapping("/create-sign") | 155 | @PutMapping("/create-sign") |
| 156 | @Operation(summary = "加签", description = "before 前加签,after 后加签") | 156 | @Operation(summary = "加签", description = "before 前加签,after 后加签") |
| 157 | @PreAuthorize("@ss.hasPermission('bpm:task:update')") | 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,9 +6,9 @@ import lombok.Data; | ||
| 6 | import jakarta.validation.constraints.NotEmpty; | 6 | import jakarta.validation.constraints.NotEmpty; |
| 7 | import jakarta.validation.constraints.NotNull; | 7 | import jakarta.validation.constraints.NotNull; |
| 8 | 8 | ||
| 9 | -@Schema(description = "管理后台 - 流程任务的更新负责人的 Request VO") | 9 | +@Schema(description = "管理后台 - 流程任务的转办 Request VO") |
| 10 | @Data | 10 | @Data |
| 11 | -public class BpmTaskUpdateAssigneeReqVO { | 11 | +public class BpmTaskTransferReqVO { |
| 12 | 12 | ||
| 13 | @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | 13 | @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| 14 | @NotEmpty(message = "任务编号不能为空") | 14 | @NotEmpty(message = "任务编号不能为空") |
| @@ -18,4 +18,8 @@ public class BpmTaskUpdateAssigneeReqVO { | @@ -18,4 +18,8 @@ public class BpmTaskUpdateAssigneeReqVO { | ||
| 18 | @NotNull(message = "新审批人的用户编号不能为空") | 18 | @NotNull(message = "新审批人的用户编号不能为空") |
| 19 | private Long assigneeUserId; | 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,15 +87,7 @@ public interface BpmTaskService { | ||
| 87 | * @param userId 用户编号 | 87 | * @param userId 用户编号 |
| 88 | * @param reqVO 分配请求 | 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 | * 创建 Task 拓展记录 | 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,7 +179,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 179 | 179 | ||
| 180 | // 情况三:审批普通的任务。大多数情况下,都是这样 | 180 | // 情况三:审批普通的任务。大多数情况下,都是这样 |
| 181 | // 3.1 更新 task 状态、原因 | 181 | // 3.1 更新 task 状态、原因 |
| 182 | - updateTaskStatus(task.getId(), BpmTaskStatustEnum.APPROVE.getStatus()); | 182 | + updateTaskStatusAndReason(task.getId(), BpmTaskStatustEnum.APPROVE.getStatus(), reqVO.getReason()); |
| 183 | // 3.2 添加评论 | 183 | // 3.2 添加评论 |
| 184 | taskService.addComment(task.getId(), task.getProcessInstanceId(), | 184 | taskService.addComment(task.getId(), task.getProcessInstanceId(), |
| 185 | BpmCommentTypeEnum.APPROVE.getType(), reqVO.getReason()); | 185 | BpmCommentTypeEnum.APPROVE.getType(), reqVO.getReason()); |
| @@ -317,19 +317,6 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -317,19 +317,6 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 317 | // .setEndTime(LocalDateTime.now()).setReason(reqVO.getReason())); | 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 | * 更新流程任务的 status 状态 | 321 | * 更新流程任务的 status 状态 |
| 335 | * | 322 | * |
| @@ -599,41 +586,54 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -599,41 +586,54 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 599 | public void delegateTask(Long userId, BpmTaskDelegateReqVO reqVO) { | 586 | public void delegateTask(Long userId, BpmTaskDelegateReqVO reqVO) { |
| 600 | String taskId = reqVO.getId(); | 587 | String taskId = reqVO.getId(); |
| 601 | // 1.1 校验任务 | 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 | // 1.2 校验目标用户存在 | 593 | // 1.2 校验目标用户存在 |
| 604 | AdminUserRespDTO delegateUser = adminUserApi.getUser(reqVO.getDelegateUserId()); | 594 | AdminUserRespDTO delegateUser = adminUserApi.getUser(reqVO.getDelegateUserId()); |
| 605 | if (delegateUser == null) { | 595 | if (delegateUser == null) { |
| 606 | throw exception(TASK_DELEGATE_FAIL_USER_NOT_EXISTS); | 596 | throw exception(TASK_DELEGATE_FAIL_USER_NOT_EXISTS); |
| 607 | } | 597 | } |
| 608 | 598 | ||
| 609 | - // 2. 添加审批意见 | 599 | + // 2. 添加委托意见 |
| 610 | AdminUserRespDTO currentUser = adminUserApi.getUser(userId); | 600 | AdminUserRespDTO currentUser = adminUserApi.getUser(userId); |
| 611 | taskService.addComment(taskId, task.getProcessInstanceId(), BpmCommentTypeEnum.DELEGATE_START.getType(), | 601 | taskService.addComment(taskId, task.getProcessInstanceId(), BpmCommentTypeEnum.DELEGATE_START.getType(), |
| 612 | BpmCommentTypeEnum.DELEGATE_START.formatComment(currentUser.getNickname(), delegateUser.getNickname(), reqVO.getReason())); | 602 | BpmCommentTypeEnum.DELEGATE_START.formatComment(currentUser.getNickname(), delegateUser.getNickname(), reqVO.getReason())); |
| 613 | 603 | ||
| 614 | // 3.1 设置任务所有人 (owner) 为原任务的处理人 (assignee) | 604 | // 3.1 设置任务所有人 (owner) 为原任务的处理人 (assignee) |
| 615 | taskService.setOwner(taskId, task.getAssignee()); | 605 | taskService.setOwner(taskId, task.getAssignee()); |
| 616 | - // 3.2 执行委派,将任务委派给 receiveId | 606 | + // 3.2 执行委派,将任务委派给 delegateUser |
| 617 | taskService.delegateTask(taskId, reqVO.getDelegateUserId().toString()); | 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 | Task task = validateTask(userId, reqVO.getId()); | 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 | @Override | 639 | @Override |