Commit bc4427aca54755bc2661bf0254acd46e2c351482

Authored by YunaiV
1 parent b2b2b497

BPM:完善 task 转派的实现

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