From 42ce1f4b6f9df984d14e29f9d9ff188de7f3c6d7 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期四, 07 五月 2026 09:45:33 +0800
Subject: [PATCH] #地图更新
---
src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 105 insertions(+), 1 deletions(-)
diff --git a/src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java
index d8d8e92..b2f2cb5 100644
--- a/src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java
@@ -15,15 +15,19 @@
import com.zy.asrs.service.BasMapService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.utils.Utils;
+import com.zy.common.utils.NavigateSolution;
import com.zy.common.utils.RedisUtil;
+import com.zy.core.News;
import com.zy.core.enums.RedisKeyType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Date;
import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -36,6 +40,14 @@
@Autowired
private RedisUtil redisUtil;
+ // 鍦板浘鎷撴墤鍙樺寲鍚庯紝杩欎簺鍙揪鎬у拰绔欑偣閫夋嫨缁撴灉閮藉彲鑳借繃鏈燂紝蹇呴』鏁翠綋澶辨晥銆�
+ private static final String[] MAP_DERIVED_CACHE_PREFIXES = {
+ RedisKeyType.STATION_REACHABLE_CACHE.key,
+ RedisKeyType.PRECOMPUTE_IN_TASK_ROW_CACHE.key,
+ RedisKeyType.IN_STATION_ROUTE_CACHE.key,
+ RedisKeyType.OUT_STATION_ROUTE_CACHE.key
+ };
+
@Override
public BasMap selectLatestMap(Integer lev) {
return this.baseMapper.selectLatestMap(lev);
@@ -43,7 +55,9 @@
@Override
public boolean deleteByLev(Integer lev) {
- return this.baseMapper.deleteByLev(lev);
+ boolean deleted = this.baseMapper.deleteByLev(lev);
+ refreshMapRuntimeCaches(Collections.singletonList(lev));
+ return deleted;
}
@Override
@@ -65,6 +79,96 @@
@Override
@Transactional
+ public void saveMapPayloadInBatches(Integer lev, String data, String originData, Date updateTime) {
+ if (lev == null || lev <= 0) {
+ throw new CoolException("妤煎眰涓嶈兘涓虹┖");
+ }
+ Date now = updateTime == null ? new Date() : updateTime;
+ BasMap basMap = this.getOne(new QueryWrapper<BasMap>().select("id").eq("lev", lev));
+ if (basMap == null) {
+ basMap = insertLightMap(lev, now);
+ }
+
+ updateDataOnly(basMap.getId(), data, now);
+ updateOriginDataOnly(basMap.getId(), originData);
+ }
+
+ private BasMap insertLightMap(Integer lev, Date now) {
+ BasMap insertMap = new BasMap();
+ insertMap.setLev(lev);
+ insertMap.setCreateTime(now);
+ insertMap.setUpdateTime(now);
+ if (!this.save(insertMap)) {
+ throw new CoolException("鍦板浘鍩虹淇℃伅淇濆瓨澶辫触");
+ }
+ return insertMap;
+ }
+
+ private void updateDataOnly(Integer id, String data, Date updateTime) {
+ UpdateWrapper<BasMap> updateWrapper = new UpdateWrapper<>();
+ updateWrapper.eq("id", id)
+ .set("data", data)
+ .set("update_time", updateTime);
+ if (!this.update(updateWrapper)) {
+ throw new CoolException("鍦板浘杩愯鏁版嵁淇濆瓨澶辫触");
+ }
+ }
+
+ private void updateOriginDataOnly(Integer id, String originData) {
+ UpdateWrapper<BasMap> updateWrapper = new UpdateWrapper<>();
+ updateWrapper.eq("id", id)
+ .set("origin_data", originData);
+ if (!this.update(updateWrapper)) {
+ throw new CoolException("鍦板浘缂栬緫鏁版嵁淇濆瓨澶辫触");
+ }
+ }
+
+ @Override
+ public void refreshMapRuntimeCaches(List<Integer> levList) {
+ redisUtil.del(RedisKeyType.LOC_MAP_BASE.key);
+ redisUtil.del(RedisKeyType.LOC_MAST_MAP_LIST.key);
+ clearMapDerivedRedisCaches();
+ if (levList == null || levList.isEmpty()) {
+ return;
+ }
+
+ LinkedHashSet<Integer> distinctLevSet = new LinkedHashSet<>(levList);
+ for (Integer lev : distinctLevSet) {
+ if (lev == null) {
+ continue;
+ }
+ NavigateSolution.clearMapCache(lev);
+ if (!hasMapLev(lev)) {
+ continue;
+ }
+ refreshNavigateMapCache(lev);
+ }
+ }
+
+ private void clearMapDerivedRedisCaches() {
+ for (String keyPrefix : MAP_DERIVED_CACHE_PREFIXES) {
+ redisUtil.deleteByPrefix(keyPrefix);
+ }
+ }
+
+ private boolean hasMapLev(Integer lev) {
+ if (lev == null) {
+ return false;
+ }
+ return this.count(new QueryWrapper<BasMap>().eq("lev", lev)) > 0;
+ }
+
+ private void refreshNavigateMapCache(Integer lev) {
+ try {
+ NavigateSolution.refreshMapCache(lev);
+ } catch (Exception e) {
+ News.error("鍦板浘杩愯缂撳瓨鍒锋柊澶辫触锛宭ev={}", lev, e);
+ throw e;
+ }
+ }
+
+ @Override
+ @Transactional
public int syncLocMastByMap(Integer lev) {
if (lev == null || lev <= 0) {
throw new CoolException("璇疯緭鍏ユ湁鏁堟ゼ灞�");
--
Gitblit v1.9.1