shicf
3 天以前 b8dbd91e4a1552a1e11cd5fe4eef09f296cf656b
src/main/java/com/product/face/entity/FaceListEntity.java
@@ -1,5 +1,6 @@
package com.product.face.entity;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.product.admin.config.CmnConst;
@@ -56,6 +57,31 @@
   private String tableName;
   /**
    * 是否显示树
    */
   private String treeShow;
   /**
    * 树数据源类型
    */
   private String treeDataType;
   /**
    * 数据源
    */
   private String treeDataSource;
   /**
    * 树label key
    */
   private String treeLabelKey;
   /**
    * 树value key
    */
   private String treeValueKey;
   /**
    * 获取表名
    *
    * @return
@@ -81,8 +107,9 @@
    * @param columnWidth    列宽
    * @param sequence       排序
    * @param fieldReference 参照
    * @param search        是否搜索
    */
   public void addField(String fieldName, String faceUuid, String columnName, String columnWidth, Integer sequence, String fieldReference) {
   public void addField(String fieldName, String faceUuid, String columnName, String columnWidth, Integer sequence, String fieldReference, boolean search) {
      FaceField faceField = new FaceField();
      faceField.setFieldName(fieldName);
      faceField.setFieldUuid(faceUuid);
@@ -90,6 +117,7 @@
      faceField.setColumnWidth(columnWidth);
      faceField.setSequence(sequence);
      faceField.setFieldReference(fieldReference);
      faceField.setSearch(search);
      if (this.faceFields == null) {
         this.faceFields = Lists.newArrayList();
      }
@@ -147,6 +175,50 @@
      this.faceFields = faceFields;
   }
   public void setTableName(String tableName) {
      this.tableName = tableName;
   }
   public String getTreeShow() {
      return treeShow;
   }
   public void setTreeShow(String treeShow) {
      this.treeShow = treeShow;
   }
   public String getTreeDataType() {
      return treeDataType;
   }
   public void setTreeDataType(String treeDataType) {
      this.treeDataType = treeDataType;
   }
   public String getTreeDataSource() {
      return treeDataSource;
   }
   public void setTreeDataSource(String treeDataSource) {
      this.treeDataSource = treeDataSource;
   }
   public String getTreeLabelKey() {
      return treeLabelKey;
   }
   public void setTreeLabelKey(String treeLabelKey) {
      this.treeLabelKey = treeLabelKey;
   }
   public String getTreeValueKey() {
      return treeValueKey;
   }
   public void setTreeValueKey(String treeValueKey) {
      this.treeValueKey = treeValueKey;
   }
   /**
    * 获取参照条件
    *
@@ -181,7 +253,6 @@
      }
      return filter.toString();
   }
   /**
    * 获取条件
    *
@@ -203,6 +274,9 @@
      maps.put("filter", filters);
      for (int i = 0; i < faceFields.size(); i++) {
         FaceField faceField = faceFields.get(i);
         if (!faceField.isSearch()) {
            continue;
         }
         if (StringUtils.isEmpty(faceField.getFieldName()) || StringUtils.isEmpty(faceField.getFieldReference())) {
            if (poolCache == null) {
               poolCache = DataPoolCacheImpl.getInstance();
@@ -217,12 +291,15 @@
         }
         //字段名称
         String fieldName = faceField.getFieldName();
         if (!StringUtils.isEmpty(fieldName)) {
            fieldName.trim();
         }
         if (aliasField != null && !StringUtils.isEmpty(fieldName)) {
            List<String> fieldAlias = aliasField.get(getTableName() + "." + fieldName);
            if (fieldAlias != null && fieldAlias.size() > 0) {
               String alias = fieldAlias.get(0);
               if (!StringUtils.isEmpty(alias)) {
                  fieldName = alias;
                  fieldName = alias.trim();
               }
            }
         }
@@ -244,7 +321,7 @@
               }
               FieldSetEntity ff = prompt.getFieldSetEntity(0);
               StringBuilder p = new StringBuilder();
               p.append(getFieldName(tableAlias, fieldName)).append("` in ").append(" ( SELECT `").append(ff.getString("value_field")).append("` FROM ").append(ff.getString("source_table"));
               p.append(getFieldName(tableAlias, fieldName)).append(" in ").append(" ( SELECT ").append(ff.getString("value_field")).append(" FROM ").append(ff.getString("source_table"));
               p.append(" WHERE ").append(ff.getString("view_fields")).append(" like concat('%','~val~','%') )");
               filters.add(p.toString());
               continue;
@@ -258,7 +335,94 @@
      //获取redis 起始key
      String faceListKey = SystemFaceService.FACE_LIST_KEY;
      //重新放入redis
      RedisUtil.set(faceListKey + getUuid(), this);
      RedisUtil.set(faceListKey + getUuid(), JSON.parseObject(JSON.toJSONString(this), com.product.admin.entity.FaceListEntity.class));
      return maps;
   }
   /**
    * 新的方法,根据查询语句的中的表别名,生成查询条件
    *
    * @param tableAlias 表别名
    * @param aliasField 字段别名
    * @param  tableAndField 表中字段
    * @return
    */
   public Map<String, List<String>> getFilters(Map<String, List<String>> tableAlias, Map<String, List<String>> aliasField,Map<String, List<String>> tableAndField) {
      DataPoolCacheImpl poolCache = null;
      //所有字段集合
      List<FaceField> faceFields = this.getFaceFields();
      //普通模糊查询字段集合
      List<String> fieldNames = Lists.newArrayList();
      //参照模糊查询条件集合
      List<String> filters = Lists.newArrayList();
      //返回的结果集
      Map<String, List<String>> maps = Maps.newHashMap();
      maps.put("fields", fieldNames);
      maps.put("filter", filters);
      for (int i = 0; i < faceFields.size(); i++) {
         FaceField faceField = faceFields.get(i);
         if (!faceField.isSearch()) {
            continue;
         }
         if (StringUtils.isEmpty(faceField.getFieldName()) || StringUtils.isEmpty(faceField.getFieldReference())) {
            if (poolCache == null) {
               poolCache = DataPoolCacheImpl.getInstance();
            }
            DataTableEntity dt = poolCache.getCacheData("表字段信息", new String[]{getTableUuid(), faceField.getFieldName()});
            if (BaseUtil.dataTableIsEmpty(dt)) {
            } else {
               FieldSetEntity f = dt.getFieldSetEntity(0);
               faceField.setFieldName(f.getString(CmnConst.FIELD_NAME));
               faceField.setFieldReference(f.getString("field_reference"));
            }
         }
         //字段名称
         String fieldName = faceField.getFieldName();
         if (!StringUtils.isEmpty(fieldName)) {
            fieldName.trim();
         }
         if (aliasField != null && !StringUtils.isEmpty(fieldName)) {
            List<String> fieldAlias = aliasField.get(getTableName() + "." + fieldName);
            if (fieldAlias != null && fieldAlias.size() > 0) {
               String alias = fieldAlias.get(0);
               if (!StringUtils.isEmpty(alias)) {
                  fieldName = alias.trim();
               }
            }
         }
         //参照处理
         String field_reference = faceField.getFieldReference();
         if (!StringUtils.isEmpty(field_reference)) {
            if (field_reference.indexOf("《") == 0 && field_reference.indexOf("》") > 0) {
               //普通参照
               filters.add(getDictFilter(getFieldName(tableAlias,aliasField, tableAndField, fieldName), field_reference.replace("《", "").replace("》", "")));
               continue;
            } else {
               if (poolCache == null) {
                  poolCache = DataPoolCacheImpl.getInstance();
               }
               //高级参照
               DataTableEntity prompt = poolCache.getCacheData("高级参照配置信息", new String[]{field_reference});
               if (BaseUtil.dataTableIsEmpty(prompt)) {
                  continue;
               }
               FieldSetEntity ff = prompt.getFieldSetEntity(0);
               StringBuilder p = new StringBuilder();
               p.append(getFieldName(tableAlias,aliasField, tableAndField, fieldName)).append(" in ").append(" ( SELECT ").append(ff.getString("value_field")).append(" FROM ").append(ff.getString("source_table"));
               p.append(" WHERE ").append(ff.getString("view_fields")).append(" like concat('%','~val~','%') )");
               filters.add(p.toString());
               continue;
            }
         }
         if (!StringUtils.isEmpty(faceField.getFieldName())) {
            fieldNames.add(getFieldName(tableAlias,aliasField, tableAndField, fieldName));
         }
      }
      //获取redis 起始key
      String faceListKey = SystemFaceService.FACE_LIST_KEY;
      //重新放入redis
      RedisUtil.set(faceListKey + getUuid(), JSON.parseObject(JSON.toJSONString(this), com.product.admin.entity.FaceListEntity.class));
      return maps;
   }
@@ -266,6 +430,50 @@
      fieldName = "`" + fieldName + "`";
      if (!StringUtils.isEmpty(tableAlias)) {
         return "`" + tableAlias + "`." + fieldName;
      }
      return fieldName;
   }
   //新方法
   private String getFieldName(Map<String, List<String>> tableAlias,Map<String, List<String>> aliasField, Map<String, List<String>> tableAndField, String fieldName) {
      String table=null;
      boolean b=false;
      if(!tableAndField.isEmpty()) {
         for(String key:tableAndField.keySet()) {
            for(String field:tableAndField.get(key)) {
               if(fieldName.equals(field)) {
                  List<String>alias=tableAlias.get(key);
                  if(!alias.isEmpty()) {
                     table=alias.get(0);//取第一个别名
                  }
                  b=true;
                  break;
               }
            }
            if(b)break;
         }
      }
      b=false;
      //找到字段的真实名字
      for(String f:aliasField.keySet()) {
         List<String> fs=aliasField.get(f);
         if(!fs.isEmpty()) {
            for(String af:fs) {
               //字段别名有可能是带 表别名
               int c=af.indexOf('.');
               if(c>0)af=af.substring(c+1);
               if(fieldName.equals(af)) {
                  fieldName=f;
                  b=true;
                  break;
               }
            }
         }
         if(b)break;
      }
      if (fieldName.indexOf('.')<0 && !StringUtils.isEmpty(table)) {
         return "`" + table + "`." + fieldName;
      }
      return fieldName;
   }
@@ -300,6 +508,8 @@
       * 字段参照
       */
      private String fieldReference;
      private boolean search;
      public String getFieldReference() {
         return fieldReference;
@@ -349,6 +559,14 @@
         this.sequence = sequence;
      }
      public boolean isSearch() {
         return search;
      }
      public void setSearch(boolean search) {
         this.search = search;
      }
   }
}