From ead2cef1f474f401fed6eb97fc161b4d08c05609 Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Mon, 11 Aug 2025 18:47:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=9A=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=8E=92=E5=BA=8FdefSort=E6=95=B0=E7=BB=84?= =?UTF-8?q?=E3=80=81=E8=A7=A3=E5=86=B3=E5=A4=9A=E5=88=97=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=E6=97=A0=E6=95=88=20#8659?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/system/query/QueryGenerator.java | 64 ++++++++++++++++++- .../common/system/util/SqlConcatUtil.java | 51 +++++++++++++++ 2 files changed, 114 insertions(+), 1 deletion(-) diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryGenerator.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryGenerator.java index 76b9d509f..1afd78720 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryGenerator.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryGenerator.java @@ -11,6 +11,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import com.baomidou.mybatisplus.core.metadata.OrderItem; import org.apache.commons.beanutils.PropertyUtils; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.DataBaseConstant; @@ -257,8 +258,69 @@ public class QueryGenerator { if(parameterMap!=null&& parameterMap.containsKey(ORDER_TYPE)) { order = parameterMap.get(ORDER_TYPE)[0]; } - log.debug("排序规则>>列:" + column + ",排序方式:" + order); + + if(oConvertUtils.isNotEmpty(column)){ + log.info("单字段排序规则>> column:" + column + ",排序方式:" + order); + } + // 1. 列表多字段排序优先 + if(parameterMap!=null&& parameterMap.containsKey("sortInfoString")) { + // 多字段排序 + String sortInfoString = parameterMap.get("sortInfoString")[0]; + log.info("多字段排序规则>> sortInfoString:" + sortInfoString); + List orderItemList = SqlConcatUtil.getQueryConditionOrders(column, order, sortInfoString); + log.info(orderItemList.toString()); + if (orderItemList != null && !orderItemList.isEmpty()) { + for (OrderItem item : orderItemList) { + // 一、获取排序数据库字段 + String columnName = item.getColumn(); + // 1.字典字段,去掉字典翻译文本后缀 + if(columnName.endsWith(CommonConstant.DICT_TEXT_SUFFIX)) { + columnName = columnName.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX)); + } + // 2.实体驼峰字段转为数据库字段 + columnName = SqlInjectionUtil.getSqlInjectSortField(columnName); + + // 二、设置字段排序规则 + if (item.isAsc()) { + queryWrapper.orderByAsc(columnName); + } else { + queryWrapper.orderByDesc(columnName); + } + } + } + return; + } + + // 2. 列表单字段默认排序 + if(oConvertUtils.isEmpty(column) && parameterMap!=null&& parameterMap.containsKey("defSortString")) { + // 多字段排序 + String sortInfoString = parameterMap.get("defSortString")[0]; + log.info("默认多字段排序规则>> defSortString:" + sortInfoString); + List orderItemList = SqlConcatUtil.getQueryConditionOrders(column, order, sortInfoString); + log.info(orderItemList.toString()); + if (orderItemList != null && !orderItemList.isEmpty()) { + for (OrderItem item : orderItemList) { + // 一、获取排序数据库字段 + String columnName = item.getColumn(); + // 1.字典字段,去掉字典翻译文本后缀 + if(columnName.endsWith(CommonConstant.DICT_TEXT_SUFFIX)) { + columnName = columnName.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX)); + } + // 2.实体驼峰字段转为数据库字段 + columnName = SqlInjectionUtil.getSqlInjectSortField(columnName); + + // 二、设置字段排序规则 + if (item.isAsc()) { + queryWrapper.orderByAsc(columnName); + } else { + queryWrapper.orderByDesc(columnName); + } + } + } + return; + } + //update-begin-author:scott date:2022-11-07 for:避免用户自定义表无默认字段{创建时间},导致排序报错 //TODO 避免用户自定义表无默认字段创建时间,导致排序报错 if(DataBaseConstant.CREATE_TIME.equals(column) && !fieldColumnMap.containsKey(DataBaseConstant.CREATE_TIME)){ diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/SqlConcatUtil.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/SqlConcatUtil.java index 9178144d7..f1d668375 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/SqlConcatUtil.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/SqlConcatUtil.java @@ -1,13 +1,22 @@ package org.jeecg.common.system.util; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.metadata.OrderItem; import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.DataBaseConstant; import org.jeecg.common.constant.SymbolConstant; +import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.query.QueryRuleEnum; import org.jeecg.common.util.CommonUtils; import org.jeecg.common.util.oConvertUtils; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; /** @@ -239,5 +248,47 @@ public class SqlConcatUtil { private static String getDbType() { return CommonUtils.getDatabaseType(); } + + /** + * 获取前端传过来的 "多字段排序信息: sortInfoString" + * @return + */ + public static List getQueryConditionOrders(String column, String order, String queryInfoString){ + List list = new ArrayList<>(); + if(oConvertUtils.isEmpty(queryInfoString)){ + //默认以创建时间倒序查询 + if(CommonConstant.ORDER_TYPE_DESC.equalsIgnoreCase(order)){ + list.add(OrderItem.desc(column)); + }else{ + list.add(OrderItem.asc(column)); + } + }else{ + // 【TV360X-967】URL解码(微服务下需要) + if (queryInfoString.contains("%22column%22")) { + log.info("queryInfoString 原生 = {}", queryInfoString); + try { + queryInfoString = URLDecoder.decode(queryInfoString, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new JeecgBootException(e); + } + log.info("queryInfoString 解码 = {}", queryInfoString); + } + JSONArray array = JSONArray.parseArray(queryInfoString); + Iterator it = array.iterator(); + while(it.hasNext()){ + JSONObject json = (JSONObject)it.next(); + String tempColumn = json.getString("column"); + if(oConvertUtils.isNotEmpty(tempColumn)){ + String tempOrder = json.getString("order"); + if(CommonConstant.ORDER_TYPE_DESC.equalsIgnoreCase(tempOrder)){ + list.add(OrderItem.desc(tempColumn)); + }else{ + list.add(OrderItem.asc(tempColumn)); + } + } + } + } + return list; + } }