修改代码,数据不经过redis缓存直接存入数据库,通过proMaxRain主表中的主键id在proMaxRainSub副表是否存在该id,来确定是否需要从数据库中获取数据。如果不存在,则调用getProMaxTop10Sub(preType, regProId)方法从数据库中获取数据,并将结果存入数据库表proMaxRainSub副表中。如果存在,则从proMaxRainSub副表中获取数据。
如果proMaxRainSub副表中的数据与数据库中的数据不一致,说明有新的数据更新,需要重新从数据库中获取最新数据并更新表中的数据。
如果preType不等于"1d",表示需要处理历史数据。对于每个数据项,如果存在历史最大降雨量日期或历史最大降雨量月份日期,将其格式化为指定的格式。
最后,将获取到的数据设置到AjaxRes对象中,并返回该对象
```java
public AjaxRes getProMaxTop10(String preType, String regProId) {
//TODO 放到区域性暴雨过程定时任务去执行,定期缓存数据. 考虑后期入库需要
AjaxRes ar = getAjaxRes();
String redisKey = RedisConst.PRO_MAX_TOP10 + regProId + ":" + preType;
try {
List<RainstormRegProPreEx> proPreExList = new ArrayList<>();
boolean redisFlag = redisService.exists(redisKey);
if (!redisFlag) {
proPreExList = getProMaxTop10Sub(preType, regProId);
redisService.set(redisKey, proPreExList);
} else {
proPreExList = (List<RainstormRegProPreEx>) redisService.get(redisKey);
Page<RainstormRegPro> proLimit = new Page<>(1, 1);
QueryWrapper<RainstormRegPro> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("start_date");
if (regProId != null && !"".equals(regProId)) {
queryWrapper.eq("id", regProId);
}
IPage<RainstormRegPro> rainstormRegProList = rainstormRegProService.page(proLimit, queryWrapper);
RainstormRegPro regPro = rainstormRegProList.getRecords().get(0);
if (!regPro.getEndDate().equals(proPreExList.get(0).getEndDate())) {
proPreExList = getProMaxTop10Sub(preType, regProId);
redisService.remove(redisKey);
redisService.set(redisKey, proPreExList);
}
}
if (!"1d".equals(preType)) {
proPreExList.forEach(o -> {
if (o.getHistoryPreMaxDate() != null && !"".equals(o.getHistoryPreMaxDate())) {
o.setHistoryPreMaxDate(DateUtil.offsetHour(DateUtil.parse(o.getHistoryPreMaxDate()), 8).toString("yyyy-MM-dd HH:mm"));
}
if (o.getHistoryPreMaxMonthDate() != null && !"".equals(o.getHistoryPreMaxMonthDate())) {
o.setHistoryPreMaxMonthDate(DateUtil.offsetHour(DateUtil.parse(o.getHistoryPreMaxMonthDate()), 8).toString("yyyy-MM-dd HH:mm"));
}
});
}
ar.setSucceed(proPreExList);
ar.setResMsg(Const.DATA_SUCCEED);
ar.setCode(Const.SUCCEED);
} catch (Exception e) {
logger.error(e.toString(), e);
//返回失败
ar.setCode(Const.FAIL);
}
return ar;
}
public List<RainstormRegProPreEx> getProMaxTop10Sub(String preType, String regProId) {
Page<RainstormRegPro> proLimit = new Page<>(1, 1);
QueryWrapper<RainstormRegPro> queryWrapper = new QueryWrapper<>();
if (!"".equals(regProId) && regProId != null) {
queryWrapper.eq("id", regProId);
}
queryWrapper.orderByDesc("start_date");
IPage<RainstormRegPro> rainstormRegProList = rainstormRegProService.page(proLimit, queryWrapper);
RainstormRegPro regPro = rainstormRegProList.getRecords().get(0);
//此处结束时间是为了Redis进行判断
String endDate = regPro.getEndDate();
Page<RainstormRegProPre> proPreLimit = new Page<>(1, 10);
QueryWrapper<RainstormRegProPre> proPreQueryWrapper = new QueryWrapper<>();
switch (preType) {
case "1h":
proPreQueryWrapper.orderByDesc("pre_max_1h");
break;
case "3h":
proPreQueryWrapper.orderByDesc("pre_max_3h");
break;
case "6h":
proPreQueryWrapper.orderByDesc("pre_max_6h");
break;
case "12h":
proPreQueryWrapper.orderByDesc("pre_max_12h");
break;
case "24h":
proPreQueryWrapper.orderByDesc("pre_max_24h");
break;
case "1d":
proPreQueryWrapper.orderByDesc("pre_max");
break;
}
proPreQueryWrapper.eq("station_type", 1);
proPreQueryWrapper.eq("reg_pro_id", regPro.getId());
//获取 区域性暴雨过程关联的 国家站降水信息 国家站降水信息top10
IPage<RainstormRegProPre> proPreList = rainstormRegProPreService.page(proPreLimit, proPreQueryWrapper);
//国家站ID
List<String> station = proPreList.getRecords().stream().map(RainstormRegProPre::getStationId).collect(Collectors.toList());
//根据所有国家站获取 历史同期月极值(单站极值降水)
QueryWrapper<ExtremePreSingle> preSingleQueryWrapper = new QueryWrapper<>();
preSingleQueryWrapper.eq("sort_type", 3); //排序类型 : 月时间排序
preSingleQueryWrapper.eq("month", regPro.getStartDate().substring(4, 6)); //获取 区域性暴雨灾害的同期月份
preSingleQueryWrapper.eq("pre_type", preType);
preSingleQueryWrapper.in("station_id", station);
List<ExtremePreSingle> preSingleList_month = extremePreSingleService.list(preSingleQueryWrapper);
Map<String, ExtremePreSingle> singleMap_month = new HashMap<>();
if (preSingleList_month != null && preSingleList_month.size() > 0) {
Map<String, List<ExtremePreSingle>> singleMonthGroupByStation = preSingleList_month.stream().collect(Collectors.groupingBy(ExtremePreSingle::getStationId));
List<ExtremePreSingle> monthList = new ArrayList<>();
for (String key : singleMonthGroupByStation.keySet()) {
ExtremePreSingle temp = singleMonthGroupByStation.get(key).stream().sorted(Comparator.comparing(ExtremePreSingle::getPre).reversed()).collect(Collectors.toList()).get(0);
monthList.add(temp);
}
//map<台站号,实体类>
singleMap_month = monthList.stream().collect(Collectors.toMap(ExtremePreSingle::getStationId, ExtremePreSingle -> ExtremePreSingle));
}
//分类返回前端
List<RainstormRegProPreEx> proPreExList = new ArrayList<>();
//整合数据
for (RainstormRegProPre proPre : proPreList.getRecords()) {
RainstormRegProPreEx proPreEx = new RainstormRegProPreEx();
BeanUtils.copyProperties(proPre, proPreEx);
if (singleMap_month.containsKey(proPre.getStationId())) {
ExtremePreSingle single = singleMap_month.get(proPre.getStationId());
proPreEx.setHistoryPreMaxMonth(single.getPre());
if ("1d".equals(preType)) {
proPreEx.setHistoryPreMaxMonthDate(single.getYear().toString() + "-" + single.getMonth().toString() + "-" + single.getDay().toString());
proPreEx.setEndDate(endDate);
} else {
proPreEx.setHistoryPreMaxMonthDate(single.getYear().toString() + "-" + single.getMonth().toString() + "-" + single.getDay().toString() + " " + single.getHour().toString() + ":00");
proPreEx.setEndDate(endDate);
}
}
proPreExList.add(proPreEx);
}
Map<String, ExtremePreSingle> singleMap = new HashMap<>();
//历史极值(单站极值降水)
preSingleQueryWrapper = new QueryWrapper<>();
preSingleQueryWrapper.in("station_id", station);
preSingleQueryWrapper.eq("sort_type", 1);
preSingleQueryWrapper.eq("pre_type", preType);
List<ExtremePreSingle> preSingleList = extremePreSingleService.list(preSingleQueryWrapper);
if (preSingleList != null && preSingleList.size() > 0) {
Map<String, List<ExtremePreSingle>> singleGroupByStation = preSingleList.stream().collect(Collectors.groupingBy(ExtremePreSingle::getStationId));
List<ExtremePreSingle> list = new ArrayList<>();
for (String key : singleGroupByStation.keySet()) {
ExtremePreSingle temp = singleGroupByStation.get(key).stream().sorted(Comparator.comparing(ExtremePreSingle::getPre).reversed()).collect(Collectors.toList()).get(0);
list.add(temp);
}
//map<台站号,实体类>
singleMap = list.stream().collect(Collectors.toMap(ExtremePreSingle::getStationId, ExtremePreSingle -> ExtremePreSingle));
}
//整合数据
for (RainstormRegProPreEx proPreEx : proPreExList) {
if (!singleMap.containsKey(proPreEx.getStationId())) {
continue;
}
ExtremePreSingle single = singleMap.get(proPreEx.getStationId());
proPreEx.setHistoryPreMax(single.getPre());
if ("1d".equals(preType)) {
proPreEx.setHistoryPreMaxDate(single.getYear().toString() + "-" + single.getMonth().toString() + "-" + single.getDay().toString());
} else {
proPreEx.setHistoryPreMaxDate(single.getYear().toString() + "-" + single.getMonth().toString() + "-" + single.getDay().toString() + " " + single.getHour().toString() + ":00");
}
}
return proPreExList;
}
```