Browse Source

进水总磷相关报警处理

王苗苗 3 days ago
parent
commit
0e5c24790a
1 changed files with 205 additions and 4 deletions
  1. 205 4
      slibra-quartz/src/main/java/com/slibra/quartz/task/AsyncTask.java

+ 205 - 4
slibra-quartz/src/main/java/com/slibra/quartz/task/AsyncTask.java

@@ -4211,11 +4211,11 @@ public class AsyncTask {
         //2025年04月15日15:45:48 这种的暂时先不报
 
         //2025年04月16日14:35:48 新增高低值设备报警
-        if (existsJsCodGDZ(jsBzz, currentVal, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiIndustries, nowDate, last8Str))
+        if (existsJsTpGDZ(jsBzz, currentVal, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiIndustries, nowDate, last8Str))
             return;
 
         //最开始的工艺报警  (超标准工艺报警) 2025年04月16日15:40:23 改成只有超标准才会报警,并且具体逻辑做拆分
-        normalIndustryWarningJsCod(jsBzz, currentVal, category, tXinyiIndustry, normConfig, cwrwfhz, nowDate, tXinyiIndustries);
+        normalIndustryWarningJsTp(jsBzz, currentVal, category, tXinyiIndustry, normConfig, cwrwfhz, nowDate, tXinyiIndustries);
 
     }
 
@@ -4420,6 +4420,64 @@ public class AsyncTask {
 
 
 
+    /**
+     * 最开始的工艺报警  (超标准工艺报警) -- 进水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
@@ -4686,6 +4744,67 @@ public class AsyncTask {
 
 
 
+    /**
+     * 根据新的规则,判断进水氨氮是否超标,超标了则返回报警对象;没有超标,返回空对象 -- 进水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
      *
@@ -5111,6 +5230,68 @@ public class AsyncTask {
     }
 
 
+
+    /**
+     * 判断是否存在高低值并处理相关报警-进水tp
+     * @param jsBzz
+     * @param currentVal
+     * @param category
+     * @param tXinyiIndustry
+     * @param normConfig
+     * @param cwrwfhz
+     * @param tXinyiIndustries
+     * @param nowDate
+     * @param last8Str
+     * @return
+     */
+    private boolean existsJsTpGDZ(BigDecimal jsBzz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiIndustry> tXinyiIndustries, Date nowDate, String last8Str) {
+        if(!CollectionUtils.isEmpty(tXinyiIndustries) && tXinyiIndustries.size() == INT_8){
+            //查询同类型的历史报警
+            TXinyiWarningRecord warningRecordGDZ = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.SJYC_GDZ.getCode()).status(0).build();
+            List<TXinyiWarningRecord> tXinyiNoChangeGDZRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordGDZ);
+            //2025年02月21日14:33:37 这里要改成当前值和上个小时比较  上个小时和上上个小时比较
+            Map<String, BigDecimal> resultMap = existsGdzJsTp(currentVal, category, tXinyiIndustries);
+            BigDecimal exceedVal = resultMap.get(EXCEEDVAL);
+            if(!Objects.isNull(exceedVal)){//这里不能只返回一个布尔类型的结果,因为还要获取百分比的值
+                //关闭同类型的其他报警
+                closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.SJYC_GDZ.getCode());
+                //触发报警 并且模拟大模型返回决策问答数据
+                if(CollectionUtils.isEmpty(tXinyiNoChangeGDZRecords)){
+                    //插入该类型报警
+                    warningRecordGDZ.setTime(nowDate);
+                    warningRecordGDZ.setReason(category + BusinessEnum.WarningSymbolEnum.SJYC_GDZ.getMsg());
+                    warningRecordGDZ.setWaterType(BusinessEnum.WaterTypeEnum.JS.getCode());
+                    warningRecordGDZ.setSymbol(BusinessEnum.WarningSymbolEnum.SJYC_GDZ.getCode());
+                    warningRecordGDZ.setCreateBy(WARNING_DEFAULT_CREATE);
+                    warningRecordGDZ.setCreateTime(nowDate);
+                    warningRecordGDZ.setWarningVal(currentVal);
+                    warningRecordGDZ.setDesignVal(jsBzz);
+                    warningRecordGDZ.setRemark(ZERO_SZ_WARNING.getCode());
+                    warningRecordGDZ.setCwrwfhz(cwrwfhz);
+                    warningRecordGDZ.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
+                    this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordGDZ);
+                    //同时处理决策 不用调用大模型,本地处理问答
+                    addChatRecordByGDZ(warningRecordGDZ, tXinyiIndustry, normConfig, category, exceedVal, resultMap.get(LASTVAL), last8Str);
+                }else{
+                    log.info("工业库报警的时候,发现存在高低值的报警,并且已经有该类型报警了,不做任何处理");
+                    //2025年04月16日15:56:47 这种的继续报警,所以决策还需要再次调用一次
+                    //2025年05月08日13:34:23bug修改 这里不能用new的对象 要获取历史报警的值
+//                    addChatRecordByGDZ(warningRecordGDZ, tXinyiIndustry, normConfig, category, exceedVal, resultMap.get(LASTVAL), last8Str);
+                    addChatRecordByGDZ(tXinyiNoChangeGDZRecords.get(0), tXinyiIndustry, normConfig, category, exceedVal, resultMap.get(LASTVAL), last8Str);
+                }
+                //后续的报警不再进行
+                log.info("工业库报警的时候,发现存在{}高低值的报警,后续报警不再处理", category);
+                return true;
+            }else{//不存在 查看历史是否有报警,有的话关闭
+                if(!CollectionUtils.isEmpty(tXinyiNoChangeGDZRecords)){
+                    closeWarning(tXinyiNoChangeGDZRecords.get(0));
+                }
+            }
+        }
+        return false;
+    }
+
+
     /**
      * 判断是否存在高低值并处理相关报警-进水cod
      * @param jsBzz
@@ -5678,8 +5859,8 @@ public class AsyncTask {
         if(!Objects.isNull(currentVal) && !Objects.isNull(jsCod1) && !Objects.isNull(jsTn) && !Objects.isNull(jsNh3) && !Objects.isNull(jsTp)){
             BigDecimal divide1 = currentVal.subtract(jsCod1).divide(jsCod1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
             //2025年04月16日14:28:55 触发条件修改: 触发条件:(现在-前一小时)/前一小时*100%> 70%  and  进水总磷 > 7.1 and 进水总氮<65 and 进水氨氮< 58 and 进水总氮<65 and 进水cod<630
-            if(divide1.compareTo(compareVal) > 0  && currentVal.compareTo(BigDecimal.valueOf(630)) > 0  && jsNh3.compareTo(BigDecimal.valueOf(58)) < 0
-                    && jsTn.compareTo(BigDecimal.valueOf(65)) < 0 && jsTp.compareTo(BigDecimal.valueOf(7.1)) < 0){
+            if(divide1.compareTo(compareVal) > 0  && currentVal.compareTo(BigDecimal.valueOf(7.1)) > 0 && jsTn.compareTo(BigDecimal.valueOf(65)) < 0
+                    && jsNh3.compareTo(BigDecimal.valueOf(58)) < 0 && jsCod.compareTo(BigDecimal.valueOf(630)) < 0){
                 resultMap.put(EXCEEDVAL, divide1);
                 resultMap.put(LASTVAL, jsCod1);
             }
@@ -5807,6 +5988,26 @@ public class AsyncTask {
 
 
 
+    /**
+     * 进水tp是否存在高低值切换
+     * @param currentVal
+     * @param category
+     * @param industryList
+     * @return
+     */
+    private Map<String, BigDecimal> existsGdzJsTp(BigDecimal currentVal, String category, List<TXinyiIndustry> industryList) {
+
+        Map<String, BigDecimal> resultMap = new HashMap<>();
+        BigDecimal compareValHigh = BigDecimal.valueOf(7.1);
+        BigDecimal compareValLow = BigDecimal.valueOf(1.7);
+
+        if(gdzJsNh3(compareValHigh, compareValLow, industryList))
+            resultMap.put(EXCEEDVAL, compareValHigh);//这里随便存一个值就可以 有值代表存在高低值  没有就是不存在
+        return resultMap;
+    }
+
+
+
     /**
      * 进水cod是否存在高低值切换
      * @param currentVal