Browse Source

Merge branch 'develop' of http://39.106.8.246:3003/BDTP/digital-twin into develop

 Conflicts:
	dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/utils/QueryCriteriaHelper.java
lijie 3 years ago
parent
commit
fa71647135
14 changed files with 151 additions and 50 deletions
  1. 1 2
      dmp-business/dmp-dic/src/main/java/com/persagy/dmp/dic/controller/DictDataController.java
  2. 1 1
      dmp-business/dmp-dic/src/main/java/com/persagy/dmp/dic/controller/DictDataMapController.java
  3. 1 1
      dmp-business/dmp-dic/src/main/java/com/persagy/dmp/dic/controller/DictTypeController.java
  4. 1 1
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/controller/GraphDefineController.java
  5. 1 2
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/controller/ObjectInfoController.java
  6. 1 1
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/controller/ObjectTypeController.java
  7. 1 1
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/controller/RelationDefineController.java
  8. 3 3
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/controller/ObjectDigitalController.java
  9. 4 4
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/controller/ObjectRelationController.java
  10. 82 26
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/utils/ObjectDigitalCriteriaHelper.java
  11. 2 2
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/iot/service/impl/CurrentIotServiceImpl.java
  12. 2 2
      dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/utils/JsonNodeUtils.java
  13. 41 3
      dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/utils/QueryCriteriaHelper.java
  14. 10 1
      dmp-comp/dmp-mybatis/src/main/java/com/persagy/dmp/mybatis/utils/ConditionUtil.java

+ 1 - 2
dmp-business/dmp-dic/src/main/java/com/persagy/dmp/dic/controller/DictDataController.java

@@ -20,7 +20,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
-import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -59,7 +58,7 @@ public class DictDataController {
             }
         }
         // 转换查询条件
-        QueryCriteriaHelper.toWrapper(wrapper, criteria);
+        QueryCriteriaHelper.toWrapper(wrapper, criteria, DictData.class);
         Page page = service.queryByCondition(QueryCriteriaHelper.toPage(criteria), wrapper);
         return ResultHelper.multi(page.getRecords(), page.getTotal());
     }

+ 1 - 1
dmp-business/dmp-dic/src/main/java/com/persagy/dmp/dic/controller/DictDataMapController.java

@@ -45,7 +45,7 @@ public class DictDataMapController {
         }
         QueryWrapper<DictDataMap> wrapper = new QueryWrapper<>();
         // 转换查询条件
-        QueryCriteriaHelper.toWrapper(wrapper, criteria);
+        QueryCriteriaHelper.toWrapper(wrapper, criteria, DictDataMap.class);
         Page page = service.queryByCondition(QueryCriteriaHelper.toPage(criteria), wrapper);
         return ResultHelper.multi(page.getRecords(), page.getTotal());
     }

+ 1 - 1
dmp-business/dmp-dic/src/main/java/com/persagy/dmp/dic/controller/DictTypeController.java

@@ -45,7 +45,7 @@ public class DictTypeController {
         }
         QueryWrapper<DictType> wrapper = new QueryWrapper<>();
         // 转换查询条件
-        QueryCriteriaHelper.toWrapper(wrapper, criteria);
+        QueryCriteriaHelper.toWrapper(wrapper, criteria, DictType.class);
         Page page = service.queryByCondition(QueryCriteriaHelper.toPage(criteria), wrapper);
         return ResultHelper.multi(page.getRecords(), page.getTotal());
     }

+ 1 - 1
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/controller/GraphDefineController.java

@@ -39,7 +39,7 @@ public class GraphDefineController {
         }
         QueryWrapper<GraphDefine> wrapper = new QueryWrapper<>();
         // 转换查询条件
-        QueryCriteriaHelper.toWrapper(wrapper, criteria);
+        QueryCriteriaHelper.toWrapper(wrapper, criteria, GraphDefine.class);
         Page page = QueryCriteriaHelper.toPage(criteria);
         if(criteria.isOnlyCount()) {
             Integer total = service.queryCount(wrapper);

+ 1 - 2
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/controller/ObjectInfoController.java

@@ -13,7 +13,6 @@ import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.utils.ResultHelper;
 import com.persagy.dmp.define.entity.ObjectInfoDefine;
 import com.persagy.dmp.mybatis.utils.ConditionUtil;
-import com.persagy.dmp.basic.utils.QueryCriteriaHelper;
 import com.persagy.dmp.rwd.define.service.IObjectInfoService;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -46,7 +45,7 @@ public class ObjectInfoController {
         // 添加所属项目条件
         ConditionUtil.ensureProjectCriteria(wrapper);
         // 转换查询条件
-        QueryCriteriaHelper.toWrapper(wrapper, criteria);
+        QueryCriteriaHelper.toWrapper(wrapper, criteria, ObjectInfoDefine.class);
         Page page = QueryCriteriaHelper.toPage(criteria);
         // 没有排序条件时,按默认条件排序
         if(CollUtil.isEmpty(page.getOrders())) {

+ 1 - 1
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/controller/ObjectTypeController.java

@@ -54,7 +54,7 @@ public class ObjectTypeController {
         // 添加所属项目条件
         ConditionUtil.ensureProjectCriteria(wrapper);
         // 转换查询条件
-        QueryCriteriaHelper.toWrapper(wrapper, criteria);
+        QueryCriteriaHelper.toWrapper(wrapper, criteria, ObjectTypeDefine.class);
         Page page = QueryCriteriaHelper.toPage(criteria);
         if(criteria.isOnlyCount()) {
             Integer total = service.queryCount(wrapper);

+ 1 - 1
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/controller/RelationDefineController.java

@@ -41,7 +41,7 @@ public class RelationDefineController {
         // 添加所属项目条件
         // ConditionUtil.ensureProjectCriteria(wrapper);
         // 转换查询条件
-        QueryCriteriaHelper.toWrapper(wrapper, criteria);
+        QueryCriteriaHelper.toWrapper(wrapper, criteria, RelationDefine.class);
         Page page = QueryCriteriaHelper.toPage(criteria);
         if(criteria.isOnlyCount()) {
             Integer total = service.queryCount(wrapper);

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

@@ -57,11 +57,11 @@ public class ObjectDigitalController{
 
         QueryWrapper<ObjectDigital> wrapper = new QueryWrapper<>();
         // 添加所属项目条件
-        ConditionUtil.ensureProjectCriteria(wrapper);
+        ConditionUtil.ensureProjectCriteriaDirectly(wrapper);
         // 处理扩展条件
-        ObjectDigitalCriteriaHelper.ensureExtraCond(criteria.getCriteria());
+        ObjectDigitalCriteriaHelper.presetDigitalCriteria(criteria);
         // 转换查询条件
-        QueryCriteriaHelper.toWrapper(wrapper, criteria);
+        QueryCriteriaHelper.toWrapper(wrapper, criteria, ObjectDigital.class);
         Page page = QueryCriteriaHelper.toPage(criteria);
         if(criteria.isOnlyCount()) {
             Integer total = service.queryCount(wrapper);

+ 4 - 4
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/controller/ObjectRelationController.java

@@ -47,9 +47,9 @@ public class ObjectRelationController {
 
         QueryWrapper<ObjectRelation> wrapper = new QueryWrapper<>();
         // 添加所属项目条件
-        ConditionUtil.ensureProjectCriteria(wrapper);
+        ConditionUtil.ensureProjectCriteriaDirectly(wrapper);
         // 转换查询条件
-        QueryCriteriaHelper.toWrapper(wrapper, criteria);
+        QueryCriteriaHelper.toWrapper(wrapper, criteria, ObjectRelation.class);
         Page page = QueryCriteriaHelper.toPage(criteria);
         if(criteria.isOnlyCount()) {
             Integer total = service.queryCount(wrapper);
@@ -124,9 +124,9 @@ public class ObjectRelationController {
         }
         QueryWrapper<ObjectRelation> wrapper = new QueryWrapper<>();
         // 添加所属项目条件
-        ConditionUtil.ensureProjectCriteria(wrapper);
+        ConditionUtil.ensureProjectCriteriaDirectly(wrapper);
         // 转换查询条件
-        QueryCriteriaHelper.toWrapper(wrapper, criteria);
+        QueryCriteriaHelper.toWrapper(wrapper, criteria, ObjectRelation.class);
         List<ObjectRelation> delList = service.delete(wrapper);
         return ResultHelper.multi(delList,delList.size());
     }

+ 82 - 26
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;
         }
@@ -196,33 +230,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-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/iot/service/impl/CurrentIotServiceImpl.java

@@ -137,9 +137,9 @@ public class CurrentIotServiceImpl implements CurrentIotService {
         //查询object对象
         QueryWrapper<ObjectDigital> wrapper = new QueryWrapper<>();
         // 添加所属项目条件
-        ConditionUtil.ensureProjectCriteria(wrapper);
+        ConditionUtil.ensureProjectCriteriaDirectly(wrapper);
         // 转换查询条件
-        QueryCriteriaHelper.toWrapper(wrapper,queryCriteria);
+        QueryCriteriaHelper.toWrapper(wrapper,queryCriteria, ObjectDigital.class);
         List<ObjectDigital> data = objectDigitalService.queryByCondition(wrapper);
 
         if(data == null || data.size()<=0){

+ 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;
         }

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

@@ -1,8 +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;
@@ -40,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;
     }
@@ -48,12 +51,15 @@ public class QueryCriteriaHelper {
     /**
      * 转换为查询条件
      * @param wrapper
+     * @param criteria
+     * @param clazz 用于判定属性是否存在. - 通过反射无法从wrapper中获取到泛型class,还是显式传参吧
      */
-    public static <T extends BaseEntity> void toWrapper(QueryWrapper<T> wrapper, QueryCriteria criteria) {
+    public static <T extends BaseEntity> void toWrapper(QueryWrapper<T> wrapper, QueryCriteria criteria, Class<T> clazz) {
         if(criteria == null) {
             return;
         }
         toWrapper(wrapper, criteria.getCriteria());
+        ensureOrders(wrapper, criteria.getOrders(), clazz);
     }
 
     /**
@@ -70,7 +76,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));
@@ -138,6 +144,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
@@ -176,4 +192,26 @@ public class QueryCriteriaHelper {
             }
         }
     }
+
+    /**
+     * 拼接排序条件
+     * @param wrapper
+     * @param orders
+     * @param <T>
+     */
+    public static <T extends BaseEntity> void ensureOrders(QueryWrapper<T> wrapper, List<OrderItem> orders, Class<T> clazz) {
+        if(CollUtil.isEmpty(orders)) {
+            return;
+        }
+        for(OrderItem order:orders) {
+            String column = order.getColumn();
+            // 只有实体存在的属性和json扩展属性参与排序,其他属性忽略
+            if(!(StrUtil.startWith(column, "#JSON#") ||
+                    ReflectUtil.hasField(clazz, column))) {
+                continue;
+            }
+            column = toUnderlineCase(order.getColumn());
+            wrapper.orderBy(true, order.isAsc(), column);
+        }
+    }
 }

+ 10 - 1
dmp-comp/dmp-mybatis/src/main/java/com/persagy/dmp/mybatis/utils/ConditionUtil.java

@@ -21,7 +21,6 @@ public class ConditionUtil {
     /**
      * 确认项目范围条件
      * @param wrapper 查询条件
-     * @param wrapper 查询条件
      */
     public static <T extends BaseEntity> void ensureProjectCriteria(QueryWrapper<T> wrapper) {
         List<String> inSql = new ArrayList<>();
@@ -39,6 +38,16 @@ public class ConditionUtil {
     }
 
     /**
+     * 非层级管控数据拼接项目条件 - 当projectId为空时查所有
+     * @param wrapper
+     * @param <T>
+     */
+    public static <T extends BaseEntity> void ensureProjectCriteriaDirectly(QueryWrapper<T> wrapper) {
+        String projectId = AppContext.getContext().getProjectId();
+        wrapper.eq(StrUtil.isNotBlank(projectId), StrUtil.toUnderlineCase(AppContext.PROJECT_ID), projectId);
+    }
+
+    /**
      * 确认项目范围条件
      * @param wrapper 查询条件
      */