From d5f77a020d823d64b8f6f7a6cc5a8432ee11b1ab Mon Sep 17 00:00:00 2001
From: zhongrj <646384940@qq.com>
Date: Sat, 13 Apr 2024 19:56:07 +0800
Subject: [PATCH] es 搜索及数据初始化调整

---
 src/main/java/org/springblade/modules/grid/mapper/GridRangeMapper.java            |    7 ++
 src/main/java/org/springblade/es/service/ElasticsearchDocumentService.java        |   50 +++++++++++++---
 src/main/java/org/springblade/modules/system/mapper/RegionMapper.java             |    7 ++
 src/main/java/org/springblade/modules/system/service/IRegionService.java          |    7 ++
 src/main/java/org/springblade/common/cache/CacheNames.java                        |    5 +
 src/main/java/org/springblade/modules/article/controller/ArticleController.java   |    4 +
 src/main/java/org/springblade/es/vo/EsParam.java                                  |    5 +
 src/main/java/org/springblade/modules/grid/service/IGridRangeService.java         |    7 ++
 src/main/java/org/springblade/modules/grid/mapper/GridRangeMapper.xml             |    7 ++
 src/main/java/org/springblade/modules/system/mapper/RegionMapper.xml              |   35 +++++++++++
 src/main/java/org/springblade/modules/system/service/impl/RegionServiceImpl.java  |   11 +++
 src/main/java/org/springblade/common/cache/SysCache.java                          |    9 +++
 src/main/java/org/springblade/modules/grid/service/impl/GridRangeServiceImpl.java |   10 +++
 13 files changed, 155 insertions(+), 9 deletions(-)

diff --git a/src/main/java/org/springblade/common/cache/CacheNames.java b/src/main/java/org/springblade/common/cache/CacheNames.java
index 11b5e3e..9087966 100644
--- a/src/main/java/org/springblade/common/cache/CacheNames.java
+++ b/src/main/java/org/springblade/common/cache/CacheNames.java
@@ -58,4 +58,9 @@
 	 */
 	String USER_FAIL_KEY = "blade:user::blade:fail:";
 
+	/**
+	 *
+	 */
+	String ARTICLE_KEY = "blade:article:";
+
 }
diff --git a/src/main/java/org/springblade/common/cache/SysCache.java b/src/main/java/org/springblade/common/cache/SysCache.java
index 100c552..6b0c53b 100644
--- a/src/main/java/org/springblade/common/cache/SysCache.java
+++ b/src/main/java/org/springblade/common/cache/SysCache.java
@@ -13,6 +13,7 @@
 import java.util.List;
 import java.util.stream.Collectors;
 
+import static org.springblade.common.cache.CacheNames.ARTICLE_KEY;
 import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
 
 /**
@@ -508,4 +509,12 @@
 		return CacheUtil.get(SYS_CACHE, REGION_CHILD_CODE, regionCode, () -> regionService.getRegionChild(regionCode,communityCode));
 	}
 
+	/**
+	 * 查询当前文章范围对应的社区编号字符串集合
+	 * @param articleRange
+	 * @return
+	 */
+	public static String getAllCommunityNameListString(String articleRange,String id) {
+		return CacheUtil.get(ARTICLE_KEY, "id", id ,() -> regionService.getAllCommunityNameListString(articleRange));
+	}
 }
diff --git a/src/main/java/org/springblade/es/service/ElasticsearchDocumentService.java b/src/main/java/org/springblade/es/service/ElasticsearchDocumentService.java
index 42457df..97c24f7 100644
--- a/src/main/java/org/springblade/es/service/ElasticsearchDocumentService.java
+++ b/src/main/java/org/springblade/es/service/ElasticsearchDocumentService.java
@@ -1,5 +1,6 @@
 package org.springblade.es.service;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.logging.log4j.util.Strings;
 import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
@@ -21,12 +22,14 @@
 import org.elasticsearch.search.SearchHit;
 import org.elasticsearch.search.SearchHits;
 import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.springblade.common.cache.SysCache;
 import org.springblade.common.constant.EsTableConstant;
 import org.springblade.common.param.CommonParamSet;
 import org.springblade.common.utils.SpringUtils;
 import org.springblade.es.vo.EsParam;
 import org.springblade.modules.article.entity.Article;
 import org.springblade.modules.article.service.ArticleService;
+import org.springblade.modules.grid.service.IGridRangeService;
 import org.springblade.modules.house.entity.HouseEntity;
 import org.springblade.modules.house.entity.HouseholdEntity;
 import org.springblade.modules.house.service.IHouseService;
@@ -65,6 +68,9 @@
 
 	@Autowired
 	private IHouseholdService householdService;
+
+	@Autowired
+	private IGridRangeService gridRangeService;
 
 	@Value("${elasticsearch.sync}")
 	private boolean elasticsearchSync;
@@ -180,12 +186,17 @@
 				for (Article article : articleList) {
 					// 初始化Elasticsearch客户端
 					IndexRequest indexRequest = new IndexRequest(esParam.getIndexName());
+					String communityNameListString
+						= SysCache.getAllCommunityNameListString(article.getArticleRange(),article.getId().toString());
+					Map<String, Object> map = new HashMap<>(1);
+					map.put("communityCode",communityNameListString);
+					String toString = new JSONObject(map).toString();
 					// 不设置id
 					// indexRequest.id("1");
 					indexRequest.source("tableId", article.getId().toString(),
 						"tableName", "jczz_article",
 						"title", article.getTitle(),
-						"communityCode", article.getArticleRange(),
+						"communityCode", toString,
 						"type", null != article.getType() ? article.getType().toString() : "",
 						"content", article.getContent(),
 						"articleType", article.getArticleType());
@@ -319,12 +330,17 @@
 	@Async
 	public void addArticle(EsParam esParam, Article article) {
 		if (elasticsearchSync) {
+			// 查询当前文章范围对应的社区名称字符串集合
+			String communityNameListString = SysCache.getAllCommunityNameListString(article.getArticleRange(),article.getId().toString());
+			Map<String, Object> map = new HashMap<>(1);
+			map.put("communityCode",communityNameListString);
+			String toString = new JSONObject(map).toString();
 			try {
 				indexDocument(esParam.getIndexName(),
 					"tableId", article.getId().toString(),
 					"tableName", "jczz_article",
 					"title", article.getTitle(),
-					"communityCode", article.getArticleRange(),
+					"communityCode", toString,
 					"type", null != article.getType() ? article.getType().toString() : "",
 					"content", article.getContent(),
 					"articleType", article.getArticleType()
@@ -464,18 +480,24 @@
 			BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
 //			boolQueryBuilder.should(QueryBuilders.matchQuery("content", esParam.getSearchKey()));
 //			boolQueryBuilder.should(QueryBuilders.matchQuery("name", esParam.getSearchKey()));
-			boolQueryBuilder.should(QueryBuilders.matchQuery("title", esParam.getSearchKey()));
+			boolQueryBuilder.should(QueryBuilders.matchPhraseQuery("title", esParam.getSearchKey()));
 //			boolQueryBuilder.should(QueryBuilders.matchQuery("location", esParam.getSearchKey()));
 //			boolQueryBuilder.should(QueryBuilders.matchQuery("phone", esParam.getSearchKey()));
 //			boolQueryBuilder.should(QueryBuilders.matchQuery("idCard", esParam.getSearchKey()));
 			if (!Strings.isBlank(esParam.getTableName())) {
 				boolQueryBuilder.must(QueryBuilders.matchQuery("tableName", esParam.getTableName()));
 			}
+			String roleName = SpringUtils.getRequestParam("roleName");
 			String communityCode = SpringUtils.getRequestParam("communityCode");
 			if (!Strings.isBlank(communityCode)) {
-				boolQueryBuilder.must(QueryBuilders.matchQuery("communityCode", communityCode));
+				if (!Strings.isBlank(roleName) && roleName.equals("inhabitant") && !Strings.isBlank(esParam.getHouseCode())){
+					// 居民根据房屋对应的小区过滤
+					boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("communityCode",gridRangeService.getDistrictIdByHouseCode(esParam.getHouseCode())));
+				}else {
+					// 设置查询社区名称,编号有多个,数字类型目前无法匹配到
+					boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("communityCode", communityCode));
+				}
 			}
-			String roleName = SpringUtils.getRequestParam("roleName");
 			if (!Strings.isBlank(roleName)){
 				if (roleName.equals("wgy") || roleName.equals("mj")){
 					// 不查公告
@@ -636,12 +658,17 @@
 	 * @param data
 	 */
 	private void setArticleMap(Article item, Map<String, Object> data) {
+		// 查询当前文章范围对应的社区名称字符串集合
+		String communityNameListString = SysCache.getAllCommunityNameListString(item.getArticleRange(),item.getId().toString());
+		Map<String, Object> map = new HashMap<>(1);
+		map.put("communityCode",communityNameListString);
+		String toString = new JSONObject(map).toString();
 		data.put("tableId",item.getId());
 		data.put("title",item.getTitle());
 		data.put("type",item.getType());
 		data.put("content",item.getContent());
 		data.put("articleType",item.getArticleType());
-		data.put("communityCode",item.getArticleRange());
+		data.put("communityCode",toString);
 	}
 	/**
 	 * 设置场所map
@@ -690,9 +717,14 @@
 			DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(esParam.getIndexName());
 			// 根据多个条件 生成 boolQueryBuilder
 			BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
-			boolQueryBuilder
-				.must(QueryBuilders.matchQuery("tableId", esParam.getTableId()))
-				.must(QueryBuilders.matchQuery("tableName", esParam.getTableName()));
+			if (!Strings.isBlank(esParam.getTableId())){
+				boolQueryBuilder
+					.must(QueryBuilders.matchQuery("tableId", esParam.getTableId()));
+			}
+			if (!Strings.isBlank(esParam.getTableName())) {
+				boolQueryBuilder
+					.must(QueryBuilders.matchQuery("tableName", esParam.getTableName()));
+			}
 			deleteByQueryRequest.setQuery(boolQueryBuilder);
 			try {
 				BulkByScrollResponse bulkResponse =
diff --git a/src/main/java/org/springblade/es/vo/EsParam.java b/src/main/java/org/springblade/es/vo/EsParam.java
index a637caf..daa4f81 100644
--- a/src/main/java/org/springblade/es/vo/EsParam.java
+++ b/src/main/java/org/springblade/es/vo/EsParam.java
@@ -29,4 +29,9 @@
 	 * 社区编号
 	 */
 	private String communityCode;
+
+	/**
+	 * 地址编码
+	 */
+	private String houseCode;
 }
diff --git a/src/main/java/org/springblade/modules/article/controller/ArticleController.java b/src/main/java/org/springblade/modules/article/controller/ArticleController.java
index 01a1409..2bcf9d8 100644
--- a/src/main/java/org/springblade/modules/article/controller/ArticleController.java
+++ b/src/main/java/org/springblade/modules/article/controller/ArticleController.java
@@ -7,6 +7,7 @@
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
+import org.springblade.core.cache.utils.CacheUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
@@ -21,6 +22,8 @@
 import javax.validation.Valid;
 import java.util.Date;
 import java.util.List;
+
+import static org.springblade.common.cache.CacheNames.ARTICLE_KEY;
 
 /**
  * @author zhongrj
@@ -169,6 +172,7 @@
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改资讯信息", notes = "传入article")
 	public R submit(@RequestBody Article article) {
+		CacheUtil.clear(ARTICLE_KEY);
 		boolean flag = false;
 		if (null == article.getId()) {
 			flag = true;
diff --git a/src/main/java/org/springblade/modules/grid/mapper/GridRangeMapper.java b/src/main/java/org/springblade/modules/grid/mapper/GridRangeMapper.java
index 962f6e8..dc97bd8 100644
--- a/src/main/java/org/springblade/modules/grid/mapper/GridRangeMapper.java
+++ b/src/main/java/org/springblade/modules/grid/mapper/GridRangeMapper.java
@@ -47,4 +47,11 @@
 	 * @return
 	 */
     List<GridVO> getTestGridData();
+
+	/**
+	 * 根据房屋查询对应的小区
+	 * @param houseCode
+	 * @return
+	 */
+    String getDistrictIdByHouseCode(@Param("houseCode") String houseCode);
 }
diff --git a/src/main/java/org/springblade/modules/grid/mapper/GridRangeMapper.xml b/src/main/java/org/springblade/modules/grid/mapper/GridRangeMapper.xml
index f44122a..597aa52 100644
--- a/src/main/java/org/springblade/modules/grid/mapper/GridRangeMapper.xml
+++ b/src/main/java/org/springblade/modules/grid/mapper/GridRangeMapper.xml
@@ -12,5 +12,12 @@
         select grid as gridName,SUBSTRING_INDEX(area, "-", -1) as communityName,std_id as principal from jczz_test
     </select>
 
+    <!--根据房屋查询对应的小区-->
+    <select id="getDistrictIdByHouseCode" resultType="java.lang.String">
+        SELECT jd.id
+        FROM jczz_district jd
+        LEFT JOIN jczz_doorplate_address jda ON jda.aoi_code = jd.aoi_code
+        WHERE jda.address_code = #{houseCode}
+    </select>
 
 </mapper>
diff --git a/src/main/java/org/springblade/modules/grid/service/IGridRangeService.java b/src/main/java/org/springblade/modules/grid/service/IGridRangeService.java
index 4242998..4ec6f4a 100644
--- a/src/main/java/org/springblade/modules/grid/service/IGridRangeService.java
+++ b/src/main/java/org/springblade/modules/grid/service/IGridRangeService.java
@@ -43,4 +43,11 @@
 	 * 网格范围表数据处理
 	 */
     Object dataHandle();
+
+	/**
+	 * 根据房屋查询对应的小区
+	 * @param houseCode
+	 * @return
+	 */
+	String getDistrictIdByHouseCode(String houseCode);
 }
diff --git a/src/main/java/org/springblade/modules/grid/service/impl/GridRangeServiceImpl.java b/src/main/java/org/springblade/modules/grid/service/impl/GridRangeServiceImpl.java
index 2586506..681caf4 100644
--- a/src/main/java/org/springblade/modules/grid/service/impl/GridRangeServiceImpl.java
+++ b/src/main/java/org/springblade/modules/grid/service/impl/GridRangeServiceImpl.java
@@ -81,4 +81,14 @@
 		}
 		return null;
 	}
+
+	/**
+	 * 根据房屋查询对应的小区
+	 * @param houseCode
+	 * @return
+	 */
+	@Override
+	public String getDistrictIdByHouseCode(String houseCode) {
+		return baseMapper.getDistrictIdByHouseCode(houseCode);
+	}
 }
diff --git a/src/main/java/org/springblade/modules/system/mapper/RegionMapper.java b/src/main/java/org/springblade/modules/system/mapper/RegionMapper.java
index 26360ed..03d1f88 100644
--- a/src/main/java/org/springblade/modules/system/mapper/RegionMapper.java
+++ b/src/main/java/org/springblade/modules/system/mapper/RegionMapper.java
@@ -121,4 +121,11 @@
 	 * @return
 	 */
 	List<Region> getGridRegionChildList(@Param("regionCode") String regionCode);
+
+	/**
+	 * 查询当前文章范围对应的社区编号字符串集合
+	 * @param articleRange
+	 * @return
+	 */
+    List<String> getAllCommunityNameListString(@Param("articleRange") String articleRange);
 }
diff --git a/src/main/java/org/springblade/modules/system/mapper/RegionMapper.xml b/src/main/java/org/springblade/modules/system/mapper/RegionMapper.xml
index 7c32c71..c3c755f 100644
--- a/src/main/java/org/springblade/modules/system/mapper/RegionMapper.xml
+++ b/src/main/java/org/springblade/modules/system/mapper/RegionMapper.xml
@@ -289,4 +289,39 @@
         WHERE is_deleted = 0  AND pcs_code IS NOT NULL
     </select>
 
+    <!--查询当前文章范围对应的社区编号字符串集合-->
+    <select id="getAllCommunityNameListString" resultType="java.lang.String">
+        SELECT
+        code
+        FROM blade_region
+        where
+        <foreach collection="articleRange.split(',')" item="item" open="(" close=")" separator="OR">
+            ancestors like concat('%',#{item},'%')
+        </foreach>
+        and region_level = 5
+        union
+        (
+        SELECT
+        br.code
+        FROM jczz_district jd
+        left join blade_region br on jd.community_code = br.village_code
+        where br.region_level = 5
+        and jd.id in
+        <foreach collection="articleRange.split(',')" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+        )
+        union
+        (
+        SELECT
+        jd.id
+        FROM jczz_district jd
+        where
+        jd.id in
+        <foreach collection="articleRange.split(',')" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+        )
+    </select>
+
 </mapper>
diff --git a/src/main/java/org/springblade/modules/system/service/IRegionService.java b/src/main/java/org/springblade/modules/system/service/IRegionService.java
index 5fcac68..1bb8585 100644
--- a/src/main/java/org/springblade/modules/system/service/IRegionService.java
+++ b/src/main/java/org/springblade/modules/system/service/IRegionService.java
@@ -131,4 +131,11 @@
 	 * @return
 	 */
 	List<Region> getGridRegionChild(String regionCode, String communityCode, String roleName);
+
+	/**
+	 * 查询当前文章范围对应的社区名称字符串集合
+	 * @param articleRange
+	 * @return
+	 */
+    String getAllCommunityNameListString(String articleRange);
 }
diff --git a/src/main/java/org/springblade/modules/system/service/impl/RegionServiceImpl.java b/src/main/java/org/springblade/modules/system/service/impl/RegionServiceImpl.java
index 1bfac19..ff6bc6d 100644
--- a/src/main/java/org/springblade/modules/system/service/impl/RegionServiceImpl.java
+++ b/src/main/java/org/springblade/modules/system/service/impl/RegionServiceImpl.java
@@ -330,4 +330,15 @@
 		}
 		return list;
 	}
+
+	/**
+	 * 查询当前文章范围对应的社区编号字符串集合
+	 * @param articleRange
+	 * @return
+	 */
+	@Override
+	public String getAllCommunityNameListString(String articleRange) {
+		// 分割后es搜索才有效果,不能用逗号分割
+		return String.join("\\",baseMapper.getAllCommunityNameListString(articleRange));
+	}
 }

--
Gitblit v1.9.3