2025-07-17 15:26:39 +08:00
|
|
|
package com.gunshi.project.hsz.service;
|
2024-07-08 17:47:02 +08:00
|
|
|
|
2024-07-18 16:49:48 +08:00
|
|
|
import cn.hutool.json.JSONArray;
|
|
|
|
|
import cn.hutool.json.JSONObject;
|
|
|
|
|
import cn.hutool.json.JSONUtil;
|
2024-07-08 17:47:02 +08:00
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
2024-07-18 16:49:48 +08:00
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
2024-07-18 10:24:37 +08:00
|
|
|
import com.gunshi.db.dto.DateTimeRangeSo;
|
2025-12-15 09:37:40 +08:00
|
|
|
import com.gunshi.project.hsz.common.model.JcskByR;
|
|
|
|
|
import com.gunshi.project.hsz.common.model.StRiverR;
|
2025-11-06 11:35:41 +08:00
|
|
|
import com.gunshi.project.hsz.common.model.StRiverRReal;
|
2025-07-17 15:26:39 +08:00
|
|
|
import com.gunshi.project.hsz.entity.vo.*;
|
|
|
|
|
import com.gunshi.project.hsz.mapper.AttResBaseMapper;
|
|
|
|
|
import com.gunshi.project.hsz.mapper.StQxWarnRMapper;
|
2025-09-02 17:30:05 +08:00
|
|
|
import com.gunshi.project.hsz.model.*;
|
2024-07-18 10:24:37 +08:00
|
|
|
import jakarta.annotation.Resource;
|
2024-07-08 17:47:02 +08:00
|
|
|
import lombok.extern.slf4j.Slf4j;
|
2024-07-18 16:49:48 +08:00
|
|
|
import org.apache.commons.compress.utils.Lists;
|
|
|
|
|
import org.apache.http.HttpEntity;
|
|
|
|
|
import org.apache.http.HttpResponse;
|
|
|
|
|
import org.apache.http.client.HttpClient;
|
|
|
|
|
import org.apache.http.client.methods.HttpPost;
|
|
|
|
|
import org.apache.http.entity.ContentType;
|
|
|
|
|
import org.apache.http.entity.StringEntity;
|
|
|
|
|
import org.apache.http.impl.client.HttpClientBuilder;
|
|
|
|
|
import org.apache.http.util.EntityUtils;
|
2025-12-15 09:37:40 +08:00
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
2024-07-18 16:49:48 +08:00
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
2024-07-08 17:47:02 +08:00
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
2024-07-18 10:24:37 +08:00
|
|
|
import java.math.BigDecimal;
|
2024-10-17 13:21:49 +08:00
|
|
|
import java.math.RoundingMode;
|
2024-07-18 16:49:48 +08:00
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Comparator;
|
2024-07-08 17:47:02 +08:00
|
|
|
import java.util.Date;
|
2024-07-18 10:24:37 +08:00
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.stream.Collectors;
|
2024-07-08 17:47:02 +08:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 描述: 气象预警表
|
|
|
|
|
* author: xusan
|
|
|
|
|
* date: 2024-07-08 17:30:38
|
|
|
|
|
*/
|
|
|
|
|
@Service
|
|
|
|
|
@Slf4j
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
2024-07-18 16:49:48 +08:00
|
|
|
public class StQxWarnRService extends ServiceImpl<StQxWarnRMapper, StQxWarnR> {
|
|
|
|
|
|
|
|
|
|
@Value("${shqxjsWarnPath}")
|
|
|
|
|
private String shqxjsWarnPath;
|
2024-07-08 17:47:02 +08:00
|
|
|
|
2024-07-18 10:24:37 +08:00
|
|
|
@Resource
|
|
|
|
|
private StImgWarnRService imgWarnRService;
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
private AttResBaseMapper attResBaseMapper;
|
|
|
|
|
|
2025-08-29 09:16:26 +08:00
|
|
|
@Resource
|
|
|
|
|
private StRsvrRRealService stRsvrRRealService;
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
private AlarmSetService alarmSetService;
|
|
|
|
|
|
2025-09-02 17:30:05 +08:00
|
|
|
@Resource
|
|
|
|
|
private StRiverRRealService stRiverRRealService;
|
|
|
|
|
|
2025-12-15 09:37:40 +08:00
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
private StRiverRService stRiverRService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private ISCAIEventService iscaiEventService;
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
private JcskByRService jcskByRService;
|
|
|
|
|
|
2024-07-18 10:24:37 +08:00
|
|
|
public HomeWarnVo homeWarn(DateTimeRangeSo dateTimeRangeSo) {
|
|
|
|
|
HomeWarnVo vo = new HomeWarnVo();
|
|
|
|
|
|
|
|
|
|
List<AttResBaseVo> attResBaseVos = attResBaseMapper.queryList();
|
|
|
|
|
AttResBaseVo attResBaseVo = attResBaseVos.get(0);
|
|
|
|
|
Date tm = attResBaseVo.getTm();
|
|
|
|
|
//水位的最新采集时间不在24小时内
|
2024-07-18 16:49:48 +08:00
|
|
|
if (tm.before(dateTimeRangeSo.getStart())) {
|
2024-07-18 10:24:37 +08:00
|
|
|
vo.setRzWarn("-");
|
2024-07-18 16:49:48 +08:00
|
|
|
} else {
|
2024-07-18 10:24:37 +08:00
|
|
|
BigDecimal rz = attResBaseVo.getRz();
|
2024-07-18 16:49:48 +08:00
|
|
|
if (attResBaseVo.getCalState() == 1) {
|
2024-07-18 10:24:37 +08:00
|
|
|
BigDecimal aboveCal = rz.subtract(attResBaseVo.getCalFloodLev());
|
2025-07-31 09:18:52 +08:00
|
|
|
vo.setRzWarn("超校核(" + aboveCal.setScale(2, RoundingMode.HALF_UP) + "m)");
|
2024-07-18 10:24:37 +08:00
|
|
|
attResBaseVo.setDesState(0);
|
|
|
|
|
attResBaseVo.setFlState(0);
|
2024-07-18 16:49:48 +08:00
|
|
|
} else if (attResBaseVo.getDesState() == 1) {
|
2024-07-18 10:24:37 +08:00
|
|
|
BigDecimal aboveDes = rz.subtract(attResBaseVo.getDesFloodLev());
|
2025-07-31 09:18:52 +08:00
|
|
|
vo.setRzWarn("超设计(" + aboveDes.setScale(2, RoundingMode.HALF_UP) + "m)");
|
2024-07-18 10:24:37 +08:00
|
|
|
attResBaseVo.setFlState(0);
|
2024-07-18 16:49:48 +08:00
|
|
|
} else if (attResBaseVo.getFlState() == 1) {
|
2025-07-31 09:18:52 +08:00
|
|
|
vo.setRzWarn("超汛限(" + attResBaseVo.getAFsltdz().setScale(2, RoundingMode.HALF_UP) + "m)");
|
2024-07-18 16:49:48 +08:00
|
|
|
} else if (rz.compareTo(attResBaseVo.getDeadLev()) < 0) {
|
2024-07-18 10:24:37 +08:00
|
|
|
BigDecimal aboveDead = rz.subtract(attResBaseVo.getDeadLev());
|
2024-10-17 13:21:49 +08:00
|
|
|
vo.setRzWarn("低水位(" + aboveDead.setScale(1, RoundingMode.HALF_UP) + "m)");
|
2024-07-18 16:49:48 +08:00
|
|
|
} else {
|
2025-07-31 09:18:52 +08:00
|
|
|
vo.setRzWarn("正常(" + attResBaseVo.getAFsltdz().setScale(2, RoundingMode.HALF_UP) + "m)");
|
2024-07-18 10:24:37 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-03 17:39:03 +08:00
|
|
|
// vo.setQxWarn(queryQxWarn());
|
2024-07-18 10:24:37 +08:00
|
|
|
|
|
|
|
|
List<OsmoticWarnVo> warnVos = baseMapper.queryOsmoticWarn(dateTimeRangeSo);
|
2024-07-18 16:49:48 +08:00
|
|
|
vo.setPressWarn(warnVos.stream().filter(o -> o.getType() == 1).collect(Collectors.toList()));
|
|
|
|
|
vo.setFlowWarn(warnVos.stream().filter(o -> o.getType() == 2).collect(Collectors.toList()));
|
|
|
|
|
vo.setShiftWarn(warnVos.stream().filter(o -> o.getType() == 3).collect(Collectors.toList()));
|
2025-12-15 09:37:40 +08:00
|
|
|
Long aiWarnCount = iscaiEventService.lambdaQuery()
|
|
|
|
|
.ge(ISCAIEvent::getStartTime, dateTimeRangeSo.getStart())
|
|
|
|
|
.le(ISCAIEvent::getStartTime,dateTimeRangeSo.getEnd())
|
|
|
|
|
.count();
|
2024-07-18 10:24:37 +08:00
|
|
|
vo.setAiWarnCount(aiWarnCount);
|
2025-08-29 09:16:26 +08:00
|
|
|
//TODO 超河道上游
|
2025-12-18 09:13:47 +08:00
|
|
|
String upperStcd = "999999999";//固定的站点编码
|
2025-12-15 09:37:40 +08:00
|
|
|
setUpAndDownOverRvUp(upperStcd,vo,dateTimeRangeSo);
|
2025-08-29 09:16:26 +08:00
|
|
|
|
|
|
|
|
//TODO 超河道下游
|
|
|
|
|
String lowerStcd = "61610700";//固定的站点编码
|
2025-12-15 09:37:40 +08:00
|
|
|
setUpAndDownOverRvDown(lowerStcd,vo,dateTimeRangeSo);
|
2024-07-18 10:24:37 +08:00
|
|
|
return vo;
|
|
|
|
|
}
|
2024-07-18 16:49:48 +08:00
|
|
|
|
2025-12-15 09:37:40 +08:00
|
|
|
private void setUpAndDownOverRvUp(String stcd, HomeWarnVo vo, DateTimeRangeSo dateTimeRangeSo){
|
2025-09-02 17:30:05 +08:00
|
|
|
//StRsvrRReal stRsvrRReal = stRsvrRRealService.getBaseMapper().queryRzByStcd(stcd);
|
2025-12-15 09:37:40 +08:00
|
|
|
//StRiverRReal stRiverRReal = stRiverRRealService.getBaseMapper().queryQByStcd(stcd);
|
|
|
|
|
StRiverR stRiverR = stRiverRService.getBaseMapper().queryByOneByTimeRange(stcd,dateTimeRangeSo);
|
|
|
|
|
if(stRiverR != null){
|
2025-08-29 09:16:26 +08:00
|
|
|
AlarmSet alarmSet = alarmSetService.getBaseMapper().queryByStcd(stcd);
|
|
|
|
|
//警告水位
|
|
|
|
|
BigDecimal warnWaterLevel = alarmSet.getWarnWaterLevel();
|
|
|
|
|
//保证水位
|
|
|
|
|
BigDecimal promiseWaterLevel = alarmSet.getPromiseWaterLevel();
|
|
|
|
|
if(alarmSet == null){
|
|
|
|
|
vo.setOverRvUp("告警设置未配置,请检查");
|
|
|
|
|
}else{
|
2025-12-15 09:37:40 +08:00
|
|
|
BigDecimal rz = stRiverR.getZ();
|
2025-09-16 14:25:13 +08:00
|
|
|
if(rz == null){
|
2025-10-11 17:58:19 +08:00
|
|
|
vo.setOverRvUp("无水位数据");
|
2025-09-16 14:25:13 +08:00
|
|
|
return;
|
|
|
|
|
}
|
2025-09-02 17:30:05 +08:00
|
|
|
if(rz.compareTo(warnWaterLevel) >=0){
|
2025-08-29 09:16:26 +08:00
|
|
|
BigDecimal gap = rz.subtract(warnWaterLevel);
|
|
|
|
|
vo.setOverRvUp("超警戒(" +gap.setScale(2, RoundingMode.HALF_UP)+")m");
|
|
|
|
|
}else{
|
|
|
|
|
BigDecimal gap = rz.subtract(warnWaterLevel);
|
|
|
|
|
vo.setOverRvUp("正常(" +gap.setScale(2, RoundingMode.HALF_UP)+")m");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}else{
|
2025-12-15 09:37:40 +08:00
|
|
|
vo.setOverRvUp("-");
|
2025-08-29 09:16:26 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-15 09:37:40 +08:00
|
|
|
private void setUpAndDownOverRvDown(String stcd, HomeWarnVo vo, DateTimeRangeSo dateTimeRangeSo){
|
|
|
|
|
StRiverR stRiverR = stRiverRService.getBaseMapper().queryByOneByTimeRange(stcd,dateTimeRangeSo);
|
|
|
|
|
if(stRiverR != null){
|
2025-08-29 09:16:26 +08:00
|
|
|
AlarmSet alarmSet = alarmSetService.getBaseMapper().queryByStcd(stcd);
|
|
|
|
|
//警告水位
|
|
|
|
|
BigDecimal warnWaterLevel = alarmSet.getWarnWaterLevel();
|
|
|
|
|
//保证水位
|
|
|
|
|
BigDecimal promiseWaterLevel = alarmSet.getPromiseWaterLevel();
|
|
|
|
|
if(alarmSet == null){
|
|
|
|
|
vo.setOverRvDown("告警设置未配置,请检查");
|
2025-09-16 14:25:13 +08:00
|
|
|
|
2025-08-29 09:16:26 +08:00
|
|
|
}else{
|
2025-12-15 09:37:40 +08:00
|
|
|
BigDecimal rz = stRiverR.getZ();
|
2025-09-16 14:25:13 +08:00
|
|
|
if(rz == null){
|
2025-10-11 17:58:19 +08:00
|
|
|
vo.setOverRvUp("无水位数据");
|
2025-09-16 14:25:13 +08:00
|
|
|
return;
|
|
|
|
|
}
|
2025-09-02 17:30:05 +08:00
|
|
|
if(rz.compareTo(warnWaterLevel) >=0){
|
2025-08-29 09:16:26 +08:00
|
|
|
BigDecimal gap = rz.subtract(warnWaterLevel);
|
|
|
|
|
vo.setOverRvDown("超警戒(" +gap.setScale(2, RoundingMode.HALF_UP)+")m");
|
|
|
|
|
}else{
|
|
|
|
|
BigDecimal gap = rz.subtract(warnWaterLevel);
|
|
|
|
|
vo.setOverRvDown("正常(" +gap.setScale(2, RoundingMode.HALF_UP)+")m");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}else{
|
2025-12-15 09:37:40 +08:00
|
|
|
vo.setOverRvDown("-");
|
2025-08-29 09:16:26 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-18 16:49:48 +08:00
|
|
|
private List<QXWarningVo> queryQxWarn() {
|
|
|
|
|
List<QXWarningVo> list = new ArrayList<>();
|
|
|
|
|
ApiVo apiVo = new ApiVo();
|
|
|
|
|
apiVo.setFilter(Lists.newArrayList());
|
|
|
|
|
ObjectMapper om = new ObjectMapper();
|
|
|
|
|
HttpClient httpClient = HttpClientBuilder.create().build();
|
|
|
|
|
HttpPost httpPost = new HttpPost(shqxjsWarnPath);
|
2025-04-25 17:01:53 +08:00
|
|
|
log.info("请求气象预警接口:{}", shqxjsWarnPath);
|
2024-07-18 16:49:48 +08:00
|
|
|
StringEntity stringEntity;
|
2025-04-25 17:01:53 +08:00
|
|
|
long start = System.currentTimeMillis();
|
2024-07-18 16:49:48 +08:00
|
|
|
try {
|
2025-04-25 17:01:53 +08:00
|
|
|
String params = om.writeValueAsString(apiVo);
|
|
|
|
|
log.info("请求气象预警接口参数:{}", params);
|
|
|
|
|
stringEntity = new StringEntity(params, ContentType.APPLICATION_JSON);
|
2024-07-18 16:49:48 +08:00
|
|
|
httpPost.setEntity(stringEntity);
|
|
|
|
|
HttpResponse response = httpClient.execute(httpPost);
|
|
|
|
|
HttpEntity entity = response.getEntity();
|
|
|
|
|
JSONObject dataObject = JSONUtil.parseObj(EntityUtils.toString(entity));
|
|
|
|
|
JSONArray data = dataObject.getJSONArray("data");
|
|
|
|
|
if (data == null) return list;
|
|
|
|
|
List<WarningData> dataList = data.toList(WarningData.class);
|
|
|
|
|
list = getList(dataList);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
2025-04-25 17:01:53 +08:00
|
|
|
long end = System.currentTimeMillis();
|
|
|
|
|
log.info("查询气象预警耗时:{} 秒", (end - start) / 1000);
|
2024-07-18 16:49:48 +08:00
|
|
|
return list;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<QXWarningVo> getList(List<WarningData> data) {
|
|
|
|
|
List<QXWarningVo> respList = Lists.newArrayList();
|
|
|
|
|
for (WarningData datum : data) {//最外层的列表
|
|
|
|
|
String ctnm = datum.getEffectArea();//市级范围
|
|
|
|
|
for (WarningData.TypeList typeList : datum.getTypeList()) {//里面的
|
|
|
|
|
// 预警类型
|
|
|
|
|
String type = typeList.getType();
|
|
|
|
|
List<WarningData.Warning> warnList = typeList.getWarnList();
|
|
|
|
|
|
|
|
|
|
for (WarningData.Warning warning : warnList) {
|
|
|
|
|
String cnnm = warning.getEffectArea();
|
2024-09-23 14:03:16 +08:00
|
|
|
if("红安".equals(cnnm)){
|
2024-07-18 16:49:48 +08:00
|
|
|
QXWarningVo vo = new QXWarningVo();
|
|
|
|
|
String publishUnit = warning.getPublishUnit();
|
|
|
|
|
vo.setCtnm(ctnm);//市级名称
|
|
|
|
|
vo.setCnnm(cnnm);//县级名称
|
|
|
|
|
vo.setPublishUnit(publishUnit);//发布单位
|
|
|
|
|
vo.setPublishTime(warning.getPublishTime());//预警发布时间
|
|
|
|
|
vo.setWarnSignalType(warning.getWarnSignalType());//预警类型
|
|
|
|
|
vo.setWarnSignalLevel(warning.getWarnSignalLevel());//预警级别
|
|
|
|
|
vo.setContent(warning.getContent());//预警内容
|
|
|
|
|
vo.setWarnid(warning.getId());
|
|
|
|
|
vo.setCreateTime(warning.getCreateTime());
|
|
|
|
|
vo.setStartTime(warning.getStartTime());
|
|
|
|
|
vo.setEndTime(warning.getEndTime());
|
|
|
|
|
respList.add(vo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
respList = respList.stream().filter(o -> "暴雨".equals(o.getWarnSignalType()) || "雷雨大风".equals(o.getWarnSignalType())).collect(Collectors.toList());
|
|
|
|
|
respList = respList.stream().filter(o -> "红色".equals(o.getWarnSignalLevel()) || "橙色".equals(o.getWarnSignalLevel())).collect(Collectors.toList());
|
|
|
|
|
return respList.stream().sorted(Comparator.comparing(QXWarningVo::getPublishTime).reversed())
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
}
|
2024-07-08 17:47:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|