Ver código fonte

化验室报警晚上

王苗苗 1 mês atrás
pai
commit
c1074a2182

+ 222 - 2
slibra-quartz/src/main/java/com/slibra/quartz/task/AsyncTask.java

@@ -1618,7 +1618,7 @@ public class AsyncTask {
             }else{
                 log.info("工业库报警的时候,发现存在仪表故障(断点多个指标)的报警,并且已经有该类型报警了,不做任何处理");
             }
-            log.info("发现存在仪表故障(断点多个指标)的报警,其他报警不再处理");
+            log.info("工业库报警的时候,发现存在仪表故障(断点多个指标)的报警,其他报警不再处理");
             return;
         }
 
@@ -2579,7 +2579,7 @@ public class AsyncTask {
 
 
     /**
-     * 通过输入的值 生成对应类型的报警对象(进水)
+     * [工业库]通过输入的值 生成对应类型的报警对象(进水)
      *
      * @param jsBzz
      * @param currentVal
@@ -2666,6 +2666,58 @@ public class AsyncTask {
 
 
 
+    /**
+     * [化验室]通过输入的值 生成对应类型的报警对象(进水)
+     * 化验室只有断点报警,没有连续不变报警(因为化验室数据本身就是4-8个小时一轮 是重复的)
+     * @param currentVal
+     * @param category
+     * @return
+     */
+    private WarningMoreExceed handleXinYiWarningRecordRobotMore(BigDecimal currentVal, String category)  {
+        WarningMoreExceed warningMoreExceed = new WarningMoreExceed();
+        boolean breakpoint = false;
+
+        Date nowDate = DateUtils.getNowDate();
+        List<TXinyiRobot> tXinyiRobots = this.xinyiRobotMapper.selectNRobot(INT_3);
+        if(CollectionUtils.isEmpty(tXinyiRobots) || tXinyiRobots.size() < 3){
+            log.error("处理连续检测报警时,获取最近的3条化验数据失败~~~~~~~");
+            return new WarningMoreExceed();
+        }
+        TXinyiRobot tXinyiRobot1 = tXinyiRobots.get(INDEX_1);//前一个小时
+
+        //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(!Objects.isNull(tXinyiRobot1)){
+            if(existsRobotBreakPoints(currentVal, category, tXinyiRobot1)){
+                //关闭同类型的其他报警
+                //2025年02月25日14:45:09 不用在此关闭,因为在后续处理的时候,判断是单一报警还是多指标表报警的时候,都做了对应的关闭。
+//                closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode());
+                breakpoint = true;
+                //触发报警 并且模拟大模型返回决策问答数据
+                //插入该类型报警
+                warningRecord.setType(0);
+                warningRecord.setCategory(category);
+                warningRecord.setTime(nowDate);
+                warningRecord.setReason(BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getMsg());
+                warningRecord.setWaterType(BusinessEnum.WaterTypeEnum.JS.getCode());
+                warningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode());
+                warningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
+                warningRecord.setCreateTime(nowDate);
+                warningRecord.setWarningVal(currentVal);
+                warningMoreExceed.setBreakPointWarningRecord(warningRecord);
+//                this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecord);
+                //同时处理决策 不用调用大模型,本地处理问答
+//                addChatRecordByBreakPointsSingle(warningRecord, tXinyiIndustry, normConfig, category);
+            }
+        }
+
+        warningMoreExceed.setBreakpoint(breakpoint);
+        return warningMoreExceed;
+    }
+
+
     /**
      * 通过输入的值 生成对应类型的报警对象(进水)
      *
@@ -3394,6 +3446,65 @@ public class AsyncTask {
         return result;
     }
 
+
+    /**
+     *
+     * 判断当前时间和上个时间段的值是否存在断点
+     * @param currentVal
+     * @param category
+     * @param tXinyiRobot1
+     * @return
+     */
+    private boolean existsRobotBreakPoints(BigDecimal currentVal, String category, TXinyiRobot tXinyiRobot1) {
+        boolean result = false;//默认不超标
+        boolean currentBreakpoint = Objects.isNull(currentVal) || BigDecimal.ZERO.compareTo(currentVal) == 0;
+
+        if(BusinessEnum.WarningCategoryEnum.ROBOT_XSY_1.getCode().equals(category)){
+            BigDecimal no3Hlj1Jqr1 = tXinyiRobot1.getNo3Hlj1Jqr();
+            if(currentBreakpoint && (Objects.isNull(no3Hlj1Jqr1) || BigDecimal.ZERO.compareTo(no3Hlj1Jqr1) == 0))
+                result = true;
+        }else if(BusinessEnum.WarningCategoryEnum.ROBOT_XSY_2.getCode().equals(category)){
+            BigDecimal no3Hlj2Jqr1 = tXinyiRobot1.getNo3Hlj2Jqr();
+            if(currentBreakpoint && (Objects.isNull(no3Hlj2Jqr1) || BigDecimal.ZERO.compareTo(no3Hlj2Jqr1) == 0))
+                result = true;
+        }else if(BusinessEnum.WarningCategoryEnum.ROBOT_ECCZLSY.getCode().equals(category)){
+            BigDecimal tpRccJqr1 = tXinyiRobot1.getTpRccJqr();
+            if(currentBreakpoint && (Objects.isNull(tpRccJqr1) || BigDecimal.ZERO.compareTo(tpRccJqr1) == 0))
+                result = true;
+        }else if(BusinessEnum.WarningCategoryEnum.CS_AD.getCode().equals(category)){//2025年02月25日16:23:08 合并一个指标:出水氨氮 通过计算获得
+            //计算得到对应的值
+            //计算1(1池)
+            BigDecimal no3Qyc1Jqr11 = tXinyiRobot1.getNo3Qyc1Jqr();
+            BigDecimal nh31Jqr11 = tXinyiRobot1.getNh31Jqr();
+            BigDecimal no3Hlj1Jqr11 = tXinyiRobot1.getNo3Hlj1Jqr();
+            if(Objects.isNull(no3Qyc1Jqr11))
+                no3Qyc1Jqr11 = BigDecimal.ZERO;
+            if(Objects.isNull(nh31Jqr11))
+                nh31Jqr11 = BigDecimal.ZERO;
+            if(Objects.isNull(no3Hlj1Jqr11))
+                no3Hlj1Jqr11 = BigDecimal.ZERO;
+            BigDecimal anDan11 = no3Qyc1Jqr11.add(nh31Jqr11).subtract(no3Hlj1Jqr11);
+            //计算1(2池)
+            BigDecimal no3Qyc1Jqr12 = tXinyiRobot1.getNo3Qyc2Jqr();
+            BigDecimal nh31Jqr12 = tXinyiRobot1.getNh32Jqr();
+            BigDecimal no3Hlj1Jqr12 = tXinyiRobot1.getNo3Hlj2Jqr();
+            if(Objects.isNull(no3Qyc1Jqr12))
+                no3Qyc1Jqr12 = BigDecimal.ZERO;
+            if(Objects.isNull(nh31Jqr12))
+                nh31Jqr12 = BigDecimal.ZERO;
+            if(Objects.isNull(no3Hlj1Jqr12))
+                no3Hlj1Jqr12 = BigDecimal.ZERO;
+            BigDecimal anDan12 = no3Qyc1Jqr12.add(nh31Jqr12).subtract(no3Hlj1Jqr12);
+            BigDecimal anDan1 = anDan11.add(anDan12).divide(DECIMAL_2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
+            if(currentBreakpoint && (Objects.isNull(anDan1) || BigDecimal.ZERO.compareTo(anDan1) == 0))
+                result = true;
+        }else{
+            log.error("化验室暂时还不支持的报警类型~~~~");
+        }
+        return result;
+    }
+
+
     private boolean judgeContinuousIndustry(TXinyiIndustry tXinyiIndustry1, TXinyiIndustry tXinyiIndustry2, String category) {
         boolean result = false;//默认不超标
         if(BusinessEnum.WarningCategoryEnum.CS_COD.getCode().equals(category)){
@@ -3808,6 +3919,115 @@ public class AsyncTask {
     private void robotWarningDetail(TXinyiRobot tXinyiRobot, TXinyiNormConfig normConfig, TXinyiIndustry tXinyiIndustry) {
 
         //先查看数据是否有断点--单指标  断点--多指标
+        int breakpointCount = 0;
+        List<TXinyiWarningRecord> breakPointList = new ArrayList<>();//断点集合
+
+        //#1好氧硝酸盐
+        BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
+        //#2好氧硝酸盐
+        BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
+        //总磷
+        BigDecimal tpRccJqr = tXinyiRobot.getTpRccJqr();
+        //1#缺氧出-硝酸盐
+        BigDecimal no3Qyc1Jqr = tXinyiRobot.getNo3Qyc1Jqr();
+        BigDecimal nh31Jqr = tXinyiRobot.getNh31Jqr();
+        //2#缺氧出-硝酸盐
+        BigDecimal no3Qyc2Jqr = tXinyiRobot.getNo3Qyc2Jqr();
+        BigDecimal nh32Jqr = tXinyiRobot.getNh32Jqr();
+
+
+        WarningMoreExceed warningMoreExceed = handleXinYiWarningRecordRobotMore(no3Hlj1Jqr, ROBOT_XSY_1.getCode());
+        if(warningMoreExceed.isBreakpoint()){
+            breakpointCount++;
+            breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
+        }
+
+        warningMoreExceed = handleXinYiWarningRecordRobotMore(no3Hlj2Jqr, ROBOT_XSY_2.getCode());
+        if(warningMoreExceed.isBreakpoint()){
+            breakpointCount++;
+            breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
+        }
+
+        BigDecimal csTp = tpRccJqr.divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP);
+        warningMoreExceed = handleXinYiWarningRecordRobotMore(csTp, ROBOT_ECCZLSY.getCode());
+        if(warningMoreExceed.isBreakpoint()){
+            breakpointCount++;
+            breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
+        }
+
+        //判断 增加容错
+        if(Objects.isNull(no3Qyc1Jqr))
+            no3Qyc1Jqr = BigDecimal.ZERO;
+        if(Objects.isNull(nh31Jqr))
+            nh31Jqr = BigDecimal.ZERO;
+        if(Objects.isNull(no3Hlj1Jqr))
+            no3Hlj1Jqr = BigDecimal.ZERO;
+        BigDecimal anDan1 = no3Qyc1Jqr.add(nh31Jqr).subtract(no3Hlj1Jqr);
+
+        //判断 增加容错
+        if(Objects.isNull(no3Qyc2Jqr))
+            no3Qyc2Jqr = BigDecimal.ZERO;
+        if(Objects.isNull(nh32Jqr))
+            nh32Jqr = BigDecimal.ZERO;
+        if(Objects.isNull(no3Hlj2Jqr))
+            no3Hlj2Jqr = BigDecimal.ZERO;
+        BigDecimal anDan2 = no3Qyc2Jqr.add(nh32Jqr).subtract(no3Hlj2Jqr);
+        BigDecimal divide = anDan1.add(anDan2).divide(DECIMAL_2, INT_2, RoundingMode.HALF_UP);
+        warningMoreExceed = handleXinYiWarningRecordRobotMore(divide, ROBOT_CS_AD.getCode());
+        if(warningMoreExceed.isBreakpoint()){
+            breakpointCount++;
+            breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
+        }
+
+
+        //下面是处理多个指标的 【断点】报警
+        //断点
+        Date nowDate = DateUtils.getNowDate();
+        TXinyiWarningRecord warningRecord = TXinyiWarningRecord.builder().symbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE.getCode()).status(0).build();
+        List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecord);
+        if(breakpointCount < 1){//恢复正常 关闭多个断点报警
+            if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
+                closeWarning(tXinyiWarningRecords.get(0));
+            }
+        }else if(breakpointCount == 1){//只有单个的断点
+            TXinyiWarningRecord warningRecordBreakPointOne = breakPointList.get(0);
+            String category = warningRecordBreakPointOne.getCategory();
+            TXinyiWarningRecord warningRecordReq = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode()).status(0).build();
+            List<TXinyiWarningRecord> tXinyiBreakPointSingleWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordReq);
+            //关闭同类型的其他报警
+            closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode());
+            //触发报警 并且模拟大模型返回决策问答数据
+            if(CollectionUtils.isEmpty(tXinyiBreakPointSingleWarningRecords)){
+                //插入该类型报警
+                this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordBreakPointOne);
+                //同时处理决策 不用调用大模型,本地处理问答
+                addChatRecordByBreakPointsSingle(warningRecordBreakPointOne, tXinyiIndustry, normConfig, category);
+            }else{
+                log.info("化验室报警的时候,发现存在仪表故障(断点不变单个指标)的报警,并且已经有该类型报警了,不做任何处理");
+            }
+        }else{
+            //将其他类型的报警全部关闭
+            closeOtherWarningsBySymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE.getCode());
+            //再新增新的类型的报警
+            if(CollectionUtils.isEmpty(tXinyiWarningRecords)){
+                //插入该类型报警
+                warningRecord.setType(0);
+                String msg = BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE.getMsg();
+                warningRecord.setCategory(msg);
+                warningRecord.setTime(nowDate);
+                warningRecord.setReason(msg);
+                warningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE.getCode());
+                warningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
+                warningRecord.setCreateTime(nowDate);
+                this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecord);
+                //同时处理决策 不用调用大模型,本地处理问答
+                addChatRecordByBreakPointsMore(warningRecord, tXinyiIndustry, normConfig);
+            }else{
+                log.info("化验室报警的时候,发现存在仪表故障(断点多个指标)的报警,并且已经有该类型报警了,不做任何处理");
+            }
+            log.info("化验室报警的时候,发现存在仪表故障(断点多个指标)的报警,其他报警不再处理");
+            return;
+        }
 
 
         //最原始的标准值和管控制报警