This commit is contained in:
ls
2025-01-05 10:31:16 +08:00
parent aa2ba6b3cd
commit 8b7d1d84cb
2 changed files with 45 additions and 37 deletions

View File

@@ -4,12 +4,11 @@ import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.constant.DataBaseConstant; import org.jeecg.common.constant.DataBaseConstant;
import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.system.util.JeecgDataAutorUtils; import org.jeecg.common.system.util.*;
import org.jeecg.common.system.util.JwtUtil;
import org.jeecg.common.system.util.SqlConcatUtil;
import org.jeecg.common.system.vo.SysPermissionDataRuleModel; import org.jeecg.common.system.vo.SysPermissionDataRuleModel;
import org.jeecg.common.util.*; import org.jeecg.common.util.*;
import org.springframework.util.NumberUtils; import org.springframework.util.NumberUtils;
@@ -33,19 +32,19 @@ import java.util.stream.Collectors;
public class QueryGenerator { public class QueryGenerator {
public static final String SQL_RULES_COLUMN = "SQL_RULES_COLUMN"; public static final String SQL_RULES_COLUMN = "SQL_RULES_COLUMN";
private static final String BEGIN = "_begin"; private static final String BEGIN = "_begin";
private static final String END = "_end"; private static final String END = "_end";
/** /**
* 数字类型字段,拼接此后缀 接受多值参数 * 数字类型字段,拼接此后缀 接受多值参数
*/ */
private static final String MULTI = "_MultiString"; private static final String MULTI = "_MultiString";
private static final String STAR = "*"; private static final String STAR = "*";
private static final String COMMA = ","; private static final String COMMA = ",";
/** /**
* 查询 逗号转义符 相当于一个逗号【作废】 * 查询 逗号转义符 相当于一个逗号【作废】
*/ */
public static final String QUERY_COMMA_ESCAPE = "++"; public static final String QUERY_COMMA_ESCAPE = "++";
private static final String NOT_EQUAL = "!"; private static final String NOT_EQUAL = "!";
/** /**
* 页面带有规则值查询,空格作为分隔符 * 页面带有规则值查询,空格作为分隔符
*/ */
@@ -53,7 +52,7 @@ public class QueryGenerator {
/** /**
* 高级查询前端传来的参数名 * 高级查询前端传来的参数名
*/ */
private static final String SUPER_QUERY_PARAMS = "superQueryParams"; private static final String SUPER_QUERY_PARAMS = "superQueryParams";
/** /**
* 高级查询前端传来的拼接方式参数名 * 高级查询前端传来的拼接方式参数名
*/ */
@@ -61,16 +60,16 @@ public class QueryGenerator {
/** /**
* 单引号 * 单引号
*/ */
public static final String SQL_SQ = "'"; public static final String SQL_SQ = "'";
/** /**
* 排序列 * 排序列
*/ */
private static final String ORDER_COLUMN = "column"; private static final String ORDER_COLUMN = "column";
/** /**
* 排序方式 * 排序方式
*/ */
private static final String ORDER_TYPE = "order"; private static final String ORDER_TYPE = "order";
private static final String ORDER_TYPE_ASC = "ASC"; private static final String ORDER_TYPE_ASC = "ASC";
/** /**
* mysql 模糊查询之特殊字符下划线 _、\ * mysql 模糊查询之特殊字符下划线 _、\
@@ -126,7 +125,8 @@ public class QueryGenerator {
* @param customRuleMap 自定义字段查询规则 {field:QueryRuleEnum} * @param customRuleMap 自定义字段查询规则 {field:QueryRuleEnum}
* @return QueryWrapper实例 * @return QueryWrapper实例
*/ */
public static <T> QueryWrapper<T> initQueryWrapper(T searchObj, Map<String, String[]> parameterMap, Map<String, QueryRuleEnum> customRuleMap) { public static <T> QueryWrapper<T> initQueryWrapper(T searchObj, Map<String, String[]> parameterMap,
Map<String, QueryRuleEnum> customRuleMap) {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
QueryWrapper<T> queryWrapper = new QueryWrapper<T>(); QueryWrapper<T> queryWrapper = new QueryWrapper<T>();
installMplus(queryWrapper, searchObj, parameterMap, customRuleMap); installMplus(queryWrapper, searchObj, parameterMap, customRuleMap);
@@ -144,7 +144,8 @@ public class QueryGenerator {
* <br>正确示例:QueryWrapper<JeecgDemo> queryWrapper = new QueryWrapper<JeecgDemo>(); * <br>正确示例:QueryWrapper<JeecgDemo> queryWrapper = new QueryWrapper<JeecgDemo>();
* <br>3.也可以不使用这个方法直接调用 {@link #initQueryWrapper}直接获取实例 * <br>3.也可以不使用这个方法直接调用 {@link #initQueryWrapper}直接获取实例
*/ */
private static void installMplus(QueryWrapper<?> queryWrapper, Object searchObj, Map<String, String[]> parameterMap, Map<String, QueryRuleEnum> customRuleMap) { private static void installMplus(QueryWrapper<?> queryWrapper, Object searchObj, Map<String, String[]> parameterMap,
Map<String, QueryRuleEnum> customRuleMap) {
/* /*
* 注意:权限查询由前端配置数据规则 当一个人有多个所属部门时候 可以在规则配置包含条件 orgCode 包含 #{sys_org_code} * 注意:权限查询由前端配置数据规则 当一个人有多个所属部门时候 可以在规则配置包含条件 orgCode 包含 #{sys_org_code}
但是不支持在自定义SQL中写orgCode in #{sys_org_code} 但是不支持在自定义SQL中写orgCode in #{sys_org_code}
@@ -242,7 +243,6 @@ public class QueryGenerator {
} }
/** /**
* 区间查询 * 区间查询
* *
@@ -252,7 +252,8 @@ public class QueryGenerator {
* @param filedName 字段名称 * @param filedName 字段名称
* @param columnName 列名称 * @param columnName 列名称
*/ */
private static void doIntervalQuery(QueryWrapper<?> queryWrapper, Map<String, String[]> parameterMap, String type, String filedName, String columnName) throws ParseException { private static void doIntervalQuery(QueryWrapper<?> queryWrapper, Map<String, String[]> parameterMap, String type, String filedName,
String columnName) throws ParseException {
// 添加 判断是否有区间值 // 添加 判断是否有区间值
String endValue = null, beginValue = null; String endValue = null, beginValue = null;
if (parameterMap != null && parameterMap.containsKey(filedName + BEGIN)) { if (parameterMap != null && parameterMap.containsKey(filedName + BEGIN)) {
@@ -271,7 +272,8 @@ public class QueryGenerator {
} }
} }
private static void doMultiFieldsOrder(QueryWrapper<?> queryWrapper, Map<String, String[]> parameterMap, Map<String, String> fieldColumnMap) { private static void doMultiFieldsOrder(QueryWrapper<?> queryWrapper, Map<String, String[]> parameterMap,
Map<String, String> fieldColumnMap) {
Set<String> allFields = fieldColumnMap.keySet(); Set<String> allFields = fieldColumnMap.keySet();
String column = null, order = null; String column = null, order = null;
if (parameterMap != null && parameterMap.containsKey(ORDER_COLUMN)) { if (parameterMap != null && parameterMap.containsKey(ORDER_COLUMN)) {
@@ -367,7 +369,8 @@ public class QueryGenerator {
private static void doSuperQuery(QueryWrapper<?> queryWrapper, Map<String, String[]> parameterMap, Map<String, String> fieldColumnMap) { private static void doSuperQuery(QueryWrapper<?> queryWrapper, Map<String, String[]> parameterMap, Map<String, String> fieldColumnMap) {
if (parameterMap != null && parameterMap.containsKey(SUPER_QUERY_PARAMS)) { if (parameterMap != null && parameterMap.containsKey(SUPER_QUERY_PARAMS)) {
String superQueryParams = parameterMap.get(SUPER_QUERY_PARAMS)[0]; String superQueryParams = parameterMap.get(SUPER_QUERY_PARAMS)[0];
String superQueryMatchType = parameterMap.get(SUPER_QUERY_MATCH_TYPE) != null ? parameterMap.get(SUPER_QUERY_MATCH_TYPE)[0] : MatchTypeEnum.AND.getValue(); String superQueryMatchType = parameterMap.get(SUPER_QUERY_MATCH_TYPE) != null ? parameterMap.get(SUPER_QUERY_MATCH_TYPE)[0]
: MatchTypeEnum.AND.getValue();
MatchTypeEnum matchType = MatchTypeEnum.getByValue(superQueryMatchType); MatchTypeEnum matchType = MatchTypeEnum.getByValue(superQueryMatchType);
// update-begin--Author:sunjianlei Date:20200325 for高级查询的条件要用括号括起来防止和用户的其他条件冲突 ------- // update-begin--Author:sunjianlei Date:20200325 for高级查询的条件要用括号括起来防止和用户的其他条件冲突 -------
try { try {
@@ -378,10 +381,8 @@ public class QueryGenerator {
} }
// update-begin-author:sunjianlei date:20220119 for: 【JTC-573】 过滤空条件查询,防止 sql 拼接多余的 and // update-begin-author:sunjianlei date:20220119 for: 【JTC-573】 过滤空条件查询,防止 sql 拼接多余的 and
List<QueryCondition> filterConditions = conditions.stream().filter( List<QueryCondition> filterConditions = conditions.stream().filter(
rule -> oConvertUtils.isNotEmpty(rule.getField()) rule -> oConvertUtils.isNotEmpty(rule.getField()) && oConvertUtils.isNotEmpty(rule.getRule())
&& oConvertUtils.isNotEmpty(rule.getRule()) && oConvertUtils.isNotEmpty(rule.getVal())).collect(Collectors.toList());
&& oConvertUtils.isNotEmpty(rule.getVal())
).collect(Collectors.toList());
if (filterConditions.size() == 0) { if (filterConditions.size() == 0) {
return; return;
} }
@@ -391,8 +392,7 @@ public class QueryGenerator {
queryWrapper.and(andWrapper -> { queryWrapper.and(andWrapper -> {
for (int i = 0; i < filterConditions.size(); i++) { for (int i = 0; i < filterConditions.size(); i++) {
QueryCondition rule = filterConditions.get(i); QueryCondition rule = filterConditions.get(i);
if (oConvertUtils.isNotEmpty(rule.getField()) if (oConvertUtils.isNotEmpty(rule.getField()) && oConvertUtils.isNotEmpty(rule.getRule())
&& oConvertUtils.isNotEmpty(rule.getRule())
&& oConvertUtils.isNotEmpty(rule.getVal())) { && oConvertUtils.isNotEmpty(rule.getVal())) {
log.debug("SuperQuery ==> " + rule.toString()); log.debug("SuperQuery ==> " + rule.toString());
@@ -438,7 +438,8 @@ public class QueryGenerator {
} }
} }
// update-begin--author:sunjianlei date:20210702 for【/issues/I3VR8E】高级查询没有类型转换查询参数都是字符串类型 ---- // update-begin--author:sunjianlei date:20210702 for【/issues/I3VR8E】高级查询没有类型转换查询参数都是字符串类型 ----
addEasyQuery(andWrapper, fieldColumnMap.get(rule.getField()), QueryRuleEnum.getByValue(rule.getRule()), queryValue); addEasyQuery(andWrapper, fieldColumnMap.get(rule.getField()), QueryRuleEnum.getByValue(rule.getRule()),
queryValue);
//update-end-author:taoyan date:20201228 for: 【高级查询】 oracle 日期等于查询报错 //update-end-author:taoyan date:20201228 for: 【高级查询】 oracle 日期等于查询报错
// 如果拼接方式是OR就拼接OR // 如果拼接方式是OR就拼接OR
@@ -563,11 +564,17 @@ public class QueryGenerator {
//mysql 模糊查询之特殊字符下划线 _、\ //mysql 模糊查询之特殊字符下划线 _、\
value = specialStrConvert(value.toString()); value = specialStrConvert(value.toString());
} else if (rule == QueryRuleEnum.LEFT_LIKE || rule == QueryRuleEnum.NE) { } else if (rule == QueryRuleEnum.LEFT_LIKE || rule == QueryRuleEnum.NE) {
value = val.substring(1); value = val;
if (StringUtils.startsWith(val, "%")) {
value = val.substring(1);
}
//mysql 模糊查询之特殊字符下划线 _、\ //mysql 模糊查询之特殊字符下划线 _、\
value = specialStrConvert(value.toString()); value = specialStrConvert(value.toString());
} else if (rule == QueryRuleEnum.RIGHT_LIKE) { } else if (rule == QueryRuleEnum.RIGHT_LIKE) {
value = val.substring(0, val.length() - 1); value = val;
if (StringUtils.endsWith(val, "%")) {
value = val.substring(0, val.length() - 1);
}
//mysql 模糊查询之特殊字符下划线 _、\ //mysql 模糊查询之特殊字符下划线 _、\
value = specialStrConvert(value.toString()); value = specialStrConvert(value.toString());
} else if (rule == QueryRuleEnum.IN) { } else if (rule == QueryRuleEnum.IN) {
@@ -587,7 +594,8 @@ public class QueryGenerator {
return value; return value;
} }
private static void addQueryByRule(QueryWrapper<?> queryWrapper, String name, String type, String value, QueryRuleEnum rule) throws ParseException { private static void addQueryByRule(QueryWrapper<?> queryWrapper, String name, String type, String value, QueryRuleEnum rule)
throws ParseException {
if (oConvertUtils.isNotEmpty(value)) { if (oConvertUtils.isNotEmpty(value)) {
//update-begin--Author:sunjianlei Date:20220104 for【JTC-409】修复逗号分割情况下没有转换类型导致类型严格的数据库查询报错 ------------------- //update-begin--Author:sunjianlei Date:20220104 for【JTC-409】修复逗号分割情况下没有转换类型导致类型严格的数据库查询报错 -------------------
// 针对数字类型字段,多值查询 // 针对数字类型字段,多值查询
@@ -752,7 +760,7 @@ public class QueryGenerator {
else if (value.getClass().isArray()) { else if (value.getClass().isArray()) {
vals = (Object[]) value; vals = (Object[]) value;
} else { } else {
vals = new Object[]{value}; vals = new Object[] {value};
} }
queryWrapper.and(j -> { queryWrapper.and(j -> {
log.info("---查询过滤器Query规则---field:{}, rule:{}, value:{}", nameFinal, "like", vals[0]); log.info("---查询过滤器Query规则---field:{}, rule:{}, value:{}", nameFinal, "like", vals[0]);
@@ -775,12 +783,10 @@ public class QueryGenerator {
* @return * @return
*/ */
private static boolean judgedIsUselessField(String name) { private static boolean judgedIsUselessField(String name) {
return "class".equals(name) || "ids".equals(name) return "class".equals(name) || "ids".equals(name) || "page".equals(name) || "rows".equals(name) || "sort".equals(name)
|| "page".equals(name) || "rows".equals(name) || "order".equals(name);
|| "sort".equals(name) || "order".equals(name);
} }
/** /**
* 获取请求对应的数据权限规则 TODO 相同列权限多个 有问题 * 获取请求对应的数据权限规则 TODO 相同列权限多个 有问题
* *
@@ -811,7 +817,8 @@ public class QueryGenerator {
return ruleMap; return ruleMap;
} }
private static void addRuleToQueryWrapper(SysPermissionDataRuleModel dataRule, String name, Class propertyType, QueryWrapper<?> queryWrapper) { private static void addRuleToQueryWrapper(SysPermissionDataRuleModel dataRule, String name, Class propertyType,
QueryWrapper<?> queryWrapper) {
QueryRuleEnum rule = QueryRuleEnum.getByValue(dataRule.getRuleConditions()); QueryRuleEnum rule = QueryRuleEnum.getByValue(dataRule.getRuleConditions());
if (rule.equals(QueryRuleEnum.IN) && !propertyType.equals(String.class)) { if (rule.equals(QueryRuleEnum.IN) && !propertyType.equals(String.class)) {
String[] values = dataRule.getRuleValue().split(","); String[] values = dataRule.getRuleValue().split(",");

View File

@@ -86,6 +86,7 @@ public class ExperimentController extends JeecgController<Experiment, IExperimen
Map<String, QueryRuleEnum> customeRuleMap = new HashMap<>(); Map<String, QueryRuleEnum> customeRuleMap = new HashMap<>();
// 自定义duoXuan字段的查询规则为LIKE_WITH_OR // 自定义duoXuan字段的查询规则为LIKE_WITH_OR
customeRuleMap.put("startDate", QueryRuleEnum.RIGHT_LIKE); customeRuleMap.put("startDate", QueryRuleEnum.RIGHT_LIKE);
QueryWrapper<Experiment> queryWrapper = QueryGenerator.initQueryWrapper(experiment, req.getParameterMap(), customeRuleMap); QueryWrapper<Experiment> queryWrapper = QueryGenerator.initQueryWrapper(experiment, req.getParameterMap(), customeRuleMap);
Page<Experiment> page = new Page<>(pageNo, pageSize); Page<Experiment> page = new Page<>(pageNo, pageSize);
IPage<Experiment> pageList = experimentService.page(page, queryWrapper); IPage<Experiment> pageList = experimentService.page(page, queryWrapper);