Procházet zdrojové kódy

增加JSON助手类。根据ObjectMapper频繁使用提取,后续可直接使用助手类处理Json转换.

yucheng před 3 roky
rodič
revize
5fc6ab9b94

+ 47 - 25
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/utils/ObjectDigitalCriteriaHelper.java

@@ -196,33 +196,55 @@ public class ObjectDigitalCriteriaHelper {
             return;
         }
         // 处理relationFrom
-        JsonNode relationFrom = criteria.get(QueryOperator.RELATION_FROM.getIndex());
-        if(relationFrom != null && relationFrom.isObject() && relationFrom.size() > 0) {
-            StringBuilder inSql = new StringBuilder("(select obj_from from dt_relation where 1=1 ");
-            addWhereCond(relationFrom, inSql, "graphId");
-            addWhereCond(relationFrom, inSql, "graphCode");
-            addWhereCond(relationFrom, inSql, "relCode");
-            addWhereCond(relationFrom, inSql, "objTo");
-            inSql.append(")");
-            ObjectNode inObj = criteria.putObject(BaseEntity.PROP_ID);
-            inObj.put(QueryOperator.IN_SQL.getIndex(), inSql.toString());
-            // 处理完成后删除
-            criteria.remove(QueryOperator.RELATION_FROM.getIndex());
-        }
+        ensureRelationIds(criteria, true);
         // 处理relationTo
-        JsonNode relationTo = criteria.get(QueryOperator.RELATION_TO.getIndex());
-        if(relationTo != null && relationTo.isObject() && relationTo.size() > 0) {
-            StringBuilder inSql = new StringBuilder("(select obj_to from dt_relation where 1=1 ");
-            addWhereCond(relationTo, inSql, "graphId");
-            addWhereCond(relationTo, inSql, "graphCode");
-            addWhereCond(relationTo, inSql, "relCode");
-            addWhereCond(relationTo, inSql, "objFrom");
-            inSql.append(")");
-            ObjectNode inObj = criteria.putObject(BaseEntity.PROP_ID);
-            inObj.put(QueryOperator.IN_SQL.getIndex(), inSql.toString());
-            // 处理完成后删除
-            criteria.remove(QueryOperator.RELATION_TO.getIndex());
+        ensureRelationIds(criteria, false);
+    }
+
+    /**
+     * 处理关系条件
+     * @param criteria
+     * @param isFrom
+     */
+    private static void ensureRelationIds(ObjectNode criteria, boolean isFrom) {
+        String flagKey = isFrom ? QueryOperator.RELATION_FROM.getIndex() : QueryOperator.RELATION_TO.getIndex();
+        String selectKey = isFrom ? "objFrom" : "objTo";
+        String whereKey = isFrom ? "objTo" : "objFrom";
+        JsonNode relationCond = criteria.get(flagKey);
+        // 没有条件不需要处理
+        if(relationCond == null || relationCond.size() <= 0 || !relationCond.isObject()) {
+            return;
+        }
+        /** 20210827 relation条件支持复杂条件 - 使用Wrapper方式只能先查询出来,可以改为拼接sql提升效率,但需要大量扩展,不便于维护。
+        // 查询关系的条件
+        QueryWrapper<ObjectRelation> wrapper = new QueryWrapper<>();
+        wrapper.select(QueryCriteriaHelper.toUnderlineCase(selectKey));
+        // 添加所属项目条件
+        ConditionUtil.ensureProjectCriteria(wrapper);
+        QueryCriteriaHelper.toWrapper(wrapper, (ObjectNode) relationCond);
+        List<ObjectRelation> relations = SpringHelper.getBean(IObjectRelationService.class).queryByCondition(wrapper);
+        List<String> idList = CollUtil.getFieldValues(relations, selectKey, String.class);
+        // 回写到criteria中
+        ObjectNode inObj = criteria.putObject(BaseEntity.PROP_ID);
+        ArrayNode inArray = inObj.putArray(QueryOperator.IN.getIndex());
+        if(CollUtil.isEmpty(idList)) {
+            inArray.add("0");
+        } else {
+            idList.forEach(id -> inArray.add(id));
         }
+        // 处理完成后删除
+        criteria.remove(flagKey);
+         **/
+        StringBuilder inSql = new StringBuilder("(select "+selectKey+" from dt_relation where 1=1 ");
+        addWhereCond(relationCond, inSql, "graphId");
+        addWhereCond(relationCond, inSql, "graphCode");
+        addWhereCond(relationCond, inSql, "relCode");
+        addWhereCond(relationCond, inSql, whereKey);
+        inSql.append(")");
+        ObjectNode inObj = criteria.putObject(BaseEntity.PROP_ID);
+        inObj.put(QueryOperator.IN_SQL.getIndex(), inSql.toString());
+        // 处理完成后删除
+        criteria.remove(flagKey);
     }
 
     /**

+ 2 - 2
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/utils/JsonNodeUtils.java

@@ -54,7 +54,7 @@ public class JsonNodeUtils {
      * @param extraColumns 扩展属性中包含的列。为空表示所有非对象的列
      * @return Json对象
      */
-    public static List<ObjectNode> toListNode(List<Object> voList, String extraColumn, Set<String> extraColumns) {
+    public static List<ObjectNode> toListNode(List voList, String extraColumn, Set<String> extraColumns) {
         if(CollUtil.isEmpty(voList)) {
             return null;
         }
@@ -82,7 +82,7 @@ public class JsonNodeUtils {
      * @param extraColumns 扩展属性中包含的列。为空表示所有非对象的列
      * @return Json对象
      */
-    public static ArrayNode toArrayNode(List<Object> voList, String extraColumn, Set<String> extraColumns) {
+    public static ArrayNode toArrayNode(List voList, String extraColumn, Set<String> extraColumns) {
         if(CollUtil.isEmpty(voList)) {
             return null;
         }

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

@@ -1,7 +1,10 @@
 package com.persagy.dmp.basic.utils;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ReflectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -10,6 +13,7 @@ import com.persagy.dmp.basic.model.QueryOperator;
 import com.persagy.dmp.common.model.entity.BaseEntity;
 
 import java.util.Iterator;
+import java.util.List;
 
 /**
  * 查询条件 助手
@@ -38,7 +42,8 @@ public class QueryCriteriaHelper {
         Page pageInfo = new Page();
         pageInfo.setCurrent(criteria.getPage());
         pageInfo.setSize(criteria.getSize());
-        pageInfo.setOrders(criteria.getOrders());
+        // 20210819 size<-1时,拦截器不执行page的配置,因此改为在wrapper中排序
+//        pageInfo.setOrders(criteria.getOrders());
         pageInfo.setSearchCount(!criteria.isWithoutCount());
         return pageInfo;
     }
@@ -52,6 +57,7 @@ public class QueryCriteriaHelper {
             return;
         }
         toWrapper(wrapper, criteria.getCriteria());
+        ensureOrders(wrapper, criteria.getOrders());
     }
 
     /**
@@ -68,7 +74,7 @@ public class QueryCriteriaHelper {
             String field = fields.next();
             JsonNode fieldValue = criteria.get(field);
             // #JSON#开关的不转驼峰
-            String dbField = StrUtil.startWith(field, "#JSON#")?field.substring(6):StrUtil.toUnderlineCase(field);
+            String dbField = toUnderlineCase(field);
             // 20210813增加ADM传sql特殊处理 - 不公开到接口文档中
             if("$sql".equalsIgnoreCase(field)) {
                 wrapper.apply((String) JsonNodeUtils.getNodeValue(fieldValue));
@@ -132,6 +138,16 @@ public class QueryCriteriaHelper {
     }
 
     /**
+     * 驼峰字段转下划线
+     * @param column
+     * @return
+     */
+    public static String toUnderlineCase(String column) {
+        // #JSON#开关的不转驼峰
+        return StrUtil.startWith(column, "#JSON#")?column.substring(6):StrUtil.toUnderlineCase(column);
+    }
+
+    /**
      * 按条件类型添加查询条件
      * @param wrapper
      * @param field
@@ -170,4 +186,25 @@ public class QueryCriteriaHelper {
             }
         }
     }
+
+    /**
+     * 拼接排序条件
+     * @param wrapper
+     * @param orders
+     * @param <T>
+     */
+    public static <T extends BaseEntity> void ensureOrders(QueryWrapper<T> wrapper, List<OrderItem> orders) {
+        if(CollUtil.isEmpty(orders)) {
+            return;
+        }
+        Class clazz = wrapper.getEntity().getClass();
+        for(OrderItem order:orders) {
+            // 实体没有属性,不参与排序(扩展属性中的也不排序)
+            if(!ReflectUtil.hasField(clazz, order.getColumn())) {
+                continue;
+            }
+            String column = toUnderlineCase(order.getColumn());
+            wrapper.orderBy(true, order.isAsc(), column);
+        }
+    }
 }