From 24352b34db1ddc47f91478522abf268251650636 Mon Sep 17 00:00:00 2001 From: ranke <213539@qq.com> Date: Thu, 29 Jan 2026 18:07:49 +0800 Subject: [PATCH] =?UTF-8?q?ztcloud-dist=20=E4=B8=AD=20bpm=20=E8=A6=86?= =?UTF-8?q?=E7=9B=96=E5=9B=9E=E6=9D=A5,=E5=8C=85=E5=90=AB=20http://172.16.?= =?UTF-8?q?46.63:31560/index.php=3Fm=3Dtask&f=3Dview&taskID=3D735=20?= =?UTF-8?q?=E5=92=8C=20http://172.16.46.63:31560/index.php=3Fm=3Dtask&f=3D?= =?UTF-8?q?view&taskID=3D552=20=E4=B8=AD=E7=9A=84=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zt-module-bpm/pom.xml | 2 + .../Dockerfile | 6 +- .../zt-module-bpm-server-app/pom.xml | 49 ++++++++ .../plat/module/bpm/BpmServerApplication.java | 0 .../src/main/resources/application-dev.yaml | 0 .../src/main/resources/application-local.yaml | 0 .../src/main/resources/application.yaml | 0 .../src/main/resources/logback-spring.xml | 9 ++ zt-module-bpm/zt-module-bpm-server/pom.xml | 19 --- .../task/BpmProcessInstanceController.java | 42 +++++++ .../core/listener/BpmTaskEventListener.java | 2 +- .../task/BpmProcessInstanceServiceImpl.java | 2 +- .../bpm/service/task/BpmTaskService.java | 4 +- .../bpm/service/task/BpmTaskServiceImpl.java | 110 ++++++++++++++---- 14 files changed, 197 insertions(+), 48 deletions(-) rename zt-module-bpm/{zt-module-bpm-server => zt-module-bpm-server-app}/Dockerfile (82%) create mode 100644 zt-module-bpm/zt-module-bpm-server-app/pom.xml rename zt-module-bpm/{zt-module-bpm-server => zt-module-bpm-server-app}/src/main/java/com/zt/plat/module/bpm/BpmServerApplication.java (100%) rename zt-module-bpm/{zt-module-bpm-server => zt-module-bpm-server-app}/src/main/resources/application-dev.yaml (100%) rename zt-module-bpm/{zt-module-bpm-server => zt-module-bpm-server-app}/src/main/resources/application-local.yaml (100%) rename zt-module-bpm/{zt-module-bpm-server => zt-module-bpm-server-app}/src/main/resources/application.yaml (100%) rename zt-module-bpm/{zt-module-bpm-server => zt-module-bpm-server-app}/src/main/resources/logback-spring.xml (90%) diff --git a/zt-module-bpm/pom.xml b/zt-module-bpm/pom.xml index 302788b7..69602408 100644 --- a/zt-module-bpm/pom.xml +++ b/zt-module-bpm/pom.xml @@ -11,7 +11,9 @@ zt-module-bpm-api zt-module-bpm-server + zt-module-bpm-server-app + ${revision} zt-module-bpm pom diff --git a/zt-module-bpm/zt-module-bpm-server/Dockerfile b/zt-module-bpm/zt-module-bpm-server-app/Dockerfile similarity index 82% rename from zt-module-bpm/zt-module-bpm-server/Dockerfile rename to zt-module-bpm/zt-module-bpm-server-app/Dockerfile index 868eec5c..d859b242 100644 --- a/zt-module-bpm/zt-module-bpm-server/Dockerfile +++ b/zt-module-bpm/zt-module-bpm-server-app/Dockerfile @@ -3,10 +3,10 @@ FROM 172.16.46.66:10043/base-service/eclipse-temurin:21-jre ## 创建目录,并使用它作为工作目录 -RUN mkdir -p /zt-module-bpm-server -WORKDIR /zt-module-bpm-server +RUN mkdir -p /zt-module-bpm-server-app +WORKDIR /zt-module-bpm-server-app ## 将后端项目的 Jar 文件,复制到镜像中 -COPY ./target/zt-module-bpm-server.jar app.jar +COPY ./target/zt-module-bpm-server-app.jar app.jar ## 设置 TZ 时区 ## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖 diff --git a/zt-module-bpm/zt-module-bpm-server-app/pom.xml b/zt-module-bpm/zt-module-bpm-server-app/pom.xml new file mode 100644 index 00000000..6b9073b7 --- /dev/null +++ b/zt-module-bpm/zt-module-bpm-server-app/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + com.zt.plat + zt-module-bpm + ${revision} + + zt-module-bpm-server-app + jar + ${project.artifactId} + + bpm 模块启动器。 + + + + + + + com.zt.plat + zt-module-bpm-server + ${revision} + + + + + + + + ${project.artifactId} + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring.boot.version} + + + + repackage + + + + + + + diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/BpmServerApplication.java b/zt-module-bpm/zt-module-bpm-server-app/src/main/java/com/zt/plat/module/bpm/BpmServerApplication.java similarity index 100% rename from zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/BpmServerApplication.java rename to zt-module-bpm/zt-module-bpm-server-app/src/main/java/com/zt/plat/module/bpm/BpmServerApplication.java diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/application-dev.yaml b/zt-module-bpm/zt-module-bpm-server-app/src/main/resources/application-dev.yaml similarity index 100% rename from zt-module-bpm/zt-module-bpm-server/src/main/resources/application-dev.yaml rename to zt-module-bpm/zt-module-bpm-server-app/src/main/resources/application-dev.yaml diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/application-local.yaml b/zt-module-bpm/zt-module-bpm-server-app/src/main/resources/application-local.yaml similarity index 100% rename from zt-module-bpm/zt-module-bpm-server/src/main/resources/application-local.yaml rename to zt-module-bpm/zt-module-bpm-server-app/src/main/resources/application-local.yaml diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/application.yaml b/zt-module-bpm/zt-module-bpm-server-app/src/main/resources/application.yaml similarity index 100% rename from zt-module-bpm/zt-module-bpm-server/src/main/resources/application.yaml rename to zt-module-bpm/zt-module-bpm-server-app/src/main/resources/application.yaml diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/resources/logback-spring.xml b/zt-module-bpm/zt-module-bpm-server-app/src/main/resources/logback-spring.xml similarity index 90% rename from zt-module-bpm/zt-module-bpm-server/src/main/resources/logback-spring.xml rename to zt-module-bpm/zt-module-bpm-server-app/src/main/resources/logback-spring.xml index 51a9a489..656c3bee 100644 --- a/zt-module-bpm/zt-module-bpm-server/src/main/resources/logback-spring.xml +++ b/zt-module-bpm/zt-module-bpm-server-app/src/main/resources/logback-spring.xml @@ -76,5 +76,14 @@ + + + + + + + + + diff --git a/zt-module-bpm/zt-module-bpm-server/pom.xml b/zt-module-bpm/zt-module-bpm-server/pom.xml index 4b151c35..f2829de7 100644 --- a/zt-module-bpm/zt-module-bpm-server/pom.xml +++ b/zt-module-bpm/zt-module-bpm-server/pom.xml @@ -120,23 +120,4 @@ - - - ${project.artifactId} - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring.boot.version} - - - - repackage - - - - - - diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmProcessInstanceController.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmProcessInstanceController.java index d55f27a0..0afdc38b 100644 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmProcessInstanceController.java +++ b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/controller/admin/task/BpmProcessInstanceController.java @@ -26,11 +26,17 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.annotation.security.PermitAll; import jakarta.validation.Valid; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.list.SetUniqueList; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.migration.ProcessInstanceMigrationBuilder; import org.flowable.engine.repository.ProcessDefinition; +import org.flowable.engine.runtime.ActivityInstance; import org.flowable.task.api.Task; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; @@ -41,6 +47,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import static com.zt.plat.framework.common.pojo.CommonResult.success; import static com.zt.plat.framework.common.util.collection.CollectionUtils.*; @@ -234,4 +241,39 @@ public class BpmProcessInstanceController { return success(processInstanceService.getProcessInstanceBpmnModelView(id)); } + + @Resource + private RuntimeService runtimeService; + + @Resource + private TaskService taskService2; + + @GetMapping("/klwtest") + @Operation(summary = "klw测试") + @PermitAll + public CommonResult klwtest(@RequestParam String processInstanceId, @RequestParam String nodeId) { + List currentActivities = runtimeService + .createActivityInstanceQuery() + .processInstanceId(processInstanceId) + .unfinished() + .list(); +// taskService2.addComment(null, processInstanceId, +// "测试 comment"); + if (CollectionUtils.isNotEmpty(currentActivities)) { + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(processInstanceId) + .moveActivityIdsToSingleActivityId( + currentActivities.stream() + .map(ActivityInstance::getActivityId) + .collect(Collectors.toList()), + nodeId + ) + .changeState(); + } + + + return success("klw测试"); + } + + } diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java index eda52442..71fe3c7c 100644 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java +++ b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java @@ -83,7 +83,7 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener { if (StrUtil.isEmpty(activity.getTaskId())) { return; } - taskService.processTaskCanceled(activity.getTaskId()); + taskService.processTaskCanceled(activity.getTaskId(), null); }); } diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index d675a7e0..ba18ea8d 100644 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -235,7 +235,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @Override public List getNextApprovalNodes(Long loginUserId, BpmApprovalDetailReqVO reqVO) { // 1.1 校验任务存在,且是当前用户的 - Task task = taskService.validateTask(loginUserId, reqVO.getTaskId()); + Task task = taskService.validateTask(loginUserId, reqVO.getTaskId(), false); // 1.2 校验流程实例存在 ProcessInstance instance = getProcessInstance(task.getProcessInstanceId()); if (instance == null) { diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmTaskService.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmTaskService.java index 8211bfe8..ce638266 100644 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmTaskService.java +++ b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmTaskService.java @@ -98,7 +98,7 @@ public interface BpmTaskService { * @param userId 用户 id * @param taskId task id */ - Task validateTask(Long userId, String taskId); + Task validateTask(Long userId, String taskId, boolean isCheckSuperAdmin); /** * 获取任务 @@ -269,7 +269,7 @@ public interface BpmTaskService { * * @param taskId 任务的编号 */ - void processTaskCanceled(String taskId); + void processTaskCanceled(String taskId, String reason); /** * 处理 Task 设置审批人事件,目前是发送审批消息 diff --git a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmTaskServiceImpl.java b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmTaskServiceImpl.java index 416444bd..308d6823 100644 --- a/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/zt-module-bpm/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/service/task/BpmTaskServiceImpl.java @@ -6,12 +6,14 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.*; import cn.hutool.extra.spring.SpringUtil; import cn.hutool.json.JSONUtil; +import com.zt.plat.framework.common.pojo.CommonResult; import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.util.date.DateUtils; import com.zt.plat.framework.common.util.number.NumberUtils; import com.zt.plat.framework.common.util.object.ObjectUtils; import com.zt.plat.framework.common.util.object.PageUtils; import com.zt.plat.framework.datapermission.core.annotation.DataPermission; +import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils; import com.zt.plat.framework.web.core.util.WebFrameworkUtils; import com.zt.plat.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; import com.zt.plat.module.bpm.controller.admin.task.vo.task.*; @@ -35,11 +37,13 @@ import com.zt.plat.module.bpm.service.message.BpmMessageService; import com.zt.plat.module.bpm.service.message.dto.BpmMessageSendWhenTaskTimeoutReqDTO; import com.zt.plat.module.system.api.dept.DeptApi; import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; +import com.zt.plat.module.system.api.permission.PermissionApi; import com.zt.plat.module.system.api.user.AdminUserApi; import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; import jakarta.annotation.Resource; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.flowable.bpmn.model.*; import org.flowable.engine.HistoryService; import org.flowable.engine.ManagementService; @@ -107,6 +111,10 @@ public class BpmTaskServiceImpl implements BpmTaskService { @Resource private AdminUserApi adminUserApi; + + @Resource + private PermissionApi permissionApi; + @Resource private DeptApi deptApi; @@ -142,12 +150,17 @@ public class BpmTaskServiceImpl implements BpmTaskService { @Override public BpmTaskRespVO getTodoTask(Long userId, String taskId, String processInstanceId) { + boolean isSelfTask = true; // 1.1 获取指定的用户待办任务 Task todoTask = getMyTodoTask(userId, taskId); // 1.2 获取不到,则获取该流程实例下,第一个用户的待办任务 if (todoTask == null) { todoTask = getMyFirstTodoTask(userId, processInstanceId); } + if (todoTask == null && isSuperAdmin(userId)) { + isSelfTask = false; + todoTask = getMyFirstTodoTaskForAdmin(processInstanceId); + } if (todoTask == null) { return null; } @@ -159,6 +172,19 @@ public class BpmTaskServiceImpl implements BpmTaskService { BpmnModel bpmnModel = bpmProcessDefinitionService.getProcessDefinitionBpmnModel(todoTask.getProcessDefinitionId()); Map buttonsSetting = BpmnModelUtils.parseButtonsSetting( bpmnModel, todoTask.getTaskDefinitionKey()); + // 如果当前登录人是管理员,并且当前任务不属于管理员,则只显示退回,取消和转办按钮 + if (!isSelfTask && buttonsSetting != null) { + Optional.ofNullable(buttonsSetting.get(1)) + .ifPresent(button -> button.setEnable(false)); + Optional.ofNullable(buttonsSetting.get(2)) + .ifPresent(button -> button.setEnable(false)); + Optional.ofNullable(buttonsSetting.get(4)) + .ifPresent(button -> button.setEnable(false)); + Optional.ofNullable(buttonsSetting.get(5)) + .ifPresent(button -> button.setEnable(false)); + Optional.ofNullable(buttonsSetting.get(7)) + .ifPresent(button -> button.setEnable(false)); + } Boolean signEnable = parseSignEnable(bpmnModel, todoTask.getTaskDefinitionKey()); Boolean reasonRequire = parseReasonRequire(bpmnModel, todoTask.getTaskDefinitionKey()); Integer nodeType = parseNodeType(BpmnModelUtils.getFlowElementById(bpmnModel, todoTask.getTaskDefinitionKey())); @@ -203,7 +229,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { /** * 获得用户指定 processInstanceId 流程编号下的首个“待办”(未审批、且可审核)的任务 * - * @param userId 用户编号 + * @param userId 用户编号 * @param processInstanceId 流程编号 * @return 任务 */ @@ -221,12 +247,47 @@ public class BpmTaskServiceImpl implements BpmTaskService { .list(); // 2. 查询我的首个任务 + SecurityFrameworkUtils.getLoginUser(); return CollUtil.findOne(tasks, task -> { return isAssignUserTask(userId, task) // 当前用户为审批人 || isAddSignUserTask(userId, task); // 当前用户为加签人(为了减签) }); } + /** + * 获得指定 processInstanceId 流程编号下的首个“待办”(未审批、且可审核)的任务(超级管理员用) + * + * @param processInstanceId 流程编号 + * @return 任务 + */ + private Task getMyFirstTodoTaskForAdmin(String processInstanceId) { + if (processInstanceId == null) { + return null; + } + // 1. 查询所有任务 + List tasks = taskService.createTaskQuery() + .active() + .processInstanceId(processInstanceId) + .includeTaskLocalVariables() + .includeProcessVariables() + .orderByTaskCreateTime().asc() // 按创建时间升序 + .list(); + + // 2. 查询首个任务 + SecurityFrameworkUtils.getLoginUser(); + return CollUtil.findOne(tasks, task -> { + return true; // 当前用户为超级管理员 + }); + } + + private boolean isSuperAdmin(Long userId) { + CommonResult result = permissionApi.isSuperAdmin(userId); + if (result != null) { + return result.getCheckedData(); + } + return false; + } + @Override public PageResult getTaskDonePage(Long userId, BpmTaskPageReqVO pageVO) { HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery() @@ -301,10 +362,13 @@ public class BpmTaskServiceImpl implements BpmTaskService { } @Override - public Task validateTask(Long userId, String taskId) { + public Task validateTask(Long userId, String taskId, boolean isCheckSuperAdmin) { Task task = validateTaskExist(taskId); // 为什么判断 assignee 非空的情况下? // 例如说:在审批人为空时,我们会有“自动审批通过”的策略,此时 userId 为 null,允许通过 + if (isCheckSuperAdmin && isSuperAdmin(userId)) { + return task; + } if (StrUtil.isNotBlank(task.getAssignee()) && ObjectUtil.notEqual(userId, NumberUtils.parseLong(task.getAssignee()))) { throw exception(TASK_OPERATE_FAIL_ASSIGN_NOT_SELF); @@ -528,7 +592,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @Transactional(rollbackFor = Exception.class) public void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO) { // 1.1 校验任务存在 - Task task = validateTask(userId, reqVO.getId()); + Task task = validateTask(userId, reqVO.getId(), false); // 1.2 校验流程实例存在 ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); if (instance == null) { @@ -601,15 +665,15 @@ public class BpmTaskServiceImpl implements BpmTaskService { /** * 校验选择的下一个节点的审批人,是否合法 - * + *

* 1. 是否有漏选:没有选择审批人 * 2. 是否有多选:非下一个节点 * * @param taskDefinitionKey 当前任务节点标识 - * @param variables 流程变量 - * @param bpmnModel 流程模型 - * @param nextAssignees 下一个节点审批人集合(参数) - * @param processInstance 流程实例 + * @param variables 流程变量 + * @param bpmnModel 流程模型 + * @param nextAssignees 下一个节点审批人集合(参数) + * @param processInstance 流程实例 */ @SuppressWarnings("unchecked") private Map validateAndSetNextAssignees(String taskDefinitionKey, Map variables, BpmnModel bpmnModel, @@ -661,7 +725,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { approveUserSelectAssignees = new HashMap<>(); } approveUserSelectAssignees.put(nextFlowNode.getId(), assignees); - Map> existingApproveUserSelectAssignees = (Map>) variables.get( + Map> existingApproveUserSelectAssignees = (Map>) variables.get( BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_APPROVE_USER_SELECT_ASSIGNEES); if (CollUtil.isNotEmpty(existingApproveUserSelectAssignees)) { approveUserSelectAssignees.putAll(existingApproveUserSelectAssignees); @@ -771,7 +835,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @Transactional(rollbackFor = Exception.class) public void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO) { // 1.1 校验任务存在 - Task task = validateTask(userId, reqVO.getId()); + Task task = validateTask(userId, reqVO.getId(), false); // 1.2 校验流程实例存在 ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); if (instance == null) { @@ -837,7 +901,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @Transactional(rollbackFor = Exception.class) public void returnTask(Long userId, BpmTaskReturnReqVO reqVO) { // 1.1 当前任务 task - Task task = validateTask(userId, reqVO.getId()); + Task task = validateTask(userId, reqVO.getId(), true); if (task.isSuspended()) { throw exception(TASK_IS_PENDING); } @@ -895,6 +959,8 @@ public class BpmTaskServiceImpl implements BpmTaskService { List runExecutionIds = new ArrayList<>(); // 2. 给当前要被退回的 task 数组,设置退回意见 + boolean isSuperAdmin = isSuperAdmin(userId); + String reasonPrefix = isSuperAdmin ? "【管理员操作】" : ""; taskList.forEach(task -> { // 需要排除掉,不需要设置退回意见的任务 if (!returnTaskKeyList.contains(task.getTaskDefinitionKey())) { @@ -910,7 +976,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { // 2.1.2 更新 task 状态 + 原因 updateTaskStatusAndReason(task.getId(), BpmTaskStatusEnum.RETURN.getStatus(), reqVO.getReason()); } else { // 情况二:别人的任务,进行 CANCEL 标记 - processTaskCanceled(task.getId()); + processTaskCanceled(task.getId(), reasonPrefix + reqVO.getReason()); } }); @@ -931,7 +997,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { public void delegateTask(Long userId, BpmTaskDelegateReqVO reqVO) { String taskId = reqVO.getId(); // 1.1 校验任务 - Task task = validateTask(userId, reqVO.getId()); + Task task = validateTask(userId, reqVO.getId(), false); if (task.getAssignee().equals(reqVO.getDelegateUserId().toString())) { // 校验当前审批人和被委派人不是同一人 throw exception(TASK_DELEGATE_FAIL_USER_REPEAT); } @@ -957,7 +1023,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { public void transferTask(Long userId, BpmTaskTransferReqVO reqVO) { String taskId = reqVO.getId(); // 1.1 校验任务 - Task task = validateTask(userId, reqVO.getId()); + Task task = validateTask(userId, reqVO.getId(), true); if (task.getAssignee().equals(reqVO.getAssigneeUserId().toString())) { // 校验当前审批人和被转派人不是同一人 throw exception(TASK_TRANSFER_FAIL_USER_REPEAT); } @@ -994,7 +1060,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { if (BpmTaskStatusEnum.isEndStatus(otherTaskStatus)) { return; } - processTaskCanceled(task.getId()); + processTaskCanceled(task.getId(), null); }); // 2. 终止流程 @@ -1066,7 +1132,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { * @return 当前任务 */ private TaskEntityImpl validateTaskCanCreateSign(Long userId, BpmTaskSignCreateReqVO reqVO) { - TaskEntityImpl taskEntity = (TaskEntityImpl) validateTask(userId, reqVO.getId()); + TaskEntityImpl taskEntity = (TaskEntityImpl) validateTask(userId, reqVO.getId(), false); // 向前加签和向后加签不能同时存在 if (taskEntity.getScopeType() != null && ObjectUtil.notEqual(taskEntity.getScopeType(), reqVO.getType())) { @@ -1217,7 +1283,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { } // 2. 任务前置通知 - if (ObjUtil.isNotNull(processDefinitionInfo.getTaskBeforeTriggerSetting())){ + if (ObjUtil.isNotNull(processDefinitionInfo.getTaskBeforeTriggerSetting())) { BpmModelMetaInfoVO.HttpRequestSetting setting = processDefinitionInfo.getTaskBeforeTriggerSetting(); BpmHttpRequestUtils.executeBpmHttpRequest(processInstance, setting.getUrl(), setting.getHeader(), setting.getBody(), true, setting.getResponse()); @@ -1281,7 +1347,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { * 2. 审批不通过:在 {@link #rejectTask(Long, BpmTaskRejectReqVO)} 不通过时,对于加签的任务,不会被 Flowable 删除,此时需要通过该方法更新状态为已取消 */ @Override - public void processTaskCanceled(String taskId) { + public void processTaskCanceled(String taskId, String reason) { Task task = getTask(taskId); // 1. 可能只是活动,不是任务,所以查询不到 if (task == null) { @@ -1295,7 +1361,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { log.error("[updateTaskStatusWhenCanceled][taskId({}) 处于结果({}),无需进行更新]", taskId, status); return; } - updateTaskStatusAndReason(taskId, BpmTaskStatusEnum.CANCEL.getStatus(), BpmReasonEnum.CANCEL_BY_SYSTEM.getReason()); + updateTaskStatusAndReason(taskId, BpmTaskStatusEnum.CANCEL.getStatus(), StringUtils.isNotBlank(reason) ? reason : BpmReasonEnum.CANCEL_BY_SYSTEM.getReason()); // 补充说明:由于 Task 被删除成 HistoricTask 后,无法通过 taskService.addComment 添加理由,所以无法存储具体的取消理由 } @@ -1344,7 +1410,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { .taskVariableValueEquals(BpmnVariableConstants.TASK_VARIABLE_STATUS, BpmTaskStatusEnum.APPROVE.getStatus()) .finished(); if (BpmAutoApproveTypeEnum.APPROVE_ALL.getType().equals(processDefinitionInfo.getAutoApprovalType()) - && sameAssigneeQuery.count() > 0) { + && sameAssigneeQuery.count() > 0) { getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) .setReason(BpmAutoApproveTypeEnum.APPROVE_ALL.getName())); return; @@ -1356,7 +1422,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { return; } List sourceTaskIds = convertList(BpmnModelUtils.getElementIncomingFlows( // 获取所有上一个节点 - BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey())), + BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey())), SequenceFlow::getSourceRef); if (sameAssigneeQuery.taskDefinitionKeys(sourceTaskIds).count() > 0) { getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) @@ -1451,7 +1517,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { } // 任务后置通知 - if (ObjUtil.isNotNull(processDefinitionInfo.getTaskAfterTriggerSetting())){ + if (ObjUtil.isNotNull(processDefinitionInfo.getTaskAfterTriggerSetting())) { BpmModelMetaInfoVO.HttpRequestSetting setting = processDefinitionInfo.getTaskAfterTriggerSetting(); BpmHttpRequestUtils.executeBpmHttpRequest(processInstance, setting.getUrl(), setting.getHeader(), setting.getBody(), true, setting.getResponse());