diff --git a/pom.xml b/pom.xml index bf0fbe5b4..8d101e7cc 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,7 @@ 4.0.2 3.5.19 3.5.16 + 1.5.6 3.9.1 4.5.0 2.3 @@ -190,6 +191,12 @@ mybatis-plus-annotation ${mybatis-plus.version} + + + com.github.yulichang + mybatis-plus-join-boot-starter + ${mybatis-plus-join.version} + p6spy diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java index c625f2d34..56928d0e4 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java @@ -112,9 +112,9 @@ public class LoginUser implements Serializable { private List roles; /** - * 数据权限角色映射 key 为权限码 value 为可参与数据权限计算的角色 + * 数据权限角色映射 key 为权限码 value 为可参与数据权限计算的角色ID列表 */ - private Map> dataScopeRoleMap; + private Map> dataScopeRoleMap; /** * 岗位对象 diff --git a/ruoyi-common/ruoyi-common-mybatis/pom.xml b/ruoyi-common/ruoyi-common-mybatis/pom.xml index 984cb6483..4a4f2ecb5 100644 --- a/ruoyi-common/ruoyi-common-mybatis/pom.xml +++ b/ruoyi-common/ruoyi-common-mybatis/pom.xml @@ -37,6 +37,11 @@ mybatis-plus-jsqlparser + + com.github.yulichang + mybatis-plus-join-boot-starter + + p6spy diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java index 7964a37a5..c8bd8548f 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java @@ -4,22 +4,21 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; +import com.baomidou.mybatisplus.core.toolkit.reflect.GenericTypeUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.logging.Log; import org.apache.ibatis.logging.LogFactory; import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Function; -import java.util.stream.Collectors; /** * 自定义 Mapper 接口, 实现 自定义扩展 @@ -30,7 +29,7 @@ import java.util.stream.Collectors; * @since 2021-05-13 */ @SuppressWarnings("unchecked") -public interface BaseMapperPlus extends BaseMapper { +public interface BaseMapperPlus extends MPJBaseMapper { Log log = LogFactory.getLog(BaseMapperPlus.class); @@ -42,7 +41,7 @@ public interface BaseMapperPlus extends BaseMapper { * @return 当前类的泛型类型 V 的 Class 对象 */ default Class currentVoClass() { - return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 1); + return (Class) GenericTypeUtils.resolveTypeArguments(this.getClass(), BaseMapperPlus.class)[1]; } /** @@ -53,7 +52,7 @@ public interface BaseMapperPlus extends BaseMapper { * @return 当前类的泛型类型 T 的 Class 对象 */ default Class currentModelClass() { - return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 0); + return (Class) GenericTypeUtils.resolveTypeArguments(this.getClass(), BaseMapperPlus.class)[0]; } /** @@ -236,11 +235,7 @@ public interface BaseMapperPlus extends BaseMapper { * @return 查询到的单个VO对象,经过类型转换为指定的VO类后返回 */ default C selectVoOne(Wrapper wrapper, Class voClass) { - T obj = this.selectOne(wrapper); - if (ObjectUtil.isNull(obj)) { - return null; - } - return MapstructUtils.convert(obj, voClass); + return selectVoOne(wrapper, voClass, true); } /** @@ -337,7 +332,7 @@ public interface BaseMapperPlus extends BaseMapper { * @return 查询到的符合条件的对象列表,经过转换为指定类型的对象后返回 */ default List selectObjs(Wrapper wrapper, Function mapper) { - return this.selectObjs(wrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList()); + return StreamUtils.toList(this.selectObjs(wrapper), mapper); } } diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java index 0556bb698..cc4bc9d36 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java @@ -225,13 +225,22 @@ public class PlusDataPermissionHandler { if (!access.constrained()) { return roles; } + Map allRoleMap = new LinkedHashMap<>(); + if (CollUtil.isNotEmpty(roles)) { + roles.forEach(role -> allRoleMap.put(role.getRoleId(), role)); + } Map roleMap = new LinkedHashMap<>(); - Map> dataScopeRoleMap = user.getDataScopeRoleMap(); + Map> dataScopeRoleMap = user.getDataScopeRoleMap(); if (CollUtil.isNotEmpty(dataScopeRoleMap)) { access.perms().forEach(perm -> { - List roleList = dataScopeRoleMap.get(perm); - if (CollUtil.isNotEmpty(roleList)) { - roleList.forEach(role -> roleMap.putIfAbsent(role.getRoleId(), role)); + List roleIds = dataScopeRoleMap.get(perm); + if (CollUtil.isNotEmpty(roleIds)) { + roleIds.forEach(roleId -> { + RoleDTO role = allRoleMap.get(roleId); + if (role != null) { + roleMap.putIfAbsent(role.getRoleId(), role); + } + }); } }); } diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableMapper.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableMapper.java index d859bf75d..d74050ed3 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableMapper.java +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableMapper.java @@ -15,29 +15,6 @@ import java.util.List; @InterceptorIgnore(dataPermission = "true", tenantLine = "true") public interface GenTableMapper extends BaseMapperPlus { - /** - * 查询所有表信息 - * - * @return 表信息集合 - */ - List selectGenTableAll(); - - /** - * 查询表ID业务信息 - * - * @param id 业务ID - * @return 业务信息 - */ - GenTable selectGenTableById(Long id); - - /** - * 查询表名称业务信息 - * - * @param tableName 表名称 - * @return 业务信息 - */ - GenTable selectGenTableByName(String tableName); - /** * 查询指定数据源下的所有表名列表 * diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java index 3fc1682fe..e5ce0967f 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java @@ -84,7 +84,7 @@ public class GenTableServiceImpl implements IGenTableService { */ @Override public GenTable selectGenTableById(Long id) { - GenTable genTable = baseMapper.selectGenTableById(id); + GenTable genTable = getGenTable(id); setTableFromOptions(genTable); return genTable; } @@ -211,7 +211,8 @@ public class GenTableServiceImpl implements IGenTableService { */ @Override public List selectGenTableAll() { - return baseMapper.selectGenTableAll(); + return fillTableColumns(baseMapper.selectList(new LambdaQueryWrapper() + .orderByAsc(GenTable::getTableId))); } /** @@ -318,7 +319,7 @@ public class GenTableServiceImpl implements IGenTableService { public Map previewCode(Long tableId) { Map dataMap = new LinkedHashMap<>(); // 查询表信息 - GenTable table = baseMapper.selectGenTableById(tableId); + GenTable table = getGenTable(tableId); List menuIds = new ArrayList<>(); for (int i = 0; i < 6; i++) { menuIds.add(IdGeneratorUtil.nextLongId()); @@ -365,7 +366,7 @@ public class GenTableServiceImpl implements IGenTableService { @Override public void generatorCode(Long tableId) { // 查询表信息 - GenTable table = baseMapper.selectGenTableById(tableId); + GenTable table = getGenTable(tableId); // 设置主键列信息 setPkColumn(table); @@ -399,7 +400,7 @@ public class GenTableServiceImpl implements IGenTableService { @DSTransactional @Override public void synchDb(Long tableId) { - GenTable table = baseMapper.selectGenTableById(tableId); + GenTable table = getGenTable(tableId); List tableColumns = table.getColumns(); Map tableColumnMap = StreamUtils.toIdentityMap(tableColumns, GenTableColumn::getColumnName); @@ -464,7 +465,7 @@ public class GenTableServiceImpl implements IGenTableService { */ private void generatorCode(Long tableId, ZipOutputStream zip) { // 查询表信息 - GenTable table = baseMapper.selectGenTableById(tableId); + GenTable table = getGenTable(tableId); List menuIds = new ArrayList<>(); for (int i = 0; i < 6; i++) { menuIds.add(IdGeneratorUtil.nextLongId()); @@ -517,6 +518,29 @@ public class GenTableServiceImpl implements IGenTableService { } } + private GenTable getGenTable(Long tableId) { + GenTable table = baseMapper.selectById(tableId); + if (ObjectUtil.isNull(table)) { + throw new ServiceException("业务表不存在"); + } + fillTableColumns(Collections.singletonList(table)); + return table; + } + + private List fillTableColumns(List tables) { + if (CollUtil.isEmpty(tables)) { + return tables; + } + List tableIds = StreamUtils.toList(tables, GenTable::getTableId); + List columns = genTableColumnMapper.selectList(new LambdaQueryWrapper() + .in(GenTableColumn::getTableId, tableIds) + .orderByAsc(GenTableColumn::getTableId) + .orderByAsc(GenTableColumn::getSort)); + Map> columnMap = StreamUtils.groupByKey(columns, GenTableColumn::getTableId); + tables.forEach(table -> table.setColumns(columnMap.getOrDefault(table.getTableId(), new ArrayList<>()))); + return tables; + } + /** * 设置主键列信息 * diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableMapper.xml b/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableMapper.xml index 148182091..d0d3e20cf 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableMapper.xml +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableMapper.xml @@ -4,38 +4,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - SELECT t.table_id, t.data_name, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.gen_type, t.gen_path, t.options, t.remark, - c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort - FROM gen_table t - LEFT JOIN gen_table_column c ON t.table_id = c.table_id - - - - - - - - diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java index 2cfd3db98..75b02fed2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java @@ -4,11 +4,19 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Param; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.annotation.DataColumn; import org.dromara.common.mybatis.annotation.DataPermission; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysRole; import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.bo.SysUserBo; import org.dromara.system.domain.vo.SysUserExportVo; import org.dromara.system.domain.vo.SysUserVo; @@ -60,7 +68,24 @@ public interface SysUserMapper extends BaseMapperPlus { @DataColumn(key = "deptName", value = "d.dept_id"), @DataColumn(key = "userName", value = "u.create_by") }) - List selectUserExportList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + default List selectUserExportList(SysUserBo user, List deptIds) { + MPJLambdaWrapper wrapper = JoinWrappers.lambda("u", SysUser.class) + .selectAll(SysUser.class) + .selectAs(SysDept::getDeptName, SysUserExportVo::getDeptName) + .selectAs("u1", SysUser::getUserName, SysUserExportVo::getLeaderName) + .leftJoin(SysDept.class, "d", SysDept::getDeptId, SysUser::getDeptId) + .leftJoin(SysUser.class, "u1", SysUser::getUserId, SysDept::getLeader) + .eq("u", SysUser::getDelFlag, SystemConstants.NORMAL) + .like(StringUtils.isNotBlank(user.getUserName()), "u", SysUser::getUserName, user.getUserName()) + .like(StringUtils.isNotBlank(user.getNickName()), "u", SysUser::getNickName, user.getNickName()) + .eq(StringUtils.isNotBlank(user.getStatus()), "u", SysUser::getStatus, user.getStatus()) + .like(StringUtils.isNotBlank(user.getPhonenumber()), "u", SysUser::getPhonenumber, user.getPhonenumber()) + .between(user.getParams().get("beginTime") != null && user.getParams().get("endTime") != null, + "u", SysUser::getCreateTime, user.getParams().get("beginTime"), user.getParams().get("endTime")) + .in(deptIds != null && !deptIds.isEmpty(), "u", SysUser::getDeptId, deptIds) + .orderByAsc("u", SysUser::getUserId); + return this.selectJoinList(SysUserExportVo.class, wrapper); + } /** * 根据条件分页查询已配用户角色列表 @@ -73,7 +98,12 @@ public interface SysUserMapper extends BaseMapperPlus { @DataColumn(key = "deptName", value = "d.dept_id"), @DataColumn(key = "userName", value = "u.create_by") }) - Page selectAllocatedList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + default Page selectAllocatedList(Page page, SysUserBo user) { + MPJLambdaWrapper wrapper = this.buildUserRoleJoinWrapper(user) + .eq(user.getRoleId() != null, "r", SysRole::getRoleId, user.getRoleId()) + .orderByAsc("u", SysUser::getUserId); + return this.selectJoinPage(page, SysUserVo.class, wrapper); + } /** * 根据条件分页查询未分配用户角色列表 @@ -85,7 +115,12 @@ public interface SysUserMapper extends BaseMapperPlus { @DataColumn(key = "deptName", value = "d.dept_id"), @DataColumn(key = "userName", value = "u.create_by") }) - Page selectUnallocatedList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + default Page selectUnallocatedList(Page page, SysUserBo user, List userIds) { + MPJLambdaWrapper wrapper = this.buildUserRoleJoinWrapper(user) + .notIn(userIds != null && !userIds.isEmpty(), "u", SysUser::getUserId, userIds) + .orderByAsc("u", SysUser::getUserId); + return this.selectJoinPage(page, SysUserVo.class, wrapper); + } /** * 根据用户ID统计用户数量 @@ -128,4 +163,17 @@ public interface SysUserMapper extends BaseMapperPlus { }) int updateById(@Param(Constants.ENTITY) SysUser user); + private MPJLambdaWrapper buildUserRoleJoinWrapper(SysUserBo user) { + return JoinWrappers.lambda("u", SysUser.class) + .distinct() + .selectAll(SysUser.class) + .leftJoin(SysDept.class, "d", SysDept::getDeptId, SysUser::getDeptId) + .leftJoin(SysUserRole.class, "sur", SysUserRole::getUserId, SysUser::getUserId) + .leftJoin(SysRole.class, "r", SysRole::getRoleId, SysUserRole::getRoleId) + .eq("u", SysUser::getDelFlag, SystemConstants.NORMAL) + .like(StringUtils.isNotBlank(user.getUserName()), "u", SysUser::getUserName, user.getUserName()) + .eq(StringUtils.isNotBlank(user.getStatus()), "u", SysUser::getStatus, user.getStatus()) + .like(StringUtils.isNotBlank(user.getPhonenumber()), "u", SysUser::getPhonenumber, user.getPhonenumber()); + } + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java index a07971021..a578f3e3d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java @@ -33,8 +33,8 @@ public interface ISysPermissionService { * 根据角色列表构建数据权限角色映射 * * @param roles 角色列表 - * @return key 为权限码 value 为命中的角色列表 + * @return key 为权限码 value 为命中的角色ID列表 */ - Map> getDataScopeRoleMap(List roles); + Map> getDataScopeRoleMap(List roles); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java index aa394add6..08d9af9d1 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java @@ -62,16 +62,15 @@ public class SysPermissionServiceImpl implements ISysPermissionService { } @Override - public Map> getDataScopeRoleMap(List roles) { + public Map> getDataScopeRoleMap(List roles) { if (CollUtil.isEmpty(roles)) { return Map.of(); } - Map roleMap = StreamUtils.toIdentityMap(roles, RoleDTO::getRoleId); List roleIds = StreamUtils.toList(roles, RoleDTO::getRoleId); Map> permsRoleIds = menuService.selectMenuPermsByRoleIds(roleIds); - Map> rolePermsMap = new LinkedHashMap<>(); + Map> rolePermsMap = new LinkedHashMap<>(); permsRoleIds.forEach((roleId, perms) -> { - perms.forEach(perm -> rolePermsMap.computeIfAbsent(perm, k -> new ArrayList<>()).add(roleMap.get(roleId))); + perms.forEach(perm -> rolePermsMap.computeIfAbsent(perm, key -> new ArrayList<>()).add(roleId)); }); return rolePermsMap; } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 26d33e0bc..74c3222df 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -6,7 +6,6 @@ import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -70,20 +69,8 @@ public class SysUserServiceImpl implements ISysUserService { */ @Override public List selectUserExportList(SysUserBo user) { - Map params = user.getParams(); - QueryWrapper wrapper = Wrappers.query(); - wrapper.eq("u.del_flag", SystemConstants.NORMAL) - .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) - .like(StringUtils.isNotBlank(user.getNickName()), "u.nick_name", user.getNickName()) - .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) - .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) - .between(params.get("beginTime") != null && params.get("endTime") != null, - "u.create_time", params.get("beginTime"), params.get("endTime")) - .and(ObjectUtil.isNotNull(user.getDeptId()), w -> { - List deptIds = deptMapper.selectDeptAndChildById(user.getDeptId()); - w.in("u.dept_id", deptIds); - }).orderByAsc("u.user_id"); - return baseMapper.selectUserExportList(wrapper); + List deptIds = ObjectUtil.isNotNull(user.getDeptId()) ? deptMapper.selectDeptAndChildById(user.getDeptId()) : null; + return baseMapper.selectUserExportList(user, deptIds); } private Wrapper buildQueryWrapper(SysUserBo user) { @@ -116,14 +103,7 @@ public class SysUserServiceImpl implements ISysUserService { */ @Override public TableDataInfo selectAllocatedList(SysUserBo user, PageQuery pageQuery) { - QueryWrapper wrapper = Wrappers.query(); - wrapper.eq("u.del_flag", SystemConstants.NORMAL) - .eq(ObjectUtil.isNotNull(user.getRoleId()), "r.role_id", user.getRoleId()) - .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) - .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) - .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) - .orderByAsc("u.user_id"); - Page page = baseMapper.selectAllocatedList(pageQuery.build(), wrapper); + Page page = baseMapper.selectAllocatedList(pageQuery.build(), user); return TableDataInfo.build(page); } @@ -136,14 +116,7 @@ public class SysUserServiceImpl implements ISysUserService { @Override public TableDataInfo selectUnallocatedList(SysUserBo user, PageQuery pageQuery) { List userIds = userRoleMapper.selectUserIdsByRoleId(user.getRoleId()); - QueryWrapper wrapper = Wrappers.query(); - wrapper.eq("u.del_flag", SystemConstants.NORMAL) - .and(w -> w.ne("r.role_id", user.getRoleId()).or().isNull("r.role_id")) - .notIn(CollUtil.isNotEmpty(userIds), "u.user_id", userIds) - .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) - .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) - .orderByAsc("u.user_id"); - Page page = baseMapper.selectUnallocatedList(pageQuery.build(), wrapper); + Page page = baseMapper.selectUnallocatedList(pageQuery.build(), user, userIds); return TableDataInfo.build(page); } diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index 24be330bf..7f0df4a2c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -4,39 +4,4 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwHisTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwHisTaskMapper.java new file mode 100644 index 000000000..a66ff5240 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwHisTaskMapper.java @@ -0,0 +1,88 @@ +package org.dromara.workflow.mapper; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.warm.flow.core.enums.NodeType; +import org.dromara.warm.flow.orm.entity.FlowDefinition; +import org.dromara.warm.flow.orm.entity.FlowHisTask; +import org.dromara.warm.flow.orm.entity.FlowInstance; +import org.dromara.workflow.domain.FlowInstanceBizExt; +import org.dromara.workflow.domain.bo.FlowTaskBo; +import org.dromara.workflow.domain.vo.FlowHisTaskVo; + +import java.util.List; + +/** + * 历史任务查询 Mapper + */ +public interface FlwHisTaskMapper extends BaseMapperPlus { + + default Page getListFinishTask(Page page, + FlowTaskBo bo, + List categoryIds, + String userId) { + MPJLambdaWrapper wrapper = JoinWrappers.lambda("a", FlowHisTask.class) + .selectAs(FlowHisTask::getId, FlowHisTaskVo::getId) + .selectAs(FlowHisTask::getNodeCode, FlowHisTaskVo::getNodeCode) + .selectAs(FlowHisTask::getNodeName, FlowHisTaskVo::getNodeName) + .selectAs(FlowHisTask::getCooperateType, FlowHisTaskVo::getCooperateType) + .selectAs(FlowHisTask::getApprover, FlowHisTaskVo::getApprover) + .selectAs(FlowHisTask::getCollaborator, FlowHisTaskVo::getCollaborator) + .selectAs(FlowHisTask::getNodeType, FlowHisTaskVo::getNodeType) + .selectAs(FlowHisTask::getTargetNodeCode, FlowHisTaskVo::getTargetNodeCode) + .selectAs(FlowHisTask::getTargetNodeName, FlowHisTaskVo::getTargetNodeName) + .selectAs(FlowHisTask::getDefinitionId, FlowHisTaskVo::getDefinitionId) + .selectAs(FlowHisTask::getInstanceId, FlowHisTaskVo::getInstanceId) + .selectAs(FlowHisTask::getFlowStatus, FlowHisTaskVo::getFlowTaskStatus) + .selectAs(FlowHisTask::getMessage, FlowHisTaskVo::getMessage) + .selectAs(FlowHisTask::getExt, FlowHisTaskVo::getExt) + .selectAs(FlowHisTask::getCreateTime, FlowHisTaskVo::getCreateTime) + .selectAs(FlowHisTask::getUpdateTime, FlowHisTaskVo::getUpdateTime) + .selectAs(FlowHisTask::getFormCustom, FlowHisTaskVo::getFormCustom) + .selectAs(FlowHisTask::getFormPath, FlowHisTaskVo::getFormPath) + .selectAs("b", FlowInstance::getFlowStatus, FlowHisTaskVo::getFlowStatus) + .selectAs("b", FlowInstance::getBusinessId, FlowHisTaskVo::getBusinessId) + .selectAs("b", FlowInstance::getCreateBy, FlowHisTaskVo::getCreateBy) + .selectAs("c", FlowDefinition::getFlowName, FlowHisTaskVo::getFlowName) + .selectAs("c", FlowDefinition::getFlowCode, FlowHisTaskVo::getFlowCode) + .selectAs("c", FlowDefinition::getCategory, FlowHisTaskVo::getCategory) + .selectAs("c", FlowDefinition::getVersion, FlowHisTaskVo::getVersion) + .selectAs("biz", FlowInstanceBizExt::getBusinessCode, FlowHisTaskVo::getBusinessCode) + .selectAs("biz", FlowInstanceBizExt::getBusinessTitle, FlowHisTaskVo::getBusinessTitle) + .leftJoin(FlowInstance.class, "b", FlowInstance::getId, FlowHisTask::getInstanceId) + .leftJoin(FlowDefinition.class, "c", FlowDefinition::getId, FlowHisTask::getDefinitionId) + .leftJoin(FlowInstanceBizExt.class, "biz", FlowInstanceBizExt::getInstanceId, FlowInstance::getId) + .eq("a", FlowHisTask::getDelFlag, "0") + .eq("b", FlowInstance::getDelFlag, "0") + .eq("c", FlowDefinition::getDelFlag, "0") + .in("a", FlowHisTask::getNodeType, List.of("1", "3", "4")) + .like(hasText(bo.getNodeName()), "a", FlowHisTask::getNodeName, bo.getNodeName()) + .like(hasText(bo.getFlowName()), "c", FlowDefinition::getFlowName, bo.getFlowName()) + .like(hasText(bo.getFlowCode()), "c", FlowDefinition::getFlowCode, bo.getFlowCode()) + .like(hasText(bo.getFlowStatus()), "b", FlowInstance::getFlowStatus, bo.getFlowStatus()) + .in(hasItems(bo.getCreateByIds()), "b", FlowInstance::getCreateBy, bo.getCreateByIds()) + .in(hasItems(categoryIds), "c", FlowDefinition::getCategory, categoryIds) + .between(hasBetween(bo), "a", FlowHisTask::getCreateTime, bo.getParams().get("beginTime"), bo.getParams().get("endTime")) + .eq(StringUtils.isNotBlank(userId), "a", FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()) + .eq(StringUtils.isNotBlank(userId), "a", FlowHisTask::getApprover, userId) + .orderByDesc("a", FlowHisTask::getCreateTime) + .orderByDesc("a", FlowHisTask::getUpdateTime); + return wrapper.page(page, FlowHisTaskVo.class); + } + + default boolean hasText(String value) { + return StringUtils.isNotBlank(value); + } + + default boolean hasItems(List values) { + return values != null && !values.isEmpty(); + } + + default boolean hasBetween(FlowTaskBo bo) { + return bo != null && bo.getParams() != null && bo.getParams().get("beginTime") != null && bo.getParams().get("endTime") != null; + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java index 92809c80f..d87a18767 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java @@ -1,10 +1,9 @@ package org.dromara.workflow.mapper; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.ibatis.annotations.Param; -import org.dromara.workflow.domain.bo.FlowInstanceBo; +import com.github.yulichang.base.MPJBaseMapper; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.dromara.warm.flow.orm.entity.FlowInstance; import org.dromara.workflow.domain.vo.FlowInstanceVo; /** @@ -13,7 +12,7 @@ import org.dromara.workflow.domain.vo.FlowInstanceVo; * @author may * @date 2024-03-02 */ -public interface FlwInstanceMapper { +public interface FlwInstanceMapper extends MPJBaseMapper { /** * 流程实例信息 @@ -22,6 +21,8 @@ public interface FlwInstanceMapper { * @param queryWrapper 条件 * @return 结果 */ - Page selectInstanceList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + default Page selectInstanceList(Page page, MPJLambdaWrapper queryWrapper) { + return this.selectJoinPage(page, FlowInstanceVo.class, queryWrapper); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java index 0d0422d5a..162071ca8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java @@ -1,14 +1,21 @@ package org.dromara.workflow.mapper; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.ibatis.annotations.Param; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.warm.flow.core.enums.NodeType; +import org.dromara.warm.flow.orm.entity.FlowDefinition; +import org.dromara.warm.flow.orm.entity.FlowInstance; +import org.dromara.warm.flow.orm.entity.FlowTask; +import org.dromara.warm.flow.orm.entity.FlowUser; +import org.dromara.workflow.domain.FlowInstanceBizExt; import org.dromara.workflow.domain.bo.FlowTaskBo; -import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; +import java.util.List; /** * 任务信息Mapper接口 @@ -16,32 +23,67 @@ import org.dromara.workflow.domain.vo.FlowTaskVo; * @author may * @date 2024-03-02 */ -public interface FlwTaskMapper { +public interface FlwTaskMapper extends BaseMapperPlus { - /** - * 获取待办信息 - * - * @param page 分页 - * @param queryWrapper 条件 - * @return 结果 - */ - Page getListRunTask(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + default Page getListRunTask(Page page, + FlowTaskBo bo, + List categoryIds, + String userId) { + MPJLambdaWrapper wrapper = JoinWrappers.lambda("t", FlowTask.class) + .distinct() + .selectAs(FlowTask::getId, FlowTaskVo::getId) + .selectAs(FlowTask::getNodeCode, FlowTaskVo::getNodeCode) + .selectAs(FlowTask::getNodeName, FlowTaskVo::getNodeName) + .selectAs(FlowTask::getNodeType, FlowTaskVo::getNodeType) + .selectAs(FlowTask::getDefinitionId, FlowTaskVo::getDefinitionId) + .selectAs(FlowTask::getInstanceId, FlowTaskVo::getInstanceId) + .selectAs(FlowTask::getCreateTime, FlowTaskVo::getCreateTime) + .selectAs(FlowTask::getUpdateTime, FlowTaskVo::getUpdateTime) + .selectAs("i", FlowInstance::getBusinessId, FlowTaskVo::getBusinessId) + .selectAs("i", FlowInstance::getFlowStatus, FlowTaskVo::getFlowStatus) + .selectAs("i", FlowInstance::getCreateBy, FlowTaskVo::getCreateBy) + .selectAs("d", FlowDefinition::getFlowName, FlowTaskVo::getFlowName) + .selectAs("d", FlowDefinition::getFlowCode, FlowTaskVo::getFlowCode) + .selectAs("d", FlowDefinition::getFormCustom, FlowTaskVo::getFormCustom) + .selectAs("d", FlowDefinition::getCategory, FlowTaskVo::getCategory) + .selectAs("d", FlowDefinition::getVersion, FlowTaskVo::getVersion) + .selectAs("uu", FlowUser::getProcessedBy, FlowTaskVo::getProcessedBy) + .selectAs("uu", FlowUser::getType, FlowTaskVo::getType) + .selectAs("biz", FlowInstanceBizExt::getBusinessCode, FlowTaskVo::getBusinessCode) + .selectAs("biz", FlowInstanceBizExt::getBusinessTitle, FlowTaskVo::getBusinessTitle) + .selectAs("COALESCE(NULLIF(TRIM(t.form_path), ''), NULLIF(TRIM(d.form_path), ''))", FlowTaskVo::getFormPath) + .leftJoin(FlowUser.class, "uu", FlowUser::getAssociated, FlowTask::getId) + .leftJoin(FlowDefinition.class, "d", FlowDefinition::getId, FlowTask::getDefinitionId) + .leftJoin(FlowInstance.class, "i", FlowInstance::getId, FlowTask::getInstanceId) + .leftJoin(FlowInstanceBizExt.class, "biz", FlowInstanceBizExt::getInstanceId, FlowInstance::getId) + .eq("t", FlowTask::getNodeType, NodeType.BETWEEN.getKey()) + .eq("t", FlowTask::getDelFlag, "0") + .eq("uu", FlowUser::getDelFlag, "0") + .in("uu", FlowUser::getType, List.of("1", "2", "3")) + .like(hasText(bo.getNodeName()), "t", FlowTask::getNodeName, bo.getNodeName()) + .like(hasText(bo.getFlowName()), "d", FlowDefinition::getFlowName, bo.getFlowName()) + .like(hasText(bo.getFlowCode()), "d", FlowDefinition::getFlowCode, bo.getFlowCode()) + .like(hasText(bo.getFlowStatus()), "i", FlowInstance::getFlowStatus, bo.getFlowStatus()) + .in(hasItems(bo.getCreateByIds()), "i", FlowInstance::getCreateBy, bo.getCreateByIds()) + .in(hasItems(categoryIds), "d", FlowDefinition::getCategory, categoryIds) + .between(hasBetween(bo), "t", FlowTask::getCreateTime, bo.getParams().get("beginTime"), bo.getParams().get("endTime")) + .eq(StringUtils.isNotBlank(userId), "uu", FlowUser::getProcessedBy, userId) + .eq(StringUtils.isNotBlank(userId), "i", FlowInstance::getFlowStatus, BusinessStatusEnum.WAITING.getStatus()) + .orderByDesc("t", FlowTask::getCreateTime) + .orderByDesc("t", FlowTask::getUpdateTime); + return wrapper.page(page, FlowTaskVo.class); + } - /** - * 获取已办 - * - * @param page 分页 - * @param queryWrapper 条件 - * @return 结果 - */ - Page getListFinishTask(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + default boolean hasText(String value) { + return StringUtils.isNotBlank(value); + } + + default boolean hasItems(List values) { + return values != null && !values.isEmpty(); + } + + default boolean hasBetween(FlowTaskBo bo) { + return bo != null && bo.getParams() != null && bo.getParams().get("beginTime") != null && bo.getParams().get("endTime") != null; + } - /** - * 查询当前用户的抄送 - * - * @param page 分页 - * @param queryWrapper 条件 - * @return 结果 - */ - Page getTaskCopyByPage(@Param("page") Page page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwUserMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwUserMapper.java new file mode 100644 index 000000000..44053eeb6 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwUserMapper.java @@ -0,0 +1,78 @@ +package org.dromara.workflow.mapper; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.warm.flow.orm.entity.FlowDefinition; +import org.dromara.warm.flow.orm.entity.FlowHisTask; +import org.dromara.warm.flow.orm.entity.FlowInstance; +import org.dromara.warm.flow.orm.entity.FlowUser; +import org.dromara.workflow.domain.FlowInstanceBizExt; +import org.dromara.workflow.domain.bo.FlowTaskBo; +import org.dromara.workflow.domain.vo.FlowTaskVo; + +import java.util.List; + +/** + * 流程用户查询 Mapper + */ +public interface FlwUserMapper extends BaseMapperPlus { + + default Page getTaskCopyByPage(Page page, + FlowTaskBo bo, + List categoryIds, + String userId) { + MPJLambdaWrapper wrapper = JoinWrappers.lambda("a", FlowUser.class) + .selectAs("b", FlowHisTask::getId, FlowTaskVo::getId) + .selectAs("b", FlowHisTask::getUpdateTime, FlowTaskVo::getUpdateTime) + .selectAs("c", FlowInstance::getBusinessId, FlowTaskVo::getBusinessId) + .selectAs("c", FlowInstance::getFlowStatus, FlowTaskVo::getFlowStatus) + .selectAs("c", FlowInstance::getCreateBy, FlowTaskVo::getCreateBy) + .selectAs(FlowUser::getProcessedBy, FlowTaskVo::getProcessedBy) + .selectAs(FlowUser::getCreateTime, FlowTaskVo::getCreateTime) + .selectAs("b", FlowHisTask::getFormCustom, FlowTaskVo::getFormCustom) + .selectAs("b", FlowHisTask::getFormPath, FlowTaskVo::getFormPath) + .selectAs("b", FlowHisTask::getNodeName, FlowTaskVo::getNodeName) + .selectAs("b", FlowHisTask::getNodeCode, FlowTaskVo::getNodeCode) + .selectAs("d", FlowDefinition::getFlowName, FlowTaskVo::getFlowName) + .selectAs("d", FlowDefinition::getFlowCode, FlowTaskVo::getFlowCode) + .selectAs("d", FlowDefinition::getCategory, FlowTaskVo::getCategory) + .selectAs("d", FlowDefinition::getVersion, FlowTaskVo::getVersion) + .selectAs("biz", FlowInstanceBizExt::getBusinessCode, FlowTaskVo::getBusinessCode) + .selectAs("biz", FlowInstanceBizExt::getBusinessTitle, FlowTaskVo::getBusinessTitle) + .leftJoin(FlowHisTask.class, "b", FlowHisTask::getTaskId, FlowUser::getAssociated) + .leftJoin(FlowInstance.class, "c", FlowInstance::getId, FlowHisTask::getInstanceId) + .leftJoin(FlowDefinition.class, "d", FlowDefinition::getId, FlowInstance::getDefinitionId) + .leftJoin(FlowInstanceBizExt.class, "biz", FlowInstanceBizExt::getInstanceId, FlowInstance::getId) + .eq("a", FlowUser::getType, "4") + .eq("a", FlowUser::getDelFlag, "0") + .eq("b", FlowHisTask::getDelFlag, "0") + .eq("d", FlowDefinition::getDelFlag, "0") + .like(hasText(bo.getNodeName()), "b", FlowHisTask::getNodeName, bo.getNodeName()) + .like(hasText(bo.getFlowName()), "d", FlowDefinition::getFlowName, bo.getFlowName()) + .like(hasText(bo.getFlowCode()), "d", FlowDefinition::getFlowCode, bo.getFlowCode()) + .like(hasText(bo.getFlowStatus()), "c", FlowInstance::getFlowStatus, bo.getFlowStatus()) + .in(hasItems(bo.getCreateByIds()), "c", FlowInstance::getCreateBy, bo.getCreateByIds()) + .in(hasItems(categoryIds), "d", FlowDefinition::getCategory, categoryIds) + .between(hasBetween(bo), "a", FlowUser::getCreateTime, bo.getParams().get("beginTime"), bo.getParams().get("endTime")) + .eq(StringUtils.isNotBlank(userId), "a", FlowUser::getProcessedBy, userId) + .orderByDesc("a", FlowUser::getCreateTime) + .orderByDesc("b", FlowHisTask::getUpdateTime); + return wrapper.page(page, FlowTaskVo.class); + } + + default boolean hasText(String value) { + return StringUtils.isNotBlank(value); + } + + default boolean hasItems(List values) { + return values != null && !values.isEmpty(); + } + + default boolean hasBetween(FlowTaskBo bo) { + return bo != null && bo.getParams() != null && bo.getParams().get("beginTime") != null && bo.getParams().get("endTime") != null; + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index b64f6ab92..05a214bb2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -5,10 +5,10 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.enums.BusinessStatusEnum; @@ -36,6 +36,7 @@ import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.enums.TaskStatusEnum; +import org.dromara.workflow.domain.FlowInstanceBizExt; import org.dromara.workflow.domain.bo.FlowCancelBo; import org.dromara.workflow.domain.bo.FlowInstanceBo; import org.dromara.workflow.domain.bo.FlowInvalidBo; @@ -82,8 +83,8 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { */ @Override public TableDataInfo selectRunningInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = buildQueryWrapper(flowInstanceBo); - queryWrapper.in("fi.flow_status", BusinessStatusEnum.runningStatus()); + MPJLambdaWrapper queryWrapper = buildQueryWrapper(flowInstanceBo); + queryWrapper.in("fi", FlowInstance::getFlowStatus, BusinessStatusEnum.runningStatus()); Page page = flwInstanceMapper.selectInstanceList(pageQuery.build(), queryWrapper); return TableDataInfo.build(page); } @@ -96,8 +97,8 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { */ @Override public TableDataInfo selectFinishInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = buildQueryWrapper(flowInstanceBo); - queryWrapper.in("fi.flow_status", BusinessStatusEnum.finishStatus()); + MPJLambdaWrapper queryWrapper = buildQueryWrapper(flowInstanceBo); + queryWrapper.in("fi", FlowInstance::getFlowStatus, BusinessStatusEnum.finishStatus()); Page page = flwInstanceMapper.selectInstanceList(pageQuery.build(), queryWrapper); return TableDataInfo.build(page); } @@ -134,19 +135,43 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { * @param flowInstanceBo 查询条件 * @return 查询条件构造方法 */ - private QueryWrapper buildQueryWrapper(FlowInstanceBo flowInstanceBo) { - QueryWrapper queryWrapper = Wrappers.query(); - queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getNodeName()), "fi.node_name", flowInstanceBo.getNodeName()); - queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowName()), "fd.flow_name", flowInstanceBo.getFlowName()); - queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowCode()), "fd.flow_code", flowInstanceBo.getFlowCode()); + private MPJLambdaWrapper buildQueryWrapper(FlowInstanceBo flowInstanceBo) { + MPJLambdaWrapper queryWrapper = JoinWrappers.lambda("fi", FlowInstance.class) + .selectAs(FlowInstance::getId, FlowInstanceVo::getId) + .selectAs(FlowInstance::getCreateTime, FlowInstanceVo::getCreateTime) + .selectAs(FlowInstance::getUpdateTime, FlowInstanceVo::getUpdateTime) + .selectAs(FlowInstance::getDelFlag, FlowInstanceVo::getDelFlag) + .selectAs(FlowInstance::getDefinitionId, FlowInstanceVo::getDefinitionId) + .selectAs(FlowInstance::getBusinessId, FlowInstanceVo::getBusinessId) + .selectAs(FlowInstance::getNodeType, FlowInstanceVo::getNodeType) + .selectAs(FlowInstance::getNodeCode, FlowInstanceVo::getNodeCode) + .selectAs(FlowInstance::getNodeName, FlowInstanceVo::getNodeName) + .selectAs(FlowInstance::getVariable, FlowInstanceVo::getVariable) + .selectAs(FlowInstance::getFlowStatus, FlowInstanceVo::getFlowStatus) + .selectAs(FlowInstance::getActivityStatus, FlowInstanceVo::getActivityStatus) + .selectAs(FlowInstance::getCreateBy, FlowInstanceVo::getCreateBy) + .selectAs(FlowInstance::getExt, FlowInstanceVo::getExt) + .selectAs(org.dromara.warm.flow.orm.entity.FlowDefinition::getFlowName, FlowInstanceVo::getFlowName) + .selectAs(org.dromara.warm.flow.orm.entity.FlowDefinition::getFlowCode, FlowInstanceVo::getFlowCode) + .selectAs(org.dromara.warm.flow.orm.entity.FlowDefinition::getVersion, FlowInstanceVo::getVersion) + .selectAs(org.dromara.warm.flow.orm.entity.FlowDefinition::getFormCustom, FlowInstanceVo::getFormCustom) + .selectAs(org.dromara.warm.flow.orm.entity.FlowDefinition::getFormPath, FlowInstanceVo::getFormPath) + .selectAs(org.dromara.warm.flow.orm.entity.FlowDefinition::getCategory, FlowInstanceVo::getCategory) + .selectAs(FlowInstanceBizExt::getBusinessCode, FlowInstanceVo::getBusinessCode) + .selectAs(FlowInstanceBizExt::getBusinessTitle, FlowInstanceVo::getBusinessTitle) + .leftJoin(org.dromara.warm.flow.orm.entity.FlowDefinition.class, "fd", org.dromara.warm.flow.orm.entity.FlowDefinition::getId, FlowInstance::getDefinitionId) + .leftJoin(FlowInstanceBizExt.class, "biz", FlowInstanceBizExt::getInstanceId, FlowInstance::getId); + queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getNodeName()), "fi", FlowInstance::getNodeName, flowInstanceBo.getNodeName()); + queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowName()), "fd", org.dromara.warm.flow.orm.entity.FlowDefinition::getFlowName, flowInstanceBo.getFlowName()); + queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowCode()), "fd", org.dromara.warm.flow.orm.entity.FlowDefinition::getFlowCode, flowInstanceBo.getFlowCode()); if (StringUtils.isNotBlank(flowInstanceBo.getCategory())) { List categoryIds = flwCategoryMapper.selectCategoryIdsByParentId(Convert.toLong(flowInstanceBo.getCategory())); - queryWrapper.in("fd.category", StreamUtils.toList(categoryIds, Convert::toStr)); + queryWrapper.in(CollUtil.isNotEmpty(categoryIds), "fd", org.dromara.warm.flow.orm.entity.FlowDefinition::getCategory, StreamUtils.toList(categoryIds, Convert::toStr)); } - queryWrapper.eq(StringUtils.isNotBlank(flowInstanceBo.getBusinessId()), "fi.business_id", flowInstanceBo.getBusinessId()); - queryWrapper.in(CollUtil.isNotEmpty(flowInstanceBo.getCreateByIds()), "fi.create_by", flowInstanceBo.getCreateByIds()); - queryWrapper.eq("fi.del_flag", "0"); - queryWrapper.orderByDesc("fi.create_time"); + queryWrapper.eq(StringUtils.isNotBlank(flowInstanceBo.getBusinessId()), "fi", FlowInstance::getBusinessId, flowInstanceBo.getBusinessId()); + queryWrapper.in(CollUtil.isNotEmpty(flowInstanceBo.getCreateByIds()), "fi", FlowInstance::getCreateBy, flowInstanceBo.getCreateByIds()); + queryWrapper.eq("fi", FlowInstance::getDelFlag, "0"); + queryWrapper.orderByDesc("fi", FlowInstance::getCreateTime); return queryWrapper; } @@ -310,8 +335,8 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { */ @Override public TableDataInfo selectCurrentInstanceList(FlowInstanceBo instanceBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = buildQueryWrapper(instanceBo); - queryWrapper.eq("fi.create_by", LoginHelper.getUserIdStr()); + MPJLambdaWrapper queryWrapper = buildQueryWrapper(instanceBo); + queryWrapper.eq("fi", FlowInstance::getCreateBy, LoginHelper.getUserIdStr()); Page page = flwInstanceMapper.selectInstanceList(pageQuery.build(), queryWrapper); return TableDataInfo.build(page); } 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 1249acf29..3fdfc7cb9 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 @@ -8,8 +8,6 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.lock.annotation.Lock4j; 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 lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -56,8 +54,10 @@ import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; import org.dromara.workflow.domain.vo.NodeExtVo; import org.dromara.workflow.mapper.FlwCategoryMapper; +import org.dromara.workflow.mapper.FlwHisTaskMapper; import org.dromara.workflow.mapper.FlwInstanceBizExtMapper; import org.dromara.workflow.mapper.FlwTaskMapper; +import org.dromara.workflow.mapper.FlwUserMapper; import org.dromara.workflow.service.IFlwCommonService; import org.dromara.workflow.service.IFlwNodeExtService; import org.dromara.workflow.service.IFlwTaskAssigneeService; @@ -89,6 +89,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { private final FlowTaskMapper flowTaskMapper; private final FlowHisTaskMapper flowHisTaskMapper; private final FlwTaskMapper flwTaskMapper; + private final FlwHisTaskMapper flwHisTaskMapper; + private final FlwUserMapper flwUserMapper; private final FlwCategoryMapper flwCategoryMapper; private final FlowNodeMapper flowNodeMapper; private final IFlwTaskAssigneeService flwTaskAssigneeService; @@ -375,11 +377,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public TableDataInfo pageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); - queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); - queryWrapper.in("t.processed_by", LoginHelper.getUserIdStr()); - queryWrapper.in("t.flow_status", BusinessStatusEnum.WAITING.getStatus()); - Page page = flwTaskMapper.getListRunTask(pageQuery.build(), queryWrapper); + Page page = flwTaskMapper.getListRunTask(pageQuery.build(), flowTaskBo, categoryIds(flowTaskBo), LoginHelper.getUserIdStr()); this.wrapAssigneeInfo(page.getRecords()); return TableDataInfo.build(page); } @@ -392,10 +390,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public TableDataInfo pageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); - queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); - queryWrapper.in("t.approver", LoginHelper.getUserIdStr()); - Page page = flwTaskMapper.getListFinishTask(pageQuery.build(), queryWrapper); + Page page = flwHisTaskMapper.getListFinishTask(pageQuery.build(), flowTaskBo, categoryIds(flowTaskBo), LoginHelper.getUserIdStr()); return TableDataInfo.build(page); } @@ -407,9 +402,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public TableDataInfo pageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); - queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); - Page page = flwTaskMapper.getListRunTask(pageQuery.build(), queryWrapper); + Page page = flwTaskMapper.getListRunTask(pageQuery.build(), flowTaskBo, categoryIds(flowTaskBo), null); this.wrapAssigneeInfo(page.getRecords()); return TableDataInfo.build(page); } @@ -440,8 +433,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public TableDataInfo pageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); - Page page = flwTaskMapper.getListFinishTask(pageQuery.build(), queryWrapper); + Page page = flwHisTaskMapper.getListFinishTask(pageQuery.build(), flowTaskBo, categoryIds(flowTaskBo), null); return TableDataInfo.build(page); } @@ -453,28 +445,16 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public TableDataInfo pageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery) { - QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); - queryWrapper.in("t.processed_by", LoginHelper.getUserIdStr()); - Page page = flwTaskMapper.getTaskCopyByPage(pageQuery.build(), queryWrapper); + Page page = flwUserMapper.getTaskCopyByPage(pageQuery.build(), flowTaskBo, categoryIds(flowTaskBo), LoginHelper.getUserIdStr()); return TableDataInfo.build(page); } - private QueryWrapper buildQueryWrapper(FlowTaskBo flowTaskBo) { - Map params = flowTaskBo.getParams(); - 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.like(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode()); - wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowStatus()), "t.flow_status", flowTaskBo.getFlowStatus()); - wrapper.in(CollUtil.isNotEmpty(flowTaskBo.getCreateByIds()), "t.create_by", flowTaskBo.getCreateByIds()); + private List categoryIds(FlowTaskBo flowTaskBo) { if (StringUtils.isNotBlank(flowTaskBo.getCategory())) { List categoryIds = flwCategoryMapper.selectCategoryIdsByParentId(Convert.toLong(flowTaskBo.getCategory())); - wrapper.in("t.category", StreamUtils.toList(categoryIds, Convert::toStr)); + return StreamUtils.toList(categoryIds, Convert::toStr); } - wrapper.between(params.get("beginTime") != null && params.get("endTime") != null, - "t.create_time", params.get("beginTime"), params.get("endTime")); - wrapper.orderByDesc("t.create_time").orderByDesc("t.update_time"); - return wrapper; + return null; } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwHisTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwHisTaskMapper.xml new file mode 100644 index 000000000..420e4f9a1 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwHisTaskMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml index 3a83afd7e..f85fb804e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml @@ -3,36 +3,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index 3858d4d75..8a6a3dd7a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -3,123 +3,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwUserMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwUserMapper.xml new file mode 100644 index 000000000..6c6389da9 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwUserMapper.xml @@ -0,0 +1,7 @@ + + + + +