gunshi-project-ss/src/main/java/com/gunshi/project/hsz/service/StQxWarnRService.java

313 lines
14 KiB
Java

package com.gunshi.project.hsz.service;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gunshi.db.dto.DateTimeRangeSo;
import com.gunshi.project.hsz.common.model.StRiverR;
import com.gunshi.project.hsz.entity.vo.*;
import com.gunshi.project.hsz.mapper.AttCctvBaseMapper;
import com.gunshi.project.hsz.mapper.AttResBaseMapper;
import com.gunshi.project.hsz.mapper.StQxWarnRMapper;
import com.gunshi.project.hsz.model.*;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
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;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
/**
* 描述: 气象预警表
* author: xusan
* date: 2024-07-08 17:30:38
*/
@Service
@Slf4j
@Transactional(rollbackFor = Exception.class)
public class StQxWarnRService extends ServiceImpl<StQxWarnRMapper, StQxWarnR> {
@Value("${shqxjsWarnPath}")
private String shqxjsWarnPath;
@Resource
private StImgWarnRService imgWarnRService;
@Resource
private AttResBaseMapper attResBaseMapper;
@Resource
private StRsvrRRealService stRsvrRRealService;
@Resource
private AlarmSetService alarmSetService;
@Resource
private StRiverRRealService stRiverRRealService;
@Resource
private StRiverRService stRiverRService;
@Autowired
private ISCAIEventService iscaiEventService;
@Resource
private JcskByRService jcskByRService;
@Resource
private AttCctvBaseService attCctvBaseService;
public HomeWarnVo homeWarn(DateTimeRangeSo dateTimeRangeSo) {
HomeWarnVo vo = new HomeWarnVo();
List<AttResBaseVo> attResBaseVos = attResBaseMapper.queryList2();
Map<String,List<SKWarningVo>> skWarningVoMap = new HashMap<>();
//超校核水位
List<SKWarningVo> cals = new ArrayList<>();
//超设计水位
List<SKWarningVo> des = new ArrayList<>();
//超汛限水位
List<SKWarningVo> fl = new ArrayList<>();
for (AttResBaseVo attResBaseVo : attResBaseVos) {
Date tm = attResBaseVo.getTm();
if(tm == null){
continue;
}
//水位的最新采集时间不在24小时内
if (tm.before(dateTimeRangeSo.getStart())) {
continue;
}else{
BigDecimal rz = attResBaseVo.getRz();
if(rz == null){
continue;
}
SKWarningVo skWarningVo = new SKWarningVo();
skWarningVo.setLttd(attResBaseVo.getLttd());
skWarningVo.setLgtd(attResBaseVo.getLgtd());
skWarningVo.setStnm(attResBaseVo.getStnm());
skWarningVo.setStcd(attResBaseVo.getStcd());
if (attResBaseVo.getCalState() == 1) {
BigDecimal aboveCal = rz.subtract(attResBaseVo.getCalFloodLev());
skWarningVo.setRzWarn(rz + "(" + aboveCal.setScale(2, RoundingMode.HALF_EVEN) + ")" );
cals.add(skWarningVo);
} else if (attResBaseVo.getDesState() == 1) {
BigDecimal aboveDes = rz.subtract(attResBaseVo.getDesFloodLev());
skWarningVo.setRzWarn(rz + "(" + aboveDes.setScale(2, RoundingMode.HALF_EVEN) + ")" );
des.add(skWarningVo);
} else if (attResBaseVo.getFlState() == 1) {
BigDecimal aboveFl = attResBaseVo.getAFsltdz().setScale(2, RoundingMode.HALF_UP);
skWarningVo.setRzWarn(rz + "(" + aboveFl.setScale(2, RoundingMode.HALF_UP) + ")" );
fl.add(skWarningVo);
}
}
}
skWarningVoMap.put("calState", cals);
skWarningVoMap.put("desState",des);
skWarningVoMap.put("flState",fl);
vo.setSkWarningVoMap(skWarningVoMap);
List<OsmoticWarnVo> warnVos = baseMapper.queryOsmoticWarn(dateTimeRangeSo);
List<OsmoticWarnVo> pressWarn = warnVos.stream().filter(o -> o.getType() == 1).collect(Collectors.toList());
pressWarn.stream().forEach(o ->{
if(o.getLevel() != null){
if(o.getLevel() == 1){
o.setWarnLevel("黄色");
}else{
o.setWarnLevel("红色");
}
}
});
List<OsmoticWarnVo> flowWarn = warnVos.stream().filter(o -> o.getType() == 2).collect(Collectors.toList());
flowWarn.stream().forEach(o->{
if(o.getLevel() != null){
if(o.getLevel() == 1){
o.setWarnLevel("黄色");
}else{
o.setWarnLevel("红色");
}
}
});
List<OsmoticWarnVo> shiftWarn = warnVos.stream().filter(o -> o.getType() == 3).collect(Collectors.toList());
shiftWarn.stream().forEach(o ->{
if(o.getLevel() != null){
if(o.getLevel() == 1){
o.setWarnLevel("黄色");
}else{
o.setWarnLevel("红色");
}
}
});
Map<String,List<OsmoticWarnVo>> osmoticWarnMaps = new HashMap<>();
osmoticWarnMaps.put("pressWarn",pressWarn);
osmoticWarnMaps.put("flowWarn",flowWarn);
osmoticWarnMaps.put("shiftWarn",shiftWarn);
vo.setOsmoticWarnVoMap(osmoticWarnMaps);
List<ISCAIEvent> iscaiEvents = iscaiEventService.lambdaQuery()
.ge(ISCAIEvent::getStartTime, dateTimeRangeSo.getStart())
.le(ISCAIEvent::getStartTime, dateTimeRangeSo.getEnd()).orderByDesc(ISCAIEvent::getStartTime).list();
List<String> distinctResNames = iscaiEvents.stream()
.map(ISCAIEvent::getEventTypeName)
.filter(Objects::nonNull) // 过滤null值
.distinct() // 去重
.collect(Collectors.toList());
Map<String,List<AiWarningVo>> aiWarnVoMap = new HashMap<>();
distinctResNames.forEach(resName -> {
aiWarnVoMap.put(resName, new ArrayList<>());
});
for (ISCAIEvent iscaiEvent : iscaiEvents) {
if(aiWarnVoMap.containsKey(iscaiEvent.getEventTypeName())){
List<AiWarningVo> aiWarningVos = aiWarnVoMap.get(iscaiEvent.getEventTypeName());
List<AttCctvBase> list = attCctvBaseService.lambdaQuery().eq(AttCctvBase::getIndexCode, iscaiEvent.getResIndexCode()).list();
for (AttCctvBase attCctvBase : list) {
AiWarningVo aiWarningVo = new AiWarningVo();
aiWarningVo.setWarningTime(iscaiEvent.getStartTime());
aiWarningVo.setStnm(attCctvBase.getName());
if(attCctvBase.getLgtd() !=null){
aiWarningVo.setLgtd(new BigDecimal(attCctvBase.getLgtd()));
}
if(attCctvBase.getLttd() != null){
aiWarningVo.setLttd(new BigDecimal(attCctvBase.getLttd()));
}
aiWarningVos.add(aiWarningVo);
}
}
}
vo.setAiWarnVoMap(aiWarnVoMap);
Map<String,List<RiverWarningVo>> riverWarningVoMap = new HashMap<>();
List<RiverWarningVo> overWarn = new ArrayList<>();
List<RiverWarningVo> overPmis = new ArrayList<>();
//TODO 超河道上游
String upperStcd = "999999999";//固定的站点编码
setUpAndDownOverRvUpAndDown(upperStcd,dateTimeRangeSo,overWarn,overPmis);
//TODO 超河道下游
String lowerStcd = "999999998";//固定的站点编码
setUpAndDownOverRvUpAndDown(lowerStcd,dateTimeRangeSo,overWarn,overPmis);
riverWarningVoMap.put("overWarn",overWarn);
riverWarningVoMap.put("overPromise",overPmis);
vo.setRiverWarningVoMap(riverWarningVoMap);
return vo;
}
private void setUpAndDownOverRvUpAndDown(String stcd, DateTimeRangeSo dateTimeRangeSo, List<RiverWarningVo> overWarn, List<RiverWarningVo> overPmis){
StRiverR stRiverR = stRiverRService.getBaseMapper().queryByOneByTimeRange(stcd,dateTimeRangeSo);
RiverWarningVo riverWarningVo = new RiverWarningVo();
if(stRiverR != null){
riverWarningVo.setStcd(stcd);
riverWarningVo.setStnm(stRiverR.getStnm());
riverWarningVo.setLgtd(stRiverR.getLgtd());
riverWarningVo.setLgtd(stRiverR.getLgtd());
AlarmSet alarmSet = alarmSetService.getBaseMapper().queryByStcd(stcd);
if(alarmSet == null){
riverWarningVo.setRzWarn("告警设置未配置,请检查");
}else{
//警告水位
BigDecimal warnWaterLevel = alarmSet.getWarnWaterLevel();
//保证水位
BigDecimal promiseWaterLevel = alarmSet.getPromiseWaterLevel();
BigDecimal rz = stRiverR.getZ();
if(rz == null){
return;
}
if(rz.compareTo(warnWaterLevel) >=0 && rz.compareTo(promiseWaterLevel) <0){
BigDecimal gap = rz.subtract(warnWaterLevel);
riverWarningVo.setRzWarn(gap.toString());
overWarn.add(riverWarningVo);
}else if (rz.compareTo(promiseWaterLevel) >=0){
BigDecimal gap = rz.subtract(warnWaterLevel);
riverWarningVo.setRzWarn(gap.toString());
overPmis.add(riverWarningVo);
}
}
}
}
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);
log.info("请求气象预警接口:{}", shqxjsWarnPath);
StringEntity stringEntity;
long start = System.currentTimeMillis();
try {
String params = om.writeValueAsString(apiVo);
log.info("请求气象预警接口参数:{}", params);
stringEntity = new StringEntity(params, ContentType.APPLICATION_JSON);
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();
}
long end = System.currentTimeMillis();
log.info("查询气象预警耗时:{} 秒", (end - start) / 1000);
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();
if("红安".equals(cnnm)){
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());
}
}