diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/AssigneeService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/AssigneeService.java new file mode 100644 index 000000000..73311cee5 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/AssigneeService.java @@ -0,0 +1,30 @@ +package org.dromara.common.core.service; + +import org.dromara.common.core.domain.dto.UserDTO; + +import java.util.List; + +/** + * 通用 办理人服务 + * + * @author AprilWind + */ +public interface AssigneeService { + + /** + * 通过taskId查询对应的任务办理人 + * + * @param taskIds taskId串逗号分隔 + * @return 任务办理人名称串逗号分隔 + */ + String selectAssigneeByIds(String taskIds); + + /** + * 通过taskId查询对应的任务办理人列表 + * + * @param taskIds taskId串逗号分隔 + * @return 列表 + */ + List selectByIds(String taskIds); + +} diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java index c084ea1a0..c14175ebe 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java @@ -32,4 +32,9 @@ public interface TransConstant { */ String OSS_ID_TO_URL = "oss_id_to_url"; + /** + * 任务Id转任务办理人名称 + */ + String TASK_ID_TO_ASSIGNEE = "task_id_to_assignee"; + } diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/TaskAssigneeTranslationImpl.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/TaskAssigneeTranslationImpl.java new file mode 100644 index 000000000..7a2502b1c --- /dev/null +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/TaskAssigneeTranslationImpl.java @@ -0,0 +1,27 @@ +package org.dromara.common.translation.core.impl; + +import lombok.AllArgsConstructor; +import org.dromara.common.core.service.AssigneeService; +import org.dromara.common.translation.annotation.TranslationType; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.common.translation.core.TranslationInterface; + +/** + * 任务办理人翻译实现 + * + * @author AprilWind + */ +@AllArgsConstructor +@TranslationType(type = TransConstant.TASK_ID_TO_ASSIGNEE) +public class TaskAssigneeTranslationImpl implements TranslationInterface { + + private final AssigneeService assigneeService; + + @Override + public String translation(Object key, String other) { + if (key instanceof String id) { + return assigneeService.selectAssigneeByIds(id); + } + return null; + } +} 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 59e6bac1b..66dc70a61 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 @@ -1,6 +1,5 @@ package org.dromara.workflow.domain.bo; -import jakarta.validation.constraints.Future; import lombok.Data; import java.io.Serial; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java index 5ab3520e9..d44121f15 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -1,5 +1,6 @@ package org.dromara.workflow.domain.vo; +import com.warm.flow.core.enums.FlowStatus; import lombok.Data; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; @@ -173,4 +174,10 @@ public class FlowHisTaskVo implements Serializable { * 运行时长 */ private String runDuration; + + public void setFlowStatus(String flowStatus) { + this.flowStatus = flowStatus; + // TODO 建议前端使用字典 + this.flowStatusName = FlowStatus.getValueByKey(flowStatus); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 54a5edf46..7a7b6c54a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -2,7 +2,8 @@ package org.dromara.workflow.domain.vo; import com.warm.flow.core.entity.User; import lombok.Data; -import org.dromara.common.core.domain.dto.UserDTO; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; import java.io.Serial; import java.io.Serializable; @@ -118,9 +119,10 @@ public class FlowTaskVo implements Serializable { private String flowStatusName; /** - * 办理人 + * 办理人名称 */ - private List userDTOList; + @Translation(type = TransConstant.TASK_ID_TO_ASSIGNEE, mapper = "id") + private String transactorNames; /** * 办理人类型 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfTaskAssigneeService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfTaskAssigneeService.java new file mode 100644 index 000000000..928c55c07 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfTaskAssigneeService.java @@ -0,0 +1,22 @@ +package org.dromara.workflow.service; + +import org.dromara.common.core.domain.dto.UserDTO; + +import java.util.List; + +/** + * 流程设计器-获取办理人 + * + * @author AprilWind + */ +public interface IWfTaskAssigneeService { + + /** + * 根据存储标识符(storageId)解析分配类型和ID,并获取对应的用户列表 + * + * @param storageId 包含分配类型和ID的字符串(例如 "user:123" 或 "role:456") + * @return 与分配类型和ID匹配的用户列表,如果格式无效则返回空列表 + */ + List fetchUsersByStorageId(String storageId); + +} 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 965ee4d07..c16567aba 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 @@ -3,6 +3,7 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.warm.flow.core.dto.FlowParams; import com.warm.flow.core.entity.*; @@ -22,8 +23,10 @@ import com.warm.flow.orm.mapper.FlowSkipMapper; import com.warm.flow.orm.mapper.FlowTaskMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.AssigneeService; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; @@ -43,7 +46,10 @@ import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import static org.dromara.workflow.common.constant.FlowConstant.BUSINESS_KEY; @@ -57,7 +63,7 @@ import static org.dromara.workflow.common.constant.FlowConstant.INITIATOR; @Slf4j @RequiredArgsConstructor @Service -public class FlwTaskServiceImpl implements IFlwTaskService { +public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { private final TaskService taskService; private final InsService insService; @@ -184,26 +190,30 @@ public class FlwTaskServiceImpl implements IFlwTaskService { * @param instance 实例 */ private void setHandler(Instance instance) { - if (instance != null) { - // 根据流程实例ID查询所有关联的任务 - List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class) - .eq(FlowTask::getInstanceId, instance.getId())); + if (instance == null) { + return; + } + // 根据流程实例ID查询所有关联的任务 + List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class) + .eq(FlowTask::getInstanceId, instance.getId())); + List userList = new ArrayList<>(); - // 遍历任务列表,处理每个任务的办理人 - for (FlowTask flowTask : flowTasks) { - // 获取与当前任务关联的用户列表 - List userList = userService.getByAssociateds(Collections.singletonList(flowTask.getId())); - // 通过工具方法过滤和获取有效用户 - 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)); - } + // 遍历任务列表,处理每个任务的办理人 + for (FlowTask flowTask : flowTasks) { + // 获取与当前任务关联的用户列表 + List associatedUsers = userService.getByAssociateds(Collections.singletonList(flowTask.getId())); + if (CollUtil.isNotEmpty(associatedUsers)) { + userList.addAll(WorkflowUtils.getUser(associatedUsers, flowTask.getId())); } } + + // 批量删除现有任务的办理人记录 + userService.deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); + + // 确保要保存的 userList 不为空 + if (CollUtil.isNotEmpty(userList)) { + userService.saveBatch(userList); + } } /** @@ -214,10 +224,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public TableDataInfo getPageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = new QueryWrapper<>(); + QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); + queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); queryWrapper.in("t.processed_by", WorkflowUtils.permissionList()); queryWrapper.in("t.flow_status", BusinessStatusEnum.WAITING.getStatus()); - Page page = buildTaskWaitingPage(pageQuery, queryWrapper, flowTaskBo); + Page page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); return TableDataInfo.build(page); } @@ -229,9 +240,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public TableDataInfo getPageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = new QueryWrapper<>(); + QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); + queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); queryWrapper.in("t.approver", LoginHelper.getUserId()); - Page page = buildTaskFinishPage(pageQuery, queryWrapper, flowTaskBo); + Page page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); return TableDataInfo.build(page); } @@ -243,51 +255,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public TableDataInfo getPageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.in("t.processed_by", WorkflowUtils.permissionList()); - Page page = buildTaskWaitingPage(pageQuery, queryWrapper, flowTaskBo); - 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); - List records = page.getRecords(); - if (CollUtil.isNotEmpty(records)) { - List taskIds = StreamUtils.toList(records, FlowTaskVo::getId); - List userList = userService.getByAssociateds(taskIds); - for (FlowTaskVo data : records) { - if (CollUtil.isNotEmpty(userList)) { - List users = StreamUtils.filter(userList, e -> e.getAssociated().toString().equals(data.getId().toString())); - data.setUserList(CollUtil.isEmpty(users) ? Collections.emptyList() : users); - data.setUserDTOList(WorkflowUtils.getHandlerUser(users)); - } - data.setFlowStatusName(FlowStatus.getValueByKey(data.getFlowStatus())); - } - } - return page; - } - - /** - * 通用条件 - * - * @param queryWrapper 查询条件 - * @param flowTaskBo 参数 - */ - private void commonCondition(QueryWrapper queryWrapper, FlowTaskBo flowTaskBo) { - queryWrapper.like(StringUtils.isNotBlank(flowTaskBo.getNodeName()), "t.node_name", flowTaskBo.getNodeName()); - queryWrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowName()), "t.flow_name", flowTaskBo.getFlowName()); - queryWrapper.eq(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode()); + QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); - queryWrapper.orderByDesc("t.create_time"); + queryWrapper.in("t.processed_by", WorkflowUtils.permissionList()); + Page page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); + return TableDataInfo.build(page); } /** @@ -298,28 +270,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public TableDataInfo getPageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - Page page = buildTaskFinishPage(pageQuery, queryWrapper, flowTaskBo); - return TableDataInfo.build(page); - } - - /** - * 构建已完成任务分页对象 - * - * @param pageQuery 分页查询对象 - * @param queryWrapper 查询条件封装对象 - * @param flowTaskBo 流程任务业务对象 - * @return 分页后的已完成任务列表 - */ - private Page buildTaskFinishPage(PageQuery pageQuery, QueryWrapper queryWrapper, FlowTaskBo flowTaskBo) { - commonCondition(queryWrapper, flowTaskBo); + QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); Page page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); - List records = page.getRecords(); - // 如果有任务记录,为每条记录设置流程状态名称 - if (CollUtil.isNotEmpty(records)) { - records.forEach(data -> data.setFlowStatusName(FlowStatus.getValueByKey(data.getFlowStatus()))); - } - return page; + return TableDataInfo.build(page); } /** @@ -330,13 +283,20 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public TableDataInfo getPageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowName()), "t.flow_name", flowTaskBo.getFlowName()); - queryWrapper.eq(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode()); + QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); Page page = flwTaskMapper.getTaskCopyByPage(pageQuery.build(), queryWrapper); return TableDataInfo.build(page); } + private QueryWrapper buildQueryWrapper(FlowTaskBo flowTaskBo) { + QueryWrapper wrapper = Wrappers.query(); + wrapper.like(StringUtils.isNotBlank(flowTaskBo.getNodeName()), "t.node_name", flowTaskBo.getNodeName()); + wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowName()), "t.flow_name", flowTaskBo.getFlowName()); + wrapper.eq(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode()); + wrapper.orderByDesc("t.create_time"); + return wrapper; + } + /** * 驳回任务 * @@ -431,4 +391,38 @@ public class FlwTaskServiceImpl implements IFlwTaskService { throw new ServiceException(e.getMessage()); } } + + /** + * 通过taskId查询对应的任务办理人 + * + * @param taskIds taskId串逗号分隔 + * @return 任务办理人名称串逗号分隔 + */ + @Override + public String selectAssigneeByIds(String taskIds) { + if (StringUtils.isBlank(taskIds)) { + return null; + } + List userList = userService.getByAssociateds(List.of(Long.valueOf(taskIds))); + // 获取处理用户的昵称并将其合并为一个字符串 + return WorkflowUtils.getHandlerUser(userList).stream() + .map(UserDTO::getNickName) + .collect(Collectors.joining(",")); + } + + /** + * 通过taskId查询对应的任务办理人列表 + * + * @param taskIds taskId串逗号分隔 + * @return 列表 + */ + @Override + public List selectByIds(String taskIds) { + if (StringUtils.isBlank(taskIds)) { + return Collections.emptyList(); + } + List userList = userService.getByAssociateds(List.of(Long.valueOf(taskIds))); + return WorkflowUtils.getHandlerUser(userList); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java index e89f3a18a..f9d5e24a6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskAssigneeServiceImpl.java @@ -1,6 +1,7 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; import com.warm.flow.ui.dto.HandlerFunDto; import com.warm.flow.ui.dto.HandlerQuery; import com.warm.flow.ui.dto.TreeFunDto; @@ -10,6 +11,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.dto.DeptDTO; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; +import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.DeptService; @@ -19,9 +21,11 @@ import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.workflow.common.enums.TaskAssigneeEnum; +import org.dromara.workflow.service.IWfTaskAssigneeService; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Optional; @@ -33,7 +37,7 @@ import java.util.Optional; @Slf4j @RequiredArgsConstructor @Service -public class WfTaskAssigneeServiceImpl implements HandlerSelectService { +public class WfTaskAssigneeServiceImpl implements IWfTaskAssigneeService, HandlerSelectService { final static String DEFAULT_GROUP_NAME = "默认分组"; private final UserService userService; private final DeptService deptService; @@ -118,4 +122,39 @@ public class WfTaskAssigneeServiceImpl implements HandlerSelectService { .setCreateTime(assignee -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, assignee.getCreateTime())); } + /** + * 根据存储标识符(storageId)解析分配类型和ID,并获取对应的用户列表 + * + * @param storageId 包含分配类型和ID的字符串(例如 "user:123" 或 "role:456") + * @return 与分配类型和ID匹配的用户列表,如果格式无效则返回空列表 + */ + @Override + public List fetchUsersByStorageId(String storageId) { + String[] parts = storageId.split(StrUtil.COLON, 2); + if (parts.length < 2) { + return Collections.emptyList(); + } + return getUsersByType(TaskAssigneeEnum.fromCode(parts[0] + StrUtil.COLON), List.of(Long.valueOf(parts[1]))); + } + + /** + * 根据指定的任务分配类型(TaskAssigneeEnum)和 ID 列表,获取对应的用户信息列表 + * + * @param type 任务分配类型,表示用户、角色、部门或其他(TaskAssigneeEnum 枚举值) + * @param ids 与指定分配类型关联的 ID 列表(例如用户ID、角色ID、部门ID等) + * @return 返回包含用户信息的列表。如果类型为用户(USER),则通过用户ID列表查询; + * 如果类型为角色(ROLE),则通过角色ID列表查询; + * 如果类型为部门(DEPT),则通过部门ID列表查询; + * 如果类型为岗位(POST)或无法识别的类型,则返回空列表 + */ + private List getUsersByType(TaskAssigneeEnum type, List ids) { + return switch (type) { + case USER -> userService.selectListByIds(ids); + case ROLE -> userService.selectUsersByRoleIds(ids); + case DEPT -> userService.selectUsersByDeptIds(ids); + // todo 岗位后续待添加 + default -> Collections.emptyList(); + }; + } + } 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 df3655160..741f94e4f 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 @@ -1,20 +1,22 @@ package org.dromara.workflow.utils; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; import com.warm.flow.core.entity.User; import com.warm.flow.orm.entity.FlowUser; +import java.util.Collections; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.StringUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.workflow.common.enums.TaskAssigneeEnum; +import org.dromara.workflow.service.IWfTaskAssigneeService; -import java.util.*; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -52,53 +54,40 @@ public class WorkflowUtils { */ public static List getHandlerUser(List userList) { if (CollUtil.isEmpty(userList)) { - return List.of(); + return Collections.emptyList(); } - UserService userService = SpringUtils.getBean(UserService.class); - List userIds = new ArrayList<>(); - List roleIds = new ArrayList<>(); - List deptIds = new ArrayList<>(); - for (User user : userList) { - String processedBy = user.getProcessedBy(); - Long id = Long.valueOf(StringUtils.substringAfter(processedBy, StrUtil.C_COLON)); - if (processedBy.startsWith(TaskAssigneeEnum.USER.getCode())) { - userIds.add(id); - } else if (processedBy.startsWith(TaskAssigneeEnum.ROLE.getCode())) { - roleIds.add(id); - } else if (processedBy.startsWith(TaskAssigneeEnum.DEPT.getCode())) { - deptIds.add(id); - } else { - userIds.add(Long.valueOf(processedBy)); - } - } - // 合并不同类型用户 - List userDTOList = new ArrayList<>(userService.selectListByIds(userIds)); - userDTOList.addAll(userService.selectUsersByRoleIds(roleIds)); - userDTOList.addAll(userService.selectUsersByDeptIds(deptIds)); - return userDTOList; + IWfTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IWfTaskAssigneeService.class); + // 获取所有用户的 UserDTO 列表 + return userList.stream() + .map(User::getProcessedBy) + .filter(Objects::nonNull) + .flatMap(processedBy -> taskAssigneeService.fetchUsersByStorageId(processedBy).stream()) + .collect(Collectors.toList()); } /** * 获取办理人 * * @param userList 办理用户 + * @param taskId 任务ID * @return 用户 */ - public static Set getUser(List userList) { + public static Set getUser(List userList, Long taskId) { if (CollUtil.isEmpty(userList)) { return Set.of(); } Set list = new HashSet<>(); - UserService userService = SpringUtils.getBean(UserService.class); + IWfTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IWfTaskAssigneeService.class); for (User user : userList) { // 根据 processedBy 前缀判断处理人类型,分别获取用户列表 - List users = getAssociatedUsers(userService, user); + List users = taskAssigneeService.fetchUsersByStorageId(user.getProcessedBy()); // 转换为 FlowUser 并添加到结果集合 if (CollUtil.isNotEmpty(users)) { users.forEach(dto -> { FlowUser flowUser = new FlowUser(); flowUser.setType(user.getType()); flowUser.setProcessedBy(String.valueOf(dto.getUserId())); + flowUser.setAssociated(taskId); list.add(flowUser); }); } @@ -106,29 +95,4 @@ public class WorkflowUtils { 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(TaskAssigneeEnum.USER.getCode())) { - // 如果前缀为 "user:",根据用户ID查询 - return userService.selectListByIds(List.of(id)); - } else if (processedBy.startsWith(TaskAssigneeEnum.ROLE.getCode())) { - // 如果前缀为 "role:",根据角色ID查询用户 - return userService.selectUsersByRoleIds(List.of(id)); - } else if (processedBy.startsWith(TaskAssigneeEnum.DEPT.getCode())) { - // 如果前缀为 "dept:",根据部门ID查询用户 - return userService.selectUsersByDeptIds(List.of(id)); - } - // 未匹配任何前缀,返回空列表 - return Collections.emptyList(); - } - }