From b8dbd91e4a1552a1e11cd5fe4eef09f296cf656b Mon Sep 17 00:00:00 2001
From: shicf <shi_chongfu@163.com>
Date: 星期一, 04 八月 2025 16:13:21 +0800
Subject: [PATCH] 综合搜索,多表且有别名,报错
---
src/main/java/com/product/face/entity/FaceListEntity.java | 132 ++++++++++++++++++++++++++++++++
src/main/java/com/product/face/service/FaceListSearchService.java | 66 ++++++++++++++++
2 files changed, 196 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/product/face/entity/FaceListEntity.java b/src/main/java/com/product/face/entity/FaceListEntity.java
index 4040366..fb791e2 100644
--- a/src/main/java/com/product/face/entity/FaceListEntity.java
+++ b/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;
+ }
/**
* 瀛楁瀹炰綋绫�
diff --git a/src/main/java/com/product/face/service/FaceListSearchService.java b/src/main/java/com/product/face/service/FaceListSearchService.java
index f70da33..eb8a71f 100644
--- a/src/main/java/com/product/face/service/FaceListSearchService.java
+++ b/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 "";
+ }
}
--
Gitblit v1.9.2