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.entity.vo.*; import com.gunshi.project.hsz.mapper.AttResBaseMapper; import com.gunshi.project.hsz.mapper.StQxWarnRMapper; import com.gunshi.project.hsz.model.AlarmSet; import com.gunshi.project.hsz.model.StImgWarnR; import com.gunshi.project.hsz.model.StQxWarnR; import com.gunshi.project.hsz.model.StRsvrRReal; 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.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.Comparator; import java.util.Date; import java.util.List; 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; public HomeWarnVo homeWarn(DateTimeRangeSo dateTimeRangeSo) { HomeWarnVo vo = new HomeWarnVo(); List attResBaseVos = attResBaseMapper.queryList(); AttResBaseVo attResBaseVo = attResBaseVos.get(0); Date tm = attResBaseVo.getTm(); //水位的最新采集时间不在24小时内 if (tm.before(dateTimeRangeSo.getStart())) { vo.setRzWarn("-"); } else { BigDecimal rz = attResBaseVo.getRz(); if (attResBaseVo.getCalState() == 1) { BigDecimal aboveCal = rz.subtract(attResBaseVo.getCalFloodLev()); vo.setRzWarn("超校核(" + aboveCal.setScale(2, RoundingMode.HALF_UP) + "m)"); attResBaseVo.setDesState(0); attResBaseVo.setFlState(0); } else if (attResBaseVo.getDesState() == 1) { BigDecimal aboveDes = rz.subtract(attResBaseVo.getDesFloodLev()); vo.setRzWarn("超设计(" + aboveDes.setScale(2, RoundingMode.HALF_UP) + "m)"); attResBaseVo.setFlState(0); } else if (attResBaseVo.getFlState() == 1) { vo.setRzWarn("超汛限(" + attResBaseVo.getAFsltdz().setScale(2, RoundingMode.HALF_UP) + "m)"); } else if (rz.compareTo(attResBaseVo.getDeadLev()) < 0) { BigDecimal aboveDead = rz.subtract(attResBaseVo.getDeadLev()); vo.setRzWarn("低水位(" + aboveDead.setScale(1, RoundingMode.HALF_UP) + "m)"); } else { vo.setRzWarn("正常(" + attResBaseVo.getAFsltdz().setScale(2, RoundingMode.HALF_UP) + "m)"); } } vo.setQxWarn(queryQxWarn()); List warnVos = baseMapper.queryOsmoticWarn(dateTimeRangeSo); 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())); Long aiWarnCount = imgWarnRService.lambdaQuery() .ge(StImgWarnR::getTm, dateTimeRangeSo.getStart()).lt(StImgWarnR::getTm, dateTimeRangeSo.getEnd()).count(); vo.setAiWarnCount(aiWarnCount); //TODO 超河道上游 String upperStcd = "123";//固定的站点编码 setUpAndDownOverRvUp(upperStcd,vo); //TODO 超河道下游 String lowerStcd = "61610700";//固定的站点编码 setUpAndDownOverRvDown(lowerStcd,vo); return vo; } private void setUpAndDownOverRvUp(String stcd,HomeWarnVo vo){ StRsvrRReal stRsvrRReal = stRsvrRRealService.getBaseMapper().queryRzByStcd(stcd); if(stRsvrRReal != null){ AlarmSet alarmSet = alarmSetService.getBaseMapper().queryByStcd(stcd); //警告水位 BigDecimal warnWaterLevel = alarmSet.getWarnWaterLevel(); //保证水位 BigDecimal promiseWaterLevel = alarmSet.getPromiseWaterLevel(); if(alarmSet == null){ vo.setOverRvUp("告警设置未配置,请检查"); }else{ BigDecimal rz = new BigDecimal(stRsvrRReal.getRz()); if(rz.compareTo(warnWaterLevel) >=0 && rz.compareTo(promiseWaterLevel) <0){ BigDecimal gap = rz.subtract(warnWaterLevel); vo.setOverRvUp("超警戒(" +gap.setScale(2, RoundingMode.HALF_UP)+")m"); }else if(rz.compareTo(promiseWaterLevel) >=0){ BigDecimal gap = rz.subtract(promiseWaterLevel); 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{ vo.setOverRvUp("暂无水库水位数据"); } } private void setUpAndDownOverRvDown(String stcd,HomeWarnVo vo){ StRsvrRReal stRsvrRReal = stRsvrRRealService.getBaseMapper().queryRzByStcd(stcd); if(stRsvrRReal != null){ AlarmSet alarmSet = alarmSetService.getBaseMapper().queryByStcd(stcd); //警告水位 BigDecimal warnWaterLevel = alarmSet.getWarnWaterLevel(); //保证水位 BigDecimal promiseWaterLevel = alarmSet.getPromiseWaterLevel(); if(alarmSet == null){ vo.setOverRvDown("告警设置未配置,请检查"); }else{ BigDecimal rz = new BigDecimal(stRsvrRReal.getRz()); if(rz.compareTo(warnWaterLevel) >=0 && rz.compareTo(promiseWaterLevel) <0){ BigDecimal gap = rz.subtract(warnWaterLevel); vo.setOverRvDown("超警戒(" +gap.setScale(2, RoundingMode.HALF_UP)+")m"); }else if(rz.compareTo(promiseWaterLevel) >=0){ BigDecimal gap = rz.subtract(promiseWaterLevel); 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{ vo.setOverRvDown("暂无水库水位数据"); } } 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()); } }