package com.gunshi.project.hsz.timetask; import com.gunshi.project.hsz.common.model.StStbprpB; import com.gunshi.project.hsz.entity.enums.AlarmTypeEnum; import com.gunshi.project.hsz.entity.vo.AttResBaseVo; import com.gunshi.project.hsz.mapper.AlarmSetMapper; import com.gunshi.project.hsz.mapper.AttResBaseMapper; import com.gunshi.project.hsz.model.AlarmSet; import com.gunshi.project.hsz.common.model.StRiverRReal; import com.gunshi.project.hsz.model.WaterAlarm; import com.gunshi.project.hsz.service.StRiverRRealService; import com.gunshi.project.hsz.service.StRsvrRService; import com.gunshi.project.hsz.service.StStbprpBService; import com.gunshi.project.hsz.service.WaterAlarmService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Profile; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.time.Instant; import java.util.List; import java.util.concurrent.TimeUnit; /** * 告警定时任务 */ @Component @Slf4j @EnableScheduling @Profile({"prod","dev","local"}) public class AlarmTask { @Autowired private AlarmSetMapper alarmSetMapper; @Autowired private AttResBaseMapper attResBaseMapper; @Autowired private WaterAlarmService waterAlarmService; @Autowired private StRiverRRealService stRiverRRealService; @Autowired private StStbprpBService stStbprpBService; @Async @Scheduled(cron = "0 7 * * * *") public void updateAlarmSet(){ //查询告警设置中所有的配置的站点 List alarmSets = alarmSetMapper.selectList(null); //去实时水情查询数据 for (AlarmSet alarmSet : alarmSets) { String stcd = alarmSet.getStcd();//获取站点编号 saveRiverData(stcd); } } @Async @Scheduled(cron = "0 7 * * * *") public void updateWaterAlarm(){ List attResBaseVos = attResBaseMapper.queryList2(); for (AttResBaseVo attResBaseVo : attResBaseVos) { saveResStData(attResBaseVo); } } private void saveResStData(AttResBaseVo entity){ Integer calState = entity.getCalState();//是否超校核 Integer desState = entity.getDesState();//是否超设计 Integer flState = entity.getFlState();//是否超汛限 WaterAlarm waterAlarmNew = waterAlarmService.getBaseMapper().selectByStcdNew(entity.getStcd()); if(waterAlarmNew != null){ //判断最新的时间是否大于 //最新数据时间 Instant newDataInstant = entity.getTm().toInstant(); //老数据告警时间 Instant currentDataInstant = waterAlarmNew.getAlarmTime().toInstant(); if(newDataInstant.compareTo(currentDataInstant) <= 0){ //如果不是最新数据,直接结束 return; } } if(calState > 0){ Integer level = AlarmTypeEnum.RESERVOIR_OVER_CHECK.getLevel(); WaterAlarm waterAlarm = new WaterAlarm(); waterAlarm.setStcd(entity.getStcd()); waterAlarm.setStnm(entity.getStnm()); waterAlarm.setAlarmTime(entity.getTm()); waterAlarm.setCurValue(entity.getRz()); waterAlarm.setAlarmValue(entity.getCalFloodLev()); waterAlarm.setOverValue(entity.getRz().subtract(entity.getCalFloodLev())); waterAlarm.setAlarmType(level); waterAlarmService.save(waterAlarm); } if(desState > 0){ Integer level = AlarmTypeEnum.RESERVOIR_OVER_DESIGN.getLevel(); WaterAlarm waterAlarm = new WaterAlarm(); waterAlarm.setStcd(entity.getStcd()); waterAlarm.setStnm(entity.getStnm()); waterAlarm.setAlarmTime(entity.getTm()); waterAlarm.setCurValue(entity.getRz()); waterAlarm.setAlarmValue(entity.getDesFloodLev()); waterAlarm.setOverValue(entity.getRz().subtract(entity.getDesFloodLev())); waterAlarm.setAlarmType(level); waterAlarmService.save(waterAlarm); } if(flState > 0){ Integer level = AlarmTypeEnum.RESERVOIR_OVER_FLOOD_LIMIT.getLevel(); WaterAlarm waterAlarm = new WaterAlarm(); waterAlarm.setStcd(entity.getStcd()); waterAlarm.setStnm(entity.getStnm()); waterAlarm.setAlarmTime(entity.getTm()); waterAlarm.setCurValue(entity.getRz()); waterAlarm.setAlarmValue(entity.getFlLowLimLev()); waterAlarm.setOverValue(entity.getRz().subtract(entity.getFlLowLimLev())); waterAlarm.setAlarmType(level); waterAlarmService.save(waterAlarm); } } private void saveRiverData(String stcd){ //根据站点编码查询真实水位数据 StRiverRReal stRiverRReal = stRiverRRealService.getBaseMapper().queryQByStcd(stcd); //查询该站点最新一条数据 WaterAlarm waterAlarmNew = waterAlarmService.getBaseMapper().selectByStcdNew(stcd); if(stRiverRReal != null){ //该站点,真实河道水位的最新数据的时间 Instant newDateInstant = stRiverRReal.getTm().toInstant(); //告警表中,该站点的最新数据的时间 if(waterAlarmNew != null){ Instant curDateInstant = waterAlarmNew.getAlarmTime().toInstant(); if(newDateInstant.compareTo(curDateInstant) <= 0){ //如果要插入数据的时间与当前告警表中数据相同,则直接跳过本条数据 return; } } AlarmSet alarmSet = alarmSetMapper.queryByStcd(stcd); //警告水位 BigDecimal warnWaterLevel = alarmSet.getWarnWaterLevel(); //保证水位 BigDecimal promiseWaterLevel = alarmSet.getPromiseWaterLevel(); if(alarmSet == null){ return; }else{ BigDecimal rz =stRiverRReal.getZ(); if(rz == null){ return; } if(rz.compareTo(warnWaterLevel) >=0 && rz.compareTo(promiseWaterLevel) <=0){ BigDecimal gap = rz.subtract(warnWaterLevel); //河道超警戒 Integer level = AlarmTypeEnum.RIVER_OVER_WARNING.getLevel(); WaterAlarm waterAlarm = new WaterAlarm(); waterAlarm.setStcd(stRiverRReal.getStcd()); waterAlarm.setStnm(stRiverRReal.getStnm()); waterAlarm.setAlarmTime(stRiverRReal.getTm()); waterAlarm.setCurValue(stRiverRReal.getZ()); waterAlarm.setAlarmValue(warnWaterLevel); waterAlarm.setOverValue(gap); waterAlarm.setAlarmType(level); waterAlarmService.save(waterAlarm); }else if(rz.compareTo(promiseWaterLevel) >0){ BigDecimal gap = rz.subtract(promiseWaterLevel); //河道超保证 Integer level = AlarmTypeEnum.RIVER_OVER_GUARANTEE.getLevel(); WaterAlarm waterAlarm = new WaterAlarm(); waterAlarm.setStcd(stRiverRReal.getStcd()); waterAlarm.setStnm(stRiverRReal.getStnm()); waterAlarm.setAlarmTime(stRiverRReal.getTm()); waterAlarm.setCurValue(stRiverRReal.getZ()); waterAlarm.setAlarmValue(promiseWaterLevel); waterAlarm.setOverValue(gap); waterAlarm.setAlarmType(level); waterAlarmService.save(waterAlarm); } } } } }