【文案修改】工作流:“回退”统一改成“退回”,和飞书保持一致

This commit is contained in:
YunaiV 2024-10-19 19:01:12 +08:00
parent 8a8544b3bd
commit 206b3ea9d2
9 changed files with 32 additions and 33 deletions

View File

@ -44,7 +44,7 @@ public interface ErrorCodeConstants {
ErrorCode TASK_NOT_EXISTS = new ErrorCode(1_009_005_002, "流程任务不存在"); ErrorCode TASK_NOT_EXISTS = new ErrorCode(1_009_005_002, "流程任务不存在");
ErrorCode TASK_IS_PENDING = new ErrorCode(1_009_005_003, "当前任务处于挂起状态,不能操作"); ErrorCode TASK_IS_PENDING = new ErrorCode(1_009_005_003, "当前任务处于挂起状态,不能操作");
ErrorCode TASK_TARGET_NODE_NOT_EXISTS = new ErrorCode(1_009_005_004, " 目标节点不存在"); ErrorCode TASK_TARGET_NODE_NOT_EXISTS = new ErrorCode(1_009_005_004, " 目标节点不存在");
ErrorCode TASK_RETURN_FAIL_SOURCE_TARGET_ERROR = new ErrorCode(1_009_005_006, "退任务失败,目标节点是在并行网关上或非同一路线上,不可跳转"); ErrorCode TASK_RETURN_FAIL_SOURCE_TARGET_ERROR = new ErrorCode(1_009_005_006, "退任务失败,目标节点是在并行网关上或非同一路线上,不可跳转");
ErrorCode TASK_DELEGATE_FAIL_USER_REPEAT = new ErrorCode(1_009_005_007, "任务委派失败,委派人和当前审批人为同一人"); ErrorCode TASK_DELEGATE_FAIL_USER_REPEAT = new ErrorCode(1_009_005_007, "任务委派失败,委派人和当前审批人为同一人");
ErrorCode TASK_DELEGATE_FAIL_USER_NOT_EXISTS = new ErrorCode(1_009_005_008, "任务委派失败,被委派人不存在"); ErrorCode TASK_DELEGATE_FAIL_USER_NOT_EXISTS = new ErrorCode(1_009_005_008, "任务委派失败,被委派人不存在");
ErrorCode TASK_SIGN_CREATE_USER_NOT_EXIST = new ErrorCode(1_009_005_009, "任务加签:选择的用户不存在"); ErrorCode TASK_SIGN_CREATE_USER_NOT_EXIST = new ErrorCode(1_009_005_009, "任务加签:选择的用户不存在");

View File

@ -158,7 +158,7 @@ public class BpmTaskController {
} }
@GetMapping("/list-by-return") @GetMapping("/list-by-return")
@Operation(summary = "获取所有可退的节点", description = "用于【流程详情】的【退】按钮") @Operation(summary = "获取所有可退的节点", description = "用于【流程详情】的【退】按钮")
@Parameter(name = "taskId", description = "当前任务ID", required = true) @Parameter(name = "taskId", description = "当前任务ID", required = true)
@PreAuthorize("@ss.hasPermission('bpm:task:update')") @PreAuthorize("@ss.hasPermission('bpm:task:update')")
public CommonResult<List<BpmTaskRespVO>> getTaskListByReturn(@RequestParam("id") String id) { public CommonResult<List<BpmTaskRespVO>> getTaskListByReturn(@RequestParam("id") String id) {
@ -168,7 +168,7 @@ public class BpmTaskController {
} }
@PutMapping("/return") @PutMapping("/return")
@Operation(summary = "退任务", description = "用于【流程详情】的【退】按钮") @Operation(summary = "退任务", description = "用于【流程详情】的【退】按钮")
@PreAuthorize("@ss.hasPermission('bpm:task:update')") @PreAuthorize("@ss.hasPermission('bpm:task:update')")
public CommonResult<Boolean> returnTask(@Valid @RequestBody BpmTaskReturnReqVO reqVO) { public CommonResult<Boolean> returnTask(@Valid @RequestBody BpmTaskReturnReqVO reqVO) {
taskService.returnTask(getLoginUserId(), reqVO); taskService.returnTask(getLoginUserId(), reqVO);

View File

@ -10,19 +10,18 @@ import lombok.Data;
@Data @Data
public class BpmApprovalDetailReqVO { public class BpmApprovalDetailReqVO {
// TODO @jason这里要不注释说明下什么情况下使用 processDefinitionIdprocessInstanceIdactivityIdtaskId
@Schema(description = "流程定义的编号", example = "1024") @Schema(description = "流程定义的编号", example = "1024")
private String processDefinitionId; // 发起流程的时候传流程定义 Id private String processDefinitionId; // 发起流程的时候传流程定义 ID
@Schema(description = "流程实例的编号", example = "1024") @Schema(description = "流程实例的编号", example = "1024")
private String processInstanceId; // 流程已发起时候传流程实例 Id private String processInstanceId; // 流程已发起时候传流程实例 ID
@Schema(description = "流程活动编号", example = "StartUserNode") // TODO @芋艿如果未来 BPMN 增加流程图它没有发起人节点会有问题
private String activityId; // 用于获取表单权限 发起流程时, 发起人节点 activityId 可获取发起人的表单权限 @Schema(description = "流程活动编号", example = "StartUserNode")
private String activityId; // 用于获取表单权限1发起流程时发起人节点 activityId 可获取发起人的表单权限2从抄送列表界面进来时传抄送的 activityId 可获取抄送人的表单权限
@Schema(description = "流程任务编号", example = "95f2f08b-621b-11ef-bf39-00ff4722db8b") @Schema(description = "流程任务编号", example = "95f2f08b-621b-11ef-bf39-00ff4722db8b")
private String taskId; // 用于获取表单权限流程已发起时传任务 Id, 获取任务节点的变得权限 private String taskId; // 用于获取表单权限1从待审批/已审批界面进来时传递 taskId 任务编号获取任务节点的变得权限
@AssertTrue(message = "流程定义的编号和流程实例的编号不能同时为空") @AssertTrue(message = "流程定义的编号和流程实例的编号不能同时为空")
@JsonIgnore @JsonIgnore

View File

@ -5,7 +5,7 @@ import lombok.Data;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
@Schema(description = "管理后台 - 退流程任务的 Request VO") @Schema(description = "管理后台 - 退流程任务的 Request VO")
@Data @Data
public class BpmTaskReturnReqVO { public class BpmTaskReturnReqVO {
@ -13,12 +13,12 @@ public class BpmTaskReturnReqVO {
@NotEmpty(message = "任务编号不能为空") @NotEmpty(message = "任务编号不能为空")
private String id; private String id;
@Schema(description = "退到的任务 Key", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @Schema(description = "退到的任务 Key", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotEmpty(message = "退到的任务 Key 不能为空") @NotEmpty(message = "退到的任务 Key 不能为空")
private String targetTaskDefinitionKey; private String targetTaskDefinitionKey;
@Schema(description = "退意见", requiredMode = Schema.RequiredMode.REQUIRED, example = "我就是想驳回") @Schema(description = "退意见", requiredMode = Schema.RequiredMode.REQUIRED, example = "我就是想驳回")
@NotEmpty(message = "退意见不能为空") @NotEmpty(message = "退意见不能为空")
private String reason; private String reason;
} }

View File

@ -52,7 +52,7 @@ public interface BpmnModelConstants {
*/ */
String USER_TASK_REJECT_HANDLER_TYPE = "rejectHandlerType"; String USER_TASK_REJECT_HANDLER_TYPE = "rejectHandlerType";
/** /**
* BPMN ExtensionElement 的扩展属性用于标记用户任务拒绝后的退的任务 Id * BPMN ExtensionElement 的扩展属性用于标记用户任务拒绝后的退的任务 Id
*/ */
String USER_TASK_REJECT_RETURN_TASK_ID = "rejectReturnTaskId"; String USER_TASK_REJECT_RETURN_TASK_ID = "rejectReturnTaskId";

View File

@ -538,7 +538,7 @@ public class BpmnModelUtils {
/** /**
* 迭代从后向前扫描判断目标节点相对于当前节点是否是串行 * 迭代从后向前扫描判断目标节点相对于当前节点是否是串行
* 不存在直接退到子流程中的情况但存在从子流程出去到父流程情况 * 不存在直接退到子流程中的情况但存在从子流程出去到父流程情况
* *
* @param source 起始节点 * @param source 起始节点
* @param target 目标节点 * @param target 目标节点

View File

@ -123,10 +123,10 @@ public interface BpmTaskService {
String taskDefineKey); String taskDefineKey);
/** /**
* 获取当前任务的可退的 UserTask 集合 * 获取当前任务的可退 UserTask 集合
* *
* @param id 当前的任务 ID * @param id 当前的任务 ID
* @return 可以退的节点列表 * @return 可以退的节点列表
*/ */
List<UserTask> getUserTaskListByReturn(String id); List<UserTask> getUserTaskListByReturn(String id);
@ -180,10 +180,10 @@ public interface BpmTaskService {
void moveTaskToEnd(String processInstanceId); void moveTaskToEnd(String processInstanceId);
/** /**
* 将任务退到指定的 targetDefinitionKey 位置 * 将任务退到指定的 targetDefinitionKey 位置
* *
* @param userId 用户编号 * @param userId 用户编号
* @param reqVO 退的任务key和当前所在的任务ID * @param reqVO 退的任务key和当前所在的任务ID
*/ */
void returnTask(Long userId, BpmTaskReturnReqVO reqVO); void returnTask(Long userId, BpmTaskReturnReqVO reqVO);

View File

@ -328,7 +328,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
if (CollUtil.isEmpty(previousUserList)) { if (CollUtil.isEmpty(previousUserList)) {
return Collections.emptyList(); return Collections.emptyList();
} }
// 2.2 过滤只有串行可到达的节点才可以退类似非串行子流程无法退回 // 2.2 过滤只有串行可到达的节点才可以退类似非串行子流程无法退回
previousUserList.removeIf(userTask -> !BpmnModelUtils.isSequentialReachable(source, userTask, null)); previousUserList.removeIf(userTask -> !BpmnModelUtils.isSequentialReachable(source, userTask, null));
return previousUserList; return previousUserList;
} }
@ -588,7 +588,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
BpmUserTaskRejectHandlerType userTaskRejectHandlerType = BpmnModelUtils.parseRejectHandlerType(userTaskElement); BpmUserTaskRejectHandlerType userTaskRejectHandlerType = BpmnModelUtils.parseRejectHandlerType(userTaskElement);
if (userTaskRejectHandlerType == BpmUserTaskRejectHandlerType.RETURN_USER_TASK) { if (userTaskRejectHandlerType == BpmUserTaskRejectHandlerType.RETURN_USER_TASK) {
String returnTaskId = BpmnModelUtils.parseReturnTaskId(userTaskElement); String returnTaskId = BpmnModelUtils.parseReturnTaskId(userTaskElement);
Assert.notNull(returnTaskId, "退的节点不能为空"); Assert.notNull(returnTaskId, "退的节点不能为空");
returnTask(userId, new BpmTaskReturnReqVO().setId(task.getId()) returnTask(userId, new BpmTaskReturnReqVO().setId(task.getId())
.setTargetTaskDefinitionKey(returnTaskId).setReason(reqVO.getReason())); .setTargetTaskDefinitionKey(returnTaskId).setReason(reqVO.getReason()));
return; return;
@ -632,12 +632,12 @@ public class BpmTaskServiceImpl implements BpmTaskService {
FlowElement targetElement = validateTargetTaskCanReturn(task.getTaskDefinitionKey(), FlowElement targetElement = validateTargetTaskCanReturn(task.getTaskDefinitionKey(),
reqVO.getTargetTaskDefinitionKey(), task.getProcessDefinitionId()); reqVO.getTargetTaskDefinitionKey(), task.getProcessDefinitionId());
// 2. 调用 Flowable 框架的退逻辑 // 2. 调用 Flowable 框架的退逻辑
returnTask(task, targetElement, reqVO); returnTask(task, targetElement, reqVO);
} }
/** /**
* 退流程节点时校验目标任务节点是否可退 * 退流程节点时校验目标任务节点是否可退
* *
* @param sourceKey 当前任务节点 Key * @param sourceKey 当前任务节点 Key
* @param targetKey 目标任务节点 key * @param targetKey 目标任务节点 key
@ -655,7 +655,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
throw exception(TASK_TARGET_NODE_NOT_EXISTS); throw exception(TASK_TARGET_NODE_NOT_EXISTS);
} }
// 2.2 只有串行可到达的节点才可以退类似非串行子流程无法退回 // 2.2 只有串行可到达的节点才可以退类似非串行子流程无法退回
if (!BpmnModelUtils.isSequentialReachable(source, target, null)) { if (!BpmnModelUtils.isSequentialReachable(source, target, null)) {
throw exception(TASK_RETURN_FAIL_SOURCE_TARGET_ERROR); throw exception(TASK_RETURN_FAIL_SOURCE_TARGET_ERROR);
} }
@ -663,10 +663,10 @@ public class BpmTaskServiceImpl implements BpmTaskService {
} }
/** /**
* 执行退逻辑 * 执行退逻辑
* *
* @param currentTask 当前退的任务 * @param currentTask 当前退的任务
* @param targetElement 需要退到的目标任务 * @param targetElement 需要退到的目标任务
* @param reqVO 前端参数封装 * @param reqVO 前端参数封装
*/ */
public void returnTask(Task currentTask, FlowElement targetElement, BpmTaskReturnReqVO reqVO) { public void returnTask(Task currentTask, FlowElement targetElement, BpmTaskReturnReqVO reqVO) {
@ -679,9 +679,9 @@ public class BpmTaskServiceImpl implements BpmTaskService {
List<UserTask> returnUserTaskList = BpmnModelUtils.iteratorFindChildUserTasks(targetElement, runTaskKeyList, null, null); List<UserTask> returnUserTaskList = BpmnModelUtils.iteratorFindChildUserTasks(targetElement, runTaskKeyList, null, null);
List<String> returnTaskKeyList = convertList(returnUserTaskList, UserTask::getId); List<String> returnTaskKeyList = convertList(returnUserTaskList, UserTask::getId);
// 2. 给当前要被退的 task 数组设置退意见 // 2. 给当前要被退 task 数组设置退意见
taskList.forEach(task -> { taskList.forEach(task -> {
// 需要排除掉不需要设置退意见的任务 // 需要排除掉不需要设置退意见的任务
if (!returnTaskKeyList.contains(task.getTaskDefinitionKey())) { if (!returnTaskKeyList.contains(task.getTaskDefinitionKey())) {
return; return;
} }
@ -1061,7 +1061,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
} }
// 审批人与提交人为同一人时根据 BpmUserTaskAssignStartUserHandlerTypeEnum 策略进行处理 // 审批人与提交人为同一人时根据 BpmUserTaskAssignStartUserHandlerTypeEnum 策略进行处理
if (StrUtil.equals(task.getAssignee(), processInstance.getStartUserId())) { if (StrUtil.equals(task.getAssignee(), processInstance.getStartUserId())) {
// 判断是否为退或者驳回如果是退或者驳回不走这个策略 // 判断是否为退或者驳回如果是退或者驳回不走这个策略
// TODO 芋艿优化未来有没更好的判断方式另外还要考虑清理机制就是说下次处理了之后就移除这个标识 // TODO 芋艿优化未来有没更好的判断方式另外还要考虑清理机制就是说下次处理了之后就移除这个标识
Boolean returnTaskFlag = runtimeService.getVariable(processInstance.getProcessInstanceId(), Boolean returnTaskFlag = runtimeService.getVariable(processInstance.getProcessInstanceId(),
String.format(PROCESS_INSTANCE_VARIABLE_RETURN_FLAG, task.getTaskDefinitionKey()), Boolean.class); String.format(PROCESS_INSTANCE_VARIABLE_RETURN_FLAG, task.getTaskDefinitionKey()), Boolean.class);