add 新增角色办理人

This commit is contained in:
AprilWind 2024-11-07 10:02:15 +08:00
parent 09766f2245
commit 22cd701d94
7 changed files with 444 additions and 9 deletions

View File

@ -0,0 +1,102 @@
package org.dromara.common.core.domain.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 任务受让人
*
* @author AprilWind
*/
@Data
@NoArgsConstructor
public class TaskAssigneeDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 总大小
*/
private Long total = 0L;
/**
*
*/
private List<TaskHandler> list;
public TaskAssigneeDTO(Long total, List<TaskHandler> list) {
this.total = total;
this.list = list;
}
/**
* 将源列表转换为 TaskHandler 列表
*
* @param <T> 通用类型
* @param sourceList 待转换的源列表
* @param storageId 提取 storageId 的函数
* @param handlerCode 提取 handlerCode 的函数
* @param handlerName 提取 handlerName 的函数
* @param groupName 提取 groupName 的函数
* @param createTimeMapper 提取 createTime 的函数
* @return 转换后的 TaskHandler 列表
*/
public static <T> List<TaskHandler> convertToHandlerList(
List<T> sourceList,
Function<T, Long> storageId,
Function<T, String> handlerCode,
Function<T, String> handlerName,
Function<T, String> groupName,
Function<T, Date> createTimeMapper) {
return sourceList.stream()
.map(item -> new TaskHandler(
String.valueOf(storageId.apply(item)),
handlerCode != null ? handlerCode.apply(item) : "",
handlerName != null ? handlerName.apply(item) : "",
groupName != null ? groupName.apply(item) : "默认分组",
createTimeMapper != null ? createTimeMapper.apply(item) : null
))
.collect(Collectors.toList());
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class TaskHandler {
/**
* 主键
*/
private String storageId;
/**
* 权限编码
*/
private String handlerCode = "";
/**
* 权限名称
*/
private String handlerName = "";
/**
* 权限分组
*/
private String groupName = "默认分组";
/**
* 创建时间
*/
private Date createTime;
}
}

View File

@ -0,0 +1,56 @@
package org.dromara.common.core.domain.model;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
/**
* 任务受让人
*
* @author AprilWind
*/
@Data
@NoArgsConstructor
public class TaskAssigneeBody implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 权限编码
*/
private String handlerCode;
/**
* 权限名称
*/
private String handlerName;
/**
* 权限分组
*/
private String groupId;
/**
* 开始时间
*/
private String beginTime;
/**
* 结束时间
*/
private String endTime;
/**
* 当前页
*/
private Integer pageNum = 1;
/**
* 每页显示条数
*/
private Integer pageSize = 10;
}

View File

@ -1,6 +1,8 @@
package org.dromara.common.core.service; package org.dromara.common.core.service;
import org.dromara.common.core.domain.dto.TaskAssigneeDTO;
import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.dto.UserDTO;
import org.dromara.common.core.domain.model.TaskAssigneeBody;
import java.util.List; import java.util.List;
@ -82,4 +84,12 @@ public interface UserService {
* @return 用户 * @return 用户
*/ */
List<UserDTO> selectUsersByDeptIds(List<Long> deptIds); List<UserDTO> selectUsersByDeptIds(List<Long> deptIds);
/**
* 查询角色信息
*
* @return 角色信息列表
*/
TaskAssigneeDTO selectUsersByRoleList(TaskAssigneeBody taskQuery);
} }

View File

@ -15,7 +15,9 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.constant.UserConstants;
import org.dromara.common.core.domain.dto.TaskAssigneeDTO;
import org.dromara.common.core.domain.dto.UserDTO; 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.exception.ServiceException;
import org.dromara.common.core.service.UserService; import org.dromara.common.core.service.UserService;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
@ -702,4 +704,35 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
.in(SysUser::getDeptId, deptIds)); .in(SysUser::getDeptId, deptIds));
return BeanUtil.copyToList(list, UserDTO.class); return BeanUtil.copyToList(list, UserDTO.class);
} }
/**
* 根据角色列表查询用户信息
*
* @param taskQuery 包含查询条件的请求体对象包含分页参数权限编码权限名称时间范围等信息
* @return 返回包含查询结果的 `TaskAssigneeDTO` 对象其中包含符合条件的总记录数和处理人列表
*/
@Override
public TaskAssigneeDTO selectUsersByRoleList(TaskAssigneeBody taskQuery) {
// 创建分页查询对象并设置分页大小和页码
PageQuery pageQuery = new PageQuery();
pageQuery.setPageSize(taskQuery.getPageSize());
pageQuery.setPageNum(taskQuery.getPageNum());
// 使用 LambdaQueryWrapper 构建查询条件
LambdaQueryWrapper<SysRole> wrapper = new LambdaQueryWrapper<SysRole>()
.like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysRole::getRoleKey, taskQuery.getHandlerCode())
.like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysRole::getRoleName, taskQuery.getHandlerName())
.between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()),
SysRole::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime());
// 执行分页查询并将查询结果封装为 SysRoleVo 对象的 Page
Page<SysRoleVo> page = roleMapper.selectVoPage(pageQuery.build(), wrapper);
// 使用封装的字段映射方法进行转换
List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(),
SysRoleVo::getRoleId, SysRoleVo::getRoleKey, SysRoleVo::getRoleName, null, SysRoleVo::getCreateTime);
return new TaskAssigneeDTO(page.getTotal(), handlers);
}
} }

View File

@ -0,0 +1,109 @@
package org.dromara.workflow.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.dromara.common.core.exception.ServiceException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 任务分配人枚举
*
* @author AprilWind
*/
@Getter
@AllArgsConstructor
public enum TaskAssigneeEnum {
/**
* 用户
*/
USER("用户", "user:"),
/**
* 角色
*/
ROLE("角色", "role:"),
/**
* 部门
*/
DEPT("部门", "dept:"),
/**
* 岗位
*/
POST("岗位", "post:");
private final String desc;
private final String code;
/**
* 根据描述获取对应的枚举类型
* <p>
* 通过传入描述查找并返回匹配的枚举项如果未找到匹配项会抛出 {@link ServiceException}
* </p>
*
* @param desc 描述用于匹配对应的枚举项
* @return TaskAssigneeEnum 返回对应的枚举类型
* @throws ServiceException 如果未找到匹配的枚举项
*/
public static TaskAssigneeEnum fromDesc(String desc) {
for (TaskAssigneeEnum type : values()) {
if (type.getDesc().equals(desc)) {
return type;
}
}
throw new ServiceException("未知的办理人类型: " + desc);
}
/**
* 根据代码获取对应的枚举类型
* <p>
* 通过传入代码查找并返回匹配的枚举项如果未找到匹配项会抛出 {@link ServiceException}
* </p>
*
* @param code 代码用于匹配对应的枚举项
* @return TaskAssigneeEnum 返回对应的枚举类型
* @throws IllegalArgumentException 如果未找到匹配的枚举项
*/
public static TaskAssigneeEnum fromCode(String code) {
for (TaskAssigneeEnum type : values()) {
if (type.getCode().equals(code)) {
return type;
}
}
throw new ServiceException("未知的办理人类型代码: " + code);
}
/**
* 获取所有办理人类型的描述列表
* <p>
* 获取当前枚举类所有项的描述字段列表通常用于展示选择项
* </p>
*
* @return List<String> 返回所有办理人类型的描述列表
*/
public static List<String> getAssigneeTypeList() {
return Arrays.stream(values())
.map(TaskAssigneeEnum::getDesc)
.collect(Collectors.toList());
}
/**
* 获取所有办理人类型的代码列表
* <p>
* 获取当前枚举类所有项的代码字段列表通常用于程序内部逻辑的判断
* </p>
*
* @return List<String> 返回所有办理人类型的代码列表
*/
public static List<String> getAssigneeCodeList() {
return Arrays.stream(values())
.map(TaskAssigneeEnum::getCode)
.collect(Collectors.toList());
}
}

View File

@ -0,0 +1,125 @@
package org.dromara.workflow.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.warm.flow.ui.dto.HandlerFunDto;
import com.warm.flow.ui.dto.HandlerQuery;
import com.warm.flow.ui.service.HandlerSelectService;
import com.warm.flow.ui.vo.HandlerSelectVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.dto.TaskAssigneeDTO;
import org.dromara.common.core.domain.model.TaskAssigneeBody;
import org.dromara.common.core.service.UserService;
import org.dromara.common.core.utils.DateUtils;
import org.dromara.workflow.common.enums.TaskAssigneeEnum;
import org.springframework.stereotype.Service;
import java.util.List;
import static org.dromara.workflow.common.enums.TaskAssigneeEnum.ROLE;
/**
* 流程设计器-获取办理人权限设置列表
*
* @author AprilWind
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class WfTaskAssigneeServiceImpl implements HandlerSelectService {
private final UserService userService;
/**
* 获取办理人权限设置列表tabs页签
*
* @return tabs页签
*/
@Override
public List<String> getHandlerType() {
return TaskAssigneeEnum.getAssigneeTypeList();
}
/**
* 获取用户列表, 同时构建左侧部门树状结构
*
* @param query 查询条件
* @return HandlerSelectVo
*/
@Override
public HandlerSelectVo getHandlerSelect(HandlerQuery query) {
TaskAssigneeEnum type = TaskAssigneeEnum.fromDesc(query.getHandlerType());
TaskAssigneeBody taskQuery = BeanUtil.toBean(query, TaskAssigneeBody.class);
TaskAssigneeDTO dto = new TaskAssigneeDTO();
if (TaskAssigneeEnum.USER == type) {
// 处理用户相关的业务逻辑
} else if (ROLE == type) {
// 处理角色相关的业务逻辑
dto = userService.selectUsersByRoleList(taskQuery);
} else if (TaskAssigneeEnum.DEPT == type) {
// 处理部门相关的业务逻辑
} else if (TaskAssigneeEnum.POST == type) {
// 处理岗位相关的业务逻辑
}
// 业务系统数据转成组件内部能够显示的数据, total是业务数据总数用于分页显示
HandlerFunDto<TaskAssigneeDTO.TaskHandler> handlerFunDto = new HandlerFunDto<>(dto.getList(), dto.getTotal())
.setStorageId(assignee -> ROLE.getCode() + assignee.getStorageId())
.setHandlerCode(TaskAssigneeDTO.TaskHandler::getHandlerCode)
.setHandlerName(TaskAssigneeDTO.TaskHandler::getHandlerName)
.setGroupName(TaskAssigneeDTO.TaskHandler::getGroupName)
.setCreateTime(assignee -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, assignee.getCreateTime()));
return getHandlerSelectVo(handlerFunDto);
}
// /**
// * 获取用户列表
// *
// * @param query 查询条件
// * @return HandlerSelectVo
// */
// private HandlerSelectVo getDept(HandlerQuery query) {
// // 查询部门列表
// List<SysDept> deptList = userService.selectDeptList(sysDept);
// long total = new PageInfo<>(deptList).getTotal();
//
// // 业务系统数据转成组件内部能够显示的数据, total是业务数据总数用于分页显示
// HandlerFunDto<SysDept> handlerFunDto = new HandlerFunDto<>(deptList, total)
// .setStorageId(dept -> "dept:" + dept.getDeptId()) // 前面拼接dept: 是为了防止用户部门的主键重复
// .setHandlerName(SysDept::getDeptName) // 权限名称
// .setCreateTime(dept -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, dept.getCreateTime()));
//
// return getHandlerSelectVo(handlerFunDto);
//
// }
//
// /**
// * 获取用户列表, 同时构建左侧部门树状结构
// *
// * @param query 查询条件
// * @return HandlerSelectVo
// */
// private HandlerSelectVo getUser(HandlerQuery query) {
// ......
// // 查询用户列表
// List<SysUser> userList = userService.selectUserList(sysUser);
// long total = new PageInfo<>(userList).getTotal();
// // 查询部门列表构建树状结构
// List<SysDept> deptList = deptMapper.selectDeptList(new SysDept());
//
// // 业务系统数据转成组件内部能够显示的数据, total是业务数据总数用于分页显示
// HandlerFunDto<SysUser> handlerFunDto = new HandlerFunDto<>(userList, total)
// .setStorageId(user -> user.getUserId().toString())
// .setHandlerCode(SysUser::getUserName) // 权限编码
// .setHandlerName(SysUser::getNickName) // 权限名称
// .setCreateTime(user -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, user.getCreateTime()))
// .setGroupName(user -> user.getDept() != null ? user.getDept().getDeptName() : "");
//
// // 业务系统机构转成组件内部左侧树列表能够显示的数据
// TreeFunDto<SysDept> treeFunDto = new TreeFunDto<>(deptList)
// .setId(dept -> dept.getDeptId().toString()) // 左侧树ID
// .setName(SysDept::getDeptName) // 左侧树名称
// .setParentId(dept -> dept.getParentId().toString()); // 左侧树父级ID
//
// return getHandlerSelectVo(handlerFunDto, treeFunDto);
// }
}

View File

@ -13,6 +13,7 @@ import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.workflow.common.enums.TaskAssigneeEnum;
import java.util.*; import java.util.*;
@ -32,9 +33,9 @@ public class WorkflowUtils {
public static List<String> permissionList() { public static List<String> permissionList() {
List<RoleDTO> roles = LoginHelper.getLoginUser().getRoles(); List<RoleDTO> roles = LoginHelper.getLoginUser().getRoles();
Long deptId = LoginHelper.getDeptId(); Long deptId = LoginHelper.getDeptId();
List<String> permissionList = StreamUtils.toList(roles, role -> "role:" + role.getRoleId()); List<String> permissionList = StreamUtils.toList(roles, role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId());
permissionList.add(LoginHelper.getUserIdStr()); permissionList.add(LoginHelper.getUserIdStr());
permissionList.add("dept:" + deptId); permissionList.add(TaskAssigneeEnum.DEPT.getCode() + deptId);
return permissionList; return permissionList;
} }
@ -55,11 +56,11 @@ public class WorkflowUtils {
for (User user : userList) { for (User user : userList) {
String processedBy = user.getProcessedBy(); String processedBy = user.getProcessedBy();
Long id = Long.valueOf(StringUtils.substringAfter(processedBy, StrUtil.C_COLON)); Long id = Long.valueOf(StringUtils.substringAfter(processedBy, StrUtil.C_COLON));
if (processedBy.startsWith("user:")) { if (processedBy.startsWith(TaskAssigneeEnum.USER.getCode())) {
userIds.add(id); userIds.add(id);
} else if (processedBy.startsWith("role:")) { } else if (processedBy.startsWith(TaskAssigneeEnum.ROLE.getCode())) {
roleIds.add(id); roleIds.add(id);
} else if (processedBy.startsWith("dept:")) { } else if (processedBy.startsWith(TaskAssigneeEnum.DEPT.getCode())) {
deptIds.add(id); deptIds.add(id);
} else { } else {
userIds.add(Long.valueOf(processedBy)); userIds.add(Long.valueOf(processedBy));
@ -111,14 +112,13 @@ public class WorkflowUtils {
String processedBy = user.getProcessedBy(); String processedBy = user.getProcessedBy();
// 提取 processedBy 字段中 ":" 后的部分作为ID // 提取 processedBy 字段中 ":" 后的部分作为ID
Long id = Long.valueOf(StringUtils.substringAfter(processedBy, StrUtil.C_COLON)); Long id = Long.valueOf(StringUtils.substringAfter(processedBy, StrUtil.C_COLON));
if (processedBy.startsWith(TaskAssigneeEnum.USER.getCode())) {
if (processedBy.startsWith("user:")) {
// 如果前缀为 "user:"根据用户ID查询 // 如果前缀为 "user:"根据用户ID查询
return userService.selectListByIds(List.of(id)); return userService.selectListByIds(List.of(id));
} else if (processedBy.startsWith("role:")) { } else if (processedBy.startsWith(TaskAssigneeEnum.ROLE.getCode())) {
// 如果前缀为 "role:"根据角色ID查询用户 // 如果前缀为 "role:"根据角色ID查询用户
return userService.selectUsersByRoleIds(List.of(id)); return userService.selectUsersByRoleIds(List.of(id));
} else if (processedBy.startsWith("dept:")) { } else if (processedBy.startsWith(TaskAssigneeEnum.DEPT.getCode())) {
// 如果前缀为 "dept:"根据部门ID查询用户 // 如果前缀为 "dept:"根据部门ID查询用户
return userService.selectUsersByDeptIds(List.of(id)); return userService.selectUsersByDeptIds(List.of(id));
} }