|
@@ -55,8 +55,7 @@ import java.util.*;
|
|
|
|
|
|
import static com.slibra.common.constant.MyConstants.*;
|
|
|
import static com.slibra.common.constant.MyConstants.BigDecimal_100;
|
|
|
-import static com.slibra.common.enums.BusinessEnum.BigModelWarningTypeRemarkEnum.ONE_SH_WARNING;
|
|
|
-import static com.slibra.common.enums.BusinessEnum.BigModelWarningTypeRemarkEnum.ZERO_SZ_WARNING;
|
|
|
+import static com.slibra.common.enums.BusinessEnum.BigModelWarningTypeRemarkEnum.*;
|
|
|
import static com.slibra.common.enums.BusinessEnum.WarningCategoryEnum.*;
|
|
|
|
|
|
/**
|
|
@@ -2862,9 +2861,448 @@ public class HandleDataController extends BaseController
|
|
|
if(!CollectionUtils.isEmpty(tXinyiRobots)){
|
|
|
for (TXinyiRobot tXinyiRobot : tXinyiRobots) {
|
|
|
asyncTask.handleRobotWarningNew(tXinyiRobot);
|
|
|
+ this.handleRobotWarningNew(tXinyiRobot);
|
|
|
}
|
|
|
}
|
|
|
return "success";
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ public void handleRobotWarningNew(TXinyiRobot tXinyiRobot) {
|
|
|
+
|
|
|
+ log.info("进入了定时任务判断机器人化验库是否超标及后续逻辑--新的逻辑处理");
|
|
|
+ //查询配置
|
|
|
+ List<TXinyiNormConfig> tXinyiNormConfigs = this.xinyiNormConfigMapper.selectTXinyiNormConfigList(null);
|
|
|
+ if(CollectionUtils.isEmpty(tXinyiNormConfigs)){
|
|
|
+// throw new ServiceException("未查询到配置信息");
|
|
|
+ log.error("未查询到配置信息");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ TXinyiNormConfig normConfig = tXinyiNormConfigs.get(0);
|
|
|
+
|
|
|
+ String testHour = tXinyiRobot.getTestHour();
|
|
|
+ if(StringUtils.isBlank(testHour)){
|
|
|
+ log.error("化验室报警的时候,获取化验室的化验时间-小时失败,无法处理后续操作");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ //查询最新的一条工业库的数据(showvalue展示使用)
|
|
|
+ //2025年02月26日15:55:16 逻辑调整:这里不使用最新的一条工业库数据,获取化验室的同时段的数据
|
|
|
+// List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectNIndustry(1);
|
|
|
+ List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectTXinyiIndustryList(TXinyiIndustry.builder().testHour(testHour).build());
|
|
|
+ if(CollectionUtils.isEmpty(tXinyiIndustries)){
|
|
|
+// throw new ServiceException("未查询到对应的工业库数据,无法进行图表数据展示!");
|
|
|
+ log.error("未查询到对应的工业库数据,无法进行图表数据展示!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ TXinyiIndustry tXinyiIndustry = tXinyiIndustries.get(0);
|
|
|
+
|
|
|
+ //新的逻辑:
|
|
|
+ //只要当前获取的工业库数据和当前时间
|
|
|
+ //如果当前时间和工业库传过来的相差不到一个小时,说明正常,工业库没挂掉:需要查询是否有挂掉的记录,有的话,关闭此报警,并触发整体的业务数据报警。
|
|
|
+ //如果超过1小时了,说明工业库同步数据挂掉了,这时候去查询有无此类型的报警,如果有,不做任何处理,程序结束;如果没有,新增该类型报警并结束程序。
|
|
|
+ robotWarningDetailNew(tXinyiRobot, normConfig, tXinyiIndustry);//采用新的逻辑
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 2025年04月18日15:53:45 由于报警逻辑和以前几乎完全不一样在,所以在保留原有的基础上,新增了该方法。
|
|
|
+ * 机器人化验室报警逻辑处理
|
|
|
+ * @param tXinyiRobot
|
|
|
+ * @param normConfig
|
|
|
+ * @param tXinyiIndustry
|
|
|
+ */
|
|
|
+ private void robotWarningDetailNew(TXinyiRobot tXinyiRobot, TXinyiNormConfig normConfig, TXinyiIndustry tXinyiIndustry) {
|
|
|
+ //#1好氧硝酸盐
|
|
|
+ BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
|
|
|
+ //#2好氧硝酸盐
|
|
|
+ BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
|
|
|
+
|
|
|
+ String testHour = tXinyiRobot.getTestHour();
|
|
|
+
|
|
|
+ //2025年04月21日17:04:28 逻辑调整,需要取最近的十条数据,计算获取到十个值
|
|
|
+ //2025年05月08日16:27:47 这里要获取某个日期下面的值
|
|
|
+// List<TXinyiRobot> tXinyiRobots = this.xinyiRobotMapper.selectNRobot(INT_10);
|
|
|
+ List<TXinyiRobot> tXinyiRobots = this.xinyiRobotMapper.selectNRobotAfterHour(INT_10, testHour);
|
|
|
+ if(CollectionUtils.isEmpty(tXinyiRobots) || tXinyiRobots.size() < INT_10){
|
|
|
+ log.error("化验室报警-新逻辑获取最近的10条化验室数据失败,无法处理报警,退出");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<BigDecimal> tenVals = new ArrayList<>(10);
|
|
|
+
|
|
|
+ //取前6个,硝酸盐是6个
|
|
|
+
|
|
|
+ for (int i = 0; i < tXinyiRobots.size(); i++) {
|
|
|
+ TXinyiRobot xinyiRobot = tXinyiRobots.get(i);
|
|
|
+ //判断 增加容错
|
|
|
+ BigDecimal no3Hlj1JqrTemp = xinyiRobot.getNo3Hlj1Jqr();
|
|
|
+ //#2好氧硝酸盐
|
|
|
+ BigDecimal no3Hlj2JqrTemp = xinyiRobot.getNo3Hlj2Jqr();
|
|
|
+ //1#缺氧出-硝酸盐
|
|
|
+ BigDecimal no3Qyc1JqrTemp = xinyiRobot.getNo3Qyc1Jqr();
|
|
|
+ BigDecimal nh31JqrTemp = xinyiRobot.getNh31Jqr();
|
|
|
+ //2#缺氧出-硝酸盐
|
|
|
+ BigDecimal no3Qyc2JqrTemp = xinyiRobot.getNo3Qyc2Jqr();
|
|
|
+ BigDecimal nh32JqrTemp = xinyiRobot.getNh32Jqr();
|
|
|
+ if (Objects.isNull(no3Qyc1JqrTemp))
|
|
|
+ no3Qyc1JqrTemp = BigDecimal.ZERO;
|
|
|
+ if (Objects.isNull(nh31JqrTemp))
|
|
|
+ nh31JqrTemp = BigDecimal.ZERO;
|
|
|
+ if (Objects.isNull(no3Hlj1JqrTemp))
|
|
|
+ no3Hlj1JqrTemp = BigDecimal.ZERO;
|
|
|
+ BigDecimal anDan1 = no3Qyc1JqrTemp.add(nh31JqrTemp).subtract(no3Hlj1JqrTemp);
|
|
|
+
|
|
|
+ //判断 增加容错
|
|
|
+ if (Objects.isNull(no3Qyc2JqrTemp))
|
|
|
+ no3Qyc2JqrTemp = BigDecimal.ZERO;
|
|
|
+ if (Objects.isNull(nh32JqrTemp))
|
|
|
+ nh32JqrTemp = BigDecimal.ZERO;
|
|
|
+ if (Objects.isNull(no3Hlj2JqrTemp))
|
|
|
+ no3Hlj2JqrTemp = BigDecimal.ZERO;
|
|
|
+ BigDecimal anDan2 = no3Qyc2JqrTemp.add(nh32JqrTemp).subtract(no3Hlj2JqrTemp);
|
|
|
+ BigDecimal divide = anDan1.add(anDan2).divide(DECIMAL_2, INT_2, RoundingMode.HALF_UP);
|
|
|
+ //2025年04月21日17:22:30 如果计算结果小于0,当0处理
|
|
|
+ if (divide.compareTo(BigDecimal.ZERO) < 0)
|
|
|
+ divide = BigDecimal.ZERO;
|
|
|
+ tenVals.add(divide);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //总氮的标准值和管控值
|
|
|
+ BigDecimal cszzBzz = normConfig.getCszzBzz();
|
|
|
+ BigDecimal cszzGkz = normConfig.getCszzGkz();
|
|
|
+ //氨氮的标准值和管控值
|
|
|
+ BigDecimal csadBzz = normConfig.getCsadBzz();
|
|
|
+ BigDecimal csadGkz = normConfig.getCsadGkz();
|
|
|
+
|
|
|
+ BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
|
|
|
+ BigDecimal jsslSjz = normConfig.getJsslSjz();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ //#1好氧硝酸盐
|
|
|
+ if(no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0){
|
|
|
+ if(!Objects.isNull(cszzBzz)){
|
|
|
+ handleXinYiWarningsRobotOriginCsXsy(cszzBzz, no3Hlj1Jqr, cszzGkz, ROBOT_XSY_1.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()), tXinyiRobots);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //#2好氧硝酸盐
|
|
|
+ if(no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0){
|
|
|
+ if(!Objects.isNull(cszzBzz)){
|
|
|
+ handleXinYiWarningsRobotOriginCsXsy(cszzBzz, no3Hlj2Jqr, cszzGkz, ROBOT_XSY_2.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()), tXinyiRobots);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //出水氨氮
|
|
|
+ if(!Objects.isNull(csadBzz)){
|
|
|
+ handleXinYiWarningsRobotOriginCsAd(csadBzz, tenVals.get(INDEX_0), csadGkz, ROBOT_CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()), tXinyiRobots, tenVals);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过输入的值 生成对应类型的报警对象(出水)
|
|
|
+ *
|
|
|
+ * @param csBzz
|
|
|
+ * @param currentVal
|
|
|
+ * @param csGkz
|
|
|
+ * @param category
|
|
|
+ * @param tXinyiIndustry
|
|
|
+ * @param normConfig
|
|
|
+ * @param cwrwfhz
|
|
|
+ * @param tXinyiRobots
|
|
|
+ * @param tenVals
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private void handleXinYiWarningsRobotOriginCsAd(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots, List<BigDecimal> tenVals) {
|
|
|
+
|
|
|
+ String testHour = tXinyiIndustry.getTestHour();
|
|
|
+ //这里也不能用当前日期,要用对应检测时间
|
|
|
+// Date nowDate = DateUtils.getNowDate();
|
|
|
+ Date nowDate = DateUtils.parseDate(testHour);
|
|
|
+
|
|
|
+ //下面是最原始的处理 超标准 超管控报警
|
|
|
+ robotCsAdGybz(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tenVals, nowDate);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * 化验室-出水氨氮 的 超标准工艺报警
|
|
|
+ * @param csBzz
|
|
|
+ * @param currentVal
|
|
|
+ * @param csGkz
|
|
|
+ * @param category
|
|
|
+ * @param tXinyiIndustry
|
|
|
+ * @param normConfig
|
|
|
+ * @param cwrwfhz
|
|
|
+ * @param tXinyiRobots
|
|
|
+ * @param nowDate
|
|
|
+ */
|
|
|
+ private void robotCsAdGybz(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<BigDecimal> tXinyiRobots, Date nowDate) {
|
|
|
+ TXinyiWarningRecord tXinyiWarningRecord = getRobotCsAdWarningBean(csBzz, currentVal, csGkz, category, normConfig, cwrwfhz, tXinyiRobots, nowDate);
|
|
|
+ //判断是否存在要报警的数据
|
|
|
+ //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
|
|
|
+ List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().delFlag(0).type(0).category(category).status(0).build());
|
|
|
+ if(Objects.isNull(tXinyiWarningRecord)){//数据正常,无告警信息
|
|
|
+ if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
|
|
|
+ log.info( "{}:现在恢复正常,历史报警数据为{}", category,JSON.toJSONString(tXinyiWarningRecords));
|
|
|
+ for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {
|
|
|
+ this.closeWarning(xinyiWarningRecord);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{//有告警信息
|
|
|
+ if(CollectionUtils.isEmpty(tXinyiWarningRecords)){//之前没有告警记录
|
|
|
+ //保存到数据库中
|
|
|
+ //2024年7月15日11:06:16 因为只有一个告警记录,但是如果一直报警,现在报警时间取的是更新时间,兼容第一次报警处理
|
|
|
+ tXinyiWarningRecord.setUpdateTime(nowDate);
|
|
|
+ this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
|
|
|
+ //继续调用决策
|
|
|
+ this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, true, nowDate);
|
|
|
+ }else{
|
|
|
+ log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
|
|
|
+ for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {//理论上只有一个的
|
|
|
+ //2024年7月5日10:45:24 逻辑调整:更新一直报警的那条记录的显示值
|
|
|
+ xinyiWarningRecord.setWarningVal(tXinyiWarningRecord.getWarningVal());
|
|
|
+// xinyiWarningRecord.setDesignVal(tXinyiWarningRecord.getDesignVal());
|
|
|
+// tXinyiWarningRecord.setControlVal(tXinyiWarningRecord.getControlVal());
|
|
|
+ xinyiWarningRecord.setTime(tXinyiWarningRecord.getTime());
|
|
|
+ xinyiWarningRecord.setUpdateTime(nowDate);
|
|
|
+ xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
|
|
|
+ //2024年7月15日11:07:33 报警的级别也要重新计算并更新
|
|
|
+ xinyiWarningRecord.setLevel(tXinyiWarningRecord.getLevel());
|
|
|
+ //2024年7月31日09:20:47 报警的原因(超标还是超管控也需要更新)
|
|
|
+ xinyiWarningRecord.setReason(tXinyiWarningRecord.getReason());
|
|
|
+ //更新数据库
|
|
|
+ this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
|
|
|
+ //继续调用决策
|
|
|
+ this.handleDecision(xinyiWarningRecord, tXinyiIndustry, normConfig, true, nowDate);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断化验室的-出水氨氮是否存在报警,如果存在返回报警对象;如果不存在,返回null
|
|
|
+ *
|
|
|
+ * @param csBzz
|
|
|
+ * @param currentVal
|
|
|
+ * @param csGkz
|
|
|
+ * @param category
|
|
|
+ * @param normConfig
|
|
|
+ * @param cwrwfhz
|
|
|
+ * @param tXinyiRobots
|
|
|
+ * @param nowDate
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private TXinyiWarningRecord getRobotCsAdWarningBean(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<BigDecimal> tXinyiRobots, Date nowDate) {
|
|
|
+ //判断是否存在
|
|
|
+ boolean flag = true;
|
|
|
+ for (BigDecimal val : tXinyiRobots) {
|
|
|
+ if (!Objects.isNull(val) && val.compareTo(csBzz) <= 0) {
|
|
|
+ flag = false;
|
|
|
+ break;//只要出现一个不超标的就不算超标
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //存放则返回对象,不存在,则返回null
|
|
|
+ if(!flag)
|
|
|
+ return null;
|
|
|
+ TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
|
|
|
+ tXinyiWarningRecord.setStatus(0);
|
|
|
+ tXinyiWarningRecord.setType(0);
|
|
|
+ tXinyiWarningRecord.setCategory(category);
|
|
|
+ tXinyiWarningRecord.setTime(nowDate);
|
|
|
+ tXinyiWarningRecord.setWarningVal(currentVal);
|
|
|
+ tXinyiWarningRecord.setDesignVal(csBzz);
|
|
|
+ tXinyiWarningRecord.setControlVal(csGkz);
|
|
|
+ tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
|
|
|
+ tXinyiWarningRecord.setCreateTime(nowDate);
|
|
|
+ tXinyiWarningRecord.setRemark(THREE_HYS_WARNING.getCode());//化验室
|
|
|
+ tXinyiWarningRecord.setCwrwfhz(cwrwfhz);//2025年02月14日10:42:53 具体指标具体计算,由上游传过来。
|
|
|
+ //2025年02月17日13:53:49 化验室的报警都是对应的类型都是出水
|
|
|
+ tXinyiWarningRecord.setWaterType(BusinessEnum.WaterTypeEnum.CS.getCode());
|
|
|
+ tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
|
|
|
+ tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
|
|
|
+ tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.CBZZ.getCode());
|
|
|
+ tXinyiWarningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
|
|
|
+ return tXinyiWarningRecord;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过输入的值 生成对应类型的报警对象(出水)
|
|
|
+ *
|
|
|
+ * @param csBzz
|
|
|
+ * @param currentVal
|
|
|
+ * @param csGkz
|
|
|
+ * @param category
|
|
|
+ * @param tXinyiIndustry
|
|
|
+ * @param normConfig
|
|
|
+ * @param cwrwfhz
|
|
|
+ * @param tXinyiRobots
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private void handleXinYiWarningsRobotOriginCsXsy(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots) {
|
|
|
+
|
|
|
+ String testHour = tXinyiIndustry.getTestHour();
|
|
|
+ //这里也不能用当前日期,要用对应检测时间
|
|
|
+// Date nowDate = DateUtils.getNowDate();
|
|
|
+ Date nowDate = DateUtils.parseDate(testHour);
|
|
|
+
|
|
|
+ //下面是最原始的处理 超标准 超管控报警
|
|
|
+ robotCsXsyGybz(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * 化验室-出水硝酸盐 的 超标准工艺报警
|
|
|
+ * @param csBzz
|
|
|
+ * @param currentVal
|
|
|
+ * @param csGkz
|
|
|
+ * @param category
|
|
|
+ * @param tXinyiIndustry
|
|
|
+ * @param normConfig
|
|
|
+ * @param cwrwfhz
|
|
|
+ * @param tXinyiRobots
|
|
|
+ * @param nowDate
|
|
|
+ */
|
|
|
+ private void robotCsXsyGybz(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots, Date nowDate) {
|
|
|
+ TXinyiWarningRecord tXinyiWarningRecord = getRobotCsXsyWarningBean(csBzz, currentVal, csGkz, category, normConfig, cwrwfhz, tXinyiRobots, nowDate);
|
|
|
+ //判断是否存在要报警的数据
|
|
|
+ //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
|
|
|
+ List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().delFlag(0).type(0).category(category).status(0).build());
|
|
|
+ if(Objects.isNull(tXinyiWarningRecord)){//数据正常,无告警信息
|
|
|
+ if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
|
|
|
+ log.info( "{}:现在恢复正常,历史报警数据为{}", category,JSON.toJSONString(tXinyiWarningRecords));
|
|
|
+ for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {
|
|
|
+ this.closeWarning(xinyiWarningRecord);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{//有告警信息
|
|
|
+ if(CollectionUtils.isEmpty(tXinyiWarningRecords)){//之前没有告警记录
|
|
|
+ //保存到数据库中
|
|
|
+ //2024年7月15日11:06:16 因为只有一个告警记录,但是如果一直报警,现在报警时间取的是更新时间,兼容第一次报警处理
|
|
|
+ tXinyiWarningRecord.setUpdateTime(nowDate);
|
|
|
+ this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
|
|
|
+ //继续调用决策
|
|
|
+ this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, true, nowDate);
|
|
|
+ }else{
|
|
|
+ log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
|
|
|
+ for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {//理论上只有一个的
|
|
|
+ //2024年7月5日10:45:24 逻辑调整:更新一直报警的那条记录的显示值
|
|
|
+ xinyiWarningRecord.setWarningVal(tXinyiWarningRecord.getWarningVal());
|
|
|
+// xinyiWarningRecord.setDesignVal(tXinyiWarningRecord.getDesignVal());
|
|
|
+// tXinyiWarningRecord.setControlVal(tXinyiWarningRecord.getControlVal());
|
|
|
+ xinyiWarningRecord.setTime(tXinyiWarningRecord.getTime());
|
|
|
+ xinyiWarningRecord.setUpdateTime(nowDate);
|
|
|
+ xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
|
|
|
+ //2024年7月15日11:07:33 报警的级别也要重新计算并更新
|
|
|
+ xinyiWarningRecord.setLevel(tXinyiWarningRecord.getLevel());
|
|
|
+ //2024年7月31日09:20:47 报警的原因(超标还是超管控也需要更新)
|
|
|
+ xinyiWarningRecord.setReason(tXinyiWarningRecord.getReason());
|
|
|
+ //更新数据库
|
|
|
+ this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
|
|
|
+ //继续调用决策
|
|
|
+ this.handleDecision(xinyiWarningRecord, tXinyiIndustry, normConfig, true, nowDate);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断化验室的-出水氨氮是否存在报警,如果存在返回报警对象;如果不存在,返回null
|
|
|
+ *
|
|
|
+ * @param csBzz
|
|
|
+ * @param currentVal
|
|
|
+ * @param csGkz
|
|
|
+ * @param category
|
|
|
+ * @param normConfig
|
|
|
+ * @param cwrwfhz
|
|
|
+ * @param tXinyiRobots
|
|
|
+ * @param nowDate
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private TXinyiWarningRecord getRobotCsXsyWarningBean(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots, Date nowDate) {
|
|
|
+ //判断是否存在
|
|
|
+ boolean flag1 = true;
|
|
|
+ boolean flag2 = true;
|
|
|
+ int index = 0;
|
|
|
+ for (TXinyiRobot xinyiRobot : tXinyiRobots) {
|
|
|
+ //是否连续6小时超标
|
|
|
+ if(index < 6){
|
|
|
+ BigDecimal val = null;
|
|
|
+ if(ROBOT_XSY_1.getCode().equals(category))
|
|
|
+ val = xinyiRobot.getNo3Hlj1Jqr();
|
|
|
+ else if(ROBOT_XSY_2.getCode().equals(category))
|
|
|
+ val = xinyiRobot.getNo3Hlj2Jqr();
|
|
|
+ if (!Objects.isNull(val) && val.compareTo(csBzz) <= 0) {
|
|
|
+ flag1 = false;
|
|
|
+ //2025年05月07日16:04:56 bug修复:这里不能退出,因为一个循环里有2个判断逻辑处理。
|
|
|
+// break;//只要出现一个不超标的就不算超标
|
|
|
+ }
|
|
|
+ }
|
|
|
+ index++;
|
|
|
+
|
|
|
+ //是否满足{缺氧区出水氨氮+缺氧区出水硝酸盐 > 15(文件配置) and 连续10小时}
|
|
|
+ BigDecimal one = null;
|
|
|
+ BigDecimal two = null;
|
|
|
+ if(ROBOT_XSY_1.getCode().equals(category)){
|
|
|
+ one = xinyiRobot.getNh31Jqr();
|
|
|
+ two = xinyiRobot.getNo3Qyc1Jqr();
|
|
|
+ }
|
|
|
+ else if(ROBOT_XSY_2.getCode().equals(category)){
|
|
|
+ one = xinyiRobot.getNh32Jqr();
|
|
|
+ two = xinyiRobot.getNo3Qyc2Jqr();
|
|
|
+ }
|
|
|
+ //兜底计算
|
|
|
+ if(Objects.isNull(one))
|
|
|
+ one = BigDecimal.ZERO;
|
|
|
+ if(Objects.isNull(two))
|
|
|
+ two = BigDecimal.ZERO;
|
|
|
+ if(one.add(two).compareTo(BigDecimal.valueOf(15)) <= 0) {
|
|
|
+ flag2 = false;
|
|
|
+ //2025年05月07日16:04:56 bug修复:这里不能退出,因为一个循环里有2个判断逻辑处理。
|
|
|
+// break;//只要出现一个不超标的就不算超标
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //存放则返回对象,不存在,则返回null 2个条件都不满足报警,返回空对象
|
|
|
+ if(!flag1 && !flag2)
|
|
|
+ return null;
|
|
|
+ TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
|
|
|
+ tXinyiWarningRecord.setStatus(0);
|
|
|
+ tXinyiWarningRecord.setType(0);
|
|
|
+ tXinyiWarningRecord.setCategory(category);
|
|
|
+ tXinyiWarningRecord.setTime(nowDate);
|
|
|
+ tXinyiWarningRecord.setWarningVal(currentVal);
|
|
|
+ tXinyiWarningRecord.setDesignVal(csBzz);
|
|
|
+ tXinyiWarningRecord.setControlVal(csGkz);
|
|
|
+ tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
|
|
|
+ tXinyiWarningRecord.setCreateTime(nowDate);
|
|
|
+ tXinyiWarningRecord.setRemark(THREE_HYS_WARNING.getCode());//化验室
|
|
|
+ tXinyiWarningRecord.setCwrwfhz(cwrwfhz);//2025年02月14日10:42:53 具体指标具体计算,由上游传过来。
|
|
|
+ //2025年02月17日13:53:49 化验室的报警都是对应的类型都是出水
|
|
|
+ tXinyiWarningRecord.setWaterType(BusinessEnum.WaterTypeEnum.CS.getCode());
|
|
|
+ tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
|
|
|
+ tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
|
|
|
+ tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.CBZZ.getCode());
|
|
|
+ tXinyiWarningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
|
|
|
+ return tXinyiWarningRecord;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|