Procházet zdrojové kódy

解决查询条件json中对象类型不解析问题

yucheng před 3 roky
rodič
revize
ba8d23215d

+ 55 - 14
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/utils/ObjectDigitalCriteriaHelper.java

@@ -1,19 +1,18 @@
 package com.persagy.dmp.rwd.digital.utils;
 
 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.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.basic.model.QueryOperator;
 import com.persagy.dmp.basic.utils.JsonNodeUtils;
 import com.persagy.dmp.common.model.entity.BaseEntity;
 import com.persagy.dmp.digital.entity.ObjectDigital;
 
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 /**
  * 对象 查询条件 助手
@@ -62,7 +61,7 @@ public class ObjectDigitalCriteriaHelper {
                 processOrCond(value);
                 continue;
             }
-            // 如果值是对象
+            // 如果值是对象 先处理contains并移除
             if(value.isObject()) {
                 // 包含
                 if (value.has(QueryOperator.CONTAINS.getIndex())) {
@@ -70,23 +69,19 @@ public class ObjectDigitalCriteriaHelper {
                     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());
                 }
-            } else if(value.isTextual()) {
-                String key = StrUtil.format("#JSON#json_unquote(json_extract({}, '$.{}'))", ObjectDigital.EXTRA_COLUMN, infoCode);
-                valueMap.put(key, value);
-            } else if(value.isInt()) {
-                String key = StrUtil.format("#JSON#ifnull(json_extract({}, '$.{}'), -9999)", ObjectDigital.EXTRA_COLUMN, infoCode);
-                valueMap.put(key, value);
-            } else if(value.isDouble()) {
-                String key = StrUtil.format("#JSON#ifnull(json_extract({}, '$.{}'), -9999.99)", ObjectDigital.EXTRA_COLUMN, infoCode);
-                valueMap.put(key, value);
             }
+            // 获取格式化的Key
+            String key = ensureFormatKey(infoCode, value);
+            valueMap.put(key, value);
             // 处理完成后删除
             fieldNames.remove();
         }
@@ -100,6 +95,52 @@ public class ObjectDigitalCriteriaHelper {
     }
 
     /**
+     * 格式化Key
+     * @param infoCode
+     * @param value
+     */
+    private static String ensureFormatKey(String infoCode, JsonNode value) {
+        if(StrUtil.isBlank(infoCode) || value == null) {
+            return null;
+        }
+        String format = null;
+        // 如果值是对象
+        if(value.isObject()) {
+            ObjectNode obj = (ObjectNode) value;
+            if (obj.has("$like")) {
+                format = "#JSON#json_unquote(json_extract({}, '$.{}'))";
+            } else {
+                for (String key : Arrays.asList("$gt", "$lt", "$gte", "$lte", "$ne")) {
+                    if (obj.has(key)) {
+                        // 递归处理
+                        return ensureFormatKey(infoCode, obj.get(key));
+                    }
+                }
+            }
+        } else if (value.isArray()) {
+            ArrayNode array = (ArrayNode) value;
+            if (ArrayUtil.isEmpty(array)) {
+                return null;
+            }
+            // 递归处理
+            return ensureFormatKey(infoCode, array.get(0));
+        } else if (value.isNull()) {
+            return null;
+        } else if (value.isTextual()) {
+            format = "#JSON#json_unquote(json_extract({}, '$.{}'))";
+        } else if (value.isDouble() || value.isFloat() || value.isBigDecimal()) {
+            format = "#JSON#ifnull(json_extract({}, '$.{}'), -9999.99)";
+        } else if (value.isInt() || value.isLong() || value.isShort() || value.isBigInteger()) {
+            format = "#JSON#ifnull(json_extract({}, '$.{}'), -9999)";
+        } else if (value.isBoolean()) {
+            format = "#JSON#ifnull(json_extract({}, '$.{}'), 0)";
+        } else if (value.isPojo()) {
+            format = "#JSON#json_unquote(json_extract({}, '$.{}'))";
+        }
+        return StrUtil.format(format, ObjectDigital.EXTRA_COLUMN, infoCode);
+    }
+
+    /**
      * 处理or条件
      * @param node
      */