|
@@ -4027,6 +4027,57 @@ public class AsyncTask {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 2025年04月22日11:19:34 取最近的6条数据从上层传递过来
|
|
|
|
+ * [化验室]通过输入的值 生成对应类型的报警对象(进水)
|
|
|
|
+ * 化验室只有断点报警,没有连续不变报警(因为化验室数据本身就是4-8个小时一轮 是重复的)
|
|
|
|
+ * 出水总磷设备故障报警
|
|
|
|
+ * @param currentVal
|
|
|
|
+ * @param category
|
|
|
|
+ * @param tXinyiRobots
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private WarningMoreExceed handleXinYiWarningRecordRobotMoreTp(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots) {
|
|
|
|
+ WarningMoreExceed warningMoreExceed = new WarningMoreExceed();
|
|
|
|
+ boolean breakpoint = false;
|
|
|
|
+
|
|
|
|
+ Date nowDate = DateUtils.getNowDate();
|
|
|
|
+ //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(existsRobotDeviceErrorTp(category, tXinyiRobots)){
|
|
|
|
+ //关闭同类型的其他报警
|
|
|
|
+ //2025年02月25日14:45:09 不用在此关闭,因为在后续处理的时候,判断是单一报警还是多指标表报警的时候,都做了对应的关闭。
|
|
|
|
+// closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode());
|
|
|
|
+ breakpoint = true;
|
|
|
|
+ //触发报警 并且模拟大模型返回决策问答数据
|
|
|
|
+ //插入该类型报警
|
|
|
|
+ warningRecord.setTime(nowDate);
|
|
|
|
+ warningRecord.setReason(category + BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getMsg());
|
|
|
|
+ warningRecord.setWaterType(BusinessEnum.WaterTypeEnum.CS.getCode());
|
|
|
|
+ warningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode());
|
|
|
|
+ warningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
|
|
|
|
+ warningRecord.setCreateTime(nowDate);
|
|
|
|
+ warningRecord.setWarningVal(currentVal);
|
|
|
|
+ warningRecord.setDesignVal(csBzz);
|
|
|
|
+ warningRecord.setControlVal(csGkz);
|
|
|
|
+ warningRecord.setRemark(THREE_HYS_WARNING.getCode());//化验室
|
|
|
|
+ warningRecord.setCwrwfhz(cwrwfhz);//2025年02月14日10:42:53 具体指标具体计算,由上游传过来。
|
|
|
|
+ warningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, false));//根据当前值和类型以及是否超标处理
|
|
|
|
+ //存起来
|
|
|
|
+ warningMoreExceed.setBreakPointWarningRecord(warningRecord);
|
|
|
|
+// this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecord);
|
|
|
|
+ //同时处理决策 不用调用大模型,本地处理问答
|
|
|
|
+// addChatRecordByBreakPointsSingle(warningRecord, tXinyiIndustry, normConfig, category);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ warningMoreExceed.setBreakpoint(breakpoint);
|
|
|
|
+ return warningMoreExceed;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
/**
|
|
/**
|
|
* 2025年04月21日16:07:55 化验室的设备故障报警逻辑调整: 触发条件:连续6小时以上数值,发生无数据、数据为0、数据相同 -- 好氧池硝酸盐
|
|
* 2025年04月21日16:07:55 化验室的设备故障报警逻辑调整: 触发条件:连续6小时以上数值,发生无数据、数据为0、数据相同 -- 好氧池硝酸盐
|
|
@@ -6933,6 +6984,7 @@ public class AsyncTask {
|
|
&& val0.compareTo(val1) == 0 && val0.compareTo(val2) == 0 && val0.compareTo(val3) == 0
|
|
&& val0.compareTo(val1) == 0 && val0.compareTo(val2) == 0 && val0.compareTo(val3) == 0
|
|
&& val0.compareTo(val4) == 0 && val0.compareTo(val5) == 0 && val0.compareTo(val6) == 0
|
|
&& val0.compareTo(val4) == 0 && val0.compareTo(val5) == 0 && val0.compareTo(val6) == 0
|
|
&& val0.compareTo(val7) == 0 && val0.compareTo(val8) == 0 && val0.compareTo(val9) == 0
|
|
&& val0.compareTo(val7) == 0 && val0.compareTo(val8) == 0 && val0.compareTo(val9) == 0
|
|
|
|
+ && val0.compareTo(BigDecimal.valueOf(4)) > 0
|
|
)
|
|
)
|
|
return true;
|
|
return true;
|
|
return false;
|
|
return false;
|
|
@@ -6940,6 +6992,38 @@ public class AsyncTask {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ *2025年04月21日16:17:57 判断二沉池正磷酸盐是否存在设备故障
|
|
|
|
+ * 触发条件:连续6小时以上数值,发生无数据、数据为0、数据相同
|
|
|
|
+ * 判断当前时间和上个时间段的值是否存在断点
|
|
|
|
+ * @param category
|
|
|
|
+ * @param tXinyiRobotList
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private boolean existsRobotDeviceErrorTp(String category, List<TXinyiRobot> tXinyiRobotList) {
|
|
|
|
+ BigDecimal tpRccJqr0 = tXinyiRobotList.get(INDEX_0).getTpRccJqr();
|
|
|
|
+ BigDecimal tpRccJqr1 = tXinyiRobotList.get(INDEX_1).getTpRccJqr();
|
|
|
|
+ BigDecimal tpRccJqr2 = tXinyiRobotList.get(INDEX_2).getTpRccJqr();
|
|
|
|
+ BigDecimal tpRccJqr3 = tXinyiRobotList.get(INDEX_3).getTpRccJqr();
|
|
|
|
+ BigDecimal tpRccJqr4 = tXinyiRobotList.get(INDEX_4).getTpRccJqr();
|
|
|
|
+ BigDecimal tpRccJqr5 = tXinyiRobotList.get(INDEX_5).getTpRccJqr();
|
|
|
|
+ if ((Objects.isNull(tpRccJqr0) || BigDecimal.ZERO.compareTo(tpRccJqr0) == 0)
|
|
|
|
+ && (Objects.isNull(tpRccJqr1) || BigDecimal.ZERO.compareTo(tpRccJqr1) == 0)
|
|
|
|
+ && (Objects.isNull(tpRccJqr2) || BigDecimal.ZERO.compareTo(tpRccJqr2) == 0)
|
|
|
|
+ && (Objects.isNull(tpRccJqr3) || BigDecimal.ZERO.compareTo(tpRccJqr3) == 0)
|
|
|
|
+ && (Objects.isNull(tpRccJqr4) || BigDecimal.ZERO.compareTo(tpRccJqr4) == 0)
|
|
|
|
+ && (Objects.isNull(tpRccJqr5) || BigDecimal.ZERO.compareTo(tpRccJqr5) == 0))
|
|
|
|
+ return true;
|
|
|
|
+ if(!Objects.isNull(tpRccJqr0) && !Objects.isNull(tpRccJqr1) && !Objects.isNull(tpRccJqr2)
|
|
|
|
+ && !Objects.isNull(tpRccJqr3) && !Objects.isNull(tpRccJqr4) && !Objects.isNull(tpRccJqr5)
|
|
|
|
+ && tpRccJqr0.compareTo(tpRccJqr1) == 0 && tpRccJqr0.compareTo(tpRccJqr2) == 0 && tpRccJqr0.compareTo(tpRccJqr3) == 0
|
|
|
|
+ && tpRccJqr0.compareTo(tpRccJqr4) == 0 && tpRccJqr0.compareTo(tpRccJqr5) == 0 && tpRccJqr0.compareTo(BigDecimal.valueOf(0.5)) > 0)
|
|
|
|
+ return true;
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
/**
|
|
/**
|
|
*2025年04月21日16:17:57 判断好氧硝酸盐是否存在设备故障
|
|
*2025年04月21日16:17:57 判断好氧硝酸盐是否存在设备故障
|
|
* 触发条件:连续6小时以上数值,发生无数据、数据为0、数据相同
|
|
* 触发条件:连续6小时以上数值,发生无数据、数据为0、数据相同
|
|
@@ -6966,7 +7050,7 @@ public class AsyncTask {
|
|
if(!Objects.isNull(no3Hlj1Jqr0) && !Objects.isNull(no3Hlj1Jqr1) && !Objects.isNull(no3Hlj1Jqr2)
|
|
if(!Objects.isNull(no3Hlj1Jqr0) && !Objects.isNull(no3Hlj1Jqr1) && !Objects.isNull(no3Hlj1Jqr2)
|
|
&& !Objects.isNull(no3Hlj1Jqr3) && !Objects.isNull(no3Hlj1Jqr4) && !Objects.isNull(no3Hlj1Jqr5)
|
|
&& !Objects.isNull(no3Hlj1Jqr3) && !Objects.isNull(no3Hlj1Jqr4) && !Objects.isNull(no3Hlj1Jqr5)
|
|
&& no3Hlj1Jqr0.compareTo(no3Hlj1Jqr1) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr2) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr3) == 0
|
|
&& no3Hlj1Jqr0.compareTo(no3Hlj1Jqr1) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr2) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr3) == 0
|
|
- && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr4) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr5) == 0)
|
|
|
|
|
|
+ && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr4) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr5) == 0 && no3Hlj1Jqr0.compareTo(BigDecimal.valueOf(14)) > 0)
|
|
return true;
|
|
return true;
|
|
}else if(BusinessEnum.WarningCategoryEnum.ROBOT_XSY_2.getCode().equals(category)){
|
|
}else if(BusinessEnum.WarningCategoryEnum.ROBOT_XSY_2.getCode().equals(category)){
|
|
BigDecimal no3Hlj1Jqr0 = tXinyiRobotList.get(INDEX_0).getNo3Hlj2Jqr();
|
|
BigDecimal no3Hlj1Jqr0 = tXinyiRobotList.get(INDEX_0).getNo3Hlj2Jqr();
|
|
@@ -6985,7 +7069,7 @@ public class AsyncTask {
|
|
if(!Objects.isNull(no3Hlj1Jqr0) && !Objects.isNull(no3Hlj1Jqr1) && !Objects.isNull(no3Hlj1Jqr2)
|
|
if(!Objects.isNull(no3Hlj1Jqr0) && !Objects.isNull(no3Hlj1Jqr1) && !Objects.isNull(no3Hlj1Jqr2)
|
|
&& !Objects.isNull(no3Hlj1Jqr3) && !Objects.isNull(no3Hlj1Jqr4) && !Objects.isNull(no3Hlj1Jqr5)
|
|
&& !Objects.isNull(no3Hlj1Jqr3) && !Objects.isNull(no3Hlj1Jqr4) && !Objects.isNull(no3Hlj1Jqr5)
|
|
&& no3Hlj1Jqr0.compareTo(no3Hlj1Jqr1) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr2) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr3) == 0
|
|
&& no3Hlj1Jqr0.compareTo(no3Hlj1Jqr1) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr2) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr3) == 0
|
|
- && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr4) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr5) == 0)
|
|
|
|
|
|
+ && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr4) == 0 && no3Hlj1Jqr0.compareTo(no3Hlj1Jqr5) == 0 && no3Hlj1Jqr0.compareTo(BigDecimal.valueOf(14)) > 0)
|
|
return true;
|
|
return true;
|
|
}else{
|
|
}else{
|
|
log.error("化验室暂时还不支持的报警类型~~~~");
|
|
log.error("化验室暂时还不支持的报警类型~~~~");
|
|
@@ -7885,6 +7969,7 @@ public class AsyncTask {
|
|
boolean xsy1Execute = true;
|
|
boolean xsy1Execute = true;
|
|
boolean xsy2Execute = true;
|
|
boolean xsy2Execute = true;
|
|
boolean csADExecute = true;
|
|
boolean csADExecute = true;
|
|
|
|
+ boolean csTpExecute = true;
|
|
|
|
|
|
//#1好氧硝酸盐
|
|
//#1好氧硝酸盐
|
|
BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
|
|
BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
|
|
@@ -7956,7 +8041,10 @@ public class AsyncTask {
|
|
//氨氮的标准值和管控值
|
|
//氨氮的标准值和管控值
|
|
BigDecimal csadBzz = normConfig.getCsadBzz();
|
|
BigDecimal csadBzz = normConfig.getCsadBzz();
|
|
BigDecimal csadGkz = normConfig.getCsadGkz();
|
|
BigDecimal csadGkz = normConfig.getCsadGkz();
|
|
-
|
|
|
|
|
|
+ //总磷的标准值和管控值
|
|
|
|
+ BigDecimal cszlBzz = normConfig.getCszlBzz();
|
|
|
|
+ BigDecimal cszlGkz = normConfig.getCszlGkz();
|
|
|
|
+ //进水量和进水流量设计值
|
|
BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
|
|
BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
|
|
BigDecimal jsslSjz = normConfig.getJsslSjz();
|
|
BigDecimal jsslSjz = normConfig.getJsslSjz();
|
|
|
|
|
|
@@ -7979,6 +8067,17 @@ public class AsyncTask {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+ //二沉池正磷酸盐设备故障报警
|
|
|
|
+ BigDecimal tpRccJqr = tXinyiRobot.getTpRccJqr();
|
|
|
|
+ if(!Objects.isNull(tpRccJqr)){
|
|
|
|
+ warningMoreExceed = handleXinYiWarningRecordRobotMoreTp(cszlBzz, tpRccJqr, cszlGkz, ROBOT_ECCZLSY.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()), tXinyiRobots6Lst);
|
|
|
|
+ if(warningMoreExceed.isBreakpoint()){
|
|
|
|
+ breakpointCount++;
|
|
|
|
+ breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
warningMoreExceed = handleXinYiWarningRecordRobotMoreAD(csadBzz, tenVals, csadGkz, ROBOT_CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
|
|
warningMoreExceed = handleXinYiWarningRecordRobotMoreAD(csadBzz, tenVals, csadGkz, ROBOT_CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
|
|
if(warningMoreExceed.isBreakpoint()){
|
|
if(warningMoreExceed.isBreakpoint()){
|
|
breakpointCount++;
|
|
breakpointCount++;
|
|
@@ -7989,7 +8088,8 @@ public class AsyncTask {
|
|
String anDan10Str = getBigDecimalList(tenVals);
|
|
String anDan10Str = getBigDecimalList(tenVals);
|
|
String hyXsy1Str = getBigDecimalList(tXinyiRobots6Lst.stream().map(TXinyiRobot::getNo3Hlj1Jqr).collect(Collectors.toList()));
|
|
String hyXsy1Str = getBigDecimalList(tXinyiRobots6Lst.stream().map(TXinyiRobot::getNo3Hlj1Jqr).collect(Collectors.toList()));
|
|
String hyXsy2Str = getBigDecimalList(tXinyiRobots6Lst.stream().map(TXinyiRobot::getNo3Hlj2Jqr).collect(Collectors.toList()));
|
|
String hyXsy2Str = getBigDecimalList(tXinyiRobots6Lst.stream().map(TXinyiRobot::getNo3Hlj2Jqr).collect(Collectors.toList()));
|
|
-
|
|
|
|
|
|
+ String tpStr = getBigDecimalList(tXinyiRobots6Lst.stream().map(TXinyiRobot::getTpRccJqr).collect(Collectors.toList()));
|
|
|
|
+
|
|
Date nowDate = DateUtils.getNowDate();
|
|
Date nowDate = DateUtils.getNowDate();
|
|
//下面是处理多个指标的 【断点】报警
|
|
//下面是处理多个指标的 【断点】报警
|
|
//断点
|
|
//断点
|
|
@@ -8011,7 +8111,7 @@ public class AsyncTask {
|
|
closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode());
|
|
closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode());
|
|
//触发报警 并且模拟大模型返回决策问答数据
|
|
//触发报警 并且模拟大模型返回决策问答数据
|
|
//最终传递过去的N条数据
|
|
//最终传递过去的N条数据
|
|
- String finalStr = getStrByCategory(category, anDan10Str, hyXsy1Str, hyXsy2Str);
|
|
|
|
|
|
+ String finalStr = getStrByCategory(category, anDan10Str, hyXsy1Str, hyXsy2Str, tpStr);
|
|
// log.info("处理本地决策,最终要最后拼接的n条数据为{}", finalStr);
|
|
// log.info("处理本地决策,最终要最后拼接的n条数据为{}", finalStr);
|
|
if(CollectionUtils.isEmpty(tXinyiBreakPointSingleWarningRecords)){
|
|
if(CollectionUtils.isEmpty(tXinyiBreakPointSingleWarningRecords)){
|
|
//插入该类型报警
|
|
//插入该类型报警
|
|
@@ -8040,6 +8140,8 @@ public class AsyncTask {
|
|
xsy2Execute = false;
|
|
xsy2Execute = false;
|
|
if(ROBOT_CS_AD.getCode().equals(category))
|
|
if(ROBOT_CS_AD.getCode().equals(category))
|
|
csADExecute = false;
|
|
csADExecute = false;
|
|
|
|
+ if(ROBOT_ECCZLSY.getCode().equals(category))
|
|
|
|
+ csTpExecute = false;
|
|
//2025年02月28日15:18:30 即使多指标断点,也是按具体分类报警 关闭多个报警
|
|
//2025年02月28日15:18:30 即使多指标断点,也是按具体分类报警 关闭多个报警
|
|
if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
|
|
if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
|
|
for (TXinyiWarningRecord tXinyiWarningRecord : tXinyiWarningRecords) {
|
|
for (TXinyiWarningRecord tXinyiWarningRecord : tXinyiWarningRecords) {
|
|
@@ -8060,6 +8162,8 @@ public class AsyncTask {
|
|
xsy2Execute = false;
|
|
xsy2Execute = false;
|
|
if(ROBOT_CS_AD.getCode().equals(category))
|
|
if(ROBOT_CS_AD.getCode().equals(category))
|
|
csADExecute = false;
|
|
csADExecute = false;
|
|
|
|
+ if(ROBOT_ECCZLSY.getCode().equals(category))
|
|
|
|
+ csTpExecute = false;
|
|
//关闭该指标的其他类型的报警
|
|
//关闭该指标的其他类型的报警
|
|
closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
|
|
closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
|
|
//原来集合里存放的都是单指标异常 下面2个值需要重新赋值
|
|
//原来集合里存放的都是单指标异常 下面2个值需要重新赋值
|
|
@@ -8067,7 +8171,7 @@ public class AsyncTask {
|
|
tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
|
|
tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
|
|
this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
|
|
this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
|
|
//最终传递过去的N条数据
|
|
//最终传递过去的N条数据
|
|
- String finalStr = getStrByCategory(category, anDan10Str, hyXsy1Str, hyXsy2Str);
|
|
|
|
|
|
+ String finalStr = getStrByCategory(category, anDan10Str, hyXsy1Str, hyXsy2Str, tpStr);
|
|
//同时处理决策 不用调用大模型,本地处理问答
|
|
//同时处理决策 不用调用大模型,本地处理问答
|
|
robotDeviceErrorMore(tXinyiWarningRecord, tXinyiIndustry, normConfig, category, finalStr);
|
|
robotDeviceErrorMore(tXinyiWarningRecord, tXinyiIndustry, normConfig, category, finalStr);
|
|
}
|
|
}
|
|
@@ -8088,6 +8192,8 @@ public class AsyncTask {
|
|
xsy2Execute = false;
|
|
xsy2Execute = false;
|
|
if(ROBOT_CS_AD.getCode().equals(category))
|
|
if(ROBOT_CS_AD.getCode().equals(category))
|
|
csADExecute = false;
|
|
csADExecute = false;
|
|
|
|
+ if(ROBOT_ECCZLSY.getCode().equals(category))
|
|
|
|
+ csTpExecute = false;
|
|
//关闭该指标的其他类型的报警
|
|
//关闭该指标的其他类型的报警
|
|
closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
|
|
closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
|
|
//新插入
|
|
//新插入
|
|
@@ -8096,7 +8202,7 @@ public class AsyncTask {
|
|
tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
|
|
tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
|
|
this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
|
|
this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
|
|
//最终传递过去的N条数据
|
|
//最终传递过去的N条数据
|
|
- String finalStr = getStrByCategory(category, anDan10Str, hyXsy1Str, hyXsy2Str);
|
|
|
|
|
|
+ String finalStr = getStrByCategory(category, anDan10Str, hyXsy1Str, hyXsy2Str, tpStr);
|
|
//同时处理决策 不用调用大模型,本地处理问答
|
|
//同时处理决策 不用调用大模型,本地处理问答
|
|
robotDeviceErrorMore(tXinyiWarningRecord, tXinyiIndustry, normConfig, category, finalStr);
|
|
robotDeviceErrorMore(tXinyiWarningRecord, tXinyiIndustry, normConfig, category, finalStr);
|
|
}
|
|
}
|
|
@@ -8131,7 +8237,7 @@ public class AsyncTask {
|
|
//更新数据库
|
|
//更新数据库
|
|
this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(tXinyiWarningRecord);
|
|
this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(tXinyiWarningRecord);
|
|
//最终传递过去的N条数据
|
|
//最终传递过去的N条数据
|
|
- String finalStr = getStrByCategory(category, anDan10Str, hyXsy1Str, hyXsy2Str);
|
|
|
|
|
|
+ String finalStr = getStrByCategory(category, anDan10Str, hyXsy1Str, hyXsy2Str, tpStr);
|
|
//继续调用决策【本地模拟的决策】
|
|
//继续调用决策【本地模拟的决策】
|
|
robotDeviceErrorMore(tXinyiWarningRecord, tXinyiIndustry, normConfig, category, finalStr);
|
|
robotDeviceErrorMore(tXinyiWarningRecord, tXinyiIndustry, normConfig, category, finalStr);
|
|
}
|
|
}
|
|
@@ -8158,21 +8264,28 @@ public class AsyncTask {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
//出水氨氮
|
|
//出水氨氮
|
|
if(!Objects.isNull(csadBzz) && csADExecute){
|
|
if(!Objects.isNull(csadBzz) && csADExecute){
|
|
handleXinYiWarningsRobotOriginCsAd(csadBzz, tenVals.get(INDEX_0), csadGkz, ROBOT_CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()), tXinyiRobots, tenVals);
|
|
handleXinYiWarningsRobotOriginCsAd(csadBzz, tenVals.get(INDEX_0), csadGkz, ROBOT_CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()), tXinyiRobots, tenVals);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+ //二沉池正磷酸盐
|
|
|
|
+ if(!Objects.isNull(cszlBzz) && csTpExecute){
|
|
|
|
+ handleXinYiWarningsRobotOriginCsTp(cszlBzz, tenVals.get(INDEX_0), cszlGkz, ROBOT_ECCZLSY.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()), tXinyiRobots);
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
- private String getStrByCategory(String category, String anDan10Str, String hyXsy1Str, String hyXsy2Str) {
|
|
|
|
|
|
+ private String getStrByCategory(String category, String anDan10Str, String hyXsy1Str, String hyXsy2Str, String tpStr) {
|
|
if(ROBOT_CS_AD.getCode().equals(category))
|
|
if(ROBOT_CS_AD.getCode().equals(category))
|
|
return anDan10Str;
|
|
return anDan10Str;
|
|
else if(ROBOT_XSY_1.getCode().equals(category))
|
|
else if(ROBOT_XSY_1.getCode().equals(category))
|
|
return hyXsy1Str;
|
|
return hyXsy1Str;
|
|
else if(ROBOT_XSY_2.getCode().equals(category))
|
|
else if(ROBOT_XSY_2.getCode().equals(category))
|
|
return hyXsy2Str;
|
|
return hyXsy2Str;
|
|
|
|
+ else if(ROBOT_ECCZLSY.getCode().equals(category))
|
|
|
|
+ return tpStr;
|
|
else{
|
|
else{
|
|
log.info("获取化验室报警,通过分类处理N条展示数据的时候,没有匹配到对应的类型");
|
|
log.info("获取化验室报警,通过分类处理N条展示数据的时候,没有匹配到对应的类型");
|
|
return null;
|
|
return null;
|
|
@@ -8557,8 +8670,37 @@ public class AsyncTask {
|
|
// }
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
+
|
|
/**
|
|
/**
|
|
- * 通过输入的值 生成对应类型的报警对象(出水)
|
|
|
|
|
|
+ * 通过输入的值 生成对应类型的报警对象(出水)- 二沉池正磷酸盐
|
|
|
|
+ *
|
|
|
|
+ * @param csBzz
|
|
|
|
+ * @param currentVal
|
|
|
|
+ * @param csGkz
|
|
|
|
+ * @param category
|
|
|
|
+ * @param tXinyiIndustry
|
|
|
|
+ * @param normConfig
|
|
|
|
+ * @param cwrwfhz
|
|
|
|
+ * @param tXinyiRobots
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private void handleXinYiWarningsRobotOriginCsTp(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots) {
|
|
|
|
+
|
|
|
|
+ Date nowDate = DateUtils.getNowDate();
|
|
|
|
+
|
|
|
|
+// //单点突变-异常升高报警
|
|
|
|
+// if (existsYcsgRobots(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate))
|
|
|
|
+// return;
|
|
|
|
+
|
|
|
|
+ //下面是最原始的处理 超标准 超管控报警
|
|
|
|
+ robotCsTpGybz(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 通过输入的值 生成对应类型的报警对象(出水)- 硝酸盐
|
|
*
|
|
*
|
|
* @param csBzz
|
|
* @param csBzz
|
|
* @param currentVal
|
|
* @param currentVal
|
|
@@ -8574,9 +8716,9 @@ public class AsyncTask {
|
|
|
|
|
|
Date nowDate = DateUtils.getNowDate();
|
|
Date nowDate = DateUtils.getNowDate();
|
|
|
|
|
|
- //单点突变-异常升高报警
|
|
|
|
- if (existsYcsgRobots(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate))
|
|
|
|
- return;
|
|
|
|
|
|
+// //单点突变-异常升高报警
|
|
|
|
+// if (existsYcsgRobots(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate))
|
|
|
|
+// return;
|
|
|
|
|
|
//下面是最原始的处理 超标准 超管控报警
|
|
//下面是最原始的处理 超标准 超管控报警
|
|
robotCsXsyGybz(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate);
|
|
robotCsXsyGybz(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate);
|
|
@@ -8584,6 +8726,64 @@ public class AsyncTask {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ *
|
|
|
|
+ * 化验室-出水总磷(二沉池正磷酸盐) 的 超标准工艺报警
|
|
|
|
+ * @param csBzz
|
|
|
|
+ * @param currentVal
|
|
|
|
+ * @param csGkz
|
|
|
|
+ * @param category
|
|
|
|
+ * @param tXinyiIndustry
|
|
|
|
+ * @param normConfig
|
|
|
|
+ * @param cwrwfhz
|
|
|
|
+ * @param tXinyiRobots
|
|
|
|
+ * @param nowDate
|
|
|
|
+ */
|
|
|
|
+ private void robotCsTpGybz(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots, Date nowDate) {
|
|
|
|
+ TXinyiWarningRecord tXinyiWarningRecord = getRobotCsTpWarningBean(csBzz, currentVal, csGkz, category, normConfig, cwrwfhz, tXinyiRobots);
|
|
|
|
+ //判断是否存在要报警的数据
|
|
|
|
+ //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完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);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
/**
|
|
/**
|
|
*
|
|
*
|
|
* 化验室-出水硝酸盐 的 超标准工艺报警
|
|
* 化验室-出水硝酸盐 的 超标准工艺报警
|
|
@@ -8641,6 +8841,56 @@ public class AsyncTask {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 判断化验室的-出水氨氮是否存在报警,如果存在返回报警对象;如果不存在,返回null
|
|
|
|
+ *
|
|
|
|
+ * @param csBzz
|
|
|
|
+ * @param currentVal
|
|
|
|
+ * @param csGkz
|
|
|
|
+ * @param category
|
|
|
|
+ * @param normConfig
|
|
|
|
+ * @param cwrwfhz
|
|
|
|
+ * @param tXinyiRobots
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private TXinyiWarningRecord getRobotCsTpWarningBean(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiRobot> tXinyiRobots) {
|
|
|
|
+ //判断是否存在
|
|
|
|
+ boolean flag1 = true;
|
|
|
|
+ for (TXinyiRobot xinyiRobot : tXinyiRobots) {
|
|
|
|
+ //是否连续6小时超标 正磷酸盐数据 > 0.5 and 连续6小时
|
|
|
|
+ BigDecimal val = xinyiRobot.getTpRccJqr();
|
|
|
|
+ if (!Objects.isNull(val) && val.compareTo(csBzz) <= 0) {
|
|
|
|
+ flag1 = false;
|
|
|
|
+ break;//只要出现一个不超标的就不算超标
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //存放则返回对象,不存在,则返回null 2个条件都不满足报警,返回空对象
|
|
|
|
+ if(!flag1)
|
|
|
|
+ return null;
|
|
|
|
+ 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());
|
|
|
|
+ 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;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 判断化验室的-出水氨氮是否存在报警,如果存在返回报警对象;如果不存在,返回null
|
|
* 判断化验室的-出水氨氮是否存在报警,如果存在返回报警对象;如果不存在,返回null
|
|
*
|
|
*
|
|
@@ -8726,7 +8976,7 @@ public class AsyncTask {
|
|
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 通过输入的值 生成对应类型的报警对象(出水)
|
|
|
|
|
|
+ * 通过输入的值 生成对应类型的报警对象(出水)- 出水氨氮
|
|
*
|
|
*
|
|
* @param csBzz
|
|
* @param csBzz
|
|
* @param currentVal
|
|
* @param currentVal
|
|
@@ -8743,9 +8993,9 @@ public class AsyncTask {
|
|
|
|
|
|
Date nowDate = DateUtils.getNowDate();
|
|
Date nowDate = DateUtils.getNowDate();
|
|
|
|
|
|
- //单点突变-异常升高报警
|
|
|
|
- if (existsYcsgRobots(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate))
|
|
|
|
- return;
|
|
|
|
|
|
+// //单点突变-异常升高报警
|
|
|
|
+// if (existsYcsgRobots(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiRobots, nowDate))
|
|
|
|
+// return;
|
|
|
|
|
|
//下面是最原始的处理 超标准 超管控报警
|
|
//下面是最原始的处理 超标准 超管控报警
|
|
robotCsAdGybz(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tenVals, nowDate);
|
|
robotCsAdGybz(csBzz, currentVal, csGkz, category, tXinyiIndustry, normConfig, cwrwfhz, tenVals, nowDate);
|