| src/main/java/com/zy/asrs/controller/BasMapController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/asrs/service/BasMapService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/asrs/service/impl/BasMapEditorServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/common/utils/RedisUtil.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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(); 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);//刷新地图运行缓存 } 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) { 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("地图运行缓存刷新失败,lev={}", lev, e); throw e; } } @Override @Transactional public int syncLocMastByMap(Integer lev) { if (lev == null || lev <= 0) { 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); }