From 233959e91890456bbba8fa81d5d7389f3e42a0a3 Mon Sep 17 00:00:00 2001 From: wzy-warehouse <18135009705@163.com> Date: Mon, 27 Apr 2026 22:50:32 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=86=E5=8C=96=E9=9A=90=E6=82=A3=E7=82=B9?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../XianHiddenDangerSpotsController.java | 6 +- .../com/gis/xian/enums/DisasterTypeEnum.java | 27 +++++- .../mapper/XianHiddenDangerSpotsMapper.java | 4 +- .../service/XianHiddenDangerSpotsService.java | 4 +- .../IXianHiddenDangerSpotsServiceImpl.java | 83 ++++++++++++---- .../com/gis/xian/task/InitializeData.java | 94 ++++++++++++++++++- .../mapper/XianHiddenDangerSpotsMapper.xml | 32 +++++-- src/main/resources/config/redis/redis-key.yml | 6 ++ 8 files changed, 219 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/gis/xian/controller/XianHiddenDangerSpotsController.java b/src/main/java/com/gis/xian/controller/XianHiddenDangerSpotsController.java index b38ad04..1ba8bc0 100644 --- a/src/main/java/com/gis/xian/controller/XianHiddenDangerSpotsController.java +++ b/src/main/java/com/gis/xian/controller/XianHiddenDangerSpotsController.java @@ -17,8 +17,10 @@ public class XianHiddenDangerSpotsController extends BaseController{ private XianHiddenDangerSpotsService xianHiddenDangerSpotsService; @GetMapping("/base-points") - public ApiResponse> getBasePoints(@RequestParam String disasterType) { - return ApiResponse.ok(xianHiddenDangerSpotsService.getBasePoints(disasterType)); + public ApiResponse> getBasePoints( + @RequestParam String type, + @RequestParam(required = false) String disasterType) { + return ApiResponse.ok(xianHiddenDangerSpotsService.getBasePoints(type, disasterType)); } @GetMapping("point-detail/{id}") diff --git a/src/main/java/com/gis/xian/enums/DisasterTypeEnum.java b/src/main/java/com/gis/xian/enums/DisasterTypeEnum.java index 582d2c3..4668c33 100644 --- a/src/main/java/com/gis/xian/enums/DisasterTypeEnum.java +++ b/src/main/java/com/gis/xian/enums/DisasterTypeEnum.java @@ -4,12 +4,33 @@ import lombok.Getter; @Getter public enum DisasterTypeEnum { - RAINSTORM("rainstorm"), - EARTHQUAKE("earthquake"); + // 第一级:灾害大类 + RAINSTORM("rainstorm", "暴雨"), + EARTHQUAKE("earthquake", "地震"), + + // 第二级:具体灾害类型(暴雨类) + LANDSLIDE("landslide", "滑坡"), + DEBRIS_FLOW("debris_flow", "泥石流"), + FLASH_FLOOD("flash_flood", "山洪"), + WATER_LOGGING("water_logging", "内涝"); private final String type; + private final String description; - DisasterTypeEnum(String type) { + DisasterTypeEnum(String type, String description) { this.type = type; + this.description = description; + } + + /** + * 根据type获取枚举 + */ + public static DisasterTypeEnum getByType(String type) { + for (DisasterTypeEnum e : values()) { + if (e.getType().equals(type)) { + return e; + } + } + return null; } } diff --git a/src/main/java/com/gis/xian/mapper/XianHiddenDangerSpotsMapper.java b/src/main/java/com/gis/xian/mapper/XianHiddenDangerSpotsMapper.java index 3ecc29c..a23cd06 100644 --- a/src/main/java/com/gis/xian/mapper/XianHiddenDangerSpotsMapper.java +++ b/src/main/java/com/gis/xian/mapper/XianHiddenDangerSpotsMapper.java @@ -13,9 +13,11 @@ import java.util.List; public interface XianHiddenDangerSpotsMapper { /** * 获取所有基础点:滑坡、泥石流、山洪、内涝 + * @param type 灾害大类(rainstorm-暴雨, earthquake-地震) + * @param disasterType 具体灾害类型(landslide-滑坡, debris_flow-泥石流, flash_flood-山洪, water_logging-内涝),可选 * @return 基础点列表 */ - List getBasePoints(String disasterType); + List getBasePoints(String type, String disasterType); /** * 根据id获取隐患点详情 diff --git a/src/main/java/com/gis/xian/service/XianHiddenDangerSpotsService.java b/src/main/java/com/gis/xian/service/XianHiddenDangerSpotsService.java index 8feac3a..a17558a 100644 --- a/src/main/java/com/gis/xian/service/XianHiddenDangerSpotsService.java +++ b/src/main/java/com/gis/xian/service/XianHiddenDangerSpotsService.java @@ -9,9 +9,11 @@ public interface XianHiddenDangerSpotsService { /** * 获取所有基础点:滑坡、泥石流、山洪、内涝 + * @param type 灾害大类(rainstorm-暴雨, earthquake-地震) + * @param disasterType 具体灾害类型(landslide-滑坡, debris_flow-泥石流, flash_flood-山洪, water_logging-内涝),可选 * @return 基础点列表 */ - List getBasePoints(String disasterType); + List getBasePoints(String type, String disasterType); /** * 根据id获取隐患点详情 diff --git a/src/main/java/com/gis/xian/service/impl/IXianHiddenDangerSpotsServiceImpl.java b/src/main/java/com/gis/xian/service/impl/IXianHiddenDangerSpotsServiceImpl.java index d6889a3..252e2c6 100644 --- a/src/main/java/com/gis/xian/service/impl/IXianHiddenDangerSpotsServiceImpl.java +++ b/src/main/java/com/gis/xian/service/impl/IXianHiddenDangerSpotsServiceImpl.java @@ -26,33 +26,84 @@ public class IXianHiddenDangerSpotsServiceImpl implements XianHiddenDangerSpotsS @Value("${init.data.base-points.hidden-danger.rainstorm}") private String rainstormBasePointsKey; + @Value("${init.data.base-points.hidden-danger.rainstorm-landslide}") + private String rainstormLandslideKey; + + @Value("${init.data.base-points.hidden-danger.rainstorm-debris-flow}") + private String rainstormDebrisFlowKey; + + @Value("${init.data.base-points.hidden-danger.rainstorm-flash-flood}") + private String rainstormMountainFloodKey; + + @Value("${init.data.base-points.hidden-danger.rainstorm-water-logging}") + private String rainstormWaterLoggingKey; + @Value("${init.data.base-points.hidden-danger.earthquake}") private String earthquakeBasePointsKey; - @Override - public List getBasePoints(String disasterType) { - // 从redis中读取基础点信息 - Object data = null; + @Value("${init.data.base-points.hidden-danger.earthquake-landslide}") + private String earthquakeLandslideKey; - if(DisasterTypeEnum.RAINSTORM.getType().equals(disasterType)) { - data = redisTemplate.opsForValue().get(rainstormBasePointsKey); - }else { - data = redisTemplate.opsForValue().get(earthquakeBasePointsKey); - } + @Value("${init.data.base-points.hidden-danger.earthquake-debris-flow}") + private String earthquakeDebrisFlowKey; + + @Override + public List getBasePoints(String type, String disasterType) { + // 构建Redis key + String redisKey = buildRedisKey(type, disasterType); + + // 从redis中读取基础点信息 + Object data = redisTemplate.opsForValue().get(redisKey); if (data == null) { - List basePoints = XianHiddenDangerSpotsBasePointVo.entity2Vo(xianHiddenDangerSpotsMapper.getBasePoints(disasterType)); - - if(DisasterTypeEnum.RAINSTORM.getType().equals(disasterType)) { - redisTemplate.opsForValue().set(rainstormBasePointsKey, JSON.toJSONString(basePoints)); - }else { - redisTemplate.opsForValue().set(earthquakeBasePointsKey, JSON.toJSONString(basePoints)); - } + // 从数据库查询 + List basePoints = + XianHiddenDangerSpotsBasePointVo.entity2Vo(xianHiddenDangerSpotsMapper.getBasePoints(type, disasterType)); + + // 存入Redis + redisTemplate.opsForValue().set(redisKey, JSON.toJSONString(basePoints)); return basePoints; } return JSON.parseArray(data.toString(), XianHiddenDangerSpotsBasePointVo.class); } + + /** + * 根据type和disasterType构建Redis key + */ + private String buildRedisKey(String type, String disasterType) { + if (DisasterTypeEnum.RAINSTORM.getType().equals(type)) { + if (disasterType == null || disasterType.isEmpty()) { + return rainstormBasePointsKey; + } + switch (disasterType) { + case "landslide": + return rainstormLandslideKey; + case "debris_flow": + return rainstormDebrisFlowKey; + case "flash_flood": + return rainstormMountainFloodKey; + case "waterlogging": + return rainstormWaterLoggingKey; + default: + return rainstormBasePointsKey; + } + } else if (DisasterTypeEnum.EARTHQUAKE.getType().equals(type)) { + if (disasterType == null || disasterType.isEmpty()) { + return earthquakeBasePointsKey; + } + switch (disasterType) { + case "landslide": + return earthquakeLandslideKey; + case "debris_flow": + return earthquakeDebrisFlowKey; + default: + return earthquakeBasePointsKey; + } + } + // 默认返回暴雨的key + return rainstormBasePointsKey; + } @Override public XianHiddenDangerSpotsPointDetailVo getPointDetailById(Long id) { diff --git a/src/main/java/com/gis/xian/task/InitializeData.java b/src/main/java/com/gis/xian/task/InitializeData.java index 3ccc3fb..b778a95 100644 --- a/src/main/java/com/gis/xian/task/InitializeData.java +++ b/src/main/java/com/gis/xian/task/InitializeData.java @@ -61,9 +61,27 @@ public class InitializeData { @Value("${init.data.base-points.hidden-danger.rainstorm}") private String rainstormBasePointsKey; + @Value("${init.data.base-points.hidden-danger.rainstorm-landslide}") + private String rainstormLandslideKey; + + @Value("${init.data.base-points.hidden-danger.rainstorm-debris-flow}") + private String rainstormDebrisFlowKey; + + @Value("${init.data.base-points.hidden-danger.rainstorm-flash-flood}") + private String rainstormMountainFloodKey; + + @Value("${init.data.base-points.hidden-danger.rainstorm-water-logging}") + private String rainstormWaterLoggingKey; + @Value("${init.data.base-points.hidden-danger.earthquake}") private String earthquakeBasePointsKey; + @Value("${init.data.base-points.hidden-danger.earthquake-landslide}") + private String earthquakeLandslideKey; + + @Value("${init.data.base-points.hidden-danger.earthquake-debris-flow}") + private String earthquakeDebrisFlowKey; + @Value("${init.data.base-points.risk}") private String riskBasePointsKey; @@ -99,22 +117,85 @@ public class InitializeData { public void init() { log.info("开始初始化数据"); // 并行执行所有数据库查询和Redis写入 + + // 暴雨类隐患点 - 总体 CompletableFuture rainstormFuture = CompletableFuture.runAsync(() -> { redisTemplate.opsForValue().set(rainstormBasePointsKey, JSON.toJSONString( XianHiddenDangerSpotsBasePointVo.entity2Vo( - xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.RAINSTORM.getType())) + xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.RAINSTORM.getType(), null)) ) ); - log.info("加载暴雨隐患点信息并写入redis完成"); + log.info("加载暴雨隐患点信息(总体)并写入redis完成"); + }); + + // 暴雨类隐患点 - 滑坡 + CompletableFuture rainstormLandslideFuture = CompletableFuture.runAsync(() -> { + redisTemplate.opsForValue().set(rainstormLandslideKey, JSON.toJSONString( + XianHiddenDangerSpotsBasePointVo.entity2Vo( + xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.RAINSTORM.getType(), "landslide")) + ) + ); + log.info("加载暴雨隐患点信息(滑坡)并写入redis完成"); + }); + + // 暴雨类隐患点 - 泥石流 + CompletableFuture rainstormDebrisFlowFuture = CompletableFuture.runAsync(() -> { + redisTemplate.opsForValue().set(rainstormDebrisFlowKey, JSON.toJSONString( + XianHiddenDangerSpotsBasePointVo.entity2Vo( + xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.RAINSTORM.getType(), "debris_flow")) + ) + ); + log.info("加载暴雨隐患点信息(泥石流)并写入redis完成"); + }); + + // 暴雨类隐患点 - 山洪 + CompletableFuture rainstormMountainFloodFuture = CompletableFuture.runAsync(() -> { + redisTemplate.opsForValue().set(rainstormMountainFloodKey, JSON.toJSONString( + XianHiddenDangerSpotsBasePointVo.entity2Vo( + xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.RAINSTORM.getType(), "flash_flood")) + ) + ); + log.info("加载暴雨隐患点信息(山洪)并写入redis完成"); + }); + + // 暴雨类隐患点 - 内涝 + CompletableFuture rainstormWaterLoggingFuture = CompletableFuture.runAsync(() -> { + redisTemplate.opsForValue().set(rainstormWaterLoggingKey, JSON.toJSONString( + XianHiddenDangerSpotsBasePointVo.entity2Vo( + xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.RAINSTORM.getType(), "water_logging")) + ) + ); + log.info("加载暴雨隐患点信息(内涝)并写入redis完成"); }); + // 地震类隐患点 - 总体 CompletableFuture earthquakeFuture = CompletableFuture.runAsync(() -> { redisTemplate.opsForValue().set(earthquakeBasePointsKey, JSON.toJSONString( XianHiddenDangerSpotsBasePointVo.entity2Vo( - xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.EARTHQUAKE.getType())) + xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.EARTHQUAKE.getType(), null)) ) ); - log.info("加载地震隐患点信息并写入redis完成"); + log.info("加载地震隐患点信息(总体)并写入redis完成"); + }); + + // 地震类隐患点 - 滑坡 + CompletableFuture earthquakeLandslideFuture = CompletableFuture.runAsync(() -> { + redisTemplate.opsForValue().set(earthquakeLandslideKey, JSON.toJSONString( + XianHiddenDangerSpotsBasePointVo.entity2Vo( + xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.EARTHQUAKE.getType(), "landslide")) + ) + ); + log.info("加载地震隐患点信息(滑坡)并写入redis完成"); + }); + + // 地震类隐患点 - 泥石流 + CompletableFuture earthquakeDebrisFlowFuture = CompletableFuture.runAsync(() -> { + redisTemplate.opsForValue().set(earthquakeDebrisFlowKey, JSON.toJSONString( + XianHiddenDangerSpotsBasePointVo.entity2Vo( + xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.EARTHQUAKE.getType(), "debris_flow")) + ) + ); + log.info("加载地震隐患点信息(泥石流)并写入redis完成"); }); CompletableFuture riskFuture = CompletableFuture.runAsync(() -> { @@ -209,7 +290,10 @@ public class InitializeData { // 等待所有任务完成 CompletableFuture.allOf( - rainstormFuture, earthquakeFuture, riskFuture, hospitalsFuture, + rainstormFuture, rainstormLandslideFuture, rainstormDebrisFlowFuture, + rainstormMountainFloodFuture, rainstormWaterLoggingFuture, + earthquakeFuture, earthquakeLandslideFuture, earthquakeDebrisFlowFuture, + riskFuture, hospitalsFuture, dangerousSourceFuture, emergencyShelterFuture, firefighterFuture, storePointsFuture, schoolFuture, bridgeFuture, reservoirFuture, subwayFuture ).join(); diff --git a/src/main/resources/com/gis/xian/mapper/XianHiddenDangerSpotsMapper.xml b/src/main/resources/com/gis/xian/mapper/XianHiddenDangerSpotsMapper.xml index 1fed6f6..2d202a6 100644 --- a/src/main/resources/com/gis/xian/mapper/XianHiddenDangerSpotsMapper.xml +++ b/src/main/resources/com/gis/xian/mapper/XianHiddenDangerSpotsMapper.xml @@ -29,15 +29,29 @@ diff --git a/src/main/resources/config/redis/redis-key.yml b/src/main/resources/config/redis/redis-key.yml index 6ef49da..c8c04a4 100644 --- a/src/main/resources/config/redis/redis-key.yml +++ b/src/main/resources/config/redis/redis-key.yml @@ -12,7 +12,13 @@ init: base-points: hidden-danger: rainstorm: 'xian:init:data:base-points:hidden-danger:rainstorm' + rainstorm-landslide: 'xian:init:data:base-points:hidden-danger:rainstorm:landslide' + rainstorm-debris-flow: 'xian:init:data:base-points:hidden-danger:rainstorm:debris_flow' + rainstorm-flash-flood: 'xian:init:data:base-points:hidden-danger:rainstorm:flash_flood' + rainstorm-water-logging: 'xian:init:data:base-points:hidden-danger:rainstorm:water_logging' earthquake: 'xian:init:data:base-points:hidden-danger:earthquake' + earthquake-landslide: 'xian:init:data:base-points:hidden-danger:earthquake:landslide' + earthquake-debris-flow: 'xian:init:data:base-points:hidden-danger:earthquake:debris_flow' risk: 'xian:init:data:base-points:risk' hospitals: 'xian:init:data:base-points:hospitals' dangerous-source: 'xian:init:data:base-points:dangerous-source'