Commit f088fdff84ca3eff266e034d63b13d1f7df5e6ec
1 parent
8649b285
code review:委托逻辑
Showing
6 changed files
with
70 additions
and
74 deletions
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
| ... | ... | @@ -43,15 +43,13 @@ public interface ErrorCodeConstants { |
| 43 | 43 | ErrorCode PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF = new ErrorCode(1_009_004_002, "流程取消失败,该流程不是你发起的"); |
| 44 | 44 | |
| 45 | 45 | // ========== 流程任务 1-009-005-000 ========== |
| 46 | - ErrorCode TASK_COMPLETE_FAIL_NOT_EXISTS = new ErrorCode(1_009_005_000, "审批任务失败,原因:该任务不处于未审批"); | |
| 47 | - ErrorCode TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF = new ErrorCode(1_009_005_001, "审批任务失败,原因:该任务的审批人不是你"); | |
| 46 | + ErrorCode TASK_OPERATE_FAIL_ASSIGN_NOT_SELF = new ErrorCode(1_009_005_001, "操作失败,原因:该任务的审批人不是你"); | |
| 48 | 47 | ErrorCode TASK_NOT_EXISTS = new ErrorCode(1_009_005_002, "流程任务不存在"); |
| 49 | 48 | ErrorCode TASK_IS_PENDING = new ErrorCode(1_009_005_003, "当前任务处于挂起状态,不能操作"); |
| 50 | 49 | ErrorCode TASK_TARGET_NODE_NOT_EXISTS = new ErrorCode(1_009_005_004, " 目标节点不存在"); |
| 51 | - ErrorCode TASK_RETURN_FAIL_NO_RETURN_TASK = new ErrorCode(1_009_005_005, "回退任务失败,选择回退的节点没有需要回滚的任务!请重新选择其他任务节点"); | |
| 52 | 50 | ErrorCode TASK_RETURN_FAIL_SOURCE_TARGET_ERROR = new ErrorCode(1_009_005_006, "回退任务失败,目标节点是在并行网关上或非同一路线上,不可跳转"); |
| 53 | - ErrorCode TASK_DELEGATE_USER_REPEAT = new ErrorCode(1_009_005_007, "任务委派失败,委派人和当前审批人为同一人"); | |
| 54 | - ErrorCode TASK_DELEGATE_USER_NULL = new ErrorCode(1_009_005_008, "任务委派失败,被委派人不存在"); | |
| 51 | + ErrorCode TASK_DELEGATE_FAIL_USER_REPEAT = new ErrorCode(1_009_005_007, "任务委派失败,委派人和当前审批人为同一人"); | |
| 52 | + ErrorCode TASK_DELEGATE_FAIL_USER_NOT_EXISTS = new ErrorCode(1_009_005_008, "任务委派失败,被委派人不存在"); | |
| 55 | 53 | |
| 56 | 54 | // ========== 流程任务分配规则 1-009-006-000 ========== |
| 57 | 55 | ErrorCode TASK_ASSIGN_RULE_EXISTS = new ErrorCode(1_009_006_000, "流程({}) 的任务({}) 已经存在分配规则"); | ... | ... |
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java
| ... | ... | @@ -87,14 +87,15 @@ public class BpmTaskController { |
| 87 | 87 | @Operation(summary = "回退任务", description = "用于【流程详情】的【回退】按钮") |
| 88 | 88 | @PreAuthorize("@ss.hasPermission('bpm:task:update')") |
| 89 | 89 | public CommonResult<Boolean> returnTask(@Valid @RequestBody BpmTaskReturnReqVO reqVO) { |
| 90 | - taskService.returnTask(reqVO); | |
| 90 | + taskService.returnTask(getLoginUserId(), reqVO); | |
| 91 | 91 | return success(true); |
| 92 | 92 | } |
| 93 | 93 | |
| 94 | 94 | @PutMapping("/delegate") |
| 95 | - @Operation(summary = "委派任务", description = "用于【流程详情】的【委派】按钮,和向前加签有点像,和向前加签的唯一的区别是没有单独创立任务") | |
| 96 | - @PreAuthorize("@ss.hasPermission('bpm:task:delegate')") | |
| 95 | + @Operation(summary = "委派任务", description = "用于【流程详情】的【委派】按钮。和向前【加签】有点像,唯一区别是【委托】没有单独创立任务") | |
| 96 | + @PreAuthorize("@ss.hasPermission('bpm:task:update')") | |
| 97 | 97 | public CommonResult<Boolean> delegateTask(@Valid @RequestBody BpmTaskDelegateReqVO reqVO) { |
| 98 | + // TODO @海:, 后面要有空格 | |
| 98 | 99 | taskService.delegateTask(reqVO,getLoginUserId()); |
| 99 | 100 | return success(true); |
| 100 | 101 | } | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskDelegateReqVO.java
| ... | ... | @@ -14,11 +14,12 @@ public class BpmTaskDelegateReqVO { |
| 14 | 14 | @NotEmpty(message = "任务编号不能为空") |
| 15 | 15 | private String id; |
| 16 | 16 | |
| 17 | - @Schema(description = "被委派人ID", requiredMode = Schema.RequiredMode.REQUIRED,example = "1") | |
| 18 | - @NotNull(message = "被委派人ID不能为空") | |
| 17 | + @Schema(description = "被委派人 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 18 | + @NotNull(message = "被委派人 ID 不能为空") | |
| 19 | 19 | private Long delegateUserId; |
| 20 | 20 | |
| 21 | - @Schema(description = "委派原因", requiredMode = Schema.RequiredMode.REQUIRED,example = "做不了决定,需要你先帮忙瞅瞅") | |
| 21 | + @Schema(description = "委派原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "做不了决定,需要你先帮忙瞅瞅") | |
| 22 | 22 | @NotEmpty(message = "委派原因不能为空") |
| 23 | 23 | private String reason; |
| 24 | + | |
| 24 | 25 | } | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java
| ... | ... | @@ -133,15 +133,18 @@ public interface BpmTaskService { |
| 133 | 133 | /** |
| 134 | 134 | * 将任务回退到指定的 targetDefinitionKey 位置 |
| 135 | 135 | * |
| 136 | + * @param userId 用户编号 | |
| 136 | 137 | * @param reqVO 回退的任务key和当前所在的任务ID |
| 137 | 138 | */ |
| 138 | - void returnTask(BpmTaskReturnReqVO reqVO); | |
| 139 | + void returnTask(Long userId, BpmTaskReturnReqVO reqVO); | |
| 139 | 140 | |
| 141 | + // TODO @海:userId 放前面 | |
| 140 | 142 | /** |
| 141 | 143 | * 将指定任务委派给其他人处理,等接收人处理后再回到原审批人手中审批 |
| 142 | 144 | * |
| 143 | 145 | * @param reqVO 被委派人和被委派的任务编号理由参数 |
| 144 | - * @param userId 委派人ID | |
| 146 | + * @param userId 用户编号 | |
| 145 | 147 | */ |
| 146 | 148 | void delegateTask(BpmTaskDelegateReqVO reqVO, Long userId); |
| 149 | + | |
| 147 | 150 | } | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
| ... | ... | @@ -189,25 +189,27 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 189 | 189 | @Override |
| 190 | 190 | @Transactional(rollbackFor = Exception.class) |
| 191 | 191 | public void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO) { |
| 192 | - // 校验任务存在 | |
| 193 | - Task task = checkTask(userId, reqVO.getId()); | |
| 194 | - // 校验流程实例存在 | |
| 192 | + // 1.1 校验任务存在 | |
| 193 | + Task task = validateTask(userId, reqVO.getId()); | |
| 194 | + // 1.2 校验流程实例存在 | |
| 195 | 195 | ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); |
| 196 | 196 | if (instance == null) { |
| 197 | 197 | throw exception(PROCESS_INSTANCE_NOT_EXISTS); |
| 198 | 198 | } |
| 199 | - //被委派的任务,不调用 complete 去完成任务 | |
| 199 | + | |
| 200 | + // 情况一:被委派的任务,不调用 complete 去完成任务 | |
| 200 | 201 | if (DelegationState.PENDING.equals(task.getDelegationState())) { |
| 201 | - this.approveDelegateTask(reqVO, task); | |
| 202 | - } else { | |
| 203 | - // 完成任务,审批通过 | |
| 204 | - taskService.complete(task.getId(), instance.getProcessVariables()); | |
| 205 | - | |
| 206 | - // 更新任务拓展表为通过 | |
| 207 | - taskExtMapper.updateByTaskId( | |
| 208 | - new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()) | |
| 209 | - .setReason(reqVO.getReason())); | |
| 202 | + approveDelegateTask(reqVO, task); | |
| 203 | + return; | |
| 210 | 204 | } |
| 205 | + | |
| 206 | + // 情况二:自己审批的任务,调用 complete 去完成任务 | |
| 207 | + // 完成任务,审批通过 | |
| 208 | + taskService.complete(task.getId(), instance.getProcessVariables()); | |
| 209 | + // 更新任务拓展表为通过 | |
| 210 | + taskExtMapper.updateByTaskId( | |
| 211 | + new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()) | |
| 212 | + .setReason(reqVO.getReason())); | |
| 211 | 213 | } |
| 212 | 214 | |
| 213 | 215 | /** |
| ... | ... | @@ -217,19 +219,19 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 217 | 219 | * @param task 当前被审批的任务 |
| 218 | 220 | */ |
| 219 | 221 | private void approveDelegateTask(BpmTaskApproveReqVO reqVO, Task task) { |
| 220 | - // 添加审批意见 | |
| 222 | + // 1. 添加审批意见 | |
| 221 | 223 | AdminUserRespDTO currentUser = adminUserApi.getUser(WebFrameworkUtils.getLoginUserId()); |
| 222 | - //原审批人 | |
| 223 | 224 | AdminUserRespDTO sourceApproveUser = adminUserApi.getUser(NumberUtils.parseLong(task.getOwner())); |
| 224 | 225 | Assert.notNull(sourceApproveUser, "委派任务找不到原审批人,需要检查数据"); |
| 225 | - //添加审批意见 | |
| 226 | 226 | String comment = StrUtil.format("[{}]完成委派任务,任务重新回到[{}]手中,审批意见为:{}", currentUser.getNickname(), |
| 227 | 227 | sourceApproveUser.getNickname(), reqVO.getReason()); |
| 228 | - taskService.addComment(reqVO.getId(), task.getProcessInstanceId(), BpmProcessInstanceResultEnum.DELEGATE.getResult().toString(), comment); | |
| 229 | - //调用 resolveTask 完成任务,底层调用 TaskHelper.changeTaskAssignee(task, task.getOwner()); | |
| 230 | - //将 owner 设置为 assignee | |
| 228 | + taskService.addComment(reqVO.getId(), task.getProcessInstanceId(), | |
| 229 | + BpmProcessInstanceResultEnum.DELEGATE.getResult().toString(), comment); | |
| 230 | + | |
| 231 | + // 2.1 调用 resolveTask 完成任务。 | |
| 232 | + // 底层调用 TaskHelper.changeTaskAssignee(task, task.getOwner()):将 owner 设置为 assignee | |
| 231 | 233 | taskService.resolveTask(task.getId()); |
| 232 | - // 更新任务拓展表为【处理中】 | |
| 234 | + // 2.2 更新任务拓展表为【处理中】 | |
| 233 | 235 | taskExtMapper.updateByTaskId( |
| 234 | 236 | new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()) |
| 235 | 237 | .setReason(reqVO.getReason())); |
| ... | ... | @@ -238,7 +240,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 238 | 240 | @Override |
| 239 | 241 | @Transactional(rollbackFor = Exception.class) |
| 240 | 242 | public void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO) { |
| 241 | - Task task = checkTask(userId, reqVO.getId()); | |
| 243 | + Task task = validateTask(userId, reqVO.getId()); | |
| 242 | 244 | // 校验流程实例存在 |
| 243 | 245 | ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); |
| 244 | 246 | if (instance == null) { |
| ... | ... | @@ -257,7 +259,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 257 | 259 | @Override |
| 258 | 260 | public void updateTaskAssignee(Long userId, BpmTaskUpdateAssigneeReqVO reqVO) { |
| 259 | 261 | // 校验任务存在 |
| 260 | - Task task = checkTask(userId, reqVO.getId()); | |
| 262 | + Task task = validateTask(userId, reqVO.getId()); | |
| 261 | 263 | // 更新负责人 |
| 262 | 264 | updateTaskAssignee(task.getId(), reqVO.getAssigneeUserId()); |
| 263 | 265 | } |
| ... | ... | @@ -273,13 +275,13 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 273 | 275 | * @param userId 用户 id |
| 274 | 276 | * @param taskId task id |
| 275 | 277 | */ |
| 276 | - private Task checkTask(Long userId, String taskId) { | |
| 278 | + private Task validateTask(Long userId, String taskId) { | |
| 277 | 279 | Task task = getTask(taskId); |
| 278 | 280 | if (task == null) { |
| 279 | - throw exception(TASK_COMPLETE_FAIL_NOT_EXISTS); | |
| 281 | + throw exception(TASK_NOT_EXISTS); | |
| 280 | 282 | } |
| 281 | 283 | if (!Objects.equals(userId, NumberUtils.parseLong(task.getAssignee()))) { |
| 282 | - throw exception(TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF); | |
| 284 | + throw exception(TASK_OPERATE_FAIL_ASSIGN_NOT_SELF); | |
| 283 | 285 | } |
| 284 | 286 | return task; |
| 285 | 287 | } |
| ... | ... | @@ -358,24 +360,6 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 358 | 360 | return task; |
| 359 | 361 | } |
| 360 | 362 | |
| 361 | - /** | |
| 362 | - * 校验任务是否合法 | |
| 363 | - * | |
| 364 | - * @param taskId 任务编号 | |
| 365 | - * @return 任务 | |
| 366 | - */ | |
| 367 | - private Task validateTask(String taskId) { | |
| 368 | - // 当前任务 task | |
| 369 | - Task task = getTask(taskId); | |
| 370 | - if (task == null) { | |
| 371 | - throw exception(TASK_NOT_EXISTS); | |
| 372 | - } | |
| 373 | - if (task.isSuspended()) { | |
| 374 | - throw exception(TASK_IS_PENDING); | |
| 375 | - } | |
| 376 | - return task; | |
| 377 | - } | |
| 378 | - | |
| 379 | 363 | private HistoricTaskInstance getHistoricTask(String id) { |
| 380 | 364 | return historyService.createHistoricTaskInstanceQuery().taskId(id).singleResult(); |
| 381 | 365 | } |
| ... | ... | @@ -406,9 +390,12 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 406 | 390 | |
| 407 | 391 | @Override |
| 408 | 392 | @Transactional(rollbackFor = Exception.class) |
| 409 | - public void returnTask(BpmTaskReturnReqVO reqVO) { | |
| 393 | + public void returnTask(Long userId, BpmTaskReturnReqVO reqVO) { | |
| 410 | 394 | // 1.1 当前任务 task |
| 411 | - Task task = validateTask(reqVO.getId()); | |
| 395 | + Task task = validateTask(userId, reqVO.getId()); | |
| 396 | + if (task.isSuspended()) { | |
| 397 | + throw exception(TASK_IS_PENDING); | |
| 398 | + } | |
| 412 | 399 | // 1.2 校验源头和目标节点的关系,并返回目标元素 |
| 413 | 400 | FlowElement targetElement = validateTargetTaskCanReturn(task.getTaskDefinitionKey(), reqVO.getTargetDefinitionKey(), task.getProcessDefinitionId()); |
| 414 | 401 | |
| ... | ... | @@ -484,24 +471,29 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 484 | 471 | |
| 485 | 472 | @Override |
| 486 | 473 | @Transactional(rollbackFor = Exception.class) |
| 487 | - public void delegateTask(BpmTaskDelegateReqVO reqVO,Long userId) { | |
| 488 | - // 校验任务 | |
| 489 | - Task task = this.validateTaskDelegate(reqVO); | |
| 490 | - // 添加审批意见 | |
| 491 | - AdminUserRespDTO currentUser = adminUserApi.getUser(userId); | |
| 474 | + public void delegateTask(BpmTaskDelegateReqVO reqVO, Long userId) { | |
| 475 | + // 1.1 校验任务 | |
| 476 | + Task task = validateTaskCanDelegate(userId, reqVO); | |
| 477 | + // 1.2 校验目标用户存在 | |
| 492 | 478 | AdminUserRespDTO delegateUser = adminUserApi.getUser(reqVO.getDelegateUserId()); |
| 493 | 479 | if (delegateUser == null) { |
| 494 | - throw exception(TASK_DELEGATE_USER_NULL); | |
| 480 | + throw exception(TASK_DELEGATE_FAIL_USER_NOT_EXISTS); | |
| 495 | 481 | } |
| 482 | + | |
| 483 | + // 2. 添加审批意见 | |
| 484 | + AdminUserRespDTO currentUser = adminUserApi.getUser(userId); | |
| 496 | 485 | String comment = StrUtil.format("[{}]将任务委派给[{}],委派理由为:{}", currentUser.getNickname(), |
| 497 | 486 | delegateUser.getNickname(), reqVO.getReason()); |
| 498 | 487 | String taskId = reqVO.getId(); |
| 499 | - taskService.addComment(taskId, task.getProcessInstanceId(), BpmProcessInstanceResultEnum.DELEGATE.getResult().toString(), comment); | |
| 500 | - // 设置任务所有人 (owner) 为原任务的处理人 (assignee) | |
| 488 | + // TODO 海:后面改;感觉 comment 应该 type 做个枚举;不和 result 耦合在一起; | |
| 489 | + taskService.addComment(taskId, task.getProcessInstanceId(), | |
| 490 | + BpmProcessInstanceResultEnum.DELEGATE.getResult().toString(), comment); | |
| 491 | + | |
| 492 | + // 3.1 设置任务所有人 (owner) 为原任务的处理人 (assignee) | |
| 501 | 493 | taskService.setOwner(taskId, task.getAssignee()); |
| 502 | - // 执行委派,将任务委派给 receiveId | |
| 494 | + // 3.2 执行委派,将任务委派给 receiveId | |
| 503 | 495 | taskService.delegateTask(taskId, reqVO.getDelegateUserId().toString()); |
| 504 | - // 更新任务拓展表为【委派】 | |
| 496 | + // 3.3 更新任务拓展表为【委派】 | |
| 505 | 497 | taskExtMapper.updateByTaskId( |
| 506 | 498 | new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.DELEGATE.getResult()) |
| 507 | 499 | .setReason(reqVO.getReason())); |
| ... | ... | @@ -510,16 +502,18 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 510 | 502 | /** |
| 511 | 503 | * 校验任务委派参数 |
| 512 | 504 | * |
| 505 | + * @param userId 用户编号 | |
| 513 | 506 | * @param reqVO 任务编号,接收人ID |
| 514 | 507 | * @return 当前任务信息 |
| 515 | 508 | */ |
| 516 | - private Task validateTaskDelegate(BpmTaskDelegateReqVO reqVO) { | |
| 509 | + private Task validateTaskCanDelegate(Long userId, BpmTaskDelegateReqVO reqVO) { | |
| 517 | 510 | // 校验任务 |
| 518 | - Task task = checkTask(WebFrameworkUtils.getLoginUserId(), reqVO.getId()); | |
| 519 | - //校验当前审批人和被委派人不是同一人 | |
| 511 | + Task task = validateTask(userId, reqVO.getId()); | |
| 512 | + // 校验当前审批人和被委派人不是同一人 | |
| 520 | 513 | if (task.getAssignee().equals(reqVO.getDelegateUserId().toString())) { |
| 521 | - throw exception(TASK_DELEGATE_USER_REPEAT); | |
| 514 | + throw exception(TASK_DELEGATE_FAIL_USER_REPEAT); | |
| 522 | 515 | } |
| 523 | 516 | return task; |
| 524 | 517 | } |
| 518 | + | |
| 525 | 519 | } | ... | ... |