update 优化待办任务查询以及任务流转
This commit is contained in:
parent
e82352deff
commit
b5ba8de7b7
@ -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<UserDTO> selectByIds(String taskIds);
|
||||
|
||||
}
|
@ -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";
|
||||
|
||||
}
|
||||
|
@ -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<String> {
|
||||
|
||||
private final AssigneeService assigneeService;
|
||||
|
||||
@Override
|
||||
public String translation(Object key, String other) {
|
||||
if (key instanceof String id) {
|
||||
return assigneeService.selectAssigneeByIds(id);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -1,6 +1,5 @@
|
||||
package org.dromara.workflow.domain.bo;
|
||||
|
||||
import jakarta.validation.constraints.Future;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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<UserDTO> userDTOList;
|
||||
@Translation(type = TransConstant.TASK_ID_TO_ASSIGNEE, mapper = "id")
|
||||
private String transactorNames;
|
||||
|
||||
/**
|
||||
* 办理人类型
|
||||
|
@ -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<UserDTO> fetchUsersByStorageId(String storageId);
|
||||
|
||||
}
|
@ -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,25 +190,29 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
* @param instance 实例
|
||||
*/
|
||||
private void setHandler(Instance instance) {
|
||||
if (instance != null) {
|
||||
if (instance == null) {
|
||||
return;
|
||||
}
|
||||
// 根据流程实例ID查询所有关联的任务
|
||||
List<FlowTask> flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class)
|
||||
.eq(FlowTask::getInstanceId, instance.getId()));
|
||||
List<User> userList = new ArrayList<>();
|
||||
|
||||
// 遍历任务列表,处理每个任务的办理人
|
||||
for (FlowTask flowTask : flowTasks) {
|
||||
// 获取与当前任务关联的用户列表
|
||||
List<User> userList = userService.getByAssociateds(Collections.singletonList(flowTask.getId()));
|
||||
// 通过工具方法过滤和获取有效用户
|
||||
Set<User> 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));
|
||||
List<User> 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<FlowTaskVo> getPageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
|
||||
QueryWrapper<FlowTaskBo> queryWrapper = new QueryWrapper<>();
|
||||
QueryWrapper<FlowTaskBo> 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<FlowTaskVo> page = buildTaskWaitingPage(pageQuery, queryWrapper, flowTaskBo);
|
||||
Page<FlowTaskVo> page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper);
|
||||
return TableDataInfo.build(page);
|
||||
}
|
||||
|
||||
@ -229,9 +240,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<FlowHisTaskVo> getPageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
|
||||
QueryWrapper<FlowTaskBo> queryWrapper = new QueryWrapper<>();
|
||||
QueryWrapper<FlowTaskBo> queryWrapper = buildQueryWrapper(flowTaskBo);
|
||||
queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey());
|
||||
queryWrapper.in("t.approver", LoginHelper.getUserId());
|
||||
Page<FlowHisTaskVo> page = buildTaskFinishPage(pageQuery, queryWrapper, flowTaskBo);
|
||||
Page<FlowHisTaskVo> page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper);
|
||||
return TableDataInfo.build(page);
|
||||
}
|
||||
|
||||
@ -243,51 +255,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<FlowTaskVo> getPageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
|
||||
QueryWrapper<FlowTaskBo> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.in("t.processed_by", WorkflowUtils.permissionList());
|
||||
Page<FlowTaskVo> page = buildTaskWaitingPage(pageQuery, queryWrapper, flowTaskBo);
|
||||
return TableDataInfo.build(page);
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建待处理任务分页对象
|
||||
*
|
||||
* @param pageQuery 分页查询对象
|
||||
* @param queryWrapper 查询条件封装对象
|
||||
* @param flowTaskBo 流程任务业务对象
|
||||
* @return 分页后的待处理任务列表
|
||||
*/
|
||||
private Page<FlowTaskVo> buildTaskWaitingPage(PageQuery pageQuery, QueryWrapper<FlowTaskBo> queryWrapper, FlowTaskBo flowTaskBo) {
|
||||
commonCondition(queryWrapper, flowTaskBo);
|
||||
Page<FlowTaskVo> page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper);
|
||||
List<FlowTaskVo> records = page.getRecords();
|
||||
if (CollUtil.isNotEmpty(records)) {
|
||||
List<Long> taskIds = StreamUtils.toList(records, FlowTaskVo::getId);
|
||||
List<User> userList = userService.getByAssociateds(taskIds);
|
||||
for (FlowTaskVo data : records) {
|
||||
if (CollUtil.isNotEmpty(userList)) {
|
||||
List<User> 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<FlowTaskBo> 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<FlowTaskBo> queryWrapper = buildQueryWrapper(flowTaskBo);
|
||||
queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey());
|
||||
queryWrapper.orderByDesc("t.create_time");
|
||||
queryWrapper.in("t.processed_by", WorkflowUtils.permissionList());
|
||||
Page<FlowTaskVo> page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper);
|
||||
return TableDataInfo.build(page);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -298,28 +270,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<FlowHisTaskVo> getPageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
|
||||
QueryWrapper<FlowTaskBo> queryWrapper = new QueryWrapper<>();
|
||||
Page<FlowHisTaskVo> page = buildTaskFinishPage(pageQuery, queryWrapper, flowTaskBo);
|
||||
return TableDataInfo.build(page);
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建已完成任务分页对象
|
||||
*
|
||||
* @param pageQuery 分页查询对象
|
||||
* @param queryWrapper 查询条件封装对象
|
||||
* @param flowTaskBo 流程任务业务对象
|
||||
* @return 分页后的已完成任务列表
|
||||
*/
|
||||
private Page<FlowHisTaskVo> buildTaskFinishPage(PageQuery pageQuery, QueryWrapper<FlowTaskBo> queryWrapper, FlowTaskBo flowTaskBo) {
|
||||
commonCondition(queryWrapper, flowTaskBo);
|
||||
QueryWrapper<FlowTaskBo> queryWrapper = buildQueryWrapper(flowTaskBo);
|
||||
Page<FlowHisTaskVo> page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper);
|
||||
List<FlowHisTaskVo> 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<FlowTaskVo> getPageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
|
||||
QueryWrapper<FlowTaskBo> 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<FlowTaskBo> queryWrapper = buildQueryWrapper(flowTaskBo);
|
||||
Page<FlowTaskVo> page = flwTaskMapper.getTaskCopyByPage(pageQuery.build(), queryWrapper);
|
||||
return TableDataInfo.build(page);
|
||||
}
|
||||
|
||||
private QueryWrapper<FlowTaskBo> buildQueryWrapper(FlowTaskBo flowTaskBo) {
|
||||
QueryWrapper<FlowTaskBo> 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<User> 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<UserDTO> selectByIds(String taskIds) {
|
||||
if (StringUtils.isBlank(taskIds)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<User> userList = userService.getByAssociateds(List.of(Long.valueOf(taskIds)));
|
||||
return WorkflowUtils.getHandlerUser(userList);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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<UserDTO> 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<UserDTO> getUsersByType(TaskAssigneeEnum type, List<Long> ids) {
|
||||
return switch (type) {
|
||||
case USER -> userService.selectListByIds(ids);
|
||||
case ROLE -> userService.selectUsersByRoleIds(ids);
|
||||
case DEPT -> userService.selectUsersByDeptIds(ids);
|
||||
// todo 岗位后续待添加
|
||||
default -> Collections.emptyList();
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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<UserDTO> getHandlerUser(List<User> userList) {
|
||||
if (CollUtil.isEmpty(userList)) {
|
||||
return List.of();
|
||||
return Collections.emptyList();
|
||||
}
|
||||
UserService userService = SpringUtils.getBean(UserService.class);
|
||||
List<Long> userIds = new ArrayList<>();
|
||||
List<Long> roleIds = new ArrayList<>();
|
||||
List<Long> 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<UserDTO> 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<User> getUser(List<User> userList) {
|
||||
public static Set<User> getUser(List<User> userList, Long taskId) {
|
||||
if (CollUtil.isEmpty(userList)) {
|
||||
return Set.of();
|
||||
}
|
||||
Set<User> list = new HashSet<>();
|
||||
UserService userService = SpringUtils.getBean(UserService.class);
|
||||
IWfTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IWfTaskAssigneeService.class);
|
||||
for (User user : userList) {
|
||||
// 根据 processedBy 前缀判断处理人类型,分别获取用户列表
|
||||
List<UserDTO> users = getAssociatedUsers(userService, user);
|
||||
List<UserDTO> 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<UserDTO> 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();
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user