Procházet zdrojové kódy

支持对象查询按信息点排序

yucheng před 3 roky
rodič
revize
890718f9d5

+ 1 - 1
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/controller/ObjectDigitalController.java

@@ -59,7 +59,7 @@ public class ObjectDigitalController{
         // 添加所属项目条件
         ConditionUtil.ensureProjectCriteria(wrapper);
         // 处理扩展条件
-        ObjectDigitalCriteriaHelper.ensureExtraCond(criteria.getCriteria());
+        ObjectDigitalCriteriaHelper.presetDigitalCriteria(criteria);
         // 转换查询条件
         QueryCriteriaHelper.toWrapper(wrapper, criteria, ObjectDigital.class);
         Page page = QueryCriteriaHelper.toPage(criteria);

+ 35 - 1
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/utils/ObjectDigitalCriteriaHelper.java

@@ -1,12 +1,15 @@
 package com.persagy.dmp.rwd.digital.utils;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.ReflectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.basic.model.QueryCriteria;
 import com.persagy.dmp.basic.model.QueryOperator;
 import com.persagy.dmp.basic.utils.JsonNodeUtils;
 import com.persagy.dmp.common.model.entity.BaseEntity;
@@ -26,11 +29,42 @@ public class ObjectDigitalCriteriaHelper {
     private static final Set<String> DIGITAL_FIELDS = ReflectUtil.getFieldMap(ObjectDigital.class).keySet();
 
     /**
+     * 对象查询条件预处理:主要处理infos扩展内容
+     * @param criteria
+     */
+    public static void presetDigitalCriteria(QueryCriteria criteria) {
+        // 处理查询条件
+        ensureExtraCond(criteria.getCriteria());
+        // 处理排序条件
+        ensureOrders(criteria.getOrders());
+    }
+
+    /**
+     * 处理排序条件
+     * @param orders
+     */
+    private static void ensureOrders(List<OrderItem> orders) {
+        if(CollUtil.isEmpty(orders)) {
+            return;
+        }
+        for(OrderItem order:orders) {
+            String column = order.getColumn();
+            // 基础属性不用处理
+            if(StrUtil.isBlank(column) || DIGITAL_FIELDS.contains(column)) {
+                continue;
+            }
+            // 非基础属性转json
+            column = StrUtil.format("#JSON#json_extract({}, '$.{}')", ObjectDigital.EXTRA_COLUMN, column);
+            order.setColumn(column);
+        }
+    }
+
+    /**
      * 拼接扩展条件
      * 暂用#JSON#表示是json条件,不处理驼峰
      * @param criteria
      */
-    public static void ensureExtraCond(ObjectNode criteria) {
+    private static void ensureExtraCond(ObjectNode criteria) {
         if(criteria == null || criteria.isNull()) {
             return;
         }

+ 5 - 3
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/utils/QueryCriteriaHelper.java

@@ -200,11 +200,13 @@ public class QueryCriteriaHelper {
             return;
         }
         for(OrderItem order:orders) {
-            // 实体没有属性,不参与排序(扩展属性中的也不排序)
-            if(!ReflectUtil.hasField(clazz, order.getColumn())) {
+            String column = order.getColumn();
+            // 只有实体存在的属性和json扩展属性参与排序,其他属性忽略
+            if(!(StrUtil.startWith(column, "#JSON#") ||
+                    ReflectUtil.hasField(clazz, column))) {
                 continue;
             }
-            String column = toUnderlineCase(order.getColumn());
+            column = toUnderlineCase(order.getColumn());
             wrapper.orderBy(true, order.isAsc(), column);
         }
     }