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 { @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 attResBaseVos = attResBaseMapper.queryList2(); Map> skWarningVoMap = new HashMap<>(); //超校核水位 List cals = new ArrayList<>(); //超设计水位 List des = new ArrayList<>(); //超汛限水位 List 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 warnVos = baseMapper.queryOsmoticWarn(dateTimeRangeSo); List 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 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 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> osmoticWarnMaps = new HashMap<>(); osmoticWarnMaps.put("pressWarn",pressWarn); osmoticWarnMaps.put("flowWarn",flowWarn); osmoticWarnMaps.put("shiftWarn",shiftWarn); vo.setOsmoticWarnVoMap(osmoticWarnMaps); List iscaiEvents = iscaiEventService.lambdaQuery() .ge(ISCAIEvent::getStartTime, dateTimeRangeSo.getStart()) .le(ISCAIEvent::getStartTime, dateTimeRangeSo.getEnd()).orderByDesc(ISCAIEvent::getStartTime).list(); List distinctResNames = iscaiEvents.stream() .map(ISCAIEvent::getEventTypeName) .filter(Objects::nonNull) // 过滤null值 .distinct() // 去重 .collect(Collectors.toList()); Map> aiWarnVoMap = new HashMap<>(); distinctResNames.forEach(resName -> { aiWarnVoMap.put(resName, new ArrayList<>()); }); for (ISCAIEvent iscaiEvent : iscaiEvents) { if(aiWarnVoMap.containsKey(iscaiEvent.getEventTypeName())){ List aiWarningVos = aiWarnVoMap.get(iscaiEvent.getEventTypeName()); List 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> riverWarningVoMap = new HashMap<>(); List overWarn = new ArrayList<>(); List 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 overWarn, List 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 queryQxWarn() { List 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 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 getList(List data) { List respList = Lists.newArrayList(); for (WarningData datum : data) {//最外层的列表 String ctnm = datum.getEffectArea();//市级范围 for (WarningData.TypeList typeList : datum.getTypeList()) {//里面的 // 预警类型 String type = typeList.getType(); List 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()); } }