diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/query/LambdaJoinQueryBuilder.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/query/LambdaJoinQueryBuilder.java new file mode 100644 index 000000000..9dbe5cf1a --- /dev/null +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/query/LambdaJoinQueryBuilder.java @@ -0,0 +1,580 @@ +package org.dromara.common.mybatis.core.query; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.github.yulichang.toolkit.LambdaUtils; +import com.github.yulichang.toolkit.support.ColumnCache; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.github.yulichang.wrapper.segments.SelectCache; +import com.github.yulichang.wrapper.segments.SelectNormal; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.helper.DataBaseHelper; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +/** + * MPJ Lambda 联表查询构造辅助类。 + * + * @param 主表实体类型 + * @author Lion Li + */ +public final class LambdaJoinQueryBuilder { + + /** + * MyBatis-Plus-Join Lambda 查询包装器。 + */ + private final MPJLambdaWrapper wrapper; + + /** + * 构造 MPJ Lambda 联表查询构造辅助对象。 + * + * @param wrapper MPJ Lambda 查询包装器 + */ + LambdaJoinQueryBuilder(MPJLambdaWrapper wrapper) { + this.wrapper = wrapper; + } + + /** + * 添加去重查询。 + * + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder distinct() { + wrapper.distinct(); + return this; + } + + /** + * 指定主表查询字段。 + * + * @param columns 查询字段 + * @return 当前联表查询构造辅助对象 + */ + @SafeVarargs + public final LambdaJoinQueryBuilder select(SFunction... columns) { + wrapper.select(columns); + return this; + } + + /** + * 指定带表别名的同名映射查询字段。 + * + * @param alias 表别名 + * @param columns 查询字段 + * @return 当前联表查询构造辅助对象 + */ + @SafeVarargs + public final LambdaJoinQueryBuilder select(String alias, SFunction... columns) { + if (columns == null || columns.length == 0) { + return this; + } + Class entityClass = LambdaUtils.getEntityClass(columns[0]); + Map cacheMap = ColumnCache.getMapField(entityClass); + for (SFunction column : columns) { + wrapper.getSelectColum().add(new SelectNormal(cacheMap.get(LambdaUtils.getName(column)), wrapper.getIndex(), true, alias)); + } + return this; + } + + /** + * 查询主表全部字段。 + * + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder selectAll() { + wrapper.selectAll(); + return this; + } + + /** + * 查询指定实体全部字段。 + * + * @param entityClass 实体类型 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder selectAll(Class entityClass) { + wrapper.selectAll(entityClass); + return this; + } + + /** + * 查询指定别名实体全部字段。 + * + * @param entityClass 实体类型 + * @param alias 表别名 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder selectAll(Class entityClass, String alias) { + wrapper.selectAll(entityClass, alias); + return this; + } + + /** + * 指定查询字段并映射到返回对象字段。 + * + * @param column 查询字段 + * @param alias 返回对象字段 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder selectAs(SFunction column, SFunction alias) { + wrapper.selectAs(column, alias); + return this; + } + + /** + * 指定带表别名的查询字段并映射到返回对象字段。 + * + * @param tableAlias 表别名 + * @param column 查询字段 + * @param alias 返回对象字段 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder selectAs(String tableAlias, SFunction column, SFunction alias) { + wrapper.selectAs(tableAlias, column, alias); + return this; + } + + /** + * 指定 SQL 查询片段并映射到返回对象字段。 + * + * @param column SQL 查询片段 + * @param alias 返回对象字段 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder selectAs(String column, SFunction alias) { + wrapper.selectAs(column, alias); + return this; + } + + /** + * 添加左联表。 + * + * @param entityClass 关联实体类型 + * @param left 关联实体字段 + * @param right 当前查询字段 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder leftJoin(Class entityClass, SFunction left, SFunction right) { + wrapper.leftJoin(entityClass, left, right); + return this; + } + + /** + * 添加带别名的左联表。 + * + * @param entityClass 关联实体类型 + * @param alias 关联表别名 + * @param left 关联实体字段 + * @param right 当前查询字段 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder leftJoin(Class entityClass, String alias, SFunction left, SFunction right) { + wrapper.leftJoin(entityClass, alias, left, right); + return this; + } + + /** + * 添加等于条件。 + * + * @param alias 表别名 + * @param column 字段 + * @param value 条件值 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder eq(String alias, SFunction column, Object value) { + return eq(true, alias, column, value); + } + + /** + * 添加等于条件。 + * + * @param condition 是否添加该条件 + * @param alias 表别名 + * @param column 字段 + * @param value 条件值 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder eq(boolean condition, String alias, SFunction column, Object value) { + wrapper.eq(condition, alias, column, value); + return this; + } + + /** + * 值不为空时添加等于条件。 + * + * @param alias 表别名 + * @param column 字段 + * @param value 条件值 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder eqIfPresent(String alias, SFunction column, Object value) { + return eq(value != null, alias, column, value); + } + + /** + * 文本不为空白时添加等于条件。 + * + * @param alias 表别名 + * @param column 字段 + * @param value 条件值 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder eqIfText(String alias, SFunction column, String value) { + return eq(StringUtils.isNotBlank(value), alias, column, value); + } + + /** + * 添加不等于条件。 + * + * @param alias 表别名 + * @param column 字段 + * @param value 条件值 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder ne(String alias, SFunction column, Object value) { + return ne(true, alias, column, value); + } + + /** + * 添加不等于条件。 + * + * @param condition 是否添加该条件 + * @param alias 表别名 + * @param column 字段 + * @param value 条件值 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder ne(boolean condition, String alias, SFunction column, Object value) { + wrapper.ne(condition, alias, column, value); + return this; + } + + /** + * 文本不为空白时添加不等于条件。 + * + * @param alias 表别名 + * @param column 字段 + * @param value 条件值 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder neIfText(String alias, SFunction column, String value) { + return ne(StringUtils.isNotBlank(value), alias, column, value); + } + + /** + * 添加模糊匹配条件。 + * + * @param alias 表别名 + * @param column 字段 + * @param value 条件值 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder like(String alias, SFunction column, Object value) { + return like(true, alias, column, value); + } + + /** + * 添加模糊匹配条件。 + * + * @param condition 是否添加该条件 + * @param alias 表别名 + * @param column 字段 + * @param value 条件值 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder like(boolean condition, String alias, SFunction column, Object value) { + wrapper.like(condition, alias, column, value); + return this; + } + + /** + * 文本不为空白时添加模糊匹配条件。 + * + * @param alias 表别名 + * @param column 字段 + * @param value 条件值 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder likeIfText(String alias, SFunction column, String value) { + return like(StringUtils.isNotBlank(value), alias, column, value); + } + + /** + * 添加区间条件。 + * + * @param condition 是否添加该条件 + * @param alias 表别名 + * @param column 字段 + * @param begin 起始值 + * @param end 结束值 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder between(boolean condition, String alias, SFunction column, Object begin, Object end) { + wrapper.between(condition, alias, column, begin, end); + return this; + } + + /** + * 起止值均不为空时添加区间条件。 + * + * @param alias 表别名 + * @param column 字段 + * @param begin 起始值 + * @param end 结束值 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder betweenIfPresent(String alias, SFunction column, Object begin, Object end) { + return between(begin != null && end != null, alias, column, begin, end); + } + + /** + * 从参数 Map 中读取起止值,均不为空时添加区间条件。 + * + * @param alias 表别名 + * @param column 字段 + * @param params 参数 Map + * @param beginKey 起始值参数名 + * @param endKey 结束值参数名 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder betweenParams(String alias, SFunction column, Map params, String beginKey, String endKey) { + if (params == null) { + return between(false, alias, column, null, null); + } + Object begin = params.get(beginKey); + Object end = params.get(endKey); + return between(begin != null && end != null, alias, column, begin, end); + } + + /** + * 添加包含集合条件。 + * + * @param condition 是否添加该条件 + * @param alias 表别名 + * @param column 字段 + * @param values 条件值集合 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder in(boolean condition, String alias, SFunction column, Collection values) { + wrapper.in(condition, alias, column, values); + return this; + } + + /** + * 添加包含数组条件。 + * + * @param condition 是否添加该条件 + * @param alias 表别名 + * @param column 字段 + * @param values 条件值数组 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder in(boolean condition, String alias, SFunction column, Object... values) { + wrapper.in(condition, alias, column, values); + return this; + } + + /** + * 添加包含集合条件。 + * + * @param alias 表别名 + * @param column 字段 + * @param values 条件值集合 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder in(String alias, SFunction column, Collection values) { + return in(true, alias, column, values); + } + + /** + * 添加包含数组条件。 + * + * @param alias 表别名 + * @param column 字段 + * @param values 条件值数组 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder in(String alias, SFunction column, Object... values) { + return in(true, alias, column, values); + } + + /** + * 集合不为空时添加包含条件。 + * + * @param alias 表别名 + * @param column 字段 + * @param values 条件值集合 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder inIfNotEmpty(String alias, SFunction column, Collection values) { + return in(values != null && !values.isEmpty(), alias, column, values); + } + + /** + * 数组不为空时添加包含条件。 + * + * @param alias 表别名 + * @param column 字段 + * @param values 条件值数组 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder inIfNotEmpty(String alias, SFunction column, Object... values) { + return in(values != null && values.length > 0, alias, column, values); + } + + /** + * 添加不包含集合条件。 + * + * @param condition 是否添加该条件 + * @param alias 表别名 + * @param column 字段 + * @param values 条件值集合 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder notIn(boolean condition, String alias, SFunction column, Collection values) { + wrapper.notIn(condition, alias, column, values); + return this; + } + + /** + * 集合不为空时添加不包含条件。 + * + * @param alias 表别名 + * @param column 字段 + * @param values 条件值集合 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder notInIfNotEmpty(String alias, SFunction column, Collection values) { + return notIn(values != null && !values.isEmpty(), alias, column, values); + } + + /** + * 添加字段非空条件。 + * + * @param alias 表别名 + * @param column 字段 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder isNotNull(String alias, SFunction column) { + return isNotNull(true, alias, column); + } + + /** + * 添加字段非空条件。 + * + * @param condition 是否添加该条件 + * @param alias 表别名 + * @param column 字段 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder isNotNull(boolean condition, String alias, SFunction column) { + wrapper.isNotNull(condition, alias, column); + return this; + } + + /** + * 添加升序排序。 + * + * @param alias 表别名 + * @param column 字段 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder orderByAsc(String alias, SFunction column) { + wrapper.orderByAsc(alias, column); + return this; + } + + /** + * 添加降序排序。 + * + * @param alias 表别名 + * @param column 字段 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder orderByDesc(String alias, SFunction column) { + wrapper.orderByDesc(alias, column); + return this; + } + + /** + * 拼接 SQL 片段条件。 + * + * @param condition 是否添加该条件 + * @param applySql SQL 片段 + * @param values SQL 片段参数 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder apply(boolean condition, String applySql, Object... values) { + wrapper.apply(condition, applySql, values); + return this; + } + + /** + * 添加 FIND_IN_SET 条件。 + * + * @param condition 是否添加该条件 + * @param value 匹配值 + * @param column 字段名 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder findInSet(boolean condition, Object value, String column) { + return apply(condition, DataBaseHelper.findInSet(value, column)); + } + + /** + * 使用函数式方式追加 MPJ 原生能力。 + * + * @param consumer MPJ 查询包装器消费函数 + * @return 当前联表查询构造辅助对象 + */ + public LambdaJoinQueryBuilder apply(Consumer> consumer) { + consumer.accept(wrapper); + return this; + } + + /** + * 查询列表。 + * + * @param resultClass 返回对象类型 + * @param 返回对象类型 + * @return 查询结果 + */ + public List list(Class resultClass) { + return wrapper.list(resultClass); + } + + /** + * 分页查询。 + * + * @param page 分页对象 + * @param resultClass 返回对象类型 + * @param 返回对象类型 + * @param

分页类型 + * @return 分页结果 + */ + public > P page(P page, Class resultClass) { + return wrapper.page(page, resultClass); + } + + /** + * 查询数量。 + * + * @return 数量 + */ + public Long count() { + return wrapper.count(); + } + + /** + * 获取底层 MPJ Lambda 查询包装器。 + * + * @return MPJ Lambda 查询包装器 + */ + public MPJLambdaWrapper build() { + return wrapper; + } + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/query/QueryBuilder.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/query/QueryBuilder.java index 69a2e9660..7997603ca 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/query/QueryBuilder.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/query/QueryBuilder.java @@ -1,6 +1,7 @@ package org.dromara.common.mybatis.core.query; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.github.yulichang.toolkit.JoinWrappers; /** * MyBatis-Plus 查询构造器入口。 @@ -23,4 +24,27 @@ public final class QueryBuilder { return new LambdaQueryBuilder<>(Wrappers.lambdaQuery(entityClass)); } + /** + * 创建 MPJ Lambda 联表查询构造辅助对象。 + * + * @param entityClass 主表实体类型 + * @param 主表实体类型 + * @return MPJ Lambda 联表查询构造辅助对象 + */ + public static LambdaJoinQueryBuilder lambdaJoin(Class entityClass) { + return new LambdaJoinQueryBuilder<>(JoinWrappers.lambda(entityClass)); + } + + /** + * 创建带主表别名的 MPJ Lambda 联表查询构造辅助对象。 + * + * @param alias 主表别名 + * @param entityClass 主表实体类型 + * @param 主表实体类型 + * @return MPJ Lambda 联表查询构造辅助对象 + */ + public static LambdaJoinQueryBuilder lambdaJoin(String alias, Class entityClass) { + return new LambdaJoinQueryBuilder<>(JoinWrappers.lambda(alias, entityClass)); + } + } 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 74bbdfe47..7bb170084 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,11 +3,11 @@ package org.dromara.system.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.base.MPJBaseMapper; -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.core.query.QueryBuilder; import org.dromara.system.domain.SysDept; import org.dromara.system.domain.SysRole; import org.dromara.system.domain.SysRoleDept; @@ -101,7 +101,7 @@ public interface SysDeptMapper extends BaseMapperPlus, MPJBa * @return 选中部门列表 */ default List selectDeptListByRoleId(Long roleId, boolean deptCheckStrictly) { - List depts = this.selectJoinList(SysDept.class, JoinWrappers.lambda("d", SysDept.class) + List depts = this.selectJoinList(SysDept.class, QueryBuilder.lambdaJoin("d", SysDept.class) .distinct() .select(SysDept::getDeptId, SysDept::getParentId, SysDept::getOrderNum) .leftJoin(SysRoleDept.class, "srd", SysRoleDept::getDeptId, SysDept::getDeptId) @@ -109,7 +109,8 @@ public interface SysDeptMapper extends BaseMapperPlus, MPJBa .eq("srd", SysRoleDept::getRoleId, roleId) .eq("sr", SysRole::getStatus, NORMAL) .orderByAsc("d", SysDept::getParentId) - .orderByAsc("d", SysDept::getOrderNum)); + .orderByAsc("d", SysDept::getOrderNum) + .build()); Set parentIds = deptCheckStrictly ? new HashSet<>(StreamUtils.toList(depts, SysDept::getParentId)) : Collections.emptySet(); return depts.stream() .map(SysDept::getDeptId) 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 cd1539ead..36ea01858 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,11 @@ package org.dromara.system.mapper; import cn.hutool.core.collection.CollUtil; import com.github.yulichang.base.MPJBaseMapper; -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.common.mybatis.core.query.QueryBuilder; import org.dromara.system.domain.SysMenu; import org.dromara.system.domain.SysRole; import org.dromara.system.domain.SysRoleMenu; @@ -31,7 +31,7 @@ public interface SysMenuMapper extends BaseMapperPlus, MPJBa * @return 权限列表 */ default Set selectMenuPermsByUserId(Long userId) { - List list = this.selectJoinList(SysMenu.class, JoinWrappers.lambda("m", SysMenu.class) + List list = this.selectJoinList(SysMenu.class, QueryBuilder.lambdaJoin("m", SysMenu.class) .distinct() .select(SysMenu::getPerms) .leftJoin(SysRoleMenu.class, "srm", SysRoleMenu::getMenuId, SysMenu::getMenuId) @@ -39,7 +39,8 @@ public interface SysMenuMapper extends BaseMapperPlus, MPJBa .leftJoin(SysRole.class, "sr", SysRole::getRoleId, SysRoleMenu::getRoleId) .eq("sur", SysUserRole::getUserId, userId) .eq("sr", SysRole::getStatus, SystemConstants.NORMAL) - .isNotNull("m", SysMenu::getPerms)); + .isNotNull("m", SysMenu::getPerms) + .build()); return new HashSet<>(StreamUtils.filter(StreamUtils.toList(list, SysMenu::getPerms), StringUtils::isNotBlank)); } @@ -50,14 +51,15 @@ public interface SysMenuMapper extends BaseMapperPlus, MPJBa * @return 权限列表 */ default Set selectMenuPermsByRoleId(Long roleId) { - List list = this.selectJoinList(SysMenu.class, JoinWrappers.lambda("m", SysMenu.class) + List list = this.selectJoinList(SysMenu.class, QueryBuilder.lambdaJoin("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)); + .isNotNull("m", SysMenu::getPerms) + .build()); return new HashSet<>(StreamUtils.filter(StreamUtils.toList(list, SysMenu::getPerms), StringUtils::isNotBlank)); } @@ -71,7 +73,7 @@ public interface SysMenuMapper extends BaseMapperPlus, MPJBa if (CollUtil.isEmpty(roleIds)) { return Map.of(); } - List list = this.selectJoinList(SysRoleMenuPermVo.class, JoinWrappers.lambda("m", SysMenu.class) + List list = this.selectJoinList(SysRoleMenuPermVo.class, QueryBuilder.lambdaJoin("m", SysMenu.class) .distinct() .selectAs("srm", SysRoleMenu::getRoleId, SysRoleMenuPermVo::getRoleId) .selectAs(SysMenu::getPerms, SysRoleMenuPermVo::getPerms) @@ -79,7 +81,8 @@ public interface SysMenuMapper extends BaseMapperPlus, MPJBa .leftJoin(SysRole.class, "sr", SysRole::getRoleId, SysRoleMenu::getRoleId) .in("srm", SysRoleMenu::getRoleId, roleIds) .eq("sr", SysRole::getStatus, SystemConstants.NORMAL) - .isNotNull("m", SysMenu::getPerms)); + .isNotNull("m", SysMenu::getPerms) + .build()); Map> result = new LinkedHashMap<>(); for (SysRoleMenuPermVo item : list) { if (StringUtils.isBlank(item.getPerms())) { @@ -112,7 +115,7 @@ public interface SysMenuMapper extends BaseMapperPlus, MPJBa * @return 选中菜单列表 */ default List selectMenuListByRoleId(Long roleId, boolean menuCheckStrictly) { - List menus = this.selectJoinList(SysMenu.class, JoinWrappers.lambda("m", SysMenu.class) + List menus = this.selectJoinList(SysMenu.class, QueryBuilder.lambdaJoin("m", SysMenu.class) .distinct() .select(SysMenu::getMenuId, SysMenu::getParentId, SysMenu::getOrderNum) .leftJoin(SysRoleMenu.class, "srm", SysRoleMenu::getMenuId, SysMenu::getMenuId) @@ -120,7 +123,8 @@ public interface SysMenuMapper extends BaseMapperPlus, MPJBa .eq("srm", SysRoleMenu::getRoleId, roleId) .eq("sr", SysRole::getStatus, SystemConstants.NORMAL) .orderByAsc("m", SysMenu::getParentId) - .orderByAsc("m", SysMenu::getOrderNum)); + .orderByAsc("m", SysMenu::getOrderNum) + .build()); Set parentIds = menuCheckStrictly ? new HashSet<>(StreamUtils.toList(menus, SysMenu::getParentId)) : Collections.emptySet(); return menus.stream() .map(SysMenu::getMenuId) @@ -136,7 +140,7 @@ public interface SysMenuMapper extends BaseMapperPlus, MPJBa * @return 菜单列表 */ default List selectMenuListByUserId(SysMenuBo menu, Long userId) { - return this.selectJoinList(SysMenuVo.class, JoinWrappers.lambda("m", SysMenu.class) + return this.selectJoinList(SysMenuVo.class, QueryBuilder.lambdaJoin("m", SysMenu.class) .distinct() .selectAll(SysMenu.class) .leftJoin(SysRoleMenu.class, "srm", SysRoleMenu::getMenuId, SysMenu::getMenuId) @@ -144,13 +148,14 @@ public interface SysMenuMapper extends BaseMapperPlus, MPJBa .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()) + .likeIfText("m", SysMenu::getMenuName, menu.getMenuName()) + .eqIfText("m", SysMenu::getVisible, menu.getVisible()) + .eqIfText("m", SysMenu::getStatus, menu.getStatus()) + .eqIfText("m", SysMenu::getMenuType, menu.getMenuType()) + .eqIfPresent("m", SysMenu::getParentId, menu.getParentId()) .orderByAsc("m", SysMenu::getParentId) - .orderByAsc("m", SysMenu::getOrderNum)); + .orderByAsc("m", SysMenu::getOrderNum) + .build()); } /** @@ -160,7 +165,7 @@ public interface SysMenuMapper extends BaseMapperPlus, MPJBa * @return 菜单列表 */ default List selectMenuTreeByUserId(Long userId) { - return this.selectJoinList(SysMenu.class, JoinWrappers.lambda("m", SysMenu.class) + return this.selectJoinList(SysMenu.class, QueryBuilder.lambdaJoin("m", SysMenu.class) .distinct() .selectAll(SysMenu.class) .leftJoin(SysRoleMenu.class, "srm", SysRoleMenu::getMenuId, SysMenu::getMenuId) @@ -171,7 +176,8 @@ public interface SysMenuMapper extends BaseMapperPlus, MPJBa .in("m", SysMenu::getMenuType, SystemConstants.TYPE_DIR, SystemConstants.TYPE_MENU) .eq("m", SysMenu::getStatus, SystemConstants.NORMAL) .orderByAsc("m", SysMenu::getParentId) - .orderByAsc("m", SysMenu::getOrderNum)); + .orderByAsc("m", SysMenu::getOrderNum) + .build()); } } 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 ace0a4829..1265c666b 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,10 @@ package org.dromara.system.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.base.MPJBaseMapper; -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.common.mybatis.core.query.QueryBuilder; import org.dromara.system.domain.SysPost; import org.dromara.system.domain.SysUserPost; import org.dromara.system.domain.vo.SysPostVo; @@ -71,10 +71,11 @@ public interface SysPostMapper extends BaseMapperPlus, MPJBa * @return 岗位信息列表 */ default List selectPostsByUserId(Long userId) { - return this.selectJoinList(SysPostVo.class, JoinWrappers.lambda("p", SysPost.class) + return this.selectJoinList(SysPostVo.class, QueryBuilder.lambdaJoin("p", SysPost.class) .selectAll(SysPost.class) .leftJoin(SysUserPost.class, "sup", SysUserPost::getPostId, SysPost::getPostId) - .eq("sup", SysUserPost::getUserId, userId)); + .eq("sup", SysUserPost::getUserId, userId) + .build()); } } 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 b2242832e..9c9c6ec22 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,11 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.base.MPJBaseMapper; -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.common.mybatis.core.query.QueryBuilder; import org.dromara.system.domain.SysRole; import org.dromara.system.domain.SysUserRole; import org.dromara.system.domain.vo.SysRoleVo; @@ -87,11 +87,12 @@ public interface SysRoleMapper extends BaseMapperPlus, MPJBa * @return 角色列表 */ default List selectRolesByUserId(Long userId) { - return this.selectJoinList(SysRoleVo.class, JoinWrappers.lambda("r", SysRole.class) + return this.selectJoinList(SysRoleVo.class, QueryBuilder.lambdaJoin("r", SysRole.class) .select(SysRole::getRoleId, SysRole::getRoleName, SysRole::getRoleKey, SysRole::getRoleSort, SysRole::getDataScope, SysRole::getStatus) .leftJoin(SysUserRole.class, "sur", SysUserRole::getRoleId, SysRole::getRoleId) - .eq("sur", SysUserRole::getUserId, userId)); + .eq("sur", SysUserRole::getUserId, userId) + .build()); } } 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 a81d0ca31..9c6c6834f 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,14 +4,12 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.base.MPJBaseMapper; -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.common.mybatis.core.query.QueryBuilder; import org.dromara.system.domain.SysDept; import org.dromara.system.domain.SysRole; import org.dromara.system.domain.SysUser; @@ -70,20 +68,19 @@ public interface SysUserMapper extends BaseMapperPlus, MPJBa @DataColumn(key = "userName", value = "u.create_by") }) default List selectUserExportList(SysUserBo user, List deptIds) { - MPJLambdaWrapper wrapper = JoinWrappers.lambda("u", SysUser.class) + MPJLambdaWrapper wrapper = QueryBuilder.lambdaJoin("u", SysUser.class) .selectAll(SysUser.class) .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); + .likeIfText("u", SysUser::getUserName, user.getUserName()) + .likeIfText("u", SysUser::getNickName, user.getNickName()) + .eqIfText("u", SysUser::getStatus, user.getStatus()) + .likeIfText("u", SysUser::getPhoneNumber, user.getPhoneNumber()) + .betweenParams("u", SysUser::getCreateTime, user.getParams(), "beginTime", "endTime") + .inIfNotEmpty("u", SysUser::getDeptId, deptIds) + .orderByAsc("u", SysUser::getUserId) + .build(); return this.selectJoinList(SysUserExportVo.class, wrapper); } @@ -172,16 +169,16 @@ public interface SysUserMapper extends BaseMapperPlus, MPJBa * @return 用户角色关联查询包装器 */ default MPJLambdaWrapper buildUserRoleJoinWrapper(SysUserBo user) { - return JoinWrappers.lambda("u", SysUser.class) + return QueryBuilder.lambdaJoin("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()); + .likeIfText("u", SysUser::getUserName, user.getUserName()) + .eqIfText("u", SysUser::getStatus, user.getStatus()) + .likeIfText("u", SysUser::getPhoneNumber, user.getPhoneNumber()) + .build(); } } 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 index 17ad73d71..9cc062383 100644 --- 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 @@ -1,12 +1,9 @@ package org.dromara.workflow.mapper; -import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.base.MPJBaseMapper; -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.common.mybatis.core.query.QueryBuilder; import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.orm.entity.FlowDefinition; import org.dromara.warm.flow.orm.entity.FlowHisTask; @@ -19,8 +16,6 @@ import org.dromara.workflow.domain.vo.FlowHisTaskVo; import java.util.List; import java.util.Map; -import static org.dromara.workflow.common.constant.FlowConstant.NOT_DELETED; - /** * 任务信息Mapper接口 * @@ -31,55 +26,35 @@ public interface FlwHisTaskMapper extends BaseMapperPlus getListFinishTask(Page page, FlowTaskBo bo, List categoryIds, String userId) { Map params = bo.getParams(); - 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) + return QueryBuilder.lambdaJoin("a", FlowHisTask.class) + .select(FlowHisTask::getId, FlowHisTask::getNodeCode, FlowHisTask::getNodeName, + FlowHisTask::getCooperateType, FlowHisTask::getApprover, FlowHisTask::getCollaborator, + FlowHisTask::getNodeType, FlowHisTask::getTargetNodeCode, FlowHisTask::getTargetNodeName, + FlowHisTask::getDefinitionId, FlowHisTask::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) + .select(FlowHisTask::getMessage, FlowHisTask::getExt, FlowHisTask::getCreateTime, + FlowHisTask::getUpdateTime, FlowHisTask::getFormCustom, FlowHisTask::getFormPath) + .select("b", FlowInstance::getFlowStatus, FlowInstance::getBusinessId, FlowInstance::getCreateBy) + .select("c", FlowDefinition::getFlowName, FlowDefinition::getFlowCode, FlowDefinition::getCategory, + FlowDefinition::getVersion) + .select("biz", FlowInstanceBizExt::getBusinessCode, FlowInstanceBizExt::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, NOT_DELETED) - .eq("b", FlowInstance::getDelFlag, NOT_DELETED) - .eq("c", FlowDefinition::getDelFlag, NOT_DELETED) .in("a", FlowHisTask::getNodeType, List.of("1", "3", "4")) .ne("a", FlowHisTask::getFlowStatus, TaskStatusEnum.COPY.getStatus()) - .like(StringUtils.isNotBlank(bo.getNodeName()), "a", FlowHisTask::getNodeName, bo.getNodeName()) - .like(StringUtils.isNotBlank(bo.getFlowName()), "c", FlowDefinition::getFlowName, bo.getFlowName()) - .like(StringUtils.isNotBlank(bo.getFlowCode()), "c", FlowDefinition::getFlowCode, bo.getFlowCode()) - .like(StringUtils.isNotBlank(bo.getFlowStatus()), "b", FlowInstance::getFlowStatus, bo.getFlowStatus()) - .in(CollUtil.isNotEmpty(bo.getCreateByIds()), "b", FlowInstance::getCreateBy, bo.getCreateByIds()) - .in(CollUtil.isNotEmpty(categoryIds), "c", FlowDefinition::getCategory, categoryIds) - .between(params.get("beginTime") != null && params.get("endTime") != null, - "a", FlowHisTask::getCreateTime, params.get("beginTime"), params.get("endTime")) - .eq(StringUtils.isNotBlank(userId), "a", FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()) - .eq(StringUtils.isNotBlank(userId), "a", FlowHisTask::getApprover, userId) + .likeIfText("a", FlowHisTask::getNodeName, bo.getNodeName()) + .likeIfText("c", FlowDefinition::getFlowName, bo.getFlowName()) + .likeIfText("c", FlowDefinition::getFlowCode, bo.getFlowCode()) + .likeIfText("b", FlowInstance::getFlowStatus, bo.getFlowStatus()) + .inIfNotEmpty("b", FlowInstance::getCreateBy, bo.getCreateByIds()) + .inIfNotEmpty("c", FlowDefinition::getCategory, categoryIds) + .betweenParams("a", FlowHisTask::getCreateTime, params, "beginTime", "endTime") + .eq(userId != null && !userId.isBlank(), "a", FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()) + .eqIfText("a", FlowHisTask::getApprover, userId) .orderByDesc("a", FlowHisTask::getCreateTime) - .orderByDesc("a", FlowHisTask::getUpdateTime); - return wrapper.page(page, FlowHisTaskVo.class); + .orderByDesc("a", FlowHisTask::getUpdateTime) + .page(page, FlowHisTaskVo.class); } } 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 bb8ab4744..ceb96457e 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,13 +1,10 @@ package org.dromara.workflow.mapper; -import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.base.MPJBaseMapper; -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.common.mybatis.core.query.QueryBuilder; import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.orm.entity.*; import org.dromara.workflow.domain.FlowInstanceBizExt; @@ -17,8 +14,6 @@ import org.dromara.workflow.domain.vo.FlowTaskVo; import java.util.List; import java.util.Map; -import static org.dromara.workflow.common.constant.FlowConstant.NOT_DELETED; - /** * 任务信息Mapper接口 * @@ -29,92 +24,62 @@ public interface FlwTaskMapper extends BaseMapperPlus, MPJ default Page getListRunTask(Page page, FlowTaskBo bo, List categoryIds, String userId) { Map params = bo.getParams(); - MPJLambdaWrapper wrapper = JoinWrappers.lambda("t", FlowTask.class) + return QueryBuilder.lambdaJoin("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) + .select(FlowTask::getId, FlowTask::getNodeCode, FlowTask::getNodeName, FlowTask::getNodeType, + FlowTask::getDefinitionId, FlowTask::getInstanceId, FlowTask::getCreateTime, FlowTask::getUpdateTime) + .select("i", FlowInstance::getBusinessId, FlowInstance::getFlowStatus, FlowInstance::getCreateBy) + .select("d", FlowDefinition::getFlowName, FlowDefinition::getFlowCode, FlowDefinition::getFormCustom, + FlowDefinition::getCategory, FlowDefinition::getVersion) + .select("uu", FlowUser::getProcessedBy, FlowUser::getType) + .select("biz", FlowInstanceBizExt::getBusinessCode, FlowInstanceBizExt::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, NOT_DELETED) - .eq("uu", FlowUser::getDelFlag, NOT_DELETED) .in("uu", FlowUser::getType, List.of("1", "2", "3")) - .like(StringUtils.isNotBlank(bo.getNodeName()), "t", FlowTask::getNodeName, bo.getNodeName()) - .like(StringUtils.isNotBlank(bo.getFlowName()), "d", FlowDefinition::getFlowName, bo.getFlowName()) - .like(StringUtils.isNotBlank(bo.getFlowCode()), "d", FlowDefinition::getFlowCode, bo.getFlowCode()) - .like(StringUtils.isNotBlank(bo.getFlowStatus()), "i", FlowInstance::getFlowStatus, bo.getFlowStatus()) - .in(CollUtil.isNotEmpty(bo.getCreateByIds()), "i", FlowInstance::getCreateBy, bo.getCreateByIds()) - .in(CollUtil.isNotEmpty(categoryIds), "d", FlowDefinition::getCategory, categoryIds) - .between(params.get("beginTime") != null && params.get("endTime") != null, - "t", FlowTask::getCreateTime, params.get("beginTime"), params.get("endTime")) - .eq(StringUtils.isNotBlank(userId), "uu", FlowUser::getProcessedBy, userId) - .eq(StringUtils.isNotBlank(userId), "i", FlowInstance::getFlowStatus, BusinessStatusEnum.WAITING.getStatus()) + .likeIfText("t", FlowTask::getNodeName, bo.getNodeName()) + .likeIfText("d", FlowDefinition::getFlowName, bo.getFlowName()) + .likeIfText("d", FlowDefinition::getFlowCode, bo.getFlowCode()) + .likeIfText("i", FlowInstance::getFlowStatus, bo.getFlowStatus()) + .inIfNotEmpty("i", FlowInstance::getCreateBy, bo.getCreateByIds()) + .inIfNotEmpty("d", FlowDefinition::getCategory, categoryIds) + .betweenParams("t", FlowTask::getCreateTime, params, "beginTime", "endTime") + .eqIfText("uu", FlowUser::getProcessedBy, userId) + .eq(userId != null && !userId.isBlank(), "i", FlowInstance::getFlowStatus, BusinessStatusEnum.WAITING.getStatus()) .orderByDesc("t", FlowTask::getCreateTime) - .orderByDesc("t", FlowTask::getUpdateTime); - return wrapper.page(page, FlowTaskVo.class); + .orderByDesc("t", FlowTask::getUpdateTime) + .page(page, FlowTaskVo.class); } default Page getTaskCopyByPage(Page page, FlowTaskBo bo, List categoryIds, String userId) { Map params = bo.getParams(); - 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) + return QueryBuilder.lambdaJoin("a", FlowUser.class) + .select(FlowUser::getProcessedBy, FlowUser::getCreateTime) + .select("b", FlowHisTask::getId, FlowHisTask::getUpdateTime, FlowHisTask::getFormCustom, + FlowHisTask::getFormPath, FlowHisTask::getNodeName, FlowHisTask::getNodeCode) + .select("c", FlowInstance::getBusinessId, FlowInstance::getFlowStatus, FlowInstance::getCreateBy) + .select("d", FlowDefinition::getFlowName, FlowDefinition::getFlowCode, FlowDefinition::getCategory, + FlowDefinition::getVersion) + .select("biz", FlowInstanceBizExt::getBusinessCode, FlowInstanceBizExt::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, NOT_DELETED) - .eq("b", FlowHisTask::getDelFlag, NOT_DELETED) - .eq("d", FlowDefinition::getDelFlag, NOT_DELETED) - .like(StringUtils.isNotBlank(bo.getNodeName()), "b", FlowHisTask::getNodeName, bo.getNodeName()) - .like(StringUtils.isNotBlank(bo.getFlowName()), "d", FlowDefinition::getFlowName, bo.getFlowName()) - .like(StringUtils.isNotBlank(bo.getFlowCode()), "d", FlowDefinition::getFlowCode, bo.getFlowCode()) - .like(StringUtils.isNotBlank(bo.getFlowStatus()), "c", FlowInstance::getFlowStatus, bo.getFlowStatus()) - .in(CollUtil.isNotEmpty(bo.getCreateByIds()), "c", FlowInstance::getCreateBy, bo.getCreateByIds()) - .in(CollUtil.isNotEmpty(categoryIds), "d", FlowDefinition::getCategory, categoryIds) - .between(params.get("beginTime") != null && params.get("endTime") != null, - "a", FlowUser::getCreateTime, params.get("beginTime"), params.get("endTime")) - .eq(StringUtils.isNotBlank(userId), "a", FlowUser::getProcessedBy, userId) + .likeIfText("b", FlowHisTask::getNodeName, bo.getNodeName()) + .likeIfText("d", FlowDefinition::getFlowName, bo.getFlowName()) + .likeIfText("d", FlowDefinition::getFlowCode, bo.getFlowCode()) + .likeIfText("c", FlowInstance::getFlowStatus, bo.getFlowStatus()) + .inIfNotEmpty("c", FlowInstance::getCreateBy, bo.getCreateByIds()) + .inIfNotEmpty("d", FlowDefinition::getCategory, categoryIds) + .betweenParams("a", FlowUser::getCreateTime, params, "beginTime", "endTime") + .eqIfText("a", FlowUser::getProcessedBy, userId) .orderByDesc("a", FlowUser::getCreateTime) - .orderByDesc("b", FlowHisTask::getUpdateTime); - return wrapper.page(page, FlowTaskVo.class); + .orderByDesc("b", FlowHisTask::getUpdateTime) + .page(page, FlowTaskVo.class); } } 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 87be5598a..e1dccaae8 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 @@ -6,7 +6,6 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; 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; @@ -16,6 +15,7 @@ import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.query.LambdaJoinQueryBuilder; import org.dromara.common.mybatis.core.query.QueryBuilder; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.FlowEngine; @@ -138,43 +138,32 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { * @return 查询条件构造方法 */ 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) + LambdaJoinQueryBuilder queryBuilder = QueryBuilder.lambdaJoin("fi", FlowInstance.class) + .select(FlowInstance::getId, FlowInstance::getCreateTime, FlowInstance::getUpdateTime, + FlowInstance::getDelFlag, FlowInstance::getDefinitionId, FlowInstance::getBusinessId, + FlowInstance::getNodeType, FlowInstance::getNodeCode, FlowInstance::getNodeName, + FlowInstance::getVariable, FlowInstance::getFlowStatus, FlowInstance::getActivityStatus, + FlowInstance::getCreateBy, FlowInstance::getExt) + .select("fd", org.dromara.warm.flow.orm.entity.FlowDefinition::getFlowName, + org.dromara.warm.flow.orm.entity.FlowDefinition::getFlowCode, + org.dromara.warm.flow.orm.entity.FlowDefinition::getVersion, + org.dromara.warm.flow.orm.entity.FlowDefinition::getFormCustom, + org.dromara.warm.flow.orm.entity.FlowDefinition::getFormPath, + org.dromara.warm.flow.orm.entity.FlowDefinition::getCategory) + .select("biz", FlowInstanceBizExt::getBusinessCode, FlowInstanceBizExt::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()); + queryBuilder.likeIfText("fi", FlowInstance::getNodeName, flowInstanceBo.getNodeName()); + queryBuilder.likeIfText("fd", org.dromara.warm.flow.orm.entity.FlowDefinition::getFlowName, flowInstanceBo.getFlowName()); + queryBuilder.likeIfText("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(CollUtil.isNotEmpty(categoryIds), "fd", org.dromara.warm.flow.orm.entity.FlowDefinition::getCategory, StreamUtils.toList(categoryIds, Convert::toStr)); + queryBuilder.inIfNotEmpty("fd", org.dromara.warm.flow.orm.entity.FlowDefinition::getCategory, StreamUtils.toList(categoryIds, Convert::toStr)); } - 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; + queryBuilder.eqIfText("fi", FlowInstance::getBusinessId, flowInstanceBo.getBusinessId()); + queryBuilder.inIfNotEmpty("fi", FlowInstance::getCreateBy, flowInstanceBo.getCreateByIds()); + queryBuilder.orderByDesc("fi", FlowInstance::getCreateTime); + return queryBuilder.build(); } /**