diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java index 0af943a78..580d8b136 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java @@ -16,18 +16,22 @@ import java.util.Arrays; @Getter @AllArgsConstructor public enum BusinessStatusEnum { + /** * 已撤销 */ CANCEL("cancel", "已撤销"), + /** * 草稿 */ DRAFT("draft", "草稿"), + /** * 待审核 */ WAITING("waiting", "待审核"), + /** * 已完成 */ @@ -36,10 +40,12 @@ public enum BusinessStatusEnum { * 已作废 */ INVALID("invalid", "已作废"), + /** * 已退回 */ BACK("back", "已退回"), + /** * 已终止 */ @@ -71,6 +77,16 @@ public enum BusinessStatusEnum { .orElse(StrUtil.EMPTY); } + /** + * 判断是否为指定的状态之一:草稿、已撤销或已退回 + * + * @param status 要检查的状态 + * @return 如果状态为草稿、已撤销或已退回之一,则返回 true;否则返回 false + */ + public static boolean isDraftOrCancelOrBack(String status) { + return DRAFT.status.equals(status) || CANCEL.status.equals(status) || BACK.status.equals(status); + } + /** * 启动流程校验 * diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java index 4ab7d4eeb..0f8e8391a 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java @@ -88,6 +88,13 @@ public class LoginHelper { return Convert.toLong(getExtra(USER_KEY)); } + /** + * 获取用户id + */ + public static String getUserIdStr() { + return Convert.toStr(getExtra(USER_KEY)); + } + /** * 获取用户账户 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 16ee315a4..85fb17ace 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -173,7 +173,7 @@ public class FlwTaskController extends BaseController { public R delegateTask(@Validated({AddGroup.class}) @RequestBody DelegateBo bo) { return toAjax(taskService.depute( bo.getTaskId(), - String.valueOf(LoginHelper.getUserId()), + LoginHelper.getUserIdStr(), WorkflowUtils.permissionList(), Collections.singletonList(bo.getUserId()), bo.getMessage())); @@ -190,7 +190,7 @@ public class FlwTaskController extends BaseController { public R transferTask(@Validated({AddGroup.class}) @RequestBody TransferBo bo) { return toAjax(taskService.transfer( bo.getTaskId(), - String.valueOf(LoginHelper.getUserId()), + LoginHelper.getUserIdStr(), WorkflowUtils.permissionList(), Collections.singletonList(bo.getUserId()), bo.getMessage())); @@ -207,7 +207,7 @@ public class FlwTaskController extends BaseController { public R addSignature(@Validated({AddGroup.class}) @RequestBody AddSignatureBo bo) { return toAjax(taskService.addSignature( bo.getTaskId(), - String.valueOf(LoginHelper.getUserId()), + LoginHelper.getUserIdStr(), WorkflowUtils.permissionList(), bo.getUserIds(), bo.getMessage())); @@ -224,7 +224,7 @@ public class FlwTaskController extends BaseController { public R reductionSignature(@Validated({AddGroup.class}) @RequestBody ReductionSignatureBo bo) { return toAjax(taskService.reductionSignature( bo.getTaskId(), - String.valueOf(LoginHelper.getUserId()), + LoginHelper.getUserIdStr(), WorkflowUtils.permissionList(), bo.getUserIds(), bo.getMessage())); @@ -246,7 +246,7 @@ public class FlwTaskController extends BaseController { .setPermissionFlag(WorkflowUtils.permissionList()) .setCooperateType(CooperateType.APPROVAL.getKey()) .setMessage("修改任务办理人") - .setCurUser(String.valueOf(LoginHelper.getUserId())) + .setCurUser(LoginHelper.getUserIdStr()) .setIgnore(false); return toAjax(taskService.updateHandler(modifyHandler)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java index 7da247df1..b83942a71 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -1,6 +1,5 @@ package org.dromara.workflow.domain.bo; -import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Data; import org.dromara.common.core.validate.AddGroup; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java index a560b9530..5738cd367 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/DelegateBo.java @@ -6,7 +6,6 @@ import org.dromara.common.core.validate.AddGroup; import java.io.Serial; import java.io.Serializable; -import java.util.List; /** * 委派任务请求对象 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java index df8b6be7d..18305ebbe 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java @@ -37,5 +37,8 @@ public class FlowInstanceBo implements Serializable { */ private Long instanceId; + /** + * 权限列表 + */ private List permissionList; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java index 74a5d554e..59e6bac1b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java @@ -38,5 +38,8 @@ public class FlowTaskBo implements Serializable { */ private Long instanceId; + /** + * 权限列表 + */ private List permissionList; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index f0604913f..0edade533 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.warm.flow.core.entity.Definition; -import com.warm.flow.core.enums.PublishStatus; import com.warm.flow.core.service.DefService; import com.warm.flow.orm.entity.FlowDefinition; import com.warm.flow.orm.mapper.FlowDefinitionMapper; @@ -26,7 +25,6 @@ import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.Arrays; import java.util.List; /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index b897dda6d..c92ad1e3a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -31,7 +31,9 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; -import org.dromara.workflow.domain.vo.*; +import org.dromara.workflow.domain.vo.FlowHisTaskVo; +import org.dromara.workflow.domain.vo.FlowTaskVo; +import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.mapper.FlwTaskMapper; import org.dromara.workflow.service.IFlwInstanceService; @@ -44,7 +46,8 @@ import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; -import static org.dromara.workflow.common.constant.FlowConstant.*; +import static org.dromara.workflow.common.constant.FlowConstant.BUSINESS_KEY; +import static org.dromara.workflow.common.constant.FlowConstant.INITIATOR; /** * 任务 服务层实现 @@ -76,36 +79,35 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Override @Transactional(rollbackFor = Exception.class) public Map startWorkFlow(StartProcessBo startProcessBo) { - Map map = new HashMap<>(16); - if (StringUtils.isBlank(startProcessBo.getBusinessKey())) { + String businessKey = startProcessBo.getBusinessKey(); + String userId = LoginHelper.getUserIdStr(); + if (StringUtils.isBlank(businessKey)) { throw new ServiceException("启动工作流时必须包含业务ID"); } // 启动流程实例(提交申请) Map variables = startProcessBo.getVariables(); // 流程发起人 - variables.put(INITIATOR, (String.valueOf(LoginHelper.getUserId()))); + variables.put(INITIATOR, userId); // 业务id - variables.put(BUSINESS_KEY, startProcessBo.getBusinessKey()); + variables.put(BUSINESS_KEY, businessKey); WfDefinitionConfigVo wfDefinitionConfigVo = wfDefinitionConfigService.getByTableNameLastVersion(startProcessBo.getTableName()); if (wfDefinitionConfigVo == null) { throw new ServiceException("请到流程定义绑定业务表名与流程KEY!"); } - FlowInstance flowInstance = iFlwInstanceService.instanceByBusinessId(startProcessBo.getBusinessKey()); + FlowInstance flowInstance = iFlwInstanceService.instanceByBusinessId(businessKey); if (flowInstance != null) { List taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId())); - map.put("processInstanceId", taskList.get(0).getInstanceId()); - map.put("taskId", taskList.get(0).getId()); - return map; + return buildMap(taskList.get(0).getInstanceId(), taskList.get(0).getId()); } FlowParams flowParams = new FlowParams(); flowParams.flowCode(wfDefinitionConfigVo.getProcessKey()); flowParams.variable(startProcessBo.getVariables()); - flowParams.setHandler(String.valueOf(LoginHelper.getUserId())); + flowParams.setHandler(userId); flowParams.flowStatus(BusinessStatusEnum.DRAFT.getStatus()); Instance instance; try { - instance = insService.start(startProcessBo.getBusinessKey(), flowParams); + instance = insService.start(businessKey, flowParams); } catch (Exception e) { throw new ServiceException(e.getMessage()); } @@ -114,9 +116,18 @@ public class FlwTaskServiceImpl implements IFlwTaskService { if (taskList.size() > 1) { throw new ServiceException("请检查流程第一个环节是否为申请人!"); } - map.put("processInstanceId", instance.getId()); - map.put("taskId", taskList.get(0).getId()); - return map; + return buildMap(instance.getId(), taskList.get(0).getId()); + } + + /** + * 构建一个包含给定 `processInstanceId` 和 `taskId` 的 Map + * + * @param instanceId 流程实例的 ID + * @param taskId 任务的 ID + * @return 返回一个包含 `processInstanceId` 和 `taskId` 的不可变 Map + */ + private Map buildMap(Object instanceId, Object taskId) { + return Map.of("processInstanceId", instanceId, "taskId", taskId); } /** @@ -128,35 +139,46 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Transactional(rollbackFor = Exception.class) public boolean completeTask(CompleteTaskBo completeTaskBo) { try { - String userId = String.valueOf(LoginHelper.getUserId()); + // 获取当前用户ID作为任务处理人 + String userId = LoginHelper.getUserIdStr(); + + // 获取任务ID并查询对应的流程任务和实例信息 Long taskId = completeTaskBo.getTaskId(); FlowTask flowTask = flowTaskMapper.selectById(taskId); Instance ins = insService.getById(flowTask.getInstanceId()); - //流程定义 + + // 获取流程定义信息 Definition definition = defService.getById(flowTask.getDefinitionId()); - //流程提交监听 - if (BusinessStatusEnum.DRAFT.getStatus().equals(ins.getFlowStatus()) || BusinessStatusEnum.CANCEL.getStatus().equals(ins.getFlowStatus()) - || BusinessStatusEnum.BACK.getStatus().equals(ins.getFlowStatus())) { + + // 检查流程状态是否为草稿、已撤销或已退回状态,若是则执行流程提交监听 + if (BusinessStatusEnum.isDraftOrCancelOrBack(ins.getFlowStatus())) { flowProcessEventHandler.processHandler(definition.getFlowCode(), ins.getBusinessId(), ins.getFlowStatus(), true); } - //办理任务监听 - flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), flowTask.getNodeCode(), - taskId.toString(), ins.getBusinessId()); + + // 办理任务监听,记录任务执行信息 + flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), flowTask.getNodeCode(), taskId.toString(), ins.getBusinessId()); + + // 构建流程参数,包括变量、跳转类型、消息、处理人、权限等信息 FlowParams flowParams = new FlowParams(); flowParams.variable(completeTaskBo.getVariables()); flowParams.skipType(SkipType.PASS.getKey()); flowParams.message(completeTaskBo.getMessage()); flowParams.handler(userId); flowParams.permissionFlag(WorkflowUtils.permissionList()); - flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()) - .hisStatus(TaskStatusEnum.PASS.getStatus()); + flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()).hisStatus(TaskStatusEnum.PASS.getStatus()); + + // 执行任务跳转,并根据返回的处理人设置下一步处理人 setHandler(taskService.skip(taskId, flowParams)); + + // 更新实例状态为待审核状态 iFlwInstanceService.updateStatus(ins.getId(), BusinessStatusEnum.WAITING.getStatus()); //判断是否流程结束 Instance instance = insService.getById(ins.getId()); + // 重新获取实例信息,检查流程是否已结束 if (FlowStatus.isFinished(instance.getFlowStatus())) { + // 若流程已结束,更新状态为已完成 iFlwInstanceService.updateStatus(instance.getId(), BusinessStatusEnum.FINISH.getStatus()); - //流程结束执行监听 + // 流程结束监听,处理结束后的业务逻辑 flowProcessEventHandler.processHandler(definition.getFlowCode(), instance.getBusinessId(), BusinessStatusEnum.FINISH.getStatus(), false); } @@ -174,19 +196,22 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ private void setHandler(Instance instance) { if (instance != null) { + // 根据流程实例ID查询所有关联的任务 List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class) .eq(FlowTask::getInstanceId, instance.getId())); + + // 遍历任务列表,处理每个任务的办理人 for (FlowTask flowTask : flowTasks) { + // 获取与当前任务关联的用户列表 List userList = userService.getByAssociateds(Collections.singletonList(flowTask.getId())); - if (CollUtil.isNotEmpty(userList)) { - Set users = WorkflowUtils.getUser(userList); - if (CollUtil.isNotEmpty(users)) { - userService.deleteByTaskIds(Collections.singletonList(flowTask.getId())); - for (User user : users) { - user.setAssociated(flowTask.getId()); - } - userService.saveBatch(new ArrayList<>(users)); - } + // 通过工具方法过滤和获取有效用户 + Set users = WorkflowUtils.getUser(userList); + if (CollUtil.isNotEmpty(users)) { + // 删除现有的任务办理人记录,确保后续数据清理和更新 + userService.deleteByTaskIds(Collections.singletonList(flowTask.getId())); + // 将新的办理人关联到任务ID,并批量保存新的办理人列表 + users.forEach(user -> user.setAssociated(flowTask.getId())); + userService.saveBatch(new ArrayList<>(users)); } } } @@ -235,6 +260,14 @@ public class FlwTaskServiceImpl implements IFlwTaskService { return TableDataInfo.build(page); } + /** + * 构建待处理任务分页对象 + * + * @param pageQuery 分页查询对象 + * @param queryWrapper 查询条件封装对象 + * @param flowTaskBo 流程任务业务对象 + * @return 分页后的待处理任务列表 + */ private Page buildTaskWaitingPage(PageQuery pageQuery, QueryWrapper queryWrapper, FlowTaskBo flowTaskBo) { commonCondition(queryWrapper, flowTaskBo); Page page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); @@ -281,14 +314,21 @@ public class FlwTaskServiceImpl implements IFlwTaskService { return TableDataInfo.build(page); } + /** + * 构建已完成任务分页对象 + * + * @param pageQuery 分页查询对象 + * @param queryWrapper 查询条件封装对象 + * @param flowTaskBo 流程任务业务对象 + * @return 分页后的已完成任务列表 + */ private Page buildTaskFinishPage(PageQuery pageQuery, QueryWrapper queryWrapper, FlowTaskBo flowTaskBo) { commonCondition(queryWrapper, flowTaskBo); Page page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); List records = page.getRecords(); + // 如果有任务记录,为每条记录设置流程状态名称 if (CollUtil.isNotEmpty(records)) { - for (FlowHisTaskVo data : records) { - data.setFlowStatusName(FlowStatus.getValueByKey(data.getFlowStatus())); - } + records.forEach(data -> data.setFlowStatusName(FlowStatus.getValueByKey(data.getFlowStatus()))); } return page; } @@ -316,7 +356,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Override public boolean backProcess(BackProcessBo bo) { try { - String userId = String.valueOf(LoginHelper.getUserId()); + String userId = LoginHelper.getUserIdStr(); Long taskId = bo.getTaskId(); List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class).eq(FlowTask::getId, taskId)); if (CollUtil.isEmpty(flowTasks)) { @@ -387,7 +427,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { //流程定义 Definition definition = defService.getById(flowTask.getDefinitionId()); FlowParams flowParams = new FlowParams(); - flowParams.handler(String.valueOf(LoginHelper.getUserId())); + flowParams.handler(LoginHelper.getUserIdStr()); flowParams.message(bo.getComment()); flowParams.permissionFlag(WorkflowUtils.permissionList()); flowParams.flowStatus(BusinessStatusEnum.TERMINATION.getStatus()) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 62412781f..63a769375 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -31,10 +31,9 @@ public class WorkflowUtils { */ public static List permissionList() { List roles = LoginHelper.getLoginUser().getRoles(); - Long userId = LoginHelper.getUserId(); Long deptId = LoginHelper.getDeptId(); List permissionList = StreamUtils.toList(roles, role -> "role:" + role.getRoleId()); - permissionList.add(String.valueOf(userId)); + permissionList.add(LoginHelper.getUserIdStr()); permissionList.add("dept:" + deptId); return permissionList; } @@ -90,38 +89,46 @@ public class WorkflowUtils { if (CollUtil.isNotEmpty(userList)) { UserService userService = SpringUtils.getBean(UserService.class); for (User user : userList) { - if (user.getProcessedBy().startsWith("user:")) { - Long userId = Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON)); - List users = userService.selectListByIds(List.of(userId)); - if (CollUtil.isNotEmpty(users)) { - FlowUser u = new FlowUser(); - u.setType(user.getType()); - u.setProcessedBy(String.valueOf(StreamUtils.toList(users, UserDTO::getUserId).get(0))); - list.add(u); - } - } - if (user.getProcessedBy().startsWith("role:")) { - Long roleId = Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON)); - List roleUsers = userService.selectUsersByRoleIds(List.of(roleId)); - for (UserDTO roleUser : roleUsers) { - FlowUser u = new FlowUser(); - u.setType(user.getType()); - u.setProcessedBy(String.valueOf(roleUser.getUserId())); - list.add(u); - } - } - if (user.getProcessedBy().startsWith("dept:")) { - Long deptId = Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON)); - List deptUsers = userService.selectUsersByDeptIds(List.of(deptId)); - for (UserDTO deptUser : deptUsers) { - FlowUser u = new FlowUser(); - u.setType(user.getType()); - u.setProcessedBy(String.valueOf(deptUser.getUserId())); - list.add(u); - } + // 根据 processedBy 前缀判断处理人类型,分别获取用户列表 + List users = getAssociatedUsers(userService, user); + // 转换为 FlowUser 并添加到结果集合 + if (CollUtil.isNotEmpty(users)) { + users.forEach(dto -> { + FlowUser flowUser = new FlowUser(); + flowUser.setType(user.getType()); + flowUser.setProcessedBy(String.valueOf(dto.getUserId())); + list.add(flowUser); + }); } } } return list; } + + /** + * 根据用户的 `processedBy` 前缀(user、role、dept)获取关联的用户列表 + * + * @param userService 用户服务,用于从数据库中查询用户信息 + * @param user 办理用户实例,通过 `processedBy` 字段识别处理人类型 + * @return 返回符合条件的用户DTO列表,如果未找到匹配的前缀则返回空列表 + */ + private static List getAssociatedUsers(UserService userService, User user) { + String processedBy = user.getProcessedBy(); + // 提取 processedBy 字段中 ":" 后的部分作为ID + Long id = Long.valueOf(StringUtils.substringAfter(processedBy, StrUtil.C_COLON)); + + if (processedBy.startsWith("user:")) { + // 如果前缀为 "user:",根据用户ID查询 + return userService.selectListByIds(List.of(id)); + } else if (processedBy.startsWith("role:")) { + // 如果前缀为 "role:",根据角色ID查询用户 + return userService.selectUsersByRoleIds(List.of(id)); + } else if (processedBy.startsWith("dept:")) { + // 如果前缀为 "dept:",根据部门ID查询用户 + return userService.selectUsersByDeptIds(List.of(id)); + } + // 未匹配任何前缀,返回空列表 + return Collections.emptyList(); + } + }