|
@@ -4106,48 +4106,15 @@ public class AsyncTask {
|
|
if (existsJsNh3GDZ(jsBzz, currentVal, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiIndustries, nowDate))
|
|
if (existsJsNh3GDZ(jsBzz, currentVal, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiIndustries, nowDate))
|
|
return;
|
|
return;
|
|
|
|
|
|
- //最开始的工艺报警 (超标准工艺报警) 2025年04月16日15:40:23 改成只有超标准才会报警,并且具体逻辑做拆分 todo
|
|
|
|
|
|
+ //最开始的工艺报警 (超标准工艺报警) 2025年04月16日15:40:23 改成只有超标准才会报警,并且具体逻辑做拆分
|
|
|
|
+ normalIndustryWarningJsNh3(jsBzz, currentVal, category, tXinyiIndustry, normConfig, cwrwfhz, nowDate, tXinyiIndustries);
|
|
|
|
|
|
- BigDecimal multiply = jsBzz.multiply(new BigDecimal(MyConstants.SCALE_VALUE));
|
|
|
|
- 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 具体的值由上游传过来
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void normalIndustryWarningJsNh3(BigDecimal jsBzz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, Date nowDate, List<TXinyiIndustry> tXinyiIndustries) {
|
|
|
|
+ //新的判断进水氨氮是否超标
|
|
|
|
+ TXinyiWarningRecord tXinyiWarningRecord = existsNormalJsNh3(jsBzz, currentVal, category, cwrwfhz, tXinyiIndustries, normConfig);
|
|
|
|
|
|
- //2024年5月25日17:52:33 如果工业库获取不到数据,也触发报警,但是不调用决策接口
|
|
|
|
- if(Objects.isNull(currentVal) || currentVal.compareTo(BigDecimal.ZERO) == 0){
|
|
|
|
- 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(jsBzz) >= 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{
|
|
|
|
- tXinyiWarningRecord = null;//这种的无需处理
|
|
|
|
- }
|
|
|
|
- /*else if(!Objects.isNull(csGkz) && currentVal.compareTo(csGkz) > 0){
|
|
|
|
- tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
|
|
|
|
- tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
|
|
|
|
- }*/
|
|
|
|
//最近3条输出 连续升高趋势 和 新增的报警都需要
|
|
//最近3条输出 连续升高趋势 和 新增的报警都需要
|
|
//当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
|
|
//当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
|
|
List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().type(0).category(category).status(0).build());
|
|
List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().type(0).category(category).status(0).build());
|
|
@@ -4155,64 +4122,96 @@ public class AsyncTask {
|
|
if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
|
|
if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
|
|
log.info( "{}:现在恢复正常,历史报警数据为{}", category,JSON.toJSONString(tXinyiWarningRecords));
|
|
log.info( "{}:现在恢复正常,历史报警数据为{}", category,JSON.toJSONString(tXinyiWarningRecords));
|
|
for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {
|
|
for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {
|
|
- xinyiWarningRecord.setStatus(2);
|
|
|
|
- xinyiWarningRecord.setOffTime(nowDate);
|
|
|
|
- xinyiWarningRecord.setUpdateTime(nowDate);
|
|
|
|
- xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
|
|
|
|
- this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
|
|
|
|
|
|
+ closeWarning(xinyiWarningRecord);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}else{//有告警信息
|
|
}else{//有告警信息
|
|
if(CollectionUtils.isEmpty(tXinyiWarningRecords)){//之前没有告警记录
|
|
if(CollectionUtils.isEmpty(tXinyiWarningRecords)){//之前没有告警记录
|
|
- //2024年7月18日16:23:11 新增逻辑,查询是否有连续升高的趋势,如果有才需要报警
|
|
|
|
- if(CollectionUtils.isEmpty(tXinyiIndustries) || tXinyiIndustries.size() < 3){
|
|
|
|
- log.error("处理生化报警时,获取最近的3条工业库数据失败~~~~~~~");
|
|
|
|
- return ;
|
|
|
|
- }
|
|
|
|
- tXinyiIndustry1 = tXinyiIndustries.get(INDEX_1);//前一个小时
|
|
|
|
- TXinyiIndustry tXinyiIndustry2 = tXinyiIndustries.get(INDEX_2);//前两个小时
|
|
|
|
- if(!this.judgeContinuousIndustry(tXinyiIndustry1, tXinyiIndustry2, category)){
|
|
|
|
- log.info("虽然当前超标了,但是没有连续升高趋势,所以不报警,当前没有报警出来的数据为{}\n,前一个小时数据为{}\n前两个小时数据为{}", JSON.toJSONString(tXinyiWarningRecord), JSON.toJSONString(tXinyiIndustry1), JSON.toJSONString(tXinyiIndustry2));
|
|
|
|
- return ;
|
|
|
|
- }
|
|
|
|
//保存到数据库中
|
|
//保存到数据库中
|
|
//2024年7月15日11:06:16 因为只有一个告警记录,但是如果一直报警,现在报警时间取的是更新时间,兼容第一次报警处理
|
|
//2024年7月15日11:06:16 因为只有一个告警记录,但是如果一直报警,现在报警时间取的是更新时间,兼容第一次报警处理
|
|
tXinyiWarningRecord.setUpdateTime(nowDate);
|
|
tXinyiWarningRecord.setUpdateTime(nowDate);
|
|
this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
|
|
this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
|
|
- if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
|
|
|
|
- //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
|
|
|
|
- this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
|
|
|
|
- }else {
|
|
|
|
- //继续调用决策
|
|
|
|
- this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, false, nowDate);
|
|
|
|
- }
|
|
|
|
|
|
+ //继续调用决策
|
|
|
|
+ this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, false, nowDate);
|
|
}else{
|
|
}else{
|
|
log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
|
|
log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
|
|
for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {//理论上只有一个的
|
|
for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {//理论上只有一个的
|
|
- if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
|
|
|
|
- //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
|
|
|
|
- this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
|
|
|
|
- }else {
|
|
|
|
- //2024年7月5日10:45:24 逻辑调整:更新一直报警的那条记录的显示值
|
|
|
|
- xinyiWarningRecord.setWarningVal(tXinyiWarningRecord.getWarningVal());
|
|
|
|
|
|
+ //2024年7月5日10:45:24 逻辑调整:更新一直报警的那条记录的显示值
|
|
|
|
+ xinyiWarningRecord.setWarningVal(tXinyiWarningRecord.getWarningVal());
|
|
// xinyiWarningRecord.setDesignVal(tXinyiWarningRecord.getDesignVal());
|
|
// xinyiWarningRecord.setDesignVal(tXinyiWarningRecord.getDesignVal());
|
|
// tXinyiWarningRecord.setControlVal(tXinyiWarningRecord.getControlVal());
|
|
// 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);
|
|
|
|
- }
|
|
|
|
|
|
+ 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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 根据新的规则,判断进水氨氮是否超标,超标了则返回报警对象;没有超标,返回空对象
|
|
|
|
+ *
|
|
|
|
+ * @param jsBzz
|
|
|
|
+ * @param currentVal
|
|
|
|
+ * @param category
|
|
|
|
+ * @param cwrwfhz
|
|
|
|
+ * @param tXinyiIndustries
|
|
|
|
+ * @param normConfig
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private TXinyiWarningRecord existsNormalJsNh3(BigDecimal jsBzz, BigDecimal currentVal, String category, BigDecimal cwrwfhz, List<TXinyiIndustry> tXinyiIndustries, TXinyiNormConfig normConfig) {
|
|
|
|
+ boolean flag = false;
|
|
|
|
+ TXinyiIndustry tXinyiIndustry = tXinyiIndustries.get(INDEX_0);
|
|
|
|
+ BigDecimal jsNh30 = tXinyiIndustry.getJsNh3();
|
|
|
|
+ BigDecimal jsNh31 = tXinyiIndustries.get(INDEX_1).getJsNh3();
|
|
|
|
+ BigDecimal jsNh32 = tXinyiIndustries.get(INDEX_2).getJsNh3();
|
|
|
|
+ BigDecimal jsNh33 = tXinyiIndustries.get(INDEX_3).getJsNh3();
|
|
|
|
+ if(!Objects.isNull(jsNh30) && jsNh30.compareTo(jsBzz) > 0 && !Objects.isNull(jsNh31) && jsNh31.compareTo(jsBzz) > 0
|
|
|
|
+ && !Objects.isNull(jsNh32) && jsNh32.compareTo(jsBzz) > 0 && !Objects.isNull(jsNh33) && jsNh33.compareTo(jsBzz) > 0)
|
|
|
|
+ flag = true;//最近4个都超标
|
|
|
|
+ if(!Objects.isNull(jsNh30) && jsNh30.compareTo(jsBzz) > 0 && !Objects.isNull(jsNh31) && jsNh30.compareTo(jsNh31) >= 0
|
|
|
|
+ && !Objects.isNull(jsNh32) && jsNh31.compareTo(jsNh32) >= 0)
|
|
|
|
+ flag = true;//最新的超标了并且连续3个值都有升高趋势
|
|
|
|
+ BigDecimal jsCod = tXinyiIndustry.getJsCod();
|
|
|
|
+ BigDecimal jsTn = tXinyiIndustry.getJsTn();
|
|
|
|
+ BigDecimal jsTp = tXinyiIndustry.getJsTp();
|
|
|
|
+ if(!Objects.isNull(jsNh30) && jsNh30.compareTo(jsBzz) > 0 && (!Objects.isNull(jsCod) && jsCod.compareTo(BigDecimal.valueOf(630)) > 0
|
|
|
|
+ || !Objects.isNull(jsTn) && jsTn.compareTo(BigDecimal.valueOf(65)) > 0 || !Objects.isNull(jsTp) && jsTp.compareTo(BigDecimal.valueOf(7.1)) > 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;
|
|
}
|
|
}
|
|
|
|
|
|
private boolean existsJsNh3YCSG(BigDecimal jsBzz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiIndustry> tXinyiIndustries, Date nowDate) {
|
|
private boolean existsJsNh3YCSG(BigDecimal jsBzz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiIndustry> tXinyiIndustries, Date nowDate) {
|