gunshi-project-ss/src/main/java/com/gunshi/project/hsz/timetask/AlarmTask.java

193 lines
7.9 KiB
Java

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<AlarmSet> alarmSets = alarmSetMapper.selectList(null);
//去实时水情查询数据
for (AlarmSet alarmSet : alarmSets) {
String stcd = alarmSet.getStcd();//获取站点编号
saveRiverData(stcd);
}
}
@Async
@Scheduled(cron = "0 7 * * * *")
public void updateWaterAlarm(){
List<AttResBaseVo> 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);
}
}
}
}
}