diff --git a/src/main/java/com/gunshi/project/xyt/mapper/OsmoticPressRMapper.java b/src/main/java/com/gunshi/project/xyt/mapper/OsmoticPressRMapper.java index 3f7a35c..1ca315a 100644 --- a/src/main/java/com/gunshi/project/xyt/mapper/OsmoticPressRMapper.java +++ b/src/main/java/com/gunshi/project/xyt/mapper/OsmoticPressRMapper.java @@ -35,7 +35,7 @@ public interface OsmoticPressRMapper extends BaseMapper { t.station_code =#{obj.stationCode} - s.profile_code =#{obj.profileCode} + and s.profile_code =#{obj.profileCode} and t.tm =]]> #{obj.dateTimeRangeSo.start} diff --git a/src/main/java/com/gunshi/project/xyt/mapper/OsmoticWarnRMapper.java b/src/main/java/com/gunshi/project/xyt/mapper/OsmoticWarnRMapper.java index df583ca..3f0e12f 100644 --- a/src/main/java/com/gunshi/project/xyt/mapper/OsmoticWarnRMapper.java +++ b/src/main/java/com/gunshi/project/xyt/mapper/OsmoticWarnRMapper.java @@ -28,10 +28,10 @@ public interface OsmoticWarnRMapper extends BaseMapper { t.type = #{obj.type} - t.level = #{obj.level} + and t.level = #{obj.level} - t.station_code LIKE concat('%',#{obj.stationCode},'%') + and t.station_code like concat('%', #{obj.stationCode}::text, '%') and t.tm =]]> #{obj.dateTimeRangeSo.start} diff --git a/src/main/java/com/gunshi/project/xyt/service/OsmoticPressRService.java b/src/main/java/com/gunshi/project/xyt/service/OsmoticPressRService.java index 0f2c8cf..8bba790 100644 --- a/src/main/java/com/gunshi/project/xyt/service/OsmoticPressRService.java +++ b/src/main/java/com/gunshi/project/xyt/service/OsmoticPressRService.java @@ -100,6 +100,8 @@ public class OsmoticPressRService extends ServiceImpl()); } resList.add(vo); } diff --git a/src/main/java/com/gunshi/project/xyt/service/OsmoticWarnRService.java b/src/main/java/com/gunshi/project/xyt/service/OsmoticWarnRService.java index 8202880..d5f08b2 100644 --- a/src/main/java/com/gunshi/project/xyt/service/OsmoticWarnRService.java +++ b/src/main/java/com/gunshi/project/xyt/service/OsmoticWarnRService.java @@ -1,6 +1,8 @@ package com.gunshi.project.xyt.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -9,14 +11,20 @@ import com.gunshi.project.xyt.entity.so.WarnPageSo; import com.gunshi.project.xyt.entity.so.WarnSo; import com.gunshi.project.xyt.entity.vo.OsmoticWarnVo; import com.gunshi.project.xyt.mapper.OsmoticWarnRMapper; +import com.gunshi.project.xyt.mapper.OsmoticWarnRuleMapper; +import com.gunshi.project.xyt.model.OsmoticShiftR; import com.gunshi.project.xyt.model.OsmoticWarnR; +import com.gunshi.project.xyt.model.OsmoticWarnRule; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; /** @@ -30,10 +38,10 @@ import java.util.stream.Collectors; public class OsmoticWarnRService extends ServiceImpl { @Resource - private OsmoticWarnRMapper mapper; + private OsmoticWarnRuleMapper warnRuleMapper; public Page queryPage(WarnPageSo warnPageSo) { - return mapper.queryPage(warnPageSo.getPageSo().toPage(),warnPageSo); + return this.baseMapper.queryPage(warnPageSo.getPageSo().toPage(),warnPageSo); } public Map stat(WarnSo warnSo) { @@ -56,6 +64,127 @@ public class OsmoticWarnRService extends ServiceImpl list = this.list(wrapper); return list.stream().collect(Collectors.groupingBy(OsmoticWarnR::getLevel, Collectors.counting())); } + + /** + * 生成位移预警 + */ + public void saveShiftWarn(OsmoticShiftR shiftR){ + String stationCode = shiftR.getStationCode(); + Date tm = shiftR.getTm(); + BigDecimal x = shiftR.getX(); + savePressWarn(stationCode,x,tm,"x"); + BigDecimal y = shiftR.getY(); + savePressWarn(stationCode,y,tm,"y"); + BigDecimal h = shiftR.getH(); + savePressWarn(stationCode,h,tm,"h"); + } + + /** + * 生成渗压/渗流预警 + * @param + */ + public void savePressWarn(String stationCode,BigDecimal value,Date tm,String direction) { + //查询预警规则,每个测点至多只有2条预警规则 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(OsmoticWarnRule::getStationCode,stationCode) + .eq(OsmoticWarnRule::getStatus,1); + if(StringUtils.isNotEmpty(direction)){ + queryWrapper.eq(OsmoticWarnRule::getDirection,direction); + } + List ruleList = warnRuleMapper.selectList(queryWrapper); + if(CollectionUtils.isNotEmpty(ruleList)){ + Boolean isRedWarn = false; + //先判断是否符合红色预警 + Optional red = ruleList.stream().filter(o -> o.getLevel() == 2).findFirst(); + if(red.isPresent()){ + OsmoticWarnRule redRule = red.get(); + isRedWarn = saveWarnData(redRule,value,tm); + if (isRedWarn){ + return; + } + //没有生成红色预警,再判断是否符合黄色预警 + Optional yellow = ruleList.stream().filter(o -> o.getLevel() == 1).findFirst(); + if(yellow.isPresent()){ + OsmoticWarnRule yellowRule = yellow.get(); + saveWarnData(yellowRule,value,tm); + } + }else { + OsmoticWarnRule yellowRule = ruleList.get(0); + saveWarnData(yellowRule,value,tm); + } + } + } + + private Boolean saveWarnData(OsmoticWarnRule rule,BigDecimal value,Date tm){ + String conditionOne = rule.getConditionOne(); + BigDecimal valueOne = rule.getValueOne(); + Integer condition = rule.getCondition(); + Boolean flagOne = getFlag(conditionOne,valueOne,value); + /** + * 没有第二条件时,条件1满足就生成预警 + * 有第二条件时,当为或时,条件1满足就生成预警,条件1不满足就判断条件2是否满足;当为且时,需条件1和条件2同时满足才生成预警 + */ + if(condition == null){ + if(flagOne){ + //生成预警 + return geneWarn(rule,value,tm); + } + }else{ + String conditionTwo = rule.getConditionTwo(); + BigDecimal valueTwo = rule.getValueTwo(); + Boolean flagTwo = getFlag(conditionTwo,valueTwo,value); + if(condition == 1){ + if(flagOne && flagTwo){ + //生成预警 + return geneWarn(rule,value,tm); + } + }else{ + if(flagOne || flagTwo){ + //生成预警 + return geneWarn(rule,value,tm); + } + } + } + return false; + } + + private Boolean geneWarn(OsmoticWarnRule rule,BigDecimal value,Date tm) { + OsmoticWarnR warnR = new OsmoticWarnR(); + warnR.setId(IdWorker.getId()); + warnR.setStationCode(rule.getStationCode()); + warnR.setRuleId(rule.getId()); + warnR.setValue(value); + warnR.setTm(tm); + warnR.setType(rule.getType()); + warnR.setLevel(rule.getLevel()); + this.baseMapper.insert(warnR); + return true; + } + + private Boolean getFlag(String condition,BigDecimal ruleValue,BigDecimal value){ + Boolean flag = false; + switch (condition) { + case ">" : + flag = value.compareTo(ruleValue) > 0; + break; + case ">=" : + flag = value.compareTo(ruleValue) >= 0; + break; + case "<" : + flag = value.compareTo(ruleValue) < 0; + break; + case "<=" : + flag = value.compareTo(ruleValue) <= 0; + break; + case "=" : + flag = value.compareTo(ruleValue) == 0; + break; + case "!=" : + flag = value.compareTo(ruleValue) != 0; + break; + } + return flag; + } }