From 916282ba681da035ee95de0de70537621693de6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Fri, 13 Mar 2026 17:46:23 +0800 Subject: [PATCH] =?UTF-8?q?[=E9=87=8D=E5=A4=A7=E6=9B=B4=E6=96=B0]=20?= =?UTF-8?q?=E9=9B=86=E6=88=90=20mybatis-plus-join=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E4=BB=A3=E7=A0=81(=E5=AE=9E=E9=AA=8C?= =?UTF-8?q?=E6=80=A7=E5=8A=9F=E8=83=BD=E4=B8=8D=E7=A8=B3=E5=AE=9A)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 + .../common/core/domain/model/LoginUser.java | 4 +- .../core/service/PermissionService.java | 4 +- .../common/core/utils/StringUtils.java | 87 ++++++++ ruoyi-common/ruoyi-common-mybatis/pom.xml | 5 + .../mybatis/core/mapper/BaseMapperPlus.java | 4 +- .../handler/PlusDataPermissionHandler.java | 17 +- .../common/web/core/I18nLocaleResolver.java | 5 +- .../generator/mapper/GenTableMapper.java | 23 --- .../service/GenTableServiceImpl.java | 36 +++- .../mapper/generator/GenTableMapper.xml | 33 --- .../system/domain/vo/SysRoleMenuPermVo.java | 20 ++ .../dromara/system/mapper/SysDeptMapper.java | 65 ++---- .../dromara/system/mapper/SysMenuMapper.java | 171 +++++++-------- .../dromara/system/mapper/SysPostMapper.java | 8 +- .../dromara/system/mapper/SysRoleMapper.java | 19 +- .../dromara/system/mapper/SysUserMapper.java | 54 ++++- .../system/service/ISysPermissionService.java | 4 +- .../service/impl/SysMenuServiceImpl.java | 33 ++- .../impl/SysPermissionServiceImpl.java | 7 +- .../service/impl/SysUserServiceImpl.java | 34 +-- .../resources/mapper/system/SysUserMapper.xml | 35 ---- .../workflow/mapper/FlwInstanceMapper.java | 12 +- .../workflow/mapper/FlwTaskMapper.java | 194 +++++++++++++++--- .../service/impl/FlwInstanceServiceImpl.java | 61 ++++-- .../service/impl/FlwTaskServiceImpl.java | 40 +--- .../mapper/workflow/FlwInstanceMapper.xml | 36 +--- .../mapper/workflow/FlwTaskMapper.xml | 120 ----------- 28 files changed, 585 insertions(+), 553 deletions(-) create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleMenuPermVo.java diff --git a/pom.xml b/pom.xml index a420f55e3..41ed143e2 100644 --- a/pom.xml +++ b/pom.xml @@ -25,6 +25,7 @@ 2.3 1.45.0 3.5.16 + 1.5.6 3.9.1 5.8.43 4.0.2 @@ -203,6 +204,12 @@ ${mybatis-plus.version} + + com.github.yulichang + mybatis-plus-join-boot-starter + ${mybatis-plus-join.version} + + p6spy diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java index 240bcb83a..a3c906eb0 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java @@ -109,9 +109,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-core/src/main/java/org/dromara/common/core/service/PermissionService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PermissionService.java index b5d318597..602dcd04e 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PermissionService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PermissionService.java @@ -33,8 +33,8 @@ public interface PermissionService { * 根据角色列表构建数据权限角色映射 * * @param roles 角色列表 - * @return key 为权限码 value 为命中的角色列表 + * @return key 为权限码 value 为命中的角色ID列表 */ - Map> getDataScopeRoleMap(List roles); + Map> getDataScopeRoleMap(List roles); } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java index a4a3f8623..adcc3fa50 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java @@ -437,6 +437,64 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils { return Strings.CS.contains(seq, searchSeq); } + /** + * 忽略大小写检查指定字符序列中是否包含另一个字符序列。 + * + * @param seq 要检查的字符序列 + * @param searchSeq 要搜索的字符序列 + * @return 如果包含则返回 true,否则返回 false + */ + public static boolean containsIgnoreCase(final CharSequence seq, final CharSequence searchSeq) { + return Strings.CI.contains(seq, searchSeq); + } + + /** + * 检查 CharSequence 是否以指定前缀开头。 + * + * @param str 要检查的字符序列 + * @param prefix 要查找的前缀 + * @return 如果以指定前缀开头则返回 true,否则返回 false + */ + public static boolean startsWith(final CharSequence str, final CharSequence prefix) { + return Strings.CS.startsWith(str, prefix); + } + + /** + * 忽略大小写检查 CharSequence 是否以指定前缀开头。 + * + * @param str 要检查的字符序列 + * @param prefix 要查找的前缀 + * @return 如果以指定前缀开头则返回 true,否则返回 false + */ + public static boolean startsWithIgnoreCase(final CharSequence str, final CharSequence prefix) { + return Strings.CI.startsWith(str, prefix); + } + + /** + * 忽略大小写检查 CharSequence 是否以指定后缀结尾。 + * + * @param str 要检查的字符序列 + * @param suffix 要查找的后缀 + * @return 如果以指定后缀结尾则返回 true,否则返回 false + */ + public static boolean endsWithIgnoreCase(final CharSequence str, final CharSequence suffix) { + return Strings.CI.endsWith(str, suffix); + } + + /** + * 返回指定字符序列首次出现的位置。 + * + * @param seq 源字符序列 + * @param searchSeq 待查找字符序列 + * @return 首次出现的位置,不存在时返回 -1 + */ + public static int indexOf(final CharSequence seq, final CharSequence searchSeq) { + if (seq == null || searchSeq == null) { + return -1; + } + return seq.toString().indexOf(searchSeq.toString()); + } + /** * 移除字符串中的指定字符序列。 * @@ -448,6 +506,35 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils { return Strings.CS.remove(str, remove); } + /** + * 如果字符串以指定前缀开头,则移除该前缀。 + * + * @param str 要处理的字符串 + * @param remove 要移除的前缀 + * @return 处理后的字符串 + */ + public static String removeStart(final String str, final String remove) { + if (isEmpty(str) || isEmpty(remove)) { + return str; + } + return startsWith(str, remove) ? str.substring(remove.length()) : str; + } + + /** + * 替换字符串中的目标子串。 + * + * @param text 原始字符串 + * @param searchString 需要替换的子串 + * @param replacement 替换后的子串 + * @return 替换后的字符串 + */ + public static String replace(final String text, final String searchString, final String replacement) { + if (text == null || isEmpty(searchString) || replacement == null) { + return text; + } + return text.replace(searchString, replacement); + } + /** * 检查字符串是否包含任意一个指定的字符序列 diff --git a/ruoyi-common/ruoyi-common-mybatis/pom.xml b/ruoyi-common/ruoyi-common-mybatis/pom.xml index 340fa9df1..c6b69a558 100644 --- a/ruoyi-common/ruoyi-common-mybatis/pom.xml +++ b/ruoyi-common/ruoyi-common-mybatis/pom.xml @@ -42,6 +42,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 24557edb6..93541188d 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,11 +4,11 @@ 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.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; @@ -29,7 +29,7 @@ import java.util.function.Function; * @since 2021-05-13 */ @SuppressWarnings("unchecked") -public interface BaseMapperPlus extends BaseMapper { +public interface BaseMapperPlus extends MPJBaseMapper { Log log = LogFactory.getLog(BaseMapperPlus.class); 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 0b57e2c17..1151907f8 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 @@ -198,13 +198,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-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/I18nLocaleResolver.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/I18nLocaleResolver.java index 98ddd06b5..d1ddaaeb4 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/I18nLocaleResolver.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/I18nLocaleResolver.java @@ -17,9 +17,8 @@ public class I18nLocaleResolver implements LocaleResolver { public Locale resolveLocale(HttpServletRequest httpServletRequest) { String language = httpServletRequest.getHeader("content-language"); Locale locale = Locale.getDefault(); - if (language != null && language.length() > 0) { - String[] split = language.split("_"); - locale = new Locale(split[0], split[1]); + if (language != null && !language.isEmpty()) { + locale = Locale.forLanguageTag(language.replace('_', '-')); } return locale; } diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java index 1798b4b60..802d9ade5 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/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-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java index 455f8d9e6..b13472a8d 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/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-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml index 78aa85209..0a08ad15e 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml @@ -3,39 +3,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/domain/vo/SysRoleMenuPermVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleMenuPermVo.java new file mode 100644 index 000000000..0254e1e9a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleMenuPermVo.java @@ -0,0 +1,20 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 角色菜单权限视图 + */ +@Data +public class SysRoleMenuPermVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long roleId; + + private String perms; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java index 80a99cf34..fea218bf6 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java @@ -3,15 +3,21 @@ package org.dromara.system.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; import org.dromara.common.core.utils.StreamUtils; 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.common.mybatis.helper.DataBaseHelper; import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.SysRoleDept; import org.dromara.system.domain.vo.SysDeptVo; +import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * 部门管理 数据层 @@ -20,42 +26,6 @@ import java.util.List; */ public interface SysDeptMapper extends BaseMapperPlus { - /** - * 构建角色对应的部门 SQL 查询语句 - * - *

该 SQL 用于查询某个角色关联的所有部门 ID,常用于数据权限控制

- * - * @param roleId 角色ID - * @return 查询部门ID的 SQL 语句字符串 - */ - default String buildDeptByRoleSql(Long roleId) { - return """ - select srd.dept_id from sys_role_dept srd - left join sys_role sr on sr.role_id = srd.role_id - where srd.role_id = %d and sr.status = '0' - """.formatted(roleId); - } - - /** - * 构建 SQL 查询,用于获取当前角色拥有的部门中所有的父部门ID - * - *

- * 该 SQL 用于 deptCheckStrictly 场景下,排除非叶子节点(父节点)用。 - *

- * - * @param roleId 角色ID - * @return SQL 语句字符串,查询角色下部门的所有父部门ID - */ - default String buildParentDeptByRoleSql(Long roleId) { - return """ - select parent_id from sys_dept where dept_id in ( - select srd.dept_id from sys_role_dept srd - left join sys_role sr on sr.role_id = srd.role_id - where srd.role_id = %d and sr.status = '0' - ) - """.formatted(roleId); - } - /** * 查询部门管理数据 * @@ -129,15 +99,20 @@ public interface SysDeptMapper extends BaseMapperPlus { * @return 选中部门列表 */ default List selectDeptListByRoleId(Long roleId, boolean deptCheckStrictly) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.select(SysDept::getDeptId) - .inSql(SysDept::getDeptId, this.buildDeptByRoleSql(roleId)) - .orderByAsc(SysDept::getParentId) - .orderByAsc(SysDept::getOrderNum); - if (deptCheckStrictly) { - wrapper.notInSql(SysDept::getDeptId, this.buildParentDeptByRoleSql(roleId)); - } - return this.selectObjs(wrapper); + List depts = this.selectJoinList(SysDept.class, JoinWrappers.lambda("d", SysDept.class) + .distinct() + .select(SysDept::getDeptId, SysDept::getParentId) + .leftJoin(SysRoleDept.class, "srd", SysRoleDept::getDeptId, SysDept::getDeptId) + .leftJoin(SysRole.class, "sr", SysRole::getRoleId, SysRoleDept::getRoleId) + .eq("srd", SysRoleDept::getRoleId, roleId) + .eq("sr", SysRole::getStatus, "0") + .orderByAsc("d", SysDept::getParentId) + .orderByAsc("d", SysDept::getOrderNum)); + Set parentIds = deptCheckStrictly ? new HashSet<>(StreamUtils.toList(depts, SysDept::getParentId)) : Collections.emptySet(); + return depts.stream() + .map(SysDept::getDeptId) + .filter(deptId -> !parentIds.contains(deptId)) + .toList(); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java index d4f989494..ff7b51b48 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java @@ -2,11 +2,17 @@ package org.dromara.system.mapper; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.github.yulichang.toolkit.JoinWrappers; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.SysRoleMenu; +import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.bo.SysMenuBo; +import org.dromara.system.domain.vo.SysRoleMenuPermVo; import org.dromara.system.domain.vo.SysMenuVo; import java.util.*; @@ -18,66 +24,6 @@ import java.util.*; */ public interface SysMenuMapper extends BaseMapperPlus { - /** - * 构建用户权限菜单 SQL - * - *

- * 查询用户所属角色所拥有的菜单权限,用于权限判断、菜单加载等场景 - *

- * - * @param userId 用户ID - * @return SQL 字符串,用于 inSql 条件 - */ - default String buildMenuByUserSql(Long userId) { - return """ - select menu_id from sys_role_menu where role_id in ( - select sur.role_id from sys_user_role sur - left join sys_role sr on sr.role_id = sur.role_id - where sur.user_id = %d and sr.status = '0' - ) - """.formatted(userId); - } - - /** - * 构建角色对应的菜单ID SQL 子查询 - * - *

- * 用于根据角色ID查询其所拥有的菜单权限(用于权限标识、菜单显示等场景) - * 通常配合 inSql 使用 - *

- * - * @param roleId 角色ID - * @return 查询菜单ID的 SQL 子查询字符串 - */ - default String buildMenuByRoleSql(Long roleId) { - return """ - select srm.menu_id from sys_role_menu srm - left join sys_role sr on sr.role_id = srm.role_id - where srm.role_id = %d and sr.status = '0' - """.formatted(roleId); - } - - /** - * 构建角色所关联菜单的父菜单ID查询 SQL - * - *

- * 用于配合菜单勾选树结构的 {@code menuCheckStrictly} 模式,过滤掉非叶子节点(父菜单), - * 只返回角色实际勾选的末级菜单 - *

- * - * @param roleId 角色ID - * @return SQL 语句字符串(查询菜单的父菜单ID) - */ - default String buildParentMenuByRoleSql(Long roleId) { - return """ - select parent_id from sys_menu where menu_id in ( - select srm.menu_id from sys_role_menu srm - left join sys_role sr on sr.role_id = srm.role_id - where srm.role_id = %d and sr.status = '0' - ) - """.formatted(roleId); - } - /** * 根据用户ID查询权限 * @@ -85,13 +31,16 @@ public interface SysMenuMapper extends BaseMapperPlus { * @return 权限列表 */ default Set selectMenuPermsByUserId(Long userId) { - List list = this.selectObjs( - new LambdaQueryWrapper() - .select(SysMenu::getPerms) - .inSql(SysMenu::getMenuId, this.buildMenuByUserSql(userId)) - .isNotNull(SysMenu::getPerms) - ); - return new HashSet<>(StreamUtils.filter(list, StringUtils::isNotBlank)); + List list = this.selectJoinList(SysMenu.class, JoinWrappers.lambda("m", SysMenu.class) + .distinct() + .select(SysMenu::getPerms) + .leftJoin(SysRoleMenu.class, "srm", SysRoleMenu::getMenuId, SysMenu::getMenuId) + .leftJoin(SysUserRole.class, "sur", SysUserRole::getRoleId, SysRoleMenu::getRoleId) + .leftJoin(SysRole.class, "sr", SysRole::getRoleId, SysRoleMenu::getRoleId) + .eq("sur", SysUserRole::getUserId, userId) + .eq("sr", SysRole::getStatus, SystemConstants.NORMAL) + .isNotNull("m", SysMenu::getPerms)); + return new HashSet<>(StreamUtils.filter(StreamUtils.toList(list, SysMenu::getPerms), StringUtils::isNotBlank)); } /** @@ -101,13 +50,15 @@ public interface SysMenuMapper extends BaseMapperPlus { * @return 权限列表 */ default Set selectMenuPermsByRoleId(Long roleId) { - List list = this.selectObjs( - new LambdaQueryWrapper() - .select(SysMenu::getPerms) - .inSql(SysMenu::getMenuId, this.buildMenuByRoleSql(roleId)) - .isNotNull(SysMenu::getPerms) - ); - return new HashSet<>(StreamUtils.filter(list, StringUtils::isNotBlank)); + List list = this.selectJoinList(SysMenu.class, JoinWrappers.lambda("m", SysMenu.class) + .distinct() + .select(SysMenu::getPerms) + .leftJoin(SysRoleMenu.class, "srm", SysRoleMenu::getMenuId, SysMenu::getMenuId) + .leftJoin(SysRole.class, "sr", SysRole::getRoleId, SysRoleMenu::getRoleId) + .eq("srm", SysRoleMenu::getRoleId, roleId) + .eq("sr", SysRole::getStatus, SystemConstants.NORMAL) + .isNotNull("m", SysMenu::getPerms)); + return new HashSet<>(StreamUtils.filter(StreamUtils.toList(list, SysMenu::getPerms), StringUtils::isNotBlank)); } /** @@ -120,8 +71,22 @@ public interface SysMenuMapper extends BaseMapperPlus { if (CollUtil.isEmpty(roleIds)) { return Map.of(); } + List list = this.selectJoinList(SysRoleMenuPermVo.class, JoinWrappers.lambda("m", SysMenu.class) + .distinct() + .selectAs("srm", SysRoleMenu::getRoleId, SysRoleMenuPermVo::getRoleId) + .selectAs(SysMenu::getPerms, SysRoleMenuPermVo::getPerms) + .leftJoin(SysRoleMenu.class, "srm", SysRoleMenu::getMenuId, SysMenu::getMenuId) + .leftJoin(SysRole.class, "sr", SysRole::getRoleId, SysRoleMenu::getRoleId) + .in("srm", SysRoleMenu::getRoleId, roleIds) + .eq("sr", SysRole::getStatus, SystemConstants.NORMAL) + .isNotNull("m", SysMenu::getPerms)); Map> result = new LinkedHashMap<>(); - roleIds.forEach(roleId -> result.put(roleId, this.selectMenuPermsByRoleId(roleId))); + for (SysRoleMenuPermVo item : list) { + if (StringUtils.isBlank(item.getPerms())) { + continue; + } + result.computeIfAbsent(item.getRoleId(), key -> new LinkedHashSet<>()).add(item.getPerms()); + } return result; } @@ -147,15 +112,53 @@ public interface SysMenuMapper extends BaseMapperPlus { * @return 选中菜单列表 */ default List selectMenuListByRoleId(Long roleId, boolean menuCheckStrictly) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.select(SysMenu::getMenuId) - .inSql(SysMenu::getMenuId, buildMenuByRoleSql(roleId)) - .orderByAsc(SysMenu::getParentId) - .orderByAsc(SysMenu::getOrderNum); - if (menuCheckStrictly) { - wrapper.notInSql(SysMenu::getMenuId, this.buildParentMenuByRoleSql(roleId)); - } - return this.selectObjs(wrapper); + List menus = this.selectJoinList(SysMenu.class, JoinWrappers.lambda("m", SysMenu.class) + .distinct() + .select(SysMenu::getMenuId, SysMenu::getParentId) + .leftJoin(SysRoleMenu.class, "srm", SysRoleMenu::getMenuId, SysMenu::getMenuId) + .leftJoin(SysRole.class, "sr", SysRole::getRoleId, SysRoleMenu::getRoleId) + .eq("srm", SysRoleMenu::getRoleId, roleId) + .eq("sr", SysRole::getStatus, SystemConstants.NORMAL) + .orderByAsc("m", SysMenu::getParentId) + .orderByAsc("m", SysMenu::getOrderNum)); + Set parentIds = menuCheckStrictly ? new HashSet<>(StreamUtils.toList(menus, SysMenu::getParentId)) : Collections.emptySet(); + return menus.stream() + .map(SysMenu::getMenuId) + .filter(menuId -> !parentIds.contains(menuId)) + .toList(); + } + + default List selectMenuListByUserId(SysMenuBo menu, Long userId) { + return this.selectJoinList(SysMenuVo.class, JoinWrappers.lambda("m", SysMenu.class) + .distinct() + .selectAll(SysMenu.class) + .leftJoin(SysRoleMenu.class, "srm", SysRoleMenu::getMenuId, SysMenu::getMenuId) + .leftJoin(SysUserRole.class, "sur", SysUserRole::getRoleId, SysRoleMenu::getRoleId) + .leftJoin(SysRole.class, "sr", SysRole::getRoleId, SysRoleMenu::getRoleId) + .eq("sur", SysUserRole::getUserId, userId) + .eq("sr", SysRole::getStatus, SystemConstants.NORMAL) + .like(StringUtils.isNotBlank(menu.getMenuName()), "m", SysMenu::getMenuName, menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), "m", SysMenu::getVisible, menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), "m", SysMenu::getStatus, menu.getStatus()) + .eq(StringUtils.isNotBlank(menu.getMenuType()), "m", SysMenu::getMenuType, menu.getMenuType()) + .eq(Objects.nonNull(menu.getParentId()), "m", SysMenu::getParentId, menu.getParentId()) + .orderByAsc("m", SysMenu::getParentId) + .orderByAsc("m", SysMenu::getOrderNum)); + } + + default List selectMenuTreeByUserId(Long userId) { + return this.selectJoinList(SysMenu.class, JoinWrappers.lambda("m", SysMenu.class) + .distinct() + .selectAll(SysMenu.class) + .leftJoin(SysRoleMenu.class, "srm", SysRoleMenu::getMenuId, SysMenu::getMenuId) + .leftJoin(SysUserRole.class, "sur", SysUserRole::getRoleId, SysRoleMenu::getRoleId) + .leftJoin(SysRole.class, "sr", SysRole::getRoleId, SysRoleMenu::getRoleId) + .eq("sur", SysUserRole::getUserId, userId) + .eq("sr", SysRole::getStatus, SystemConstants.NORMAL) + .in("m", SysMenu::getMenuType, SystemConstants.TYPE_DIR, SystemConstants.TYPE_MENU) + .eq("m", SysMenu::getStatus, SystemConstants.NORMAL) + .orderByAsc("m", SysMenu::getParentId) + .orderByAsc("m", SysMenu::getOrderNum)); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java index d8d03157a..165d4d3fb 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java @@ -3,10 +3,12 @@ package org.dromara.system.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; 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.SysPost; +import org.dromara.system.domain.SysUserPost; import org.dromara.system.domain.vo.SysPostVo; import java.util.List; @@ -68,8 +70,10 @@ public interface SysPostMapper extends BaseMapperPlus { * @return 岗位信息列表 */ default List selectPostsByUserId(Long userId) { - return this.selectVoList(new LambdaQueryWrapper() - .inSql(SysPost::getPostId, "select post_id from sys_user_post where user_id = " + userId)); + return this.selectJoinList(SysPostVo.class, JoinWrappers.lambda("p", SysPost.class) + .selectAll(SysPost.class) + .leftJoin(SysUserPost.class, "sup", SysUserPost::getPostId, SysPost::getPostId) + .eq("sup", SysUserPost::getUserId, userId)); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java index 920780563..43f9cdfb2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java @@ -4,11 +4,13 @@ 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 org.apache.ibatis.annotations.Param; 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.SysRole; +import org.dromara.system.domain.SysUserRole; import org.dromara.system.domain.vo.SysRoleVo; import java.util.List; @@ -20,18 +22,6 @@ import java.util.List; */ public interface SysRoleMapper extends BaseMapperPlus { - /** - * 构建根据用户ID查询角色ID的SQL子查询 - * - * @param userId 用户ID - * @return 查询用户对应角色ID的SQL语句字符串 - */ - default String buildRoleByUserSql(Long userId) { - return """ - select role_id from sys_user_role where user_id = %d - """.formatted(userId); - } - /** * 分页查询角色列表 * @@ -96,10 +86,11 @@ public interface SysRoleMapper extends BaseMapperPlus { * @return 角色列表 */ default List selectRolesByUserId(Long userId) { - return this.selectVoList(new LambdaQueryWrapper() + return this.selectJoinList(SysRoleVo.class, JoinWrappers.lambda("r", SysRole.class) .select(SysRole::getRoleId, SysRole::getRoleName, SysRole::getRoleKey, SysRole::getRoleSort, SysRole::getDataScope, SysRole::getStatus) - .inSql(SysRole::getRoleId, this.buildRoleByUserSql(userId))); + .leftJoin(SysUserRole.class, "sur", SysUserRole::getRoleId, SysRole::getRoleId) + .eq("sur", SysUserRole::getUserId, userId)); } } 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 c92547374..99d713071 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/SysMenuServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java index de6ff5e84..7a25bfdab 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java @@ -61,22 +61,19 @@ public class SysMenuServiceImpl implements ISysMenuService { */ @Override public List selectMenuList(SysMenuBo menu, Long userId) { - List menuList; - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); // 管理员显示所有菜单信息 不是管理员 按用户id过滤菜单 - if (!LoginHelper.isSuperAdmin(userId)) { - // 通过用户id获取角色id 通过角色id获取菜单id 然后in菜单 - wrapper.inSql(SysMenu::getMenuId, baseMapper.buildMenuByUserSql(userId)); + if (LoginHelper.isSuperAdmin(userId)) { + return baseMapper.selectVoList( + new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(menu.getMenuName()), SysMenu::getMenuName, menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), SysMenu::getVisible, menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), SysMenu::getStatus, menu.getStatus()) + .eq(StringUtils.isNotBlank(menu.getMenuType()), SysMenu::getMenuType, menu.getMenuType()) + .eq(ObjectUtil.isNotNull(menu.getParentId()), SysMenu::getParentId, menu.getParentId()) + .orderByAsc(SysMenu::getParentId) + .orderByAsc(SysMenu::getOrderNum)); } - menuList = baseMapper.selectVoList( - wrapper.like(StringUtils.isNotBlank(menu.getMenuName()), SysMenu::getMenuName, menu.getMenuName()) - .eq(StringUtils.isNotBlank(menu.getVisible()), SysMenu::getVisible, menu.getVisible()) - .eq(StringUtils.isNotBlank(menu.getStatus()), SysMenu::getStatus, menu.getStatus()) - .eq(StringUtils.isNotBlank(menu.getMenuType()), SysMenu::getMenuType, menu.getMenuType()) - .eq(ObjectUtil.isNotNull(menu.getParentId()), SysMenu::getParentId, menu.getParentId()) - .orderByAsc(SysMenu::getParentId) - .orderByAsc(SysMenu::getOrderNum)); - return menuList; + return baseMapper.selectMenuListByUserId(menu, userId); } /** @@ -124,13 +121,7 @@ public class SysMenuServiceImpl implements ISysMenuService { if (LoginHelper.isSuperAdmin(userId)) { menus = baseMapper.selectMenuTreeAll(); } else { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - menus = baseMapper.selectList( - wrapper.in(SysMenu::getMenuType, SystemConstants.TYPE_DIR, SystemConstants.TYPE_MENU) - .eq(SysMenu::getStatus, SystemConstants.NORMAL) - .inSql(SysMenu::getMenuId, baseMapper.buildMenuByUserSql(userId)) - .orderByAsc(SysMenu::getParentId) - .orderByAsc(SysMenu::getOrderNum)); + menus = baseMapper.selectMenuTreeByUserId(userId); } return TreeBuildUtils.build(menus, Constants.TOP_PARENT_ID, SysMenu::getParentId, (menu, nodeTreeMaps) -> { 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 6454a5b2b..4a0992da5 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 @@ -63,17 +63,16 @@ public class SysPermissionServiceImpl implements ISysPermissionService, Permissi } @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)); + 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 62b3df9f7..579b7f1fa 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 @@ -70,20 +70,8 @@ public class SysUserServiceImpl implements ISysUserService, UserService { */ @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 +104,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService { */ @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 +117,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService { @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 475c65952..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/FlwInstanceMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java index 92809c80f..4a5e39dec 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,9 +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 com.github.yulichang.base.MPJBaseMapper; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.dromara.warm.flow.orm.entity.FlowInstance; import org.dromara.workflow.domain.bo.FlowInstanceBo; import org.dromara.workflow.domain.vo.FlowInstanceVo; @@ -13,7 +13,7 @@ import org.dromara.workflow.domain.vo.FlowInstanceVo; * @author may * @date 2024-03-02 */ -public interface FlwInstanceMapper { +public interface FlwInstanceMapper extends MPJBaseMapper { /** * 流程实例信息 @@ -22,6 +22,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..fca1b3fca 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,19 @@ 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.*; +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 +21,163 @@ 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 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 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; + } - /** - * 查询当前用户的抄送 - * - * @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/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 897d8a6e2..9ad81aba5 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; } @@ -306,8 +331,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 e2eedf684..c7d3086d1 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; @@ -372,11 +370,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); } @@ -389,10 +383,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 = flwTaskMapper.getListFinishTask(pageQuery.build(), flowTaskBo, categoryIds(flowTaskBo), LoginHelper.getUserIdStr()); return TableDataInfo.build(page); } @@ -404,9 +395,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); } @@ -437,8 +426,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 = flwTaskMapper.getListFinishTask(pageQuery.build(), flowTaskBo, categoryIds(flowTaskBo), null); return TableDataInfo.build(page); } @@ -450,28 +438,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 = flwTaskMapper.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/FlwInstanceMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml index 0ae7adbf3..c86c5844c 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 @@ -1,39 +1,7 @@ + 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 ead3d0759..3e9bdc881 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,125 +3,5 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - -