细化隐患点类型

This commit is contained in:
wzy-warehouse
2026-04-27 22:50:32 +08:00
parent 601cb300bc
commit 233959e918
8 changed files with 219 additions and 37 deletions
@@ -17,8 +17,10 @@ public class XianHiddenDangerSpotsController extends BaseController{
private XianHiddenDangerSpotsService xianHiddenDangerSpotsService; private XianHiddenDangerSpotsService xianHiddenDangerSpotsService;
@GetMapping("/base-points") @GetMapping("/base-points")
public ApiResponse<List<XianHiddenDangerSpotsBasePointVo>> getBasePoints(@RequestParam String disasterType) { public ApiResponse<List<XianHiddenDangerSpotsBasePointVo>> getBasePoints(
return ApiResponse.ok(xianHiddenDangerSpotsService.getBasePoints(disasterType)); @RequestParam String type,
@RequestParam(required = false) String disasterType) {
return ApiResponse.ok(xianHiddenDangerSpotsService.getBasePoints(type, disasterType));
} }
@GetMapping("point-detail/{id}") @GetMapping("point-detail/{id}")
@@ -4,12 +4,33 @@ import lombok.Getter;
@Getter @Getter
public enum DisasterTypeEnum { 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 type;
private final String description;
DisasterTypeEnum(String type) { DisasterTypeEnum(String type, String description) {
this.type = type; 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;
} }
} }
@@ -13,9 +13,11 @@ import java.util.List;
public interface XianHiddenDangerSpotsMapper { public interface XianHiddenDangerSpotsMapper {
/** /**
* 获取所有基础点:滑坡、泥石流、山洪、内涝 * 获取所有基础点:滑坡、泥石流、山洪、内涝
* @param type 灾害大类(rainstorm-暴雨, earthquake-地震)
* @param disasterType 具体灾害类型(landslide-滑坡, debris_flow-泥石流, flash_flood-山洪, water_logging-内涝),可选
* @return 基础点列表 * @return 基础点列表
*/ */
List<XianHiddenDangerSpots> getBasePoints(String disasterType); List<XianHiddenDangerSpots> getBasePoints(String type, String disasterType);
/** /**
* 根据id获取隐患点详情 * 根据id获取隐患点详情
@@ -9,9 +9,11 @@ public interface XianHiddenDangerSpotsService {
/** /**
* 获取所有基础点:滑坡、泥石流、山洪、内涝 * 获取所有基础点:滑坡、泥石流、山洪、内涝
* @param type 灾害大类(rainstorm-暴雨, earthquake-地震)
* @param disasterType 具体灾害类型(landslide-滑坡, debris_flow-泥石流, flash_flood-山洪, water_logging-内涝),可选
* @return 基础点列表 * @return 基础点列表
*/ */
List<XianHiddenDangerSpotsBasePointVo> getBasePoints(String disasterType); List<XianHiddenDangerSpotsBasePointVo> getBasePoints(String type, String disasterType);
/** /**
* 根据id获取隐患点详情 * 根据id获取隐患点详情
@@ -26,33 +26,84 @@ public class IXianHiddenDangerSpotsServiceImpl implements XianHiddenDangerSpotsS
@Value("${init.data.base-points.hidden-danger.rainstorm}") @Value("${init.data.base-points.hidden-danger.rainstorm}")
private String rainstormBasePointsKey; 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}") @Value("${init.data.base-points.hidden-danger.earthquake}")
private String earthquakeBasePointsKey; private String earthquakeBasePointsKey;
@Override @Value("${init.data.base-points.hidden-danger.earthquake-landslide}")
public List<XianHiddenDangerSpotsBasePointVo> getBasePoints(String disasterType) { private String earthquakeLandslideKey;
// 从redis中读取基础点信息
Object data = null;
if(DisasterTypeEnum.RAINSTORM.getType().equals(disasterType)) { @Value("${init.data.base-points.hidden-danger.earthquake-debris-flow}")
data = redisTemplate.opsForValue().get(rainstormBasePointsKey); private String earthquakeDebrisFlowKey;
}else {
data = redisTemplate.opsForValue().get(earthquakeBasePointsKey); @Override
} public List<XianHiddenDangerSpotsBasePointVo> getBasePoints(String type, String disasterType) {
// 构建Redis key
String redisKey = buildRedisKey(type, disasterType);
// 从redis中读取基础点信息
Object data = redisTemplate.opsForValue().get(redisKey);
if (data == null) { if (data == null) {
List<XianHiddenDangerSpotsBasePointVo> basePoints = XianHiddenDangerSpotsBasePointVo.entity2Vo(xianHiddenDangerSpotsMapper.getBasePoints(disasterType)); // 从数据库查询
List<XianHiddenDangerSpotsBasePointVo> basePoints =
if(DisasterTypeEnum.RAINSTORM.getType().equals(disasterType)) { XianHiddenDangerSpotsBasePointVo.entity2Vo(xianHiddenDangerSpotsMapper.getBasePoints(type, disasterType));
redisTemplate.opsForValue().set(rainstormBasePointsKey, JSON.toJSONString(basePoints));
}else { // 存入Redis
redisTemplate.opsForValue().set(earthquakeBasePointsKey, JSON.toJSONString(basePoints)); redisTemplate.opsForValue().set(redisKey, JSON.toJSONString(basePoints));
}
return basePoints; return basePoints;
} }
return JSON.parseArray(data.toString(), XianHiddenDangerSpotsBasePointVo.class); 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 @Override
public XianHiddenDangerSpotsPointDetailVo getPointDetailById(Long id) { public XianHiddenDangerSpotsPointDetailVo getPointDetailById(Long id) {
@@ -61,9 +61,27 @@ public class InitializeData {
@Value("${init.data.base-points.hidden-danger.rainstorm}") @Value("${init.data.base-points.hidden-danger.rainstorm}")
private String rainstormBasePointsKey; 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}") @Value("${init.data.base-points.hidden-danger.earthquake}")
private String earthquakeBasePointsKey; 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}") @Value("${init.data.base-points.risk}")
private String riskBasePointsKey; private String riskBasePointsKey;
@@ -99,22 +117,85 @@ public class InitializeData {
public void init() { public void init() {
log.info("开始初始化数据"); log.info("开始初始化数据");
// 并行执行所有数据库查询和Redis写入 // 并行执行所有数据库查询和Redis写入
// 暴雨类隐患点 - 总体
CompletableFuture<Void> rainstormFuture = CompletableFuture.runAsync(() -> { CompletableFuture<Void> rainstormFuture = CompletableFuture.runAsync(() -> {
redisTemplate.opsForValue().set(rainstormBasePointsKey, JSON.toJSONString( redisTemplate.opsForValue().set(rainstormBasePointsKey, JSON.toJSONString(
XianHiddenDangerSpotsBasePointVo.entity2Vo( XianHiddenDangerSpotsBasePointVo.entity2Vo(
xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.RAINSTORM.getType())) xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.RAINSTORM.getType(), null))
) )
); );
log.info("加载暴雨隐患点信息并写入redis完成"); log.info("加载暴雨隐患点信息(总体)并写入redis完成");
});
// 暴雨类隐患点 - 滑坡
CompletableFuture<Void> rainstormLandslideFuture = CompletableFuture.runAsync(() -> {
redisTemplate.opsForValue().set(rainstormLandslideKey, JSON.toJSONString(
XianHiddenDangerSpotsBasePointVo.entity2Vo(
xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.RAINSTORM.getType(), "landslide"))
)
);
log.info("加载暴雨隐患点信息(滑坡)并写入redis完成");
});
// 暴雨类隐患点 - 泥石流
CompletableFuture<Void> rainstormDebrisFlowFuture = CompletableFuture.runAsync(() -> {
redisTemplate.opsForValue().set(rainstormDebrisFlowKey, JSON.toJSONString(
XianHiddenDangerSpotsBasePointVo.entity2Vo(
xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.RAINSTORM.getType(), "debris_flow"))
)
);
log.info("加载暴雨隐患点信息(泥石流)并写入redis完成");
});
// 暴雨类隐患点 - 山洪
CompletableFuture<Void> rainstormMountainFloodFuture = CompletableFuture.runAsync(() -> {
redisTemplate.opsForValue().set(rainstormMountainFloodKey, JSON.toJSONString(
XianHiddenDangerSpotsBasePointVo.entity2Vo(
xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.RAINSTORM.getType(), "flash_flood"))
)
);
log.info("加载暴雨隐患点信息(山洪)并写入redis完成");
});
// 暴雨类隐患点 - 内涝
CompletableFuture<Void> rainstormWaterLoggingFuture = CompletableFuture.runAsync(() -> {
redisTemplate.opsForValue().set(rainstormWaterLoggingKey, JSON.toJSONString(
XianHiddenDangerSpotsBasePointVo.entity2Vo(
xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.RAINSTORM.getType(), "water_logging"))
)
);
log.info("加载暴雨隐患点信息(内涝)并写入redis完成");
}); });
// 地震类隐患点 - 总体
CompletableFuture<Void> earthquakeFuture = CompletableFuture.runAsync(() -> { CompletableFuture<Void> earthquakeFuture = CompletableFuture.runAsync(() -> {
redisTemplate.opsForValue().set(earthquakeBasePointsKey, JSON.toJSONString( redisTemplate.opsForValue().set(earthquakeBasePointsKey, JSON.toJSONString(
XianHiddenDangerSpotsBasePointVo.entity2Vo( XianHiddenDangerSpotsBasePointVo.entity2Vo(
xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.EARTHQUAKE.getType())) xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.EARTHQUAKE.getType(), null))
) )
); );
log.info("加载地震隐患点信息并写入redis完成"); log.info("加载地震隐患点信息(总体)并写入redis完成");
});
// 地震类隐患点 - 滑坡
CompletableFuture<Void> earthquakeLandslideFuture = CompletableFuture.runAsync(() -> {
redisTemplate.opsForValue().set(earthquakeLandslideKey, JSON.toJSONString(
XianHiddenDangerSpotsBasePointVo.entity2Vo(
xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.EARTHQUAKE.getType(), "landslide"))
)
);
log.info("加载地震隐患点信息(滑坡)并写入redis完成");
});
// 地震类隐患点 - 泥石流
CompletableFuture<Void> earthquakeDebrisFlowFuture = CompletableFuture.runAsync(() -> {
redisTemplate.opsForValue().set(earthquakeDebrisFlowKey, JSON.toJSONString(
XianHiddenDangerSpotsBasePointVo.entity2Vo(
xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.EARTHQUAKE.getType(), "debris_flow"))
)
);
log.info("加载地震隐患点信息(泥石流)并写入redis完成");
}); });
CompletableFuture<Void> riskFuture = CompletableFuture.runAsync(() -> { CompletableFuture<Void> riskFuture = CompletableFuture.runAsync(() -> {
@@ -209,7 +290,10 @@ public class InitializeData {
// 等待所有任务完成 // 等待所有任务完成
CompletableFuture.allOf( CompletableFuture.allOf(
rainstormFuture, earthquakeFuture, riskFuture, hospitalsFuture, rainstormFuture, rainstormLandslideFuture, rainstormDebrisFlowFuture,
rainstormMountainFloodFuture, rainstormWaterLoggingFuture,
earthquakeFuture, earthquakeLandslideFuture, earthquakeDebrisFlowFuture,
riskFuture, hospitalsFuture,
dangerousSourceFuture, emergencyShelterFuture, firefighterFuture, storePointsFuture, schoolFuture, dangerousSourceFuture, emergencyShelterFuture, firefighterFuture, storePointsFuture, schoolFuture,
bridgeFuture, reservoirFuture, subwayFuture bridgeFuture, reservoirFuture, subwayFuture
).join(); ).join();
@@ -29,15 +29,29 @@
<select id="getBasePoints" resultMap="XianHiddenDangerSpotsResultMap"> <select id="getBasePoints" resultMap="XianHiddenDangerSpotsResultMap">
SELECT id, disaster_name, lon, lat, disaster_type FROM xian_hidden_danger_spots SELECT id, disaster_name, lon, lat, disaster_type FROM xian_hidden_danger_spots
<where> <where>
<choose> is_delete = 0
<when test='disasterType == "rainstorm"'> <if test="type != null and type == 'rainstorm'">
disaster_type IN('滑坡', '泥石流', '山洪', '内涝') AND disaster_type IN('滑坡', '泥石流', '山洪', '内涝')
</when> </if>
<otherwise> <if test="type != null and type == 'earthquake'">
disaster_type IN('滑坡', '泥石流') AND disaster_type IN('滑坡', '泥石流')
</otherwise> </if>
</choose> <if test="disasterType != null and disasterType != ''">
AND is_delete = 0 <choose>
<when test="disasterType == 'landslide'">
AND disaster_type = '滑坡'
</when>
<when test="disasterType == 'debris_flow'">
AND disaster_type = '泥石流'
</when>
<when test="disasterType == 'flash_flood'">
AND disaster_type = '山洪'
</when>
<when test="disasterType == 'waterlogging'">
AND disaster_type = '内涝'
</when>
</choose>
</if>
</where> </where>
</select> </select>
@@ -12,7 +12,13 @@ init:
base-points: base-points:
hidden-danger: hidden-danger:
rainstorm: 'xian:init:data:base-points:hidden-danger:rainstorm' 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: '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' risk: 'xian:init:data:base-points:risk'
hospitals: 'xian:init:data:base-points:hospitals' hospitals: 'xian:init:data:base-points:hospitals'
dangerous-source: 'xian:init:data:base-points:dangerous-source' dangerous-source: 'xian:init:data:base-points:dangerous-source'