فهرست منبع

超标准工艺报警 按照新的规则 不同化验项目 做不通的报警处理

王苗苗 2 هفته پیش
والد
کامیت
ae5036c87a
1فایلهای تغییر یافته به همراه80 افزوده شده و 81 حذف شده
  1. 80 81
      slibra-quartz/src/main/java/com/slibra/quartz/task/AsyncTask.java

+ 80 - 81
slibra-quartz/src/main/java/com/slibra/quartz/task/AsyncTask.java

@@ -4106,48 +4106,15 @@ public class AsyncTask {
         if (existsJsNh3GDZ(jsBzz, currentVal, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiIndustries, nowDate))
             return;
 
-        //最开始的工艺报警  (超标准工艺报警) 2025年04月16日15:40:23 改成只有超标准才会报警,并且具体逻辑做拆分 todo
+        //最开始的工艺报警  (超标准工艺报警) 2025年04月16日15:40:23 改成只有超标准才会报警,并且具体逻辑做拆分
+        normalIndustryWarningJsNh3(jsBzz, currentVal, category, tXinyiIndustry, normConfig, cwrwfhz, nowDate, tXinyiIndustries);
 
-        BigDecimal multiply = jsBzz.multiply(new BigDecimal(MyConstants.SCALE_VALUE));
-        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 具体的值由上游传过来
+    }
+
+    private void normalIndustryWarningJsNh3(BigDecimal jsBzz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, Date nowDate, List<TXinyiIndustry> tXinyiIndustries) {
+        //新的判断进水氨氮是否超标
+        TXinyiWarningRecord tXinyiWarningRecord = existsNormalJsNh3(jsBzz, currentVal, category, cwrwfhz, tXinyiIndustries, normConfig);
 
-        //2024年5月25日17:52:33  如果工业库获取不到数据,也触发报警,但是不调用决策接口
-        if(Objects.isNull(currentVal) || currentVal.compareTo(BigDecimal.ZERO) == 0){
-            tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
-            tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
-        }else if(currentVal.compareTo(multiply) > 0){//一级
-            tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
-            tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
-            tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.CBZZ.getCode());
-            tXinyiWarningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
-        }else if(currentVal.compareTo(jsBzz) >= 0 && currentVal.compareTo(multiply) <= 0){//二级
-            tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
-            tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
-            tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.CBZZ.getCode());
-            tXinyiWarningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
-        }else{
-            tXinyiWarningRecord = null;//这种的无需处理
-        }
-        /*else if(!Objects.isNull(csGkz) && currentVal.compareTo(csGkz) > 0){
-            tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
-            tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
-        }*/
         //最近3条输出 连续升高趋势 和 新增的报警都需要
         //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
         List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().type(0).category(category).status(0).build());
@@ -4155,64 +4122,96 @@ public class AsyncTask {
             if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
                 log.info( "{}:现在恢复正常,历史报警数据为{}", category,JSON.toJSONString(tXinyiWarningRecords));
                 for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {
-                    xinyiWarningRecord.setStatus(2);
-                    xinyiWarningRecord.setOffTime(nowDate);
-                    xinyiWarningRecord.setUpdateTime(nowDate);
-                    xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
-                    this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
+                    closeWarning(xinyiWarningRecord);
                 }
             }
         }else{//有告警信息
             if(CollectionUtils.isEmpty(tXinyiWarningRecords)){//之前没有告警记录
-                //2024年7月18日16:23:11  新增逻辑,查询是否有连续升高的趋势,如果有才需要报警
-                if(CollectionUtils.isEmpty(tXinyiIndustries) || tXinyiIndustries.size() < 3){
-                    log.error("处理生化报警时,获取最近的3条工业库数据失败~~~~~~~");
-                    return ;
-                }
-                tXinyiIndustry1 = tXinyiIndustries.get(INDEX_1);//前一个小时
-                TXinyiIndustry tXinyiIndustry2 = tXinyiIndustries.get(INDEX_2);//前两个小时
-                if(!this.judgeContinuousIndustry(tXinyiIndustry1, tXinyiIndustry2, category)){
-                    log.info("虽然当前超标了,但是没有连续升高趋势,所以不报警,当前没有报警出来的数据为{}\n,前一个小时数据为{}\n前两个小时数据为{}", JSON.toJSONString(tXinyiWarningRecord), JSON.toJSONString(tXinyiIndustry1), JSON.toJSONString(tXinyiIndustry2));
-                    return ;
-                }
                 //保存到数据库中
                 //2024年7月15日11:06:16 因为只有一个告警记录,但是如果一直报警,现在报警时间取的是更新时间,兼容第一次报警处理
                 tXinyiWarningRecord.setUpdateTime(nowDate);
                 this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
-                if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
-                    //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
-                    this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
-                }else {
-                    //继续调用决策
-                    this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, false, nowDate);
-                }
+                //继续调用决策
+                this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, false, nowDate);
             }else{
                 log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
                 for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {//理论上只有一个的
-                    if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
-                        //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
-                        this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
-                    }else {
-                        //2024年7月5日10:45:24 逻辑调整:更新一直报警的那条记录的显示值
-                        xinyiWarningRecord.setWarningVal(tXinyiWarningRecord.getWarningVal());
+                    //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);
-                    }
+                    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);
                 }
             }
         }
+    }
+
+    /**
+     * 根据新的规则,判断进水氨氮是否超标,超标了则返回报警对象;没有超标,返回空对象
+     *
+     * @param jsBzz
+     * @param currentVal
+     * @param category
+     * @param cwrwfhz
+     * @param tXinyiIndustries
+     * @param normConfig
+     * @return
+     */
+    private TXinyiWarningRecord existsNormalJsNh3(BigDecimal jsBzz, BigDecimal currentVal, String category, BigDecimal cwrwfhz, List<TXinyiIndustry> tXinyiIndustries, TXinyiNormConfig normConfig) {
+        boolean flag = false;
+        TXinyiIndustry tXinyiIndustry = tXinyiIndustries.get(INDEX_0);
+        BigDecimal jsNh30 = tXinyiIndustry.getJsNh3();
+        BigDecimal jsNh31 = tXinyiIndustries.get(INDEX_1).getJsNh3();
+        BigDecimal jsNh32 = tXinyiIndustries.get(INDEX_2).getJsNh3();
+        BigDecimal jsNh33 = tXinyiIndustries.get(INDEX_3).getJsNh3();
+        if(!Objects.isNull(jsNh30) && jsNh30.compareTo(jsBzz) > 0 && !Objects.isNull(jsNh31) && jsNh31.compareTo(jsBzz) > 0
+            && !Objects.isNull(jsNh32) && jsNh32.compareTo(jsBzz) > 0 && !Objects.isNull(jsNh33) && jsNh33.compareTo(jsBzz) > 0)
+            flag = true;//最近4个都超标
+        if(!Objects.isNull(jsNh30) && jsNh30.compareTo(jsBzz) > 0 && !Objects.isNull(jsNh31) && jsNh30.compareTo(jsNh31) >= 0
+            && !Objects.isNull(jsNh32) && jsNh31.compareTo(jsNh32) >= 0)
+            flag = true;//最新的超标了并且连续3个值都有升高趋势
+        BigDecimal jsCod = tXinyiIndustry.getJsCod();
+        BigDecimal jsTn = tXinyiIndustry.getJsTn();
+        BigDecimal jsTp = tXinyiIndustry.getJsTp();
+        if(!Objects.isNull(jsNh30) && jsNh30.compareTo(jsBzz) > 0 && (!Objects.isNull(jsCod) && jsCod.compareTo(BigDecimal.valueOf(630)) > 0
+            || !Objects.isNull(jsTn) && jsTn.compareTo(BigDecimal.valueOf(65)) > 0 || !Objects.isNull(jsTp) && jsTp.compareTo(BigDecimal.valueOf(7.1)) > 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;
     }
 
     private boolean existsJsNh3YCSG(BigDecimal jsBzz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiIndustry> tXinyiIndustries, Date nowDate) {