Переглянути джерело

手动处理工业库报警和化验库报警 处理 总磷相关报警

王苗苗 3 днів тому
батько
коміт
6236d8fe80

+ 293 - 1
slibra-admin/src/main/java/com/slibra/web/controller/business/HandleDataController.java

@@ -2275,6 +2275,7 @@ public class HandleDataController extends BaseController
         BigDecimal cscodBzz = normConfig.getCscodBzz();
         BigDecimal cscodGkz = normConfig.getCscodGkz();
         BigDecimal jscodSjz = normConfig.getJscodSjz();
+        BigDecimal jszlSjz = normConfig.getJszlSjz();
         //进水总氮超标报警
         BigDecimal jsTn = tXinyiIndustry.getJsTn();
         //进水氨氮超标报警
@@ -2283,6 +2284,8 @@ public class HandleDataController extends BaseController
         BigDecimal jsCod = tXinyiIndustry.getJsCod();
         //出水Cod报警
         BigDecimal csCod = tXinyiIndustry.getCsCod();
+        //进水总磷
+        BigDecimal jsTp = tXinyiIndustry.getJsTp();
 
         if(!Objects.isNull(jszdSjz) && jszdSjz.compareTo(BigDecimal.ZERO) > 0)
             handleXinYiWarningRecordJSOriginZD(jszdSjz, jsTn, BusinessEnum.WarningCategoryEnum.JS_ZD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
@@ -2292,9 +2295,157 @@ public class HandleDataController extends BaseController
             handleXinYiWarningsCsOriginCod(cscodBzz, csCod, cscodGkz, CS_COD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsCod(), jsslSjz, normConfig.getJscodSjz()));
         if(!Objects.isNull(jscodSjz) && jscodSjz.compareTo(BigDecimal.ZERO) > 0)
             handleXinYiWarningRecordJSOriginCod(jscodSjz, jsCod, JS_COD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsCod(), jsslSjz, normConfig.getJscodSjz()));
+        if(!Objects.isNull(jszlSjz) && jszlSjz.compareTo(BigDecimal.ZERO) > 0)
+            handleXinYiWarningRecordJSOriginTp(jszlSjz, jsTp, JS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, jsTp, jsslSjz, jszlSjz));
+    }
+
+
+    /**
+     * 不同指标报警规则不一样,全部区分开来处理,此方法为:进水tp
+     * 通过输入的值 生成对应类型的报警对象(进水)- 总磷
+     *
+     * @param jsBzz
+     * @param currentVal
+     * @param category
+     * @param tXinyiIndustry
+     * @param normConfig
+     * @param cwrwfhz
+     * @return
+     */
+    private void handleXinYiWarningRecordJSOriginTp(BigDecimal jsBzz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz) {
+
+        Date nowDate = DateUtils.getNowDate();
+
+        List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectNIndustry(INT_8);
+        if(CollectionUtils.isEmpty(tXinyiIndustries) || tXinyiIndustries.size() < INT_8){
+            log.error("处理生化报警时,获取最近的8条工业库数据失败~~~~~~~");
+            return ;
+        }
+        //最开始的工艺报警  (超标准工艺报警) 2025年04月16日15:40:23 改成只有超标准才会报警,并且具体逻辑做拆分
+        normalIndustryWarningJsTp(jsBzz, currentVal, category, tXinyiIndustry, normConfig, cwrwfhz, nowDate, tXinyiIndustries);
+
+    }
+
+
+    /**
+     * 最开始的工艺报警  (超标准工艺报警) -- 进水tp
+     * @param jsBzz
+     * @param currentVal
+     * @param category
+     * @param tXinyiIndustry
+     * @param normConfig
+     * @param cwrwfhz
+     * @param nowDate
+     * @param tXinyiIndustries
+     */
+    private void normalIndustryWarningJsTp(BigDecimal jsBzz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, Date nowDate, List<TXinyiIndustry> tXinyiIndustries) {
+        //新的判断进水氨氮是否超标
+        TXinyiWarningRecord tXinyiWarningRecord = existsNormalJsTp(jsBzz, currentVal, category, cwrwfhz, tXinyiIndustries, normConfig);
+
+        //最近3条输出 连续升高趋势 和 新增的报警都需要
+        //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
+        List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().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) {
+                    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, false, 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, false, nowDate);
+                }
+            }
+        }
     }
 
 
+
+    /**
+     * 根据新的规则,判断进水氨氮是否超标,超标了则返回报警对象;没有超标,返回空对象 -- 进水cod
+     *
+     * @param jsBzz
+     * @param currentVal
+     * @param category
+     * @param cwrwfhz
+     * @param tXinyiIndustries
+     * @param normConfig
+     * @return
+     */
+    private TXinyiWarningRecord existsNormalJsTp(BigDecimal jsBzz, BigDecimal currentVal, String category, BigDecimal cwrwfhz, List<TXinyiIndustry> tXinyiIndustries, TXinyiNormConfig normConfig) {
+        boolean flag = false;
+        TXinyiIndustry tXinyiIndustry = tXinyiIndustries.get(INDEX_0);
+        BigDecimal jsTp0 = tXinyiIndustry.getJsTp();
+        BigDecimal jsTp1 = tXinyiIndustries.get(INDEX_1).getJsTp();
+        BigDecimal jsTp2 = tXinyiIndustries.get(INDEX_2).getJsTp();
+        BigDecimal jsTp3 = tXinyiIndustries.get(INDEX_3).getJsTp();
+        if(!Objects.isNull(jsTp0) && jsTp0.compareTo(jsBzz) > 0 && !Objects.isNull(jsTp1) && jsTp1.compareTo(jsBzz) > 0
+                && !Objects.isNull(jsTp2) && jsTp2.compareTo(jsBzz) > 0 && !Objects.isNull(jsTp3) && jsTp3.compareTo(jsBzz) > 0)
+            flag = true;//最近4个都超标
+        if(!Objects.isNull(jsTp0) && jsTp0.compareTo(jsBzz) > 0 && !Objects.isNull(jsTp1) && jsTp0.compareTo(jsTp1) >= 0
+                && !Objects.isNull(jsTp2) && jsTp1.compareTo(jsTp2) >= 0)
+            flag = true;//最新的超标了并且连续3个值都有升高趋势
+        BigDecimal jsCod = tXinyiIndustry.getJsCod();
+        BigDecimal jsTn = tXinyiIndustry.getJsTn();
+        BigDecimal jsNh3 = tXinyiIndustry.getJsNh3();
+        //在线仪表,一个进水总磷数据 > 7.1,并且 cod> 630 或当前进水总氮> 65 或 当前进水氨氮 >58
+        if(!Objects.isNull(jsTp0) && jsTp0.compareTo(jsBzz) > 0 && (!Objects.isNull(jsCod) && jsCod.compareTo(BigDecimal.valueOf(630)) > 0
+                || !Objects.isNull(jsTn) && jsTn.compareTo(BigDecimal.valueOf(65)) > 0 || !Objects.isNull(jsNh3) && jsNh3.compareTo(BigDecimal.valueOf(58)) > 0))
+            flag = true;
+        if(!flag)
+            return null;
+        //存在符合的报警情况,生成报警对象
+        TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
+        /*String category = BusinessEnum.WarningCategoryEnum.CS_AD.getCode();*/
+        tXinyiWarningRecord.setStatus(0);
+        tXinyiWarningRecord.setType(0);
+        tXinyiWarningRecord.setCategory(category);
+        tXinyiWarningRecord.setTime(DateUtils.getNowDate());
+        tXinyiWarningRecord.setWarningVal(currentVal);
+        tXinyiWarningRecord.setDesignVal(jsBzz);
+//        tXinyiWarningRecord.setControlVal(csGkz);
+        tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
+        tXinyiWarningRecord.setCreateTime(DateUtils.getNowDate());
+        tXinyiWarningRecord.setRemark(ZERO_SZ_WARNING.getCode());
+        //2025年02月10日14:45:08 下面是新增加的字段
+        tXinyiWarningRecord.setWaterType(BusinessEnum.WaterTypeEnum.JS.getCode());
+        //超污染物限制:计算公式为:当前氨氮/氨氮设计值 或者 当前氨氮/氨氮管控值(智能工单使用)  这里是出水的 【需要根据超标还是超管控,具体计算】
+        //超污染物负荷值:计算公式为:当前水量与氨氮乘积  /  设计水量与设计进水氨氮的乘积(智能工单使用)
+        tXinyiWarningRecord.setCwrwfhz(cwrwfhz);//2025年02月14日10:48:32 具体的值由上游传过来
+        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;
+    }
+
+
+
     /**
      * 不同指标报警规则不一样,全部区分开来处理,此方法为:进水cod
      * 通过输入的值 生成对应类型的报警对象(进水)- cod
@@ -3485,7 +3636,10 @@ public class HandleDataController extends BaseController
         //氨氮的标准值和管控值
         BigDecimal csadBzz = normConfig.getCsadBzz();
         BigDecimal csadGkz = normConfig.getCsadGkz();
-
+        //总磷的标准值和管控值
+        BigDecimal cszlBzz = normConfig.getCszlBzz();
+        BigDecimal cszlGkz = normConfig.getCszlGkz();
+        //进水量和进水流量设计值
         BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
         BigDecimal jsslSjz = normConfig.getJsslSjz();
 
@@ -3510,6 +3664,144 @@ public class HandleDataController extends BaseController
         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);
         }
+
+        //二沉池正磷酸盐
+        if(!Objects.isNull(cszlBzz)){
+            handleXinYiWarningsRobotOriginCsTp(cszlBzz, tenVals.get(INDEX_0), cszlGkz, ROBOT_ECCZLSY.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()), tXinyiRobots);
+        }
+    }
+
+
+    /**
+     * 通过输入的值 生成对应类型的报警对象(出水)- 二沉池正磷酸盐
+     *
+     * @param csBzz
+     * @param currentVal
+     * @param csGkz
+     * @param category
+     * @param tXinyiIndustry
+     * @param normConfig
+     * @param cwrwfhz
+     * @param tXinyiRobots
+     * @return
+     */
+    private void handleXinYiWarningsRobotOriginCsTp(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots) {
+
+        Date nowDate = DateUtils.getNowDate();
+
+//        //单点突变-异常升高报警
+//        if (existsYcsgRobots(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate))
+//            return;
+
+        //下面是最原始的处理 超标准 超管控报警
+        robotCsTpGybz(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 robotCsTpGybz(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots, Date nowDate) {
+        TXinyiWarningRecord tXinyiWarningRecord = getRobotCsTpWarningBean(csBzz, currentVal, csGkz, category, normConfig, cwrwfhz, tXinyiRobots);
+        //判断是否存在要报警的数据
+        //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完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
+     * @return
+     */
+    private TXinyiWarningRecord getRobotCsTpWarningBean(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots) {
+        //判断是否存在
+        boolean flag1 = true;
+        for (TXinyiRobot xinyiRobot : tXinyiRobots) {
+            //是否连续6小时超标 正磷酸盐数据 > 0.5 and 连续6小时
+            BigDecimal val = xinyiRobot.getTpRccJqr();
+            if (!Objects.isNull(val) && val.compareTo(csBzz) <= 0) {
+                flag1 = false;
+                break;//只要出现一个不超标的就不算超标
+            }
+        }
+
+        //存放则返回对象,不存在,则返回null  2个条件都不满足报警,返回空对象
+        if(!flag1)
+            return null;
+        TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
+        tXinyiWarningRecord.setStatus(0);
+        tXinyiWarningRecord.setType(0);
+        tXinyiWarningRecord.setCategory(category);
+        tXinyiWarningRecord.setTime(DateUtils.getNowDate());
+        tXinyiWarningRecord.setWarningVal(currentVal);
+        tXinyiWarningRecord.setDesignVal(csBzz);
+        tXinyiWarningRecord.setControlVal(csGkz);
+        tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
+        tXinyiWarningRecord.setCreateTime(DateUtils.getNowDate());
+        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;
     }