Răsfoiți Sursa

手动处理化验室报警 相关从普通的报警调用移除 全部采用新的逻辑

王苗苗 2 zile în urmă
părinte
comite
fbcfbb6e66

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

@@ -55,8 +55,7 @@ import java.util.*;
 
 import static com.slibra.common.constant.MyConstants.*;
 import static com.slibra.common.constant.MyConstants.BigDecimal_100;
-import static com.slibra.common.enums.BusinessEnum.BigModelWarningTypeRemarkEnum.ONE_SH_WARNING;
-import static com.slibra.common.enums.BusinessEnum.BigModelWarningTypeRemarkEnum.ZERO_SZ_WARNING;
+import static com.slibra.common.enums.BusinessEnum.BigModelWarningTypeRemarkEnum.*;
 import static com.slibra.common.enums.BusinessEnum.WarningCategoryEnum.*;
 
 /**
@@ -2862,9 +2861,448 @@ public class HandleDataController extends BaseController
         if(!CollectionUtils.isEmpty(tXinyiRobots)){
             for (TXinyiRobot tXinyiRobot : tXinyiRobots) {
                 asyncTask.handleRobotWarningNew(tXinyiRobot);
+                this.handleRobotWarningNew(tXinyiRobot);
             }
         }
         return "success";
     }
+
+
+    public void handleRobotWarningNew(TXinyiRobot tXinyiRobot) {
+
+        log.info("进入了定时任务判断机器人化验库是否超标及后续逻辑--新的逻辑处理");
+        //查询配置
+        List<TXinyiNormConfig> tXinyiNormConfigs = this.xinyiNormConfigMapper.selectTXinyiNormConfigList(null);
+        if(CollectionUtils.isEmpty(tXinyiNormConfigs)){
+//            throw new ServiceException("未查询到配置信息");
+            log.error("未查询到配置信息");
+            return;
+        }
+        TXinyiNormConfig normConfig = tXinyiNormConfigs.get(0);
+
+        String testHour = tXinyiRobot.getTestHour();
+        if(StringUtils.isBlank(testHour)){
+            log.error("化验室报警的时候,获取化验室的化验时间-小时失败,无法处理后续操作");
+            return;
+        }
+
+        //查询最新的一条工业库的数据(showvalue展示使用)
+        //2025年02月26日15:55:16 逻辑调整:这里不使用最新的一条工业库数据,获取化验室的同时段的数据
+//        List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectNIndustry(1);
+        List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectTXinyiIndustryList(TXinyiIndustry.builder().testHour(testHour).build());
+        if(CollectionUtils.isEmpty(tXinyiIndustries)){
+//            throw new ServiceException("未查询到对应的工业库数据,无法进行图表数据展示!");
+            log.error("未查询到对应的工业库数据,无法进行图表数据展示!");
+            return;
+        }
+
+        TXinyiIndustry tXinyiIndustry = tXinyiIndustries.get(0);
+
+        //新的逻辑:
+        //只要当前获取的工业库数据和当前时间
+        //如果当前时间和工业库传过来的相差不到一个小时,说明正常,工业库没挂掉:需要查询是否有挂掉的记录,有的话,关闭此报警,并触发整体的业务数据报警。
+        //如果超过1小时了,说明工业库同步数据挂掉了,这时候去查询有无此类型的报警,如果有,不做任何处理,程序结束;如果没有,新增该类型报警并结束程序。
+        robotWarningDetailNew(tXinyiRobot, normConfig, tXinyiIndustry);//采用新的逻辑
+    }
+
+
+
+    /**
+     * 2025年04月18日15:53:45  由于报警逻辑和以前几乎完全不一样在,所以在保留原有的基础上,新增了该方法。
+     * 机器人化验室报警逻辑处理
+     * @param tXinyiRobot
+     * @param normConfig
+     * @param tXinyiIndustry
+     */
+    private void robotWarningDetailNew(TXinyiRobot tXinyiRobot, TXinyiNormConfig normConfig, TXinyiIndustry tXinyiIndustry) {
+        //#1好氧硝酸盐
+        BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
+        //#2好氧硝酸盐
+        BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
+
+        String testHour = tXinyiRobot.getTestHour();
+
+        //2025年04月21日17:04:28 逻辑调整,需要取最近的十条数据,计算获取到十个值
+        //2025年05月08日16:27:47 这里要获取某个日期下面的值
+//        List<TXinyiRobot> tXinyiRobots = this.xinyiRobotMapper.selectNRobot(INT_10);
+        List<TXinyiRobot> tXinyiRobots = this.xinyiRobotMapper.selectNRobotAfterHour(INT_10, testHour);
+        if(CollectionUtils.isEmpty(tXinyiRobots) || tXinyiRobots.size() < INT_10){
+            log.error("化验室报警-新逻辑获取最近的10条化验室数据失败,无法处理报警,退出");
+            return;
+        }
+
+        List<BigDecimal> tenVals = new ArrayList<>(10);
+
+        //取前6个,硝酸盐是6个
+
+        for (int i = 0; i < tXinyiRobots.size(); i++) {
+            TXinyiRobot xinyiRobot = tXinyiRobots.get(i);
+            //判断 增加容错
+            BigDecimal no3Hlj1JqrTemp = xinyiRobot.getNo3Hlj1Jqr();
+            //#2好氧硝酸盐
+            BigDecimal no3Hlj2JqrTemp = xinyiRobot.getNo3Hlj2Jqr();
+            //1#缺氧出-硝酸盐
+            BigDecimal no3Qyc1JqrTemp = xinyiRobot.getNo3Qyc1Jqr();
+            BigDecimal nh31JqrTemp = xinyiRobot.getNh31Jqr();
+            //2#缺氧出-硝酸盐
+            BigDecimal no3Qyc2JqrTemp = xinyiRobot.getNo3Qyc2Jqr();
+            BigDecimal nh32JqrTemp = xinyiRobot.getNh32Jqr();
+            if (Objects.isNull(no3Qyc1JqrTemp))
+                no3Qyc1JqrTemp = BigDecimal.ZERO;
+            if (Objects.isNull(nh31JqrTemp))
+                nh31JqrTemp = BigDecimal.ZERO;
+            if (Objects.isNull(no3Hlj1JqrTemp))
+                no3Hlj1JqrTemp = BigDecimal.ZERO;
+            BigDecimal anDan1 = no3Qyc1JqrTemp.add(nh31JqrTemp).subtract(no3Hlj1JqrTemp);
+
+            //判断 增加容错
+            if (Objects.isNull(no3Qyc2JqrTemp))
+                no3Qyc2JqrTemp = BigDecimal.ZERO;
+            if (Objects.isNull(nh32JqrTemp))
+                nh32JqrTemp = BigDecimal.ZERO;
+            if (Objects.isNull(no3Hlj2JqrTemp))
+                no3Hlj2JqrTemp = BigDecimal.ZERO;
+            BigDecimal anDan2 = no3Qyc2JqrTemp.add(nh32JqrTemp).subtract(no3Hlj2JqrTemp);
+            BigDecimal divide = anDan1.add(anDan2).divide(DECIMAL_2, INT_2, RoundingMode.HALF_UP);
+            //2025年04月21日17:22:30 如果计算结果小于0,当0处理
+            if (divide.compareTo(BigDecimal.ZERO) < 0)
+                divide = BigDecimal.ZERO;
+            tenVals.add(divide);
+        }
+
+
+        //总氮的标准值和管控值
+        BigDecimal cszzBzz = normConfig.getCszzBzz();
+        BigDecimal cszzGkz = normConfig.getCszzGkz();
+        //氨氮的标准值和管控值
+        BigDecimal csadBzz = normConfig.getCsadBzz();
+        BigDecimal csadGkz = normConfig.getCsadGkz();
+
+        BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
+        BigDecimal jsslSjz = normConfig.getJsslSjz();
+
+
+
+        //#1好氧硝酸盐
+        if(no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0){
+            if(!Objects.isNull(cszzBzz)){
+                handleXinYiWarningsRobotOriginCsXsy(cszzBzz, no3Hlj1Jqr, cszzGkz, ROBOT_XSY_1.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()), tXinyiRobots);
+            }
+        }
+
+        //#2好氧硝酸盐
+        if(no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0){
+            if(!Objects.isNull(cszzBzz)){
+                handleXinYiWarningsRobotOriginCsXsy(cszzBzz, no3Hlj2Jqr, cszzGkz, ROBOT_XSY_2.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()), tXinyiRobots);
+            }
+        }
+
+
+        //出水氨氮
+        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);
+        }
+    }
+
+
+    /**
+     * 通过输入的值 生成对应类型的报警对象(出水)
+     *
+     * @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) {
+
+        String testHour = tXinyiIndustry.getTestHour();
+        //这里也不能用当前日期,要用对应检测时间
+//        Date nowDate = DateUtils.getNowDate();
+        Date nowDate = DateUtils.parseDate(testHour);
+
+        //下面是最原始的处理 超标准 超管控报警
+        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, nowDate);
+        //判断是否存在要报警的数据
+        //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完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
+     * @param nowDate
+     * @return
+     */
+    private TXinyiWarningRecord getRobotCsAdWarningBean(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<BigDecimal> tXinyiRobots, Date nowDate) {
+        //判断是否存在
+        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(nowDate);
+        tXinyiWarningRecord.setWarningVal(currentVal);
+        tXinyiWarningRecord.setDesignVal(csBzz);
+        tXinyiWarningRecord.setControlVal(csGkz);
+        tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
+        tXinyiWarningRecord.setCreateTime(nowDate);
+        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;
+    }
+
+
+    /**
+     * 通过输入的值 生成对应类型的报警对象(出水)
+     *
+     * @param csBzz
+     * @param currentVal
+     * @param csGkz
+     * @param category
+     * @param tXinyiIndustry
+     * @param normConfig
+     * @param cwrwfhz
+     * @param tXinyiRobots
+     * @return
+     */
+    private void handleXinYiWarningsRobotOriginCsXsy(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots) {
+
+        String testHour = tXinyiIndustry.getTestHour();
+        //这里也不能用当前日期,要用对应检测时间
+//        Date nowDate = DateUtils.getNowDate();
+        Date nowDate = DateUtils.parseDate(testHour);
+
+        //下面是最原始的处理 超标准 超管控报警
+        robotCsXsyGybz(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 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, nowDate);
+        //判断是否存在要报警的数据
+        //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完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
+     * @param nowDate
+     * @return
+     */
+    private TXinyiWarningRecord getRobotCsXsyWarningBean(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots, Date nowDate) {
+        //判断是否存在
+        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;
+                    //2025年05月07日16:04:56 bug修复:这里不能退出,因为一个循环里有2个判断逻辑处理。
+//                    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;
+                //2025年05月07日16:04:56 bug修复:这里不能退出,因为一个循环里有2个判断逻辑处理。
+//                break;//只要出现一个不超标的就不算超标
+            }
+
+        }
+
+        //存放则返回对象,不存在,则返回null  2个条件都不满足报警,返回空对象
+        if(!flag1 && !flag2)
+            return null;
+        TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
+        tXinyiWarningRecord.setStatus(0);
+        tXinyiWarningRecord.setType(0);
+        tXinyiWarningRecord.setCategory(category);
+        tXinyiWarningRecord.setTime(nowDate);
+        tXinyiWarningRecord.setWarningVal(currentVal);
+        tXinyiWarningRecord.setDesignVal(csBzz);
+        tXinyiWarningRecord.setControlVal(csGkz);
+        tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
+        tXinyiWarningRecord.setCreateTime(nowDate);
+        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;
+    }
+
+
+
 }
 

+ 2 - 0
slibra-system/src/main/java/com/slibra/business/mapper/TXinyiRobotMapper.java

@@ -73,6 +73,8 @@ public interface TXinyiRobotMapper
 
     List<TXinyiRobot> selectNRobot(int size);
 
+    List<TXinyiRobot> selectNRobotAfterHour(@Param("size") int size, @Param("testHour") String testHour);
+
     TXinyiRobot selectRebotAvgByDate(String date);
 
     TXinyiRobot selectTXinyiRobotByAvg(TXinyiRobot tXinyiRobot);

+ 5 - 0
slibra-system/src/main/resources/mapper/business/TXinyiRobotMapper.xml

@@ -203,6 +203,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectTXinyiRobotVo"/> order by id desc limit #{size}
     </select>
 
+    <select id="selectNRobotAfterHour" resultMap="TXinyiRobotResult">
+        <include refid="selectTXinyiRobotVo"/> where TEST_HOUR &lt;= #{testHour} order by id desc limit #{size}
+    </select>
+
+
     <select id="selectRebotAvgByDate" resultMap="TXinyiRobotResult">
         SELECT
             AVG(NO3_HLJ1_JQR) NO3_HLJ1_JQR,