소스 검색

物理世界扩展属性处理

yucheng 3 년 전
부모
커밋
cb30235fd2

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

@@ -1,14 +1,17 @@
 package com.persagy.dmp.rwd.digital.controller;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.utils.JsonNodeUtils;
 import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.common.exception.BusinessException;
+import com.persagy.dmp.common.model.entity.BaseEntity;
 import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.model.response.PageList;
 import com.persagy.dmp.common.utils.ResultHelper;
@@ -38,17 +41,72 @@ public class ObjectDigitalController {
     private IObjectDigitalService service;
 
     @PostMapping("/query")
-    public CommonResult<PageList<ObjectDigital>> query(@RequestBody QueryCriteria criteria) {
+    public CommonResult<PageList<ObjectNode>> query(@RequestBody QueryCriteria criteria) {
         if(criteria == null) {
             throw new BusinessException(ResponseCode.A0400.getCode(), ResponseCode.A0400.getDesc());
         }
         QueryWrapper<ObjectDigital> wrapper = new QueryWrapper<>();
         // 添加所属项目条件
         ConditionUtil.ensureProjectCriteria(wrapper);
+        // 处理关系条件
+        ensureRelationCond(wrapper, criteria.getCriteria());
         // 转换查询条件
         QueryCriteriaHelper.toWrapper(wrapper, criteria);
         Page page = service.queryByCondition(QueryCriteriaHelper.toPage(criteria), wrapper);
-        return ResultHelper.multi(page.getRecords(), page.getTotal());
+        // 处理扩展属性
+        List<ObjectNode> records = JsonNodeUtils.toListNode(page.getRecords(), "infos", criteria.getWithColumns());
+        return ResultHelper.multi(records, page.getTotal());
+    }
+
+    /**
+     * 处理关系条件
+     * @param wrapper
+     * @param criteria
+     */
+    private void ensureRelationCond(QueryWrapper<ObjectDigital> wrapper, ObjectNode criteria) {
+        if(criteria == null || criteria.isNull()) {
+            return;
+        }
+        // 处理relationFrom
+        JsonNode relationFrom = criteria.get("relationFrom");
+        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(")");
+            wrapper.inSql(BaseEntity.PROP_ID, inSql.toString());
+            // 处理完成后删除
+            criteria.remove("relationFrom");
+        }
+        // 处理relationTo
+        JsonNode relationTo = criteria.get("relationTo");
+        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(")");
+            wrapper.inSql(BaseEntity.PROP_ID, inSql.toString());
+            // 处理完成后删除
+            criteria.remove("relationTo");
+        }
+    }
+
+    /**
+     * 添加where条件
+     * @param node json对象
+     * @param inSql in条件
+     * @param field 属性名
+     */
+    private void addWhereCond(JsonNode node, StringBuilder inSql, String field) {
+        String value = (String) JsonNodeUtils.getNodeValue(node.get(field));
+        if(StrUtil.isNotEmpty(value)) {
+            String column = StrUtil.toUnderlineCase(field);
+            inSql.append("and " + column + " = '" + value + "' ");
+        }
     }
 
     @PostMapping("/createOne")

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

@@ -26,9 +26,10 @@ public class JsonNodeUtils {
      * 将对象转换为Json对象,自动扩充扩展列
      * @param vo 对象
      * @param extraColumn 扩展列名
+     * @param extraColumns 扩展属性中包含的列。为空表示所有非对象的列
      * @return Json对象
      */
-    public static ObjectNode toObjectNode(BaseEntity vo, String extraColumn) {
+    public static ObjectNode toObjectNode(BaseEntity vo, String extraColumn, Set<String> extraColumns) {
         if(vo == null) {
             return null;
         }
@@ -41,7 +42,7 @@ public class JsonNodeUtils {
         } catch (IOException e) {
             throw new BusinessException(ResponseCode.A0427.getCode(), ResponseCode.A0427.getDesc());
         }
-        ensureExtras(node, extraColumn);
+        ensureExtras(node, extraColumn, extraColumns);
         return node;
     }
 
@@ -49,9 +50,38 @@ public class JsonNodeUtils {
      * 将对象转换为Json对象,自动扩充扩展列
      * @param voList List对象
      * @param extraColumn 扩展列名
+     * @param extraColumns 扩展属性中包含的列。为空表示所有非对象的列
+     * @return Json对象
+     */
+    public static List<ObjectNode> toListNode(List<BaseEntity> voList, String extraColumn, Set<String> extraColumns) {
+        if(CollUtil.isEmpty(voList)) {
+            return null;
+        }
+        // 将vo转换为ObjectNode
+        ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
+        List<ObjectNode> array = null;
+        try {
+            String voJson = objectMapper.writeValueAsString(voList);
+            JavaType javaType = objectMapper.getTypeFactory().constructParametricType(ArrayList.class, ObjectNode.class);
+            array = objectMapper.readValue(array.toString(), javaType);
+        } catch (IOException e) {
+            throw new BusinessException(ResponseCode.A0427.getCode(), ResponseCode.A0427.getDesc());
+        }
+        for(int i = 0;i < array.size();i++) {
+            ObjectNode node = (ObjectNode) array.get(i);
+            ensureExtras(node, extraColumn, extraColumns);
+        }
+        return array;
+    }
+
+    /**
+     * 将对象转换为Json对象,自动扩充扩展列
+     * @param voList List对象
+     * @param extraColumn 扩展列名
+     * @param extraColumns 扩展属性中包含的列。为空表示所有非对象的列
      * @return Json对象
      */
-    public static ArrayNode toArrayNode(List<BaseEntity> voList, String extraColumn) {
+    public static ArrayNode toArrayNode(List<BaseEntity> voList, String extraColumn, Set<String> extraColumns) {
         if(CollUtil.isEmpty(voList)) {
             return null;
         }
@@ -66,7 +96,7 @@ public class JsonNodeUtils {
         }
         for(int i = 0;i < array.size();i++) {
             ObjectNode node = (ObjectNode) array.get(i);
-            ensureExtras(node, extraColumn);
+            ensureExtras(node, extraColumn, extraColumns);
         }
         return array;
     }
@@ -75,8 +105,9 @@ public class JsonNodeUtils {
      * 在Json对象中扩充扩展列
      * @param node json对象
      * @param extraColumn 扩展列名
+     * @param extraColumns 扩展属性中包含的列。为空表示所有非对象的列
      */
-    private static void ensureExtras(ObjectNode node, String extraColumn) {
+    private static void ensureExtras(ObjectNode node, String extraColumn, Set<String> extraColumns) {
         JsonNode extraNode = node.get(extraColumn);
         // 如果扩展列的值为空或不是对象,直接返回
         if(extraNode.isNull() || !extraNode.isObject()) {
@@ -89,6 +120,10 @@ public class JsonNodeUtils {
             if (node.has(extraKey)) {
                 continue;
             }
+            // 如果有设置过滤列,且不在过滤列范围内,则不移出
+            if(CollUtil.isNotEmpty(extraColumns) && !extraColumns.contains(extraKey)) {
+                continue;
+            }
             // 将extra移到外部
             node.set(extraKey, extraNode.get(extraKey));
         }