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