王苗苗 6 ngày trước cách đây
mục cha
commit
edd97c8af4

+ 171 - 1
slibra-quartz/src/main/java/com/slibra/quartz/task/AsyncTask.java

@@ -7238,7 +7238,7 @@ public class AsyncTask {
 
         //出水氨氮
         if(!Objects.isNull(csadBzz) && csADExecute){
-            handleXinYiWarningsRobotOrigin(csadBzz, tenVals.get(INDEX_0), csadGkz, ROBOT_CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
+            handleXinYiWarningsRobotOriginCsAd(csadBzz, tenVals.get(INDEX_0), csadGkz, ROBOT_CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()), tXinyiRobots);
         }
 
     }
@@ -7634,6 +7634,176 @@ public class AsyncTask {
 //    }
 
 
+
+    /**
+     * 通过输入的值 生成对应类型的报警对象(出水)
+     *
+     * @param csBzz
+     * @param currentVal
+     * @param csGkz
+     * @param category
+     * @param tXinyiIndustry
+     * @param normConfig
+     * @param cwrwfhz
+     * @param tXinyiRobots
+     * @return
+     */
+    private void handleXinYiWarningsRobotOriginCsAd(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots) {
+
+        Date nowDate = DateUtils.getNowDate();
+        TXinyiRobot tXinyiRobot1 = tXinyiRobots.get(INDEX_1);//前一个小时
+
+        //单点突变-异常升高报警
+        if (existsYcsgRobots(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate))
+            return;
+
+
+        //下面是最原始的处理 超标准 超管控报警
+        robotCsAdGybz(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate, tXinyiRobot1);
+
+    }
+
+
+    /**
+     *
+     * 化验室-出水氨氮 的 超标准工艺报警
+     * @param csBzz
+     * @param currentVal
+     * @param csGkz
+     * @param category
+     * @param tXinyiIndustry
+     * @param normConfig
+     * @param cwrwfhz
+     * @param tXinyiRobots
+     * @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));
+        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());
+
+        //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;//这种的无需处理
+        }
+        //判断是否存在要报警的数据
+        xxx
+        //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完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);
+                }
+            }
+        }
+    }
+
+    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();
+        List<TXinyiWarningRecord> tXinyiNoChangeYCSGRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordYCSG);
+        //是否存在异常升高的问题
+        //2025年02月21日14:33:37 这里要改成当前值和上个小时比较  上个小时和上上个小时比较
+//            BigDecimal exceedVal = existsRobotYCSG(currentVal, category, tXinyiRobots);
+        Map<String, BigDecimal> resultMap = existsRobotYCSG(currentVal, category, tXinyiRobots);
+        BigDecimal exceedVal = resultMap.get(EXCEEDVAL);
+        if(!Objects.isNull(exceedVal)){//这里不能只返回一个布尔类型的结果,因为还要获取百分比的值
+            //关闭同类型的其他报警
+            closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode());
+            //触发报警 并且模拟大模型返回决策问答数据
+            if(CollectionUtils.isEmpty(tXinyiNoChangeYCSGRecords)){
+                //插入该类型报警
+                warningRecordYCSG.setTime(nowDate);
+                warningRecordYCSG.setReason(category + BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getMsg());
+                warningRecordYCSG.setWaterType(BusinessEnum.WaterTypeEnum.CS.getCode());
+                warningRecordYCSG.setSymbol(BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode());
+                warningRecordYCSG.setCreateBy(WARNING_DEFAULT_CREATE);
+                warningRecordYCSG.setCreateTime(nowDate);
+                warningRecordYCSG.setWarningVal(currentVal);
+                warningRecordYCSG.setDesignVal(csBzz);
+                warningRecordYCSG.setControlVal(csGkz);
+                warningRecordYCSG.setRemark(THREE_HYS_WARNING.getCode());//化验室
+                warningRecordYCSG.setCwrwfhz(cwrwfhz);//2025年02月14日10:42:53 具体指标具体计算,由上游传过来。
+                warningRecordYCSG.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, false));//根据当前值和类型以及是否超标处理
+                this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordYCSG);
+                //同时处理决策 不用调用大模型,本地处理问答
+                addChatRecordByYCSG(warningRecordYCSG, tXinyiIndustry, normConfig, category, exceedVal, resultMap.get(LASTVAL));
+            }else{
+                log.info("化验室报警的时候,发现存在异常升高的报警,并且已经有该类型报警了,不做任何处理");
+                //同时处理决策 不用调用大模型,本地处理问答
+                addChatRecordByYCSG(warningRecordYCSG, tXinyiIndustry, normConfig, category, exceedVal, resultMap.get(LASTVAL));
+            }
+            log.info("化验室报警的时候,发现存在异常升高的报警,后续同指标报警不再处理");
+            return true;
+        }else{//不存在 查看历史是否有报警,有的话关闭
+            if(!CollectionUtils.isEmpty(tXinyiNoChangeYCSGRecords)){
+                closeWarning(tXinyiNoChangeYCSGRecords.get(0));
+            }
+        }
+        return false;
+    }
+
+
     /**
      * 通过输入的值 生成对应类型的报警对象(出水)
      *