From c97c04770c17c36c554963bf8bb8d8fafc6a8d43 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期四, 07 五月 2026 09:43:35 +0800
Subject: [PATCH] #地图更新刷新缓存

---
 src/main/java/com/zy/asrs/service/impl/BasMapEditorServiceImpl.java |   18 -----
 src/main/java/com/zy/common/utils/RedisUtil.java                    |   30 ++++++++++
 src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java       |   60 +++++++++++++++++++
 src/main/java/com/zy/asrs/controller/BasMapController.java          |   15 ++--
 src/main/java/com/zy/asrs/service/BasMapService.java                |    2 
 5 files changed, 100 insertions(+), 25 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/BasMapController.java b/src/main/java/com/zy/asrs/controller/BasMapController.java
index 062ce52..cb02ccb 100644
--- a/src/main/java/com/zy/asrs/controller/BasMapController.java
+++ b/src/main/java/com/zy/asrs/controller/BasMapController.java
@@ -13,7 +13,6 @@
 import com.core.common.BaseRes;
 import com.core.common.Cools;
 import com.core.common.R;
-import com.zy.common.utils.NavigateSolution;
 import com.zy.common.web.BaseController;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -83,7 +82,7 @@
     public R add(BasMap basMap) {
         basMapService.save(basMap);
         if (basMap != null && basMap.getLev() != null) {
-            NavigateSolution.refreshMapCache(basMap.getLev());
+            basMapService.refreshMapRuntimeCaches(Collections.singletonList(basMap.getLev()));
         }
         return R.ok();
     }
@@ -96,14 +95,16 @@
         }
         BasMap oldBasMap = basMapService.getById(basMap.getId());
         basMapService.updateById(basMap);
-        if (oldBasMap != null && oldBasMap.getLev() != null) {
-            NavigateSolution.clearMapCache(oldBasMap.getLev());
-        }
         Integer refreshLev = basMap.getLev() != null
                 ? basMap.getLev()
                 : oldBasMap == null ? null : oldBasMap.getLev();
         if (refreshLev != null) {
-            NavigateSolution.refreshMapCache(refreshLev);
+            List<Integer> refreshLevList = new ArrayList<>();
+            if (oldBasMap != null && oldBasMap.getLev() != null) {
+                refreshLevList.add(oldBasMap.getLev());
+            }
+            refreshLevList.add(refreshLev);
+            basMapService.refreshMapRuntimeCaches(refreshLevList);
         }
         return R.ok();
     }
@@ -115,7 +116,7 @@
             BasMap basMap = basMapService.getById(id);
             basMapService.removeById(id);
             if (basMap != null && basMap.getLev() != null) {
-                NavigateSolution.clearMapCache(basMap.getLev());
+                basMapService.refreshMapRuntimeCaches(Collections.singletonList(basMap.getLev()));
             }
         }
         return R.ok();
diff --git a/src/main/java/com/zy/asrs/service/BasMapService.java b/src/main/java/com/zy/asrs/service/BasMapService.java
index ad74835..1cb74b0 100644
--- a/src/main/java/com/zy/asrs/service/BasMapService.java
+++ b/src/main/java/com/zy/asrs/service/BasMapService.java
@@ -26,4 +26,6 @@
 
     void saveMapPayloadInBatches(Integer lev, String data, String originData, Date updateTime);//鍒嗘壒淇濆瓨鍦板浘澶у瓧娈�
 
+    void refreshMapRuntimeCaches(List<Integer> levList);//鍒锋柊鍦板浘杩愯缂撳瓨
+
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/BasMapEditorServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasMapEditorServiceImpl.java
index 3d1181d..063b684 100644
--- a/src/main/java/com/zy/asrs/service/impl/BasMapEditorServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/BasMapEditorServiceImpl.java
@@ -19,9 +19,6 @@
 import com.zy.asrs.service.BasStationService;
 import com.zy.asrs.service.DeviceConfigService;
 import com.zy.asrs.utils.MapExcelUtils;
-import com.zy.common.utils.NavigateSolution;
-import com.zy.common.utils.RedisUtil;
-import com.zy.core.enums.RedisKeyType;
 import com.zy.core.enums.SlaveType;
 import com.zy.core.model.StationObjModel;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -68,8 +65,6 @@
     private BasStationService basStationService;
     @Autowired
     private MapExcelUtils mapExcelUtils;
-    @Autowired
-    private RedisUtil redisUtil;
 
     @Override
     public BasMapEditorDoc getEditorDoc(Integer lev) {
@@ -968,18 +963,7 @@
     }
 
     private void clearMapCaches(List<Integer> levList) {
-        redisUtil.del(RedisKeyType.LOC_MAP_BASE.key);
-        redisUtil.del(RedisKeyType.LOC_MAST_MAP_LIST.key);
-        if (levList == null || levList.isEmpty()) {
-            return;
-        }
-        LinkedHashSet<Integer> distinctLevSet = new LinkedHashSet<>(levList);
-        for (Integer lev : distinctLevSet) {
-            if (lev == null) {
-                continue;
-            }
-            NavigateSolution.refreshMapCache(lev);
-        }
+        basMapService.refreshMapRuntimeCaches(levList);
     }
 
     private String normalizeType(String type) {
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 1e3b7b6..7f3cb64 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
@@ -123,6 +137,50 @@
     }
 
     @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) {
diff --git a/src/main/java/com/zy/common/utils/RedisUtil.java b/src/main/java/com/zy/common/utils/RedisUtil.java
index 2c27c76..6a28925 100644
--- a/src/main/java/com/zy/common/utils/RedisUtil.java
+++ b/src/main/java/com/zy/common/utils/RedisUtil.java
@@ -118,6 +118,36 @@
         });
     }
 
+    public int deleteByPrefix(String keyPrefix) {
+        if (keyPrefix == null || keyPrefix.trim().isEmpty()) {
+            return 0;
+        }
+        Integer deletedCount = (Integer) redisTemplate.execute((org.springframework.data.redis.core.RedisCallback<Integer>) connection -> {
+            org.springframework.data.redis.core.ScanOptions options = org.springframework.data.redis.core.ScanOptions.scanOptions()
+                    .match(keyPrefix + "*")
+                    .count(1000)
+                    .build();
+            org.springframework.data.redis.core.Cursor<byte[]> cursor = connection.scan(options);
+            int count = 0;
+            try {
+                while (cursor.hasNext()) {
+                    byte[] key = cursor.next();
+                    Long deleted = connection.keyCommands().del(key);
+                    if (deleted != null) {
+                        count += deleted.intValue();
+                    }
+                }
+            } finally {
+                try {
+                    cursor.close();
+                } catch (Exception e) {
+                }
+            }
+            return count;
+        });
+        return deletedCount == null ? 0 : deletedCount;
+    }
+
     public java.util.List<Object> multiGet(java.util.Collection<String> keys) {
         return redisTemplate.opsForValue().multiGet(keys);
     }

--
Gitblit v1.9.1