Эх сурвалжийг харах

化验室的 二沉池正鳞酸盐【出水总磷】报警功能完善

王苗苗 3 өдөр өмнө
parent
commit
ac2cf2ab98

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

@@ -139,7 +139,7 @@ public class HandleDataController extends BaseController
        TXinyiIndustry tXinyiIndustry = this.xinyiIndustryMapper.selectTXinyiIndustryNewest();
        if(Objects.isNull(tXinyiIndustry))
            throw new RuntimeException("未查询到工业库信息");
-       asyncTask.handleSZWarning(tXinyiIndustry, normConfig);
+//       asyncTask.handleSZWarning(tXinyiIndustry, normConfig);
        return "success";
    }
 

+ 268 - 18
slibra-quartz/src/main/java/com/slibra/quartz/task/AsyncTask.java

@@ -4027,6 +4027,57 @@ public class AsyncTask {
 
 
 
+    /**
+     * 2025年04月22日11:19:34 取最近的6条数据从上层传递过来
+     * [化验室]通过输入的值 生成对应类型的报警对象(进水)
+     * 化验室只有断点报警,没有连续不变报警(因为化验室数据本身就是4-8个小时一轮 是重复的)
+     * 出水总磷设备故障报警
+     * @param currentVal
+     * @param category
+     * @param tXinyiRobots
+     * @return
+     */
+    private WarningMoreExceed handleXinYiWarningRecordRobotMoreTp(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots)  {
+        WarningMoreExceed warningMoreExceed = new WarningMoreExceed();
+        boolean breakpoint = false;
+
+        Date nowDate = DateUtils.getNowDate();
+        //2025年02月21日10:32:42 在这里处理额外的其他报警项
+        //该类型的断点历史报警
+        TXinyiWarningRecord warningRecord = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode()).status(0).build();
+        //是否存在断点 判断是否存在 硝酸盐设备故障
+        if(existsRobotDeviceErrorTp(category, tXinyiRobots)){
+            //关闭同类型的其他报警
+            //2025年02月25日14:45:09 不用在此关闭,因为在后续处理的时候,判断是单一报警还是多指标表报警的时候,都做了对应的关闭。
+//                closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode());
+            breakpoint = true;
+            //触发报警 并且模拟大模型返回决策问答数据
+            //插入该类型报警
+            warningRecord.setTime(nowDate);
+            warningRecord.setReason(category + BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getMsg());
+            warningRecord.setWaterType(BusinessEnum.WaterTypeEnum.CS.getCode());
+            warningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode());
+            warningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
+            warningRecord.setCreateTime(nowDate);
+            warningRecord.setWarningVal(currentVal);
+            warningRecord.setDesignVal(csBzz);
+            warningRecord.setControlVal(csGkz);
+            warningRecord.setRemark(THREE_HYS_WARNING.getCode());//化验室
+            warningRecord.setCwrwfhz(cwrwfhz);//2025年02月14日10:42:53 具体指标具体计算,由上游传过来。
+            warningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, false));//根据当前值和类型以及是否超标处理
+            //存起来
+            warningMoreExceed.setBreakPointWarningRecord(warningRecord);
+//                this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecord);
+            //同时处理决策 不用调用大模型,本地处理问答
+//                addChatRecordByBreakPointsSingle(warningRecord, tXinyiIndustry, normConfig, category);
+        }
+
+        warningMoreExceed.setBreakpoint(breakpoint);
+        return warningMoreExceed;
+    }
+
+
+
 
     /**
      * 2025年04月21日16:07:55 化验室的设备故障报警逻辑调整: 触发条件:连续6小时以上数值,发生无数据、数据为0、数据相同 -- 好氧池硝酸盐
@@ -6933,6 +6984,7 @@ public class AsyncTask {
                 && val0.compareTo(val1) == 0 && val0.compareTo(val2) == 0 && val0.compareTo(val3) == 0
                 && val0.compareTo(val4) == 0 && val0.compareTo(val5) == 0 && val0.compareTo(val6) == 0
                 && val0.compareTo(val7) == 0 && val0.compareTo(val8) == 0 && val0.compareTo(val9) == 0
+                && val0.compareTo(BigDecimal.valueOf(4)) > 0
         )
             return true;
         return false;
@@ -6940,6 +6992,38 @@ public class AsyncTask {
 
 
 
+    /**
+     *2025年04月21日16:17:57 判断二沉池正磷酸盐是否存在设备故障
+     * 触发条件:连续6小时以上数值,发生无数据、数据为0、数据相同
+     * 判断当前时间和上个时间段的值是否存在断点
+     * @param category
+     * @param tXinyiRobotList
+     * @return
+     */
+    private boolean existsRobotDeviceErrorTp(String category, List<TXinyiRobot> tXinyiRobotList) {
+        BigDecimal tpRccJqr0 = tXinyiRobotList.get(INDEX_0).getTpRccJqr();
+        BigDecimal tpRccJqr1 = tXinyiRobotList.get(INDEX_1).getTpRccJqr();
+        BigDecimal tpRccJqr2 = tXinyiRobotList.get(INDEX_2).getTpRccJqr();
+        BigDecimal tpRccJqr3 = tXinyiRobotList.get(INDEX_3).getTpRccJqr();
+        BigDecimal tpRccJqr4 = tXinyiRobotList.get(INDEX_4).getTpRccJqr();
+        BigDecimal tpRccJqr5 = tXinyiRobotList.get(INDEX_5).getTpRccJqr();
+        if ((Objects.isNull(tpRccJqr0) || BigDecimal.ZERO.compareTo(tpRccJqr0) == 0)
+                && (Objects.isNull(tpRccJqr1) || BigDecimal.ZERO.compareTo(tpRccJqr1) == 0)
+                && (Objects.isNull(tpRccJqr2) || BigDecimal.ZERO.compareTo(tpRccJqr2) == 0)
+                && (Objects.isNull(tpRccJqr3) || BigDecimal.ZERO.compareTo(tpRccJqr3) == 0)
+                && (Objects.isNull(tpRccJqr4) || BigDecimal.ZERO.compareTo(tpRccJqr4) == 0)
+                && (Objects.isNull(tpRccJqr5) || BigDecimal.ZERO.compareTo(tpRccJqr5) == 0))
+            return true;
+        if(!Objects.isNull(tpRccJqr0) && !Objects.isNull(tpRccJqr1) && !Objects.isNull(tpRccJqr2)
+                && !Objects.isNull(tpRccJqr3) && !Objects.isNull(tpRccJqr4) && !Objects.isNull(tpRccJqr5)
+                && tpRccJqr0.compareTo(tpRccJqr1) == 0 && tpRccJqr0.compareTo(tpRccJqr2) == 0 && tpRccJqr0.compareTo(tpRccJqr3) == 0
+                && tpRccJqr0.compareTo(tpRccJqr4) == 0 && tpRccJqr0.compareTo(tpRccJqr5) == 0 && tpRccJqr0.compareTo(BigDecimal.valueOf(0.5)) > 0)
+            return true;
+        return false;
+    }
+
+
+
     /**
      *2025年04月21日16:17:57 判断好氧硝酸盐是否存在设备故障
      * 触发条件:连续6小时以上数值,发生无数据、数据为0、数据相同
@@ -6966,7 +7050,7 @@ public class AsyncTask {
             if(!Objects.isNull(no3Hlj1Jqr0) && !Objects.isNull(no3Hlj1Jqr1) && !Objects.isNull(no3Hlj1Jqr2)
                     && !Objects.isNull(no3Hlj1Jqr3) && !Objects.isNull(no3Hlj1Jqr4) && !Objects.isNull(no3Hlj1Jqr5)
                         && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr1) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr2) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr3) == 0
-                            && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr4) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr5) == 0)
+                            && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr4) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr5) == 0 && no3Hlj1Jqr0.compareTo(BigDecimal.valueOf(14)) > 0)
                 return true;
         }else if(BusinessEnum.WarningCategoryEnum.ROBOT_XSY_2.getCode().equals(category)){
             BigDecimal no3Hlj1Jqr0 = tXinyiRobotList.get(INDEX_0).getNo3Hlj2Jqr();
@@ -6985,7 +7069,7 @@ public class AsyncTask {
             if(!Objects.isNull(no3Hlj1Jqr0) && !Objects.isNull(no3Hlj1Jqr1) && !Objects.isNull(no3Hlj1Jqr2)
                     && !Objects.isNull(no3Hlj1Jqr3) && !Objects.isNull(no3Hlj1Jqr4) && !Objects.isNull(no3Hlj1Jqr5)
                     && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr1) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr2) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr3) == 0
-                    && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr4) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr5) == 0)
+                    && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr4) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr5) == 0 && no3Hlj1Jqr0.compareTo(BigDecimal.valueOf(14)) > 0)
                 return true;
         }else{
             log.error("化验室暂时还不支持的报警类型~~~~");
@@ -7885,6 +7969,7 @@ public class AsyncTask {
         boolean xsy1Execute = true;
         boolean xsy2Execute = true;
         boolean csADExecute = true;
+        boolean csTpExecute = true;
 
         //#1好氧硝酸盐
         BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
@@ -7956,7 +8041,10 @@ public class AsyncTask {
         //氨氮的标准值和管控值
         BigDecimal csadBzz = normConfig.getCsadBzz();
         BigDecimal csadGkz = normConfig.getCsadGkz();
-
+        //总磷的标准值和管控值
+        BigDecimal cszlBzz = normConfig.getCszlBzz();
+        BigDecimal cszlGkz = normConfig.getCszlGkz();
+        //进水量和进水流量设计值
         BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
         BigDecimal jsslSjz = normConfig.getJsslSjz();
 
@@ -7979,6 +8067,17 @@ public class AsyncTask {
         }
 
 
+        //二沉池正磷酸盐设备故障报警
+        BigDecimal tpRccJqr = tXinyiRobot.getTpRccJqr();
+        if(!Objects.isNull(tpRccJqr)){
+            warningMoreExceed = handleXinYiWarningRecordRobotMoreTp(cszlBzz, tpRccJqr, cszlGkz, ROBOT_ECCZLSY.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()), tXinyiRobots6Lst);
+            if(warningMoreExceed.isBreakpoint()){
+                breakpointCount++;
+                breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
+            }
+        }
+
+
         warningMoreExceed = handleXinYiWarningRecordRobotMoreAD(csadBzz, tenVals, csadGkz, ROBOT_CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
         if(warningMoreExceed.isBreakpoint()){
             breakpointCount++;
@@ -7989,7 +8088,8 @@ public class AsyncTask {
         String anDan10Str = getBigDecimalList(tenVals);
         String hyXsy1Str = getBigDecimalList(tXinyiRobots6Lst.stream().map(TXinyiRobot::getNo3Hlj1Jqr).collect(Collectors.toList()));
         String hyXsy2Str = getBigDecimalList(tXinyiRobots6Lst.stream().map(TXinyiRobot::getNo3Hlj2Jqr).collect(Collectors.toList()));
-        
+        String tpStr = getBigDecimalList(tXinyiRobots6Lst.stream().map(TXinyiRobot::getTpRccJqr).collect(Collectors.toList()));
+
         Date nowDate = DateUtils.getNowDate();
         //下面是处理多个指标的 【断点】报警
         //断点
@@ -8011,7 +8111,7 @@ public class AsyncTask {
             closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode());
             //触发报警 并且模拟大模型返回决策问答数据
             //最终传递过去的N条数据
-            String finalStr = getStrByCategory(category, anDan10Str, hyXsy1Str, hyXsy2Str);
+            String finalStr = getStrByCategory(category, anDan10Str, hyXsy1Str, hyXsy2Str, tpStr);
 //            log.info("处理本地决策,最终要最后拼接的n条数据为{}", finalStr);
             if(CollectionUtils.isEmpty(tXinyiBreakPointSingleWarningRecords)){
                 //插入该类型报警
@@ -8040,6 +8140,8 @@ public class AsyncTask {
                 xsy2Execute = false;
             if(ROBOT_CS_AD.getCode().equals(category))
                 csADExecute = false;
+            if(ROBOT_ECCZLSY.getCode().equals(category))
+                csTpExecute = false;
             //2025年02月28日15:18:30 即使多指标断点,也是按具体分类报警  关闭多个报警
             if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
                 for (TXinyiWarningRecord tXinyiWarningRecord : tXinyiWarningRecords) {
@@ -8060,6 +8162,8 @@ public class AsyncTask {
                         xsy2Execute = false;
                     if(ROBOT_CS_AD.getCode().equals(category))
                         csADExecute = false;
+                    if(ROBOT_ECCZLSY.getCode().equals(category))
+                        csTpExecute = false;
                     //关闭该指标的其他类型的报警
                     closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
                     //原来集合里存放的都是单指标异常 下面2个值需要重新赋值
@@ -8067,7 +8171,7 @@ public class AsyncTask {
                     tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
                     this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
                     //最终传递过去的N条数据
-                    String finalStr = getStrByCategory(category, anDan10Str, hyXsy1Str, hyXsy2Str);
+                    String finalStr = getStrByCategory(category, anDan10Str, hyXsy1Str, hyXsy2Str, tpStr);
                     //同时处理决策 不用调用大模型,本地处理问答
                     robotDeviceErrorMore(tXinyiWarningRecord, tXinyiIndustry, normConfig, category, finalStr);
                 }
@@ -8088,6 +8192,8 @@ public class AsyncTask {
                             xsy2Execute = false;
                         if(ROBOT_CS_AD.getCode().equals(category))
                             csADExecute = false;
+                        if(ROBOT_ECCZLSY.getCode().equals(category))
+                            csTpExecute = false;
                         //关闭该指标的其他类型的报警
                         closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
                         //新插入
@@ -8096,7 +8202,7 @@ public class AsyncTask {
                         tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
                         this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
                         //最终传递过去的N条数据
-                        String finalStr = getStrByCategory(category, anDan10Str, hyXsy1Str, hyXsy2Str);
+                        String finalStr = getStrByCategory(category, anDan10Str, hyXsy1Str, hyXsy2Str, tpStr);
                         //同时处理决策 不用调用大模型,本地处理问答
                         robotDeviceErrorMore(tXinyiWarningRecord, tXinyiIndustry, normConfig, category, finalStr);
                     }
@@ -8131,7 +8237,7 @@ public class AsyncTask {
                         //更新数据库
                         this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(tXinyiWarningRecord);
                         //最终传递过去的N条数据
-                        String finalStr = getStrByCategory(category, anDan10Str, hyXsy1Str, hyXsy2Str);
+                        String finalStr = getStrByCategory(category, anDan10Str, hyXsy1Str, hyXsy2Str, tpStr);
                         //继续调用决策【本地模拟的决策】
                         robotDeviceErrorMore(tXinyiWarningRecord, tXinyiIndustry, normConfig, category, finalStr);
                     }
@@ -8158,21 +8264,28 @@ public class AsyncTask {
         }
 
 
-
         //出水氨氮
         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, tenVals);
         }
 
+
+        //二沉池正磷酸盐
+        if(!Objects.isNull(cszlBzz) && csTpExecute){
+            handleXinYiWarningsRobotOriginCsTp(cszlBzz, tenVals.get(INDEX_0), cszlGkz, ROBOT_ECCZLSY.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()), tXinyiRobots);
+        }
+
     }
 
-    private String getStrByCategory(String category, String anDan10Str, String hyXsy1Str, String hyXsy2Str) {
+    private String getStrByCategory(String category, String anDan10Str, String hyXsy1Str, String hyXsy2Str, String tpStr) {
         if(ROBOT_CS_AD.getCode().equals(category))
             return anDan10Str;
         else if(ROBOT_XSY_1.getCode().equals(category))
             return hyXsy1Str;
         else if(ROBOT_XSY_2.getCode().equals(category))
             return hyXsy2Str;
+        else if(ROBOT_ECCZLSY.getCode().equals(category))
+            return tpStr;
         else{
             log.info("获取化验室报警,通过分类处理N条展示数据的时候,没有匹配到对应的类型");
             return null;
@@ -8557,8 +8670,37 @@ public class AsyncTask {
 //    }
 
 
+
     /**
-     * 通过输入的值 生成对应类型的报警对象(出水)
+     * 通过输入的值 生成对应类型的报警对象(出水)- 二沉池正磷酸盐
+     *
+     * @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
@@ -8574,9 +8716,9 @@ public class AsyncTask {
 
         Date nowDate = DateUtils.getNowDate();
 
-        //单点突变-异常升高报警
-        if (existsYcsgRobots(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate))
-            return;
+//        //单点突变-异常升高报警
+//        if (existsYcsgRobots(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate))
+//            return;
 
         //下面是最原始的处理 超标准 超管控报警
         robotCsXsyGybz(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate);
@@ -8584,6 +8726,64 @@ public class AsyncTask {
     }
 
 
+    /**
+     *
+     * 化验室-出水总磷(二沉池正磷酸盐) 的 超标准工艺报警
+     * @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);
+                }
+            }
+        }
+    }
+
+
+
     /**
      *
      * 化验室-出水硝酸盐 的 超标准工艺报警
@@ -8641,6 +8841,56 @@ public class AsyncTask {
     }
 
 
+    /**
+     * 判断化验室的-出水氨氮是否存在报警,如果存在返回报警对象;如果不存在,返回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;
+    }
+
+
+
     /**
      * 判断化验室的-出水氨氮是否存在报警,如果存在返回报警对象;如果不存在,返回null
      *
@@ -8726,7 +8976,7 @@ public class AsyncTask {
 
 
     /**
-     * 通过输入的值 生成对应类型的报警对象(出水)
+     * 通过输入的值 生成对应类型的报警对象(出水)- 出水氨氮
      *
      * @param csBzz
      * @param currentVal
@@ -8743,9 +8993,9 @@ public class AsyncTask {
 
         Date nowDate = DateUtils.getNowDate();
 
-        //单点突变-异常升高报警
-        if (existsYcsgRobots(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate))
-            return;
+//        //单点突变-异常升高报警
+//        if (existsYcsgRobots(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate))
+//            return;
 
         //下面是最原始的处理 超标准 超管控报警
         robotCsAdGybz(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tenVals, nowDate);