shicf
昨天 b8dbd91e4a1552a1e11cd5fe4eef09f296cf656b
综合搜索,多表且有别名,报错
已修改2个文件
198 ■■■■■ 文件已修改
src/main/java/com/product/face/entity/FaceListEntity.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/face/service/FaceListSearchService.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/face/entity/FaceListEntity.java
@@ -253,7 +253,6 @@
        }
        return filter.toString();
    }
    /**
     * 获取条件
     *
@@ -339,6 +338,93 @@
        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;
    }
    private String getFieldName(String tableAlias, String fieldName) {
        fieldName = "`" + fieldName + "`";
@@ -347,6 +433,50 @@
        }
        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;
    }
    /**
     * 字段实体类
src/main/java/com/product/face/service/FaceListSearchService.java
@@ -19,7 +19,18 @@
 */
@Component
public class FaceListSearchService extends AbstractBaseService {
    /**
     * 不用
     * 列表关键字搜索
     * @param aliasTable
     * @param aliasField
     * @param faceUuid
     * @param faceNumber
     * @param val
     * @return
     * @throws BaseException
     */
    public String getFaceListSearchFilter(Map<String, List<String>> aliasTable, Map<String, List<String>> aliasField, String faceUuid, String faceNumber, String val) throws BaseException {
        if (StringUtils.isEmpty(val)) {
            return "";
@@ -57,4 +68,57 @@
        }
        return "";
    }
    /**
     * 列表关键字搜索
     * @param aliasTable  {"product_sys_staffs":["a"],"product_sys_users":["b"],"product_sys_job_posts":["e"],"product_sys_org_levels":["c","d"]}
     * @param aliasField
     * @param faceUuid
     * @param faceNumber
     * @param val
     * @param tableOfField  表对应字段 如:table_relate_fields = {
        "product_sys_staffs": ["uuid", "staff_status", "staff_avatar", "show_name", "mobile_phone", "staff_status_save_value", "status_save_value"],
        "product_sys_users": ["uuid1", "user_name", "user_id", "user_account", "status"],
        "product_sys_job_posts": ["job_post_uuid"],
        "product_sys_org_levels": ["uuid2", "uuid3", "org_level_uuid", "dept_uuid"]
    }
     * @return
     * @throws BaseException
     */
    public String getFaceListSearchFilter(Map<String, List<String>> aliasTable, Map<String, List<String>> aliasField, String faceUuid, String faceNumber, String val, Map<String, List<String>> tableOfField) throws BaseException {
        if (StringUtils.isEmpty(val)) {
            return "";
        }
        FaceListEntity face = null;
        if (!StringUtils.isEmpty(faceNumber)) {
            face = (FaceListEntity) RedisUtil.get(FaceConst.FACE_LIST_KEY + ":face-number" + faceNumber);
        } else if (!StringUtils.isEmpty(faceUuid)) {
            face = JSON.parseObject(JSON.toJSONString(RedisUtil.get(FaceConst.FACE_LIST_KEY + faceUuid)), FaceListEntity.class);
        }
        if (face != null) {
            String tableAlias = null;
            String tableName = face.getTableName();
            List<String> t = aliasTable.get(tableName);
            if (t != null && t.size() > 0) {
                tableAlias = t.get(0);
            }
            Map<String, List<String>> params = face.getFilters(aliasTable, aliasField,tableOfField);
            List<String> fieldNames = params.get("fields");
            List<String> filters = params.get("filter");
            String filter = "";
            for (int i = 0; i < fieldNames.size(); i++) {
                if (i > 0) {
                    filter += " or ";
                }
                filter += " " + fieldNames.get(i) + " LIKE BINARY concat('%','" + val + "','%')";
            }
            for (int i = 0; i < filters.size(); i++) {
                if (!"".equals(filter)) {
                    filter += " or ";
                }
                filter += filters.get(i).replace("~val~", val);
            }
            return "".equals(filter) ? "" : "( " + filter + " )";
        }
        return "";
    }
}