王苗苗 3 dagar sedan
förälder
incheckning
1d008a5003
3 ändrade filer med 205 tillägg och 37 borttagningar
  1. BIN
      .DS_Store
  2. BIN
      slibra-admin/.DS_Store
  3. 205 37
      slibra-quartz/src/main/java/com/slibra/quartz/task/AsyncTask.java

BIN
.DS_Store


BIN
slibra-admin/.DS_Store


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

@@ -4219,8 +4219,6 @@ public class AsyncTask {
             log.error("处理生化报警时,获取最近的8条工业库数据失败~~~~~~~");
             log.error("处理生化报警时,获取最近的8条工业库数据失败~~~~~~~");
             return ;
             return ;
         }
         }
-        TXinyiIndustry tXinyiIndustry1 = tXinyiIndustries.get(INDEX_1);//前一个小时
-
         //拼接决策的最近8小时的值
         //拼接决策的最近8小时的值
         String last8Str = this.getJsNh3StrByList(tXinyiIndustries);
         String last8Str = this.getJsNh3StrByList(tXinyiIndustries);
 
 
@@ -7223,14 +7221,14 @@ public class AsyncTask {
         //#1好氧硝酸盐
         //#1好氧硝酸盐
         if(no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0 && xsy1Execute){
         if(no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0 && xsy1Execute){
             if(!Objects.isNull(cszzBzz)){
             if(!Objects.isNull(cszzBzz)){
-                handleXinYiWarningsRobotOrigin(cszzBzz, no3Hlj1Jqr, cszzGkz, ROBOT_XSY_1.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
+                handleXinYiWarningsRobotOriginCsXsy(cszzBzz, no3Hlj1Jqr, cszzGkz, ROBOT_XSY_1.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()), tXinyiRobots);
             }
             }
         }
         }
 
 
         //#2好氧硝酸盐
         //#2好氧硝酸盐
         if(no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0 && xsy2Execute){
         if(no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0 && xsy2Execute){
             if(!Objects.isNull(cszzBzz)){
             if(!Objects.isNull(cszzBzz)){
-                handleXinYiWarningsRobotOrigin(cszzBzz, no3Hlj2Jqr, cszzGkz, ROBOT_XSY_2.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
+                handleXinYiWarningsRobotOriginCsXsy(cszzBzz, no3Hlj2Jqr, cszzGkz, ROBOT_XSY_2.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()), tXinyiRobots);
             }
             }
         }
         }
 
 
@@ -7238,7 +7236,7 @@ public class AsyncTask {
 
 
         //出水氨氮
         //出水氨氮
         if(!Objects.isNull(csadBzz) && csADExecute){
         if(!Objects.isNull(csadBzz) && csADExecute){
-            handleXinYiWarningsRobotOriginCsAd(csadBzz, tenVals.get(INDEX_0), csadGkz, ROBOT_CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()), tXinyiRobots);
+            handleXinYiWarningsRobotOriginCsAd(csadBzz, tenVals.get(INDEX_0), csadGkz, ROBOT_CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()), tXinyiRobots, tenVals);
         }
         }
 
 
     }
     }
@@ -7634,7 +7632,6 @@ public class AsyncTask {
 //    }
 //    }
 
 
 
 
-
     /**
     /**
      * 通过输入的值 生成对应类型的报警对象(出水)
      * 通过输入的值 生成对应类型的报警对象(出水)
      *
      *
@@ -7648,25 +7645,23 @@ public class AsyncTask {
      * @param tXinyiRobots
      * @param tXinyiRobots
      * @return
      * @return
      */
      */
-    private void handleXinYiWarningsRobotOriginCsAd(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots) {
+    private void handleXinYiWarningsRobotOriginCsXsy(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots) {
 
 
         Date nowDate = DateUtils.getNowDate();
         Date nowDate = DateUtils.getNowDate();
-        TXinyiRobot tXinyiRobot1 = tXinyiRobots.get(INDEX_1);//前一个小时
 
 
         //单点突变-异常升高报警
         //单点突变-异常升高报警
         if (existsYcsgRobots(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate))
         if (existsYcsgRobots(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate))
             return;
             return;
 
 
-
         //下面是最原始的处理 超标准 超管控报警
         //下面是最原始的处理 超标准 超管控报警
-        robotCsAdGybz(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate, tXinyiRobot1);
+        robotCsXsyGybz(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate);
 
 
     }
     }
 
 
 
 
     /**
     /**
      *
      *
-     * 化验室-出水氨氮 的 超标准工艺报警
+     * 化验室-出水硝酸盐 的 超标准工艺报警
      * @param csBzz
      * @param csBzz
      * @param currentVal
      * @param currentVal
      * @param csGkz
      * @param csGkz
@@ -7676,10 +7671,109 @@ public class AsyncTask {
      * @param cwrwfhz
      * @param cwrwfhz
      * @param tXinyiRobots
      * @param tXinyiRobots
      * @param nowDate
      * @param nowDate
-     * @param tXinyiRobot1
      */
      */
-    private void robotCsAdGybz(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots, Date nowDate, TXinyiRobot tXinyiRobot1) {
-        BigDecimal multiply = csBzz.multiply(new BigDecimal(MyConstants.SCALE_VALUE));
+    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);
+        //判断是否存在要报警的数据
+        //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完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 getRobotCsXsyWarningBean(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots) {
+        //判断是否存在
+        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;
+                    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;
+                break;//只要出现一个不超标的就不算超标
+            }
+
+        }
+
+        //存放则返回对象,不存在,则返回null  2个条件都不满足报警,返回空对象
+        if(!flag1 && !flag2)
+            return null;
         TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
         TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
         tXinyiWarningRecord.setStatus(0);
         tXinyiWarningRecord.setStatus(0);
         tXinyiWarningRecord.setType(0);
         tXinyiWarningRecord.setType(0);
@@ -7694,31 +7788,60 @@ public class AsyncTask {
         tXinyiWarningRecord.setCwrwfhz(cwrwfhz);//2025年02月14日10:42:53 具体指标具体计算,由上游传过来。
         tXinyiWarningRecord.setCwrwfhz(cwrwfhz);//2025年02月14日10:42:53 具体指标具体计算,由上游传过来。
         //2025年02月17日13:53:49 化验室的报警都是对应的类型都是出水
         //2025年02月17日13:53:49 化验室的报警都是对应的类型都是出水
         tXinyiWarningRecord.setWaterType(BusinessEnum.WaterTypeEnum.CS.getCode());
         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;
+    }
 
 
-        //2024年5月25日17:52:33  如果化验室获取不到数据,也触发报警,但是不调用决策接口
-        if(Objects.isNull(currentVal)){
-            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(csBzz) >= 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 if(!Objects.isNull(csGkz) && currentVal.compareTo(csGkz) > 0){
-            tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
-            tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
-            tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.CGKZ.getCode());
-            tXinyiWarningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, false));//根据当前值和类型以及是否超标处理
-        }else{
-            tXinyiWarningRecord = null;//这种的无需处理
-        }
+
+
+
+    /**
+     * 通过输入的值 生成对应类型的报警对象(出水)
+     *
+     * @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) {
+
+        Date nowDate = DateUtils.getNowDate();
+
+        //单点突变-异常升高报警
+        if (existsYcsgRobots(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate))
+            return;
+
+        //下面是最原始的处理 超标准 超管控报警
+        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);
         //判断是否存在要报警的数据
         //判断是否存在要报警的数据
-//        xxx todo 优化
         //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
         //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
         List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().delFlag(0).type(0).category(category).status(0).build());
         List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().delFlag(0).type(0).category(category).status(0).build());
         if(Objects.isNull(tXinyiWarningRecord)){//数据正常,无告警信息
         if(Objects.isNull(tXinyiWarningRecord)){//数据正常,无告警信息
@@ -7759,6 +7882,51 @@ public class AsyncTask {
         }
         }
     }
     }
 
 
+    /**
+     * 判断化验室的-出水氨氮是否存在报警,如果存在返回报警对象;如果不存在,返回null
+     *
+     * @param csBzz
+     * @param currentVal
+     * @param csGkz
+     * @param category
+     * @param normConfig
+     * @param cwrwfhz
+     * @param tXinyiRobots
+     * @return
+     */
+    private TXinyiWarningRecord getRobotCsAdWarningBean(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<BigDecimal> tXinyiRobots) {
+        //判断是否存在
+        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(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;
+    }
+
     private boolean existsYcsgRobots(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots, Date nowDate) {
     private boolean existsYcsgRobots(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots, Date nowDate) {
         TXinyiWarningRecord warningRecordYCSG = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode()).status(0).build();
         TXinyiWarningRecord warningRecordYCSG = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode()).status(0).build();
         List<TXinyiWarningRecord> tXinyiNoChangeYCSGRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordYCSG);
         List<TXinyiWarningRecord> tXinyiNoChangeYCSGRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordYCSG);