Browse Source

fix bug:使用infos中的信息点进行andOr查询时会将字段更改为表字段进行查询

lijie 3 years ago
parent
commit
fdff8c9f4b

+ 17 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/basic/utils/DigitalCommonUtils.java

@@ -2,11 +2,13 @@ package com.persagy.dmp.rwd.basic.utils;
 
 
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.common.constant.CommonConstant;
 import com.persagy.dmp.common.constant.CommonConstant;
 import com.persagy.dmp.common.helper.SpringHelper;
 import com.persagy.dmp.common.helper.SpringHelper;
 import com.persagy.dmp.rwd.basic.constant.DigitalObjectType;
 import com.persagy.dmp.rwd.basic.constant.DigitalObjectType;
 import com.persagy.dmp.rwd.basic.constant.DigitalObjectTypeShort;
 import com.persagy.dmp.rwd.basic.constant.DigitalObjectTypeShort;
+import org.apache.poi.ss.formula.functions.T;
 
 
 /**
 /**
  * 数据孪生通用工具
  * 数据孪生通用工具
@@ -92,4 +94,19 @@ public class DigitalCommonUtils {
         }
         }
         requestData.setSkip((requestData.getPage()-1)*requestData.getSize());
         requestData.setSkip((requestData.getPage()-1)*requestData.getSize());
     }
     }
+    /***
+     * Description: 获得分页对象
+     * @param requestData : 请求参数
+     * @return : void
+     * @author : lijie
+     * @date :2021/8/30 10:01
+     * Update By lijie 2021/8/30 10:01
+     */
+    public static <T> Page<T> computePageObject(RequestData requestData) {
+        computePageParam(requestData);
+        Page<T> page = new Page<>();
+        page.setSize(requestData.getSize());
+        page.setCurrent(requestData.getPage());
+        return page;
+    }
 }
 }

+ 2 - 1
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/dao/ObjectDigitalMapper.java

@@ -1,6 +1,7 @@
 package com.persagy.dmp.rwd.digital.dao;
 package com.persagy.dmp.rwd.digital.dao;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.digital.entity.ObjectDigital;
 import com.persagy.dmp.digital.entity.ObjectDigital;
 import com.persagy.dmp.rwd.digital.domain.CalculatingDTO;
 import com.persagy.dmp.rwd.digital.domain.CalculatingDTO;
@@ -54,7 +55,7 @@ public interface ObjectDigitalMapper extends BaseMapper<ObjectDigital> {
      * @date :2021/8/30 17:03
      * @date :2021/8/30 17:03
      * Update By lijie 2021/8/30 17:03
      * Update By lijie 2021/8/30 17:03
      */
      */
-    List<List<ObjectDigital>> queryObjectListByRelIdAndClassCode(@Param("param") RequestData requestData);
+    Page<ObjectDigital> queryObjectListByRelIdAndClassCode(Page<ObjectDigital> page,@Param("param") RequestData requestData);
     /***
     /***
      * Description: 按类型编码查询所有设备
      * Description: 按类型编码查询所有设备
      * @param requestData : 请求参数
      * @param requestData : 请求参数

+ 8 - 9
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/impl/ObjectDigitalServiceImpl.java

@@ -16,6 +16,7 @@ import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.basic.model.CodeTableTypeEnum;
 import com.persagy.dmp.basic.model.CodeTableTypeEnum;
+import com.persagy.dmp.basic.utils.JsonNodeUtils;
 import com.persagy.dmp.codetable.client.CodeTableDataFacade;
 import com.persagy.dmp.codetable.client.CodeTableDataFacade;
 import com.persagy.dmp.codetable.entity.CodeTableData;
 import com.persagy.dmp.codetable.entity.CodeTableData;
 import com.persagy.dmp.common.constant.CommonConstant;
 import com.persagy.dmp.common.constant.CommonConstant;
@@ -121,7 +122,7 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
         //获取$remove字段
         //获取$remove字段
         Map<String, Object> removeMap = getRemoveInfo(voList);
         Map<String, Object> removeMap = getRemoveInfo(voList);
         //获取基础属性
         //获取基础属性
-        Set<String> fieldSet = ReflectUtil.getFieldMap(ObjectDigital.class).keySet();
+        Set<String> fieldSet = JsonNodeUtils.getFieldMap(ObjectDigital.class).keySet();
         //查询数据库中存在的数据
         //查询数据库中存在的数据
         List<String> idList = CollUtil.getFieldValues(voList, BaseEntity.PROP_ID, String.class);
         List<String> idList = CollUtil.getFieldValues(voList, BaseEntity.PROP_ID, String.class);
         List<ObjectDigital> dbList = objectDigitalMapper.selectBatchIds(idList);
         List<ObjectDigital> dbList = objectDigitalMapper.selectBatchIds(idList);
@@ -240,14 +241,13 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
      */
      */
     @Override
     @Override
     public CommonResult<List<ObjectDigital>> queryEquipListBySpaceIdAndClassCode(RequestData requestData) {
     public CommonResult<List<ObjectDigital>> queryEquipListBySpaceIdAndClassCode(RequestData requestData) {
-        // 1.计算分页参数
-        DigitalCommonUtils.computePageParam(requestData);
         // 2.使用Eq2Sp关系查询楼层下的空间
         // 2.使用Eq2Sp关系查询楼层下的空间
         requestData.setRelCode(DigitalRelCode.EQ_2_SP.getIndex());
         requestData.setRelCode(DigitalRelCode.EQ_2_SP.getIndex());
         requestData.setObjType(DigitalObjectType.EQUIPMENT.getIndex());
         requestData.setObjType(DigitalObjectType.EQUIPMENT.getIndex());
         requestData.setRelId(requestData.getSpaceId());
         requestData.setRelId(requestData.getSpaceId());
-        List<List<ObjectDigital>> dataResult = objectDigitalMapper.queryObjectListByRelIdAndClassCode(requestData);
-        return commonAnalysisPageResult(dataResult);
+        Page<ObjectDigital> dataResult = objectDigitalMapper
+                .queryObjectListByRelIdAndClassCode(DigitalCommonUtils.computePageObject(requestData),requestData);
+        return ResultHelper.multi(dataResult.getRecords(),dataResult.getTotal());
     }
     }
     /***
     /***
      * Description: 按类型编码查询所有设备
      * Description: 按类型编码查询所有设备
@@ -276,14 +276,13 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
      */
      */
     @Override
     @Override
     public CommonResult<List<ObjectDigital>> queryEquipListBySystemId(RequestData requestData) {
     public CommonResult<List<ObjectDigital>> queryEquipListBySystemId(RequestData requestData) {
-        // 1.计算分页参数
-        DigitalCommonUtils.computePageParam(requestData);
         // 2.使用Sy2Eq关系查询系统下的设备
         // 2.使用Sy2Eq关系查询系统下的设备
         requestData.setRelId(requestData.getSystemId());
         requestData.setRelId(requestData.getSystemId());
         requestData.setObjType(DigitalObjectType.EQUIPMENT.getIndex());
         requestData.setObjType(DigitalObjectType.EQUIPMENT.getIndex());
         requestData.setRelCode(DigitalRelCode.SY_2_EQ.getIndex());
         requestData.setRelCode(DigitalRelCode.SY_2_EQ.getIndex());
-        List<List<ObjectDigital>> dataResult = objectDigitalMapper.queryObjectListByRelIdAndClassCode(requestData);
-        return commonAnalysisPageResult(dataResult);
+        Page<ObjectDigital> dataResult = objectDigitalMapper
+                .queryObjectListByRelIdAndClassCode(DigitalCommonUtils.computePageObject(requestData),requestData);
+        return ResultHelper.multi(dataResult.getRecords(),dataResult.getTotal());
     }
     }
 
 
     /***
     /***

+ 80 - 26
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/utils/ObjectDigitalCriteriaHelper.java

@@ -32,7 +32,7 @@ import java.util.*;
 public class ObjectDigitalCriteriaHelper {
 public class ObjectDigitalCriteriaHelper {
 
 
     /** 对象类字段集 */
     /** 对象类字段集 */
-    public static final Set<String> DIGITAL_FIELDS = ReflectUtil.getFieldMap(ObjectDigital.class).keySet();
+    public static final Set<String> DIGITAL_FIELDS = JsonNodeUtils.getFieldMap(ObjectDigital.class).keySet();
     /** 未绑定关系标识 */
     /** 未绑定关系标识 */
     private static final String BIND_FLAG = "$bindFlag";
     private static final String BIND_FLAG = "$bindFlag";
 
 
@@ -97,8 +97,13 @@ public class ObjectDigitalCriteriaHelper {
                 continue;
                 continue;
             }
             }
             // 基础属性不用处理
             // 基础属性不用处理
-            if(DIGITAL_FIELDS.contains(infoCode)
-                    || QueryOperator.AND_OR.getIndex().equalsIgnoreCase(infoCode)) {
+            if(DIGITAL_FIELDS.contains(infoCode)) {
+                continue;
+            }
+            if (QueryOperator.AND_OR.getIndex().equalsIgnoreCase(infoCode)){
+                // $andOr的特殊处理
+                JsonNode andOrNode = criteria.get(QueryOperator.AND_OR.getIndex());
+                processAndOrCond(andOrNode);
                 continue;
                 continue;
             }
             }
             JsonNode value = criteria.get(infoCode);
             JsonNode value = criteria.get(infoCode);
@@ -110,29 +115,7 @@ public class ObjectDigitalCriteriaHelper {
                 processOrCond(value);
                 processOrCond(value);
                 continue;
                 continue;
             }
             }
-            // 如果值是对象 先处理contains并移除
-            if(value.isObject()) {
-                // 包含
-                if (value.has(QueryOperator.CONTAINS.getIndex())) {
-                    JsonNode valueNode = value.get(QueryOperator.CONTAINS.getIndex());
-                    String valueStr = valueNode.isTextual() ? value.asText():value.toString();
-                    String key = StrUtil.format("#JSON#json_contains({}, {}, '$.{}')", ObjectDigital.EXTRA_COLUMN, valueStr, infoCode);
-                    valueMap.put(key, criteria.numberNode(1));
-                    ((ObjectNode) value).remove(QueryOperator.CONTAINS.getIndex());
-                } else if (value.has(QueryOperator.NOT_CONTAINS.getIndex())) {
-                    // 不包含
-                    JsonNode valueNode = value.get(QueryOperator.NOT_CONTAINS.getIndex());
-                    String valueStr = valueNode.isTextual() ? value.asText():value.toString();
-                    String key = StrUtil.format("#JSON#json_contains({}, {}, '$.{}')", ObjectDigital.EXTRA_COLUMN, valueStr, infoCode);
-                    valueMap.put(key, criteria.numberNode(0));
-                    ((ObjectNode) value).remove(QueryOperator.NOT_CONTAINS.getIndex());
-                }
-            }
-            // 获取格式化的Key
-            String key = ensureFormatKey(infoCode, value);
-            valueMap.put(key, value);
-            // 处理完成后删除
-            fieldNames.remove();
+            commonProcessInfosCond(value,infoCode,criteria, valueMap,fieldNames);
         }
         }
         // 将valueMap写入criteria中
         // 将valueMap写入criteria中
         if(MapUtil.isEmpty(valueMap)) {
         if(MapUtil.isEmpty(valueMap)) {
@@ -142,6 +125,77 @@ public class ObjectDigitalCriteriaHelper {
             criteria.set(key, valueMap.get(key));
             criteria.set(key, valueMap.get(key));
         }
         }
     }
     }
+    /***
+     * Description: 处理andOr的查询条件
+     * @param node : andOr查询对象
+     * @return : void
+     * @author : lijie
+     * @date :2021/10/20 19:16
+     * Update By lijie 2021/10/20 19:16
+     */
+    private static void processAndOrCond(JsonNode node) {
+        if(node == null || node.isNull() || !node.isObject()) {
+            return;
+        }
+        ObjectNode objectNode = (ObjectNode) node;
+        Iterator<String> fieldNames = node.fieldNames();
+        Map<String, JsonNode> valueMap = new HashMap<>(16);
+        while (fieldNames.hasNext()){
+            String infoCode = fieldNames.next();
+            // 基础属性不用处理
+            if(DIGITAL_FIELDS.contains(infoCode)) {
+                continue;
+            }
+            JsonNode value = node.get(infoCode);
+            commonProcessInfosCond(value,infoCode,objectNode, valueMap,fieldNames);
+        }
+        // 将valueMap写入criteria中
+        if(MapUtil.isEmpty(valueMap)) {
+            return;
+        }
+        for(String key:valueMap.keySet()) {
+            objectNode.set(key, valueMap.get(key));
+        }
+    }
+    /***
+     * Description: 通用处理infos的查询条件
+     * @param value : key对应的值
+     * @param infoCode : 信息点code
+     * @param node : 查询条件对象
+     * @param valueMap : 信息点code与值的映射
+     * @param fieldNames : 字段列表
+     * @return : void
+     * @author : lijie
+     * @date :2021/10/20 19:16
+     * Update By lijie 2021/10/20 19:16
+     */
+    private static void commonProcessInfosCond(JsonNode value,String infoCode, ObjectNode node,
+                                               Map<String, JsonNode> valueMap,
+                                               Iterator<String> fieldNames) {
+        // 如果值是对象 先处理contains并移除
+        if(value.isObject()) {
+            // 包含
+            if (value.has(QueryOperator.CONTAINS.getIndex())) {
+                JsonNode valueNode = value.get(QueryOperator.CONTAINS.getIndex());
+                String valueStr = valueNode.isTextual() ? value.asText():value.toString();
+                String key = StrUtil.format("#JSON#json_contains({}, {}, '$.{}')", ObjectDigital.EXTRA_COLUMN, valueStr, infoCode);
+                valueMap.put(key, node.numberNode(1));
+                ((ObjectNode) value).remove(QueryOperator.CONTAINS.getIndex());
+            } else if (value.has(QueryOperator.NOT_CONTAINS.getIndex())) {
+                // 不包含
+                JsonNode valueNode = value.get(QueryOperator.NOT_CONTAINS.getIndex());
+                String valueStr = valueNode.isTextual() ? value.asText():value.toString();
+                String key = StrUtil.format("#JSON#json_contains({}, {}, '$.{}')", ObjectDigital.EXTRA_COLUMN, valueStr, infoCode);
+                valueMap.put(key, node.numberNode(0));
+                ((ObjectNode) value).remove(QueryOperator.NOT_CONTAINS.getIndex());
+            }
+        }
+        // 获取格式化的Key
+        String key = ensureFormatKey(infoCode, value);
+        valueMap.put(key,value);
+        // 处理完成后删除
+        fieldNames.remove();
+    }
 
 
     /**
     /**
      * 格式化Key
      * 格式化Key

+ 23 - 5
dmp-business/dmp-rwd/src/main/resources/mapper/ObjectDigitalMapper.xml

@@ -267,16 +267,34 @@
             <property name="param" value="#{param}"/>
             <property name="param" value="#{param}"/>
         </include>
         </include>
     </select>
     </select>
-    <select id="queryObjectListByRelIdAndClassCode" resultMap="BaseResultMap,count">
-        <include refid="commonQueryObjectListByParam">
+    <select id="queryObjectListByRelIdAndClassCode" resultMap="BaseResultMap">
+        SELECT DISTINCT
+        dto.*,
+        JSON_ARRAYAGG( dtr.obj_from ) AS objFromIds,
+        JSON_ARRAYAGG( dtr.obj_to ) AS objToIds
+        FROM
+        dt_object AS dto
+        INNER JOIN ( SELECT * FROM dt_relation AS dtrA WHERE 1=1
+        <if test="null!=param.relId and param.relId.length>0">
+            AND (dtrA.obj_from = #{param.relId} OR dtrA.obj_to=#{param.relId})
+        </if>
+        <if test="null!=param.projectId and param.projectId.length>0">
+            AND dtrA.project_id = #{param.projectId}
+        </if>
+        <if test="null!=param.relCode and param.relCode.length>0">
+            AND dtrA.rel_code = #{param.relCode}
+        </if>
+        <if test="null!=param.groupCode and param.groupCode.length>0">
+            AND dtrA.group_code = #{param.groupCode}
+        </if>
+        ) AS dtr ON (dtr.obj_to = dto.id OR dtr.obj_from = dto.id)
+        <include refid="commonQueryObjectListByParamDtObjectWhereCondition">
             <property name="param" value="#{param}"/>
             <property name="param" value="#{param}"/>
         </include>
         </include>
         <if test="null!=param.classCode and param.classCode.length>0">
         <if test="null!=param.classCode and param.classCode.length>0">
             AND dto.class_code=#{param.classCode}
             AND dto.class_code=#{param.classCode}
         </if>
         </if>
-        <include refid="commonQueryObjectListByParamSuffix">
-            <property name="param" value="#{param}"/>
-        </include>
+        GROUP BY dto.id
     </select>
     </select>
     <select id="queryEquipListByClassCode" resultMap="BaseResultMap,count">
     <select id="queryEquipListByClassCode" resultMap="BaseResultMap,count">
         SELECT DISTINCT SQL_CALC_FOUND_ROWS
         SELECT DISTINCT SQL_CALC_FOUND_ROWS

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

@@ -1,8 +1,11 @@
 package com.persagy.dmp.basic.utils;
 package com.persagy.dmp.basic.utils;
 
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Filter;
+import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ReflectUtil;
 import cn.hutool.core.util.ReflectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -11,6 +14,8 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.common.exception.BusinessException;
 import com.persagy.dmp.common.exception.BusinessException;
 import com.persagy.dmp.common.helper.SpringHelper;
 import com.persagy.dmp.common.helper.SpringHelper;
+import org.apache.poi.ss.formula.functions.FactDouble;
+import org.apache.poi.ss.formula.functions.T;
 
 
 import java.io.IOException;
 import java.io.IOException;
 import java.lang.reflect.Field;
 import java.lang.reflect.Field;
@@ -146,7 +151,7 @@ public class JsonNodeUtils {
      */
      */
     public static <T> T toEntity(ObjectNode node, Class<T> clazz, String extraColumn) {
     public static <T> T toEntity(ObjectNode node, Class<T> clazz, String extraColumn) {
         // 检查clazz包含的属性
         // 检查clazz包含的属性
-        Map<String, Field> fieldMap = ReflectUtil.getFieldMap(clazz);
+        Map<String, Field> fieldMap = getFieldMap(clazz);
         Set<String> fieldSet = fieldMap.keySet();
         Set<String> fieldSet = fieldMap.keySet();
         // 转换node
         // 转换node
         collectExtras(node, extraColumn, fieldSet, null);
         collectExtras(node, extraColumn, fieldSet, null);
@@ -169,7 +174,7 @@ public class JsonNodeUtils {
      */
      */
     public static <T> List<T> toEntity(ArrayNode array, Class<T> clazz, String extraColumn) {
     public static <T> List<T> toEntity(ArrayNode array, Class<T> clazz, String extraColumn) {
         // 检查clazz包含的属性
         // 检查clazz包含的属性
-        Map<String, Field> fieldMap = ReflectUtil.getFieldMap(clazz);
+        Map<String, Field> fieldMap = getFieldMap(clazz);
         Set<String> fieldSet = fieldMap.keySet();
         Set<String> fieldSet = fieldMap.keySet();
         // 转换node
         // 转换node
         for(int i = 0;i < array.size();i++) {
         for(int i = 0;i < array.size();i++) {
@@ -185,6 +190,25 @@ public class JsonNodeUtils {
             throw new BusinessException(ResponseCode.A0427.getCode(), ResponseCode.A0427.getDesc());
             throw new BusinessException(ResponseCode.A0427.getCode(), ResponseCode.A0427.getDesc());
         }
         }
     }
     }
+    /***
+     * Description: 根据字段映射过滤掉字段带有false的字段
+     * @param clazz : 对象类型
+     * @return : java.util.Map<java.lang.String,java.lang.reflect.Field>  
+     * @author : lijie
+     * @date :2021/10/20 18:13
+     * Update By lijie 2021/10/20 18:13
+     */
+    public static <T> Map<String,Field> getFieldMap(Class<T> clazz){
+        Map<String, Field> fieldMap = ReflectUtil.getFieldMap(clazz);
+        return MapUtil.filter(fieldMap, (Filter<Map.Entry<String, Field>>) entry -> {
+            Field field = entry.getValue();
+            TableField tableField = field.getAnnotation(TableField.class);
+            if (null != tableField && !tableField.exist()) {
+                return false;
+            }
+            return true;
+        });
+    }
 
 
     /**
     /**
      * 收集扩展属性
      * 收集扩展属性