|
@@ -4211,11 +4211,11 @@ public class AsyncTask {
|
|
|
//2025年04月15日15:45:48 这种的暂时先不报
|
|
|
|
|
|
//2025年04月16日14:35:48 新增高低值设备报警
|
|
|
- if (existsJsCodGDZ(jsBzz, currentVal, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiIndustries, nowDate, last8Str))
|
|
|
+ if (existsJsTpGDZ(jsBzz, currentVal, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiIndustries, nowDate, last8Str))
|
|
|
return;
|
|
|
|
|
|
//最开始的工艺报警 (超标准工艺报警) 2025年04月16日15:40:23 改成只有超标准才会报警,并且具体逻辑做拆分
|
|
|
- normalIndustryWarningJsCod(jsBzz, currentVal, category, tXinyiIndustry, normConfig, cwrwfhz, nowDate, tXinyiIndustries);
|
|
|
+ normalIndustryWarningJsTp(jsBzz, currentVal, category, tXinyiIndustry, normConfig, cwrwfhz, nowDate, tXinyiIndustries);
|
|
|
|
|
|
}
|
|
|
|
|
@@ -4420,6 +4420,64 @@ public class AsyncTask {
|
|
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
+ * 最开始的工艺报警 (超标准工艺报警) -- 进水tp
|
|
|
+ * @param jsBzz
|
|
|
+ * @param currentVal
|
|
|
+ * @param category
|
|
|
+ * @param tXinyiIndustry
|
|
|
+ * @param normConfig
|
|
|
+ * @param cwrwfhz
|
|
|
+ * @param nowDate
|
|
|
+ * @param tXinyiIndustries
|
|
|
+ */
|
|
|
+ private void normalIndustryWarningJsTp(BigDecimal jsBzz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, Date nowDate, List<TXinyiIndustry> tXinyiIndustries) {
|
|
|
+ //新的判断进水氨氮是否超标
|
|
|
+ TXinyiWarningRecord tXinyiWarningRecord = existsNormalJsTp(jsBzz, currentVal, category, cwrwfhz, tXinyiIndustries, normConfig);
|
|
|
+
|
|
|
+ //最近3条输出 连续升高趋势 和 新增的报警都需要
|
|
|
+ //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
|
|
|
+ List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().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) {
|
|
|
+ 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, false, 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, false, nowDate);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 最开始的工艺报警 (超标准工艺报警) -- 进水cod
|
|
|
* @param jsBzz
|
|
@@ -4686,6 +4744,67 @@ public class AsyncTask {
|
|
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
+ * 根据新的规则,判断进水氨氮是否超标,超标了则返回报警对象;没有超标,返回空对象 -- 进水cod
|
|
|
+ *
|
|
|
+ * @param jsBzz
|
|
|
+ * @param currentVal
|
|
|
+ * @param category
|
|
|
+ * @param cwrwfhz
|
|
|
+ * @param tXinyiIndustries
|
|
|
+ * @param normConfig
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private TXinyiWarningRecord existsNormalJsTp(BigDecimal jsBzz, BigDecimal currentVal, String category, BigDecimal cwrwfhz, List<TXinyiIndustry> tXinyiIndustries, TXinyiNormConfig normConfig) {
|
|
|
+ boolean flag = false;
|
|
|
+ TXinyiIndustry tXinyiIndustry = tXinyiIndustries.get(INDEX_0);
|
|
|
+ BigDecimal jsTp0 = tXinyiIndustry.getJsTp();
|
|
|
+ BigDecimal jsTp1 = tXinyiIndustries.get(INDEX_1).getJsTp();
|
|
|
+ BigDecimal jsTp2 = tXinyiIndustries.get(INDEX_2).getJsTp();
|
|
|
+ BigDecimal jsTp3 = tXinyiIndustries.get(INDEX_3).getJsTp();
|
|
|
+ if(!Objects.isNull(jsTp0) && jsTp0.compareTo(jsBzz) > 0 && !Objects.isNull(jsTp1) && jsTp1.compareTo(jsBzz) > 0
|
|
|
+ && !Objects.isNull(jsTp2) && jsTp2.compareTo(jsBzz) > 0 && !Objects.isNull(jsTp3) && jsTp3.compareTo(jsBzz) > 0)
|
|
|
+ flag = true;//最近4个都超标
|
|
|
+ if(!Objects.isNull(jsTp0) && jsTp0.compareTo(jsBzz) > 0 && !Objects.isNull(jsTp1) && jsTp0.compareTo(jsTp1) >= 0
|
|
|
+ && !Objects.isNull(jsTp2) && jsTp1.compareTo(jsTp2) >= 0)
|
|
|
+ flag = true;//最新的超标了并且连续3个值都有升高趋势
|
|
|
+ BigDecimal jsCod = tXinyiIndustry.getJsCod();
|
|
|
+ BigDecimal jsTn = tXinyiIndustry.getJsTn();
|
|
|
+ BigDecimal jsNh3 = tXinyiIndustry.getJsNh3();
|
|
|
+ //在线仪表,一个进水总磷数据 > 7.1,并且 cod> 630 或当前进水总氮> 65 或 当前进水氨氮 >58
|
|
|
+ if(!Objects.isNull(jsTp0) && jsTp0.compareTo(jsBzz) > 0 && (!Objects.isNull(jsCod) && jsCod.compareTo(BigDecimal.valueOf(630)) > 0
|
|
|
+ || !Objects.isNull(jsTn) && jsTn.compareTo(BigDecimal.valueOf(65)) > 0 || !Objects.isNull(jsNh3) && jsNh3.compareTo(BigDecimal.valueOf(58)) > 0))
|
|
|
+ flag = true;
|
|
|
+ if(!flag)
|
|
|
+ return null;
|
|
|
+ //存在符合的报警情况,生成报警对象
|
|
|
+ TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
|
|
|
+ /*String category = BusinessEnum.WarningCategoryEnum.CS_AD.getCode();*/
|
|
|
+ tXinyiWarningRecord.setStatus(0);
|
|
|
+ tXinyiWarningRecord.setType(0);
|
|
|
+ tXinyiWarningRecord.setCategory(category);
|
|
|
+ tXinyiWarningRecord.setTime(DateUtils.getNowDate());
|
|
|
+ tXinyiWarningRecord.setWarningVal(currentVal);
|
|
|
+ tXinyiWarningRecord.setDesignVal(jsBzz);
|
|
|
+// tXinyiWarningRecord.setControlVal(csGkz);
|
|
|
+ tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
|
|
|
+ tXinyiWarningRecord.setCreateTime(DateUtils.getNowDate());
|
|
|
+ tXinyiWarningRecord.setRemark(ZERO_SZ_WARNING.getCode());
|
|
|
+ //2025年02月10日14:45:08 下面是新增加的字段
|
|
|
+ tXinyiWarningRecord.setWaterType(BusinessEnum.WaterTypeEnum.JS.getCode());
|
|
|
+ //超污染物限制:计算公式为:当前氨氮/氨氮设计值 或者 当前氨氮/氨氮管控值(智能工单使用) 这里是出水的 【需要根据超标还是超管控,具体计算】
|
|
|
+ //超污染物负荷值:计算公式为:当前水量与氨氮乘积 / 设计水量与设计进水氨氮的乘积(智能工单使用)
|
|
|
+ tXinyiWarningRecord.setCwrwfhz(cwrwfhz);//2025年02月14日10:48:32 具体的值由上游传过来
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 根据新的规则,判断进水氨氮是否超标,超标了则返回报警对象;没有超标,返回空对象 -- 进水cod
|
|
|
*
|
|
@@ -5111,6 +5230,68 @@ public class AsyncTask {
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断是否存在高低值并处理相关报警-进水tp
|
|
|
+ * @param jsBzz
|
|
|
+ * @param currentVal
|
|
|
+ * @param category
|
|
|
+ * @param tXinyiIndustry
|
|
|
+ * @param normConfig
|
|
|
+ * @param cwrwfhz
|
|
|
+ * @param tXinyiIndustries
|
|
|
+ * @param nowDate
|
|
|
+ * @param last8Str
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean existsJsTpGDZ(BigDecimal jsBzz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiIndustry> tXinyiIndustries, Date nowDate, String last8Str) {
|
|
|
+ if(!CollectionUtils.isEmpty(tXinyiIndustries) && tXinyiIndustries.size() == INT_8){
|
|
|
+ //查询同类型的历史报警
|
|
|
+ TXinyiWarningRecord warningRecordGDZ = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.SJYC_GDZ.getCode()).status(0).build();
|
|
|
+ List<TXinyiWarningRecord> tXinyiNoChangeGDZRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordGDZ);
|
|
|
+ //2025年02月21日14:33:37 这里要改成当前值和上个小时比较 上个小时和上上个小时比较
|
|
|
+ Map<String, BigDecimal> resultMap = existsGdzJsTp(currentVal, category, tXinyiIndustries);
|
|
|
+ BigDecimal exceedVal = resultMap.get(EXCEEDVAL);
|
|
|
+ if(!Objects.isNull(exceedVal)){//这里不能只返回一个布尔类型的结果,因为还要获取百分比的值
|
|
|
+ //关闭同类型的其他报警
|
|
|
+ closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.SJYC_GDZ.getCode());
|
|
|
+ //触发报警 并且模拟大模型返回决策问答数据
|
|
|
+ if(CollectionUtils.isEmpty(tXinyiNoChangeGDZRecords)){
|
|
|
+ //插入该类型报警
|
|
|
+ warningRecordGDZ.setTime(nowDate);
|
|
|
+ warningRecordGDZ.setReason(category + BusinessEnum.WarningSymbolEnum.SJYC_GDZ.getMsg());
|
|
|
+ warningRecordGDZ.setWaterType(BusinessEnum.WaterTypeEnum.JS.getCode());
|
|
|
+ warningRecordGDZ.setSymbol(BusinessEnum.WarningSymbolEnum.SJYC_GDZ.getCode());
|
|
|
+ warningRecordGDZ.setCreateBy(WARNING_DEFAULT_CREATE);
|
|
|
+ warningRecordGDZ.setCreateTime(nowDate);
|
|
|
+ warningRecordGDZ.setWarningVal(currentVal);
|
|
|
+ warningRecordGDZ.setDesignVal(jsBzz);
|
|
|
+ warningRecordGDZ.setRemark(ZERO_SZ_WARNING.getCode());
|
|
|
+ warningRecordGDZ.setCwrwfhz(cwrwfhz);
|
|
|
+ warningRecordGDZ.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
|
|
|
+ this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordGDZ);
|
|
|
+ //同时处理决策 不用调用大模型,本地处理问答
|
|
|
+ addChatRecordByGDZ(warningRecordGDZ, tXinyiIndustry, normConfig, category, exceedVal, resultMap.get(LASTVAL), last8Str);
|
|
|
+ }else{
|
|
|
+ log.info("工业库报警的时候,发现存在高低值的报警,并且已经有该类型报警了,不做任何处理");
|
|
|
+ //2025年04月16日15:56:47 这种的继续报警,所以决策还需要再次调用一次
|
|
|
+ //2025年05月08日13:34:23bug修改 这里不能用new的对象 要获取历史报警的值
|
|
|
+// addChatRecordByGDZ(warningRecordGDZ, tXinyiIndustry, normConfig, category, exceedVal, resultMap.get(LASTVAL), last8Str);
|
|
|
+ addChatRecordByGDZ(tXinyiNoChangeGDZRecords.get(0), tXinyiIndustry, normConfig, category, exceedVal, resultMap.get(LASTVAL), last8Str);
|
|
|
+ }
|
|
|
+ //后续的报警不再进行
|
|
|
+ log.info("工业库报警的时候,发现存在{}高低值的报警,后续报警不再处理", category);
|
|
|
+ return true;
|
|
|
+ }else{//不存在 查看历史是否有报警,有的话关闭
|
|
|
+ if(!CollectionUtils.isEmpty(tXinyiNoChangeGDZRecords)){
|
|
|
+ closeWarning(tXinyiNoChangeGDZRecords.get(0));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 判断是否存在高低值并处理相关报警-进水cod
|
|
|
* @param jsBzz
|
|
@@ -5678,8 +5859,8 @@ public class AsyncTask {
|
|
|
if(!Objects.isNull(currentVal) && !Objects.isNull(jsCod1) && !Objects.isNull(jsTn) && !Objects.isNull(jsNh3) && !Objects.isNull(jsTp)){
|
|
|
BigDecimal divide1 = currentVal.subtract(jsCod1).divide(jsCod1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
|
|
|
//2025年04月16日14:28:55 触发条件修改: 触发条件:(现在-前一小时)/前一小时*100%> 70% and 进水总磷 > 7.1 and 进水总氮<65 and 进水氨氮< 58 and 进水总氮<65 and 进水cod<630
|
|
|
- if(divide1.compareTo(compareVal) > 0 && currentVal.compareTo(BigDecimal.valueOf(630)) > 0 && jsNh3.compareTo(BigDecimal.valueOf(58)) < 0
|
|
|
- && jsTn.compareTo(BigDecimal.valueOf(65)) < 0 && jsTp.compareTo(BigDecimal.valueOf(7.1)) < 0){
|
|
|
+ if(divide1.compareTo(compareVal) > 0 && currentVal.compareTo(BigDecimal.valueOf(7.1)) > 0 && jsTn.compareTo(BigDecimal.valueOf(65)) < 0
|
|
|
+ && jsNh3.compareTo(BigDecimal.valueOf(58)) < 0 && jsCod.compareTo(BigDecimal.valueOf(630)) < 0){
|
|
|
resultMap.put(EXCEEDVAL, divide1);
|
|
|
resultMap.put(LASTVAL, jsCod1);
|
|
|
}
|
|
@@ -5807,6 +5988,26 @@ public class AsyncTask {
|
|
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
+ * 进水tp是否存在高低值切换
|
|
|
+ * @param currentVal
|
|
|
+ * @param category
|
|
|
+ * @param industryList
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Map<String, BigDecimal> existsGdzJsTp(BigDecimal currentVal, String category, List<TXinyiIndustry> industryList) {
|
|
|
+
|
|
|
+ Map<String, BigDecimal> resultMap = new HashMap<>();
|
|
|
+ BigDecimal compareValHigh = BigDecimal.valueOf(7.1);
|
|
|
+ BigDecimal compareValLow = BigDecimal.valueOf(1.7);
|
|
|
+
|
|
|
+ if(gdzJsNh3(compareValHigh, compareValLow, industryList))
|
|
|
+ resultMap.put(EXCEEDVAL, compareValHigh);//这里随便存一个值就可以 有值代表存在高低值 没有就是不存在
|
|
|
+ return resultMap;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 进水cod是否存在高低值切换
|
|
|
* @param currentVal
|