|
@@ -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;
|
|
|
+ }
|
|
|
|
|
|
|
|
|
//最原始的标准值和管控制报警
|