|
@@ -4048,22 +4048,20 @@ public class AsyncTask {
|
|
|
|
|
|
/**
|
|
|
* 2025年04月21日16:07:55 化验室的设备故障报警逻辑调整: 触发条件:连续6小时以上数值,发生无数据、数据为0、数据相同 -- 好氧池硝酸盐
|
|
|
+ * 2025年04月22日11:19:34 取最近的6条数据从上层传递过来
|
|
|
* [化验室]通过输入的值 生成对应类型的报警对象(进水)
|
|
|
* 化验室只有断点报警,没有连续不变报警(因为化验室数据本身就是4-8个小时一轮 是重复的)
|
|
|
+ *
|
|
|
* @param currentVal
|
|
|
* @param category
|
|
|
+ * @param tXinyiRobots
|
|
|
* @return
|
|
|
*/
|
|
|
- private WarningMoreExceed handleXinYiWarningRecordRobotMoreXsy(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz) {
|
|
|
+ private WarningMoreExceed handleXinYiWarningRecordRobotMoreXsy(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();
|
|
|
- List<TXinyiRobot> tXinyiRobots = this.xinyiRobotMapper.selectNRobot(INT_6);
|
|
|
- if(CollectionUtils.isEmpty(tXinyiRobots) || tXinyiRobots.size() < INT_6){
|
|
|
- log.error("处理连续检测报警时,获取最近的6条化验数据失败~~~~~~~");
|
|
|
- return new WarningMoreExceed();
|
|
|
- }
|
|
|
//2025年02月21日10:32:42 在这里处理额外的其他报警项
|
|
|
//该类型的断点历史报警
|
|
|
TXinyiWarningRecord warningRecord = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode()).status(0).build();
|
|
@@ -4726,6 +4724,20 @@ public class AsyncTask {
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
+ private String getBigDecimalList(List<BigDecimal> list) {
|
|
|
+ int size = list.size();
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
+ if(i < size - 1)
|
|
|
+ sb.append(DecimalUtils.getAbsAndScale(list.get(i), INT_2)).append("mg/L、");
|
|
|
+ else
|
|
|
+ sb.append("mg/L");
|
|
|
+ }
|
|
|
+ return sb.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 通过输入的值 生成对应类型的报警对象(进水)
|
|
|
*
|
|
@@ -6420,6 +6432,38 @@ public class AsyncTask {
|
|
|
this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 化验室报警:设备故障-本地决策-新 需要展示多个值
|
|
|
+ * @param warningRecord
|
|
|
+ * @param tXinyiIndustry
|
|
|
+ * @param normConfig
|
|
|
+ * @param category
|
|
|
+ */
|
|
|
+ private void addChatRecordByBreakPointsSingleNew(TXinyiWarningRecord warningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, String category) {
|
|
|
+ ChatReq chatReq = new ChatReq();
|
|
|
+ //保存聊天记录
|
|
|
+ //将问答更新到数据库中
|
|
|
+ chatReq.setSessionId(IdUtils.simpleUUID());
|
|
|
+ chatReq.setType(1);//0问答 1决策 2本地 3仿真预测
|
|
|
+ chatReq.setModule(3);
|
|
|
+ /*String userId = SecurityUtils.getUserId().toString();
|
|
|
+ String username = SecurityUtils.getUsername();*/
|
|
|
+ chatReq.setUserId(WARNING_DEFAULT_CREATE);
|
|
|
+ String showVal = this.buildShowValue(warningRecord, tXinyiIndustry, normConfig, DateUtils.getNowDate());
|
|
|
+ chatReq.setShowVal(showVal);//前端展示的数据和提问的数据不一致
|
|
|
+ chatReq.setQuestion(BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getMsg());//本地问题
|
|
|
+// chatReq.setAnswer(SINGLE_BREAKPOINT_ANSWER_PREFIX + category + SINGLE_BREAKPOINT_ANSWER_SUFFIX);
|
|
|
+ chatReq.setAnswer(ROBOT_SJYC_ANSWER_REPLACE.replaceAll("@@@0", category).replaceAll("@@@1", xxx));
|
|
|
+ chatReq.setWarningId(String.valueOf(warningRecord.getId()));
|
|
|
+ chatReq.setCounts(1);//问答次数
|
|
|
+
|
|
|
+ chatReq.setCreateBy(WARNING_DEFAULT_CREATE);
|
|
|
+ chatReq.setCreateTime(DateUtils.getNowDate());
|
|
|
+ this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
private void addChatRecordByBreakPointsSingle(TXinyiWarningRecord warningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, String category) {
|
|
|
ChatReq chatReq = new ChatReq();
|
|
|
//保存聊天记录
|
|
@@ -6890,12 +6934,64 @@ public class AsyncTask {
|
|
|
BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
|
|
|
//#2好氧硝酸盐
|
|
|
BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
|
|
|
- //1#缺氧出-硝酸盐
|
|
|
- BigDecimal no3Qyc1Jqr = tXinyiRobot.getNo3Qyc1Jqr();
|
|
|
- BigDecimal nh31Jqr = tXinyiRobot.getNh31Jqr();
|
|
|
- //2#缺氧出-硝酸盐
|
|
|
- BigDecimal no3Qyc2Jqr = tXinyiRobot.getNo3Qyc2Jqr();
|
|
|
- BigDecimal nh32Jqr = tXinyiRobot.getNh32Jqr();
|
|
|
+// //1#缺氧出-硝酸盐
|
|
|
+// BigDecimal no3Qyc1Jqr = tXinyiRobot.getNo3Qyc1Jqr();
|
|
|
+// BigDecimal nh31Jqr = tXinyiRobot.getNh31Jqr();
|
|
|
+// //2#缺氧出-硝酸盐
|
|
|
+// BigDecimal no3Qyc2Jqr = tXinyiRobot.getNo3Qyc2Jqr();
|
|
|
+// BigDecimal nh32Jqr = tXinyiRobot.getNh32Jqr();
|
|
|
+
|
|
|
+ //2025年04月21日17:04:28 逻辑调整,需要取最近的十条数据,计算获取到十个值
|
|
|
+ List<TXinyiRobot> tXinyiRobots = this.xinyiRobotMapper.selectNRobot(INT_10);
|
|
|
+ if(CollectionUtils.isEmpty(tXinyiRobots) || tXinyiRobots.size() < INT_10){
|
|
|
+ log.error("化验室报警-新逻辑获取最近的10条化验室数据失败,无法处理报警,退出");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<BigDecimal> tenVals = new ArrayList<>(10);
|
|
|
+
|
|
|
+ //取前6个,硝酸盐是6个
|
|
|
+ List<TXinyiRobot> tXinyiRobots6Lst = new ArrayList<>(6);
|
|
|
+
|
|
|
+ for (int i = 0; i < tXinyiRobots.size(); i++) {
|
|
|
+ TXinyiRobot xinyiRobot = tXinyiRobots.get(i);
|
|
|
+ //判断 增加容错
|
|
|
+ BigDecimal no3Hlj1JqrTemp = xinyiRobot.getNo3Hlj1Jqr();
|
|
|
+ //#2好氧硝酸盐
|
|
|
+ BigDecimal no3Hlj2JqrTemp = xinyiRobot.getNo3Hlj2Jqr();
|
|
|
+ //1#缺氧出-硝酸盐
|
|
|
+ BigDecimal no3Qyc1JqrTemp = xinyiRobot.getNo3Qyc1Jqr();
|
|
|
+ BigDecimal nh31JqrTemp = xinyiRobot.getNh31Jqr();
|
|
|
+ //2#缺氧出-硝酸盐
|
|
|
+ BigDecimal no3Qyc2JqrTemp = xinyiRobot.getNo3Qyc2Jqr();
|
|
|
+ BigDecimal nh32JqrTemp = xinyiRobot.getNh32Jqr();
|
|
|
+ if (Objects.isNull(no3Qyc1JqrTemp))
|
|
|
+ no3Qyc1JqrTemp = BigDecimal.ZERO;
|
|
|
+ if (Objects.isNull(nh31JqrTemp))
|
|
|
+ nh31JqrTemp = BigDecimal.ZERO;
|
|
|
+ if (Objects.isNull(no3Hlj1JqrTemp))
|
|
|
+ no3Hlj1JqrTemp = BigDecimal.ZERO;
|
|
|
+ BigDecimal anDan1 = no3Qyc1JqrTemp.add(nh31JqrTemp).subtract(no3Hlj1JqrTemp);
|
|
|
+
|
|
|
+ //判断 增加容错
|
|
|
+ if (Objects.isNull(no3Qyc2JqrTemp))
|
|
|
+ no3Qyc2JqrTemp = BigDecimal.ZERO;
|
|
|
+ if (Objects.isNull(nh32JqrTemp))
|
|
|
+ nh32JqrTemp = BigDecimal.ZERO;
|
|
|
+ if (Objects.isNull(no3Hlj2JqrTemp))
|
|
|
+ no3Hlj2JqrTemp = BigDecimal.ZERO;
|
|
|
+ BigDecimal anDan2 = no3Qyc2JqrTemp.add(nh32JqrTemp).subtract(no3Hlj2JqrTemp);
|
|
|
+ BigDecimal divide = anDan1.add(anDan2).divide(DECIMAL_2, INT_2, RoundingMode.HALF_UP);
|
|
|
+ //2025年04月21日17:22:30 如果计算结果小于0,当0处理
|
|
|
+ if (divide.compareTo(BigDecimal.ZERO) < 0)
|
|
|
+ divide = BigDecimal.ZERO;
|
|
|
+ tenVals.add(divide);
|
|
|
+ //额外保存最近的6条数据
|
|
|
+ if(i < 6){
|
|
|
+ tXinyiRobots6Lst.add(xinyiRobot);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
//总氮的标准值和管控值
|
|
|
BigDecimal cszzBzz = normConfig.getCszzBzz();
|
|
@@ -6909,7 +7005,7 @@ public class AsyncTask {
|
|
|
|
|
|
WarningMoreExceed warningMoreExceed = null;
|
|
|
if(!Objects.isNull(no3Hlj1Jqr)){
|
|
|
- warningMoreExceed = handleXinYiWarningRecordRobotMoreXsy(cszzBzz, no3Hlj1Jqr, cszzGkz, ROBOT_XSY_1.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
|
|
|
+ warningMoreExceed = handleXinYiWarningRecordRobotMoreXsy(cszzBzz, no3Hlj1Jqr, cszzGkz, ROBOT_XSY_1.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()), tXinyiRobots6Lst);
|
|
|
if(warningMoreExceed.isBreakpoint()){
|
|
|
breakpointCount++;
|
|
|
breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
|
|
@@ -6918,7 +7014,7 @@ public class AsyncTask {
|
|
|
|
|
|
|
|
|
if(!Objects.isNull(no3Hlj2Jqr)){
|
|
|
- warningMoreExceed = handleXinYiWarningRecordRobotMoreXsy(cszzBzz, no3Hlj2Jqr, cszzGkz, ROBOT_XSY_2.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
|
|
|
+ warningMoreExceed = handleXinYiWarningRecordRobotMoreXsy(cszzBzz, no3Hlj2Jqr, cszzGkz, ROBOT_XSY_2.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()), tXinyiRobots6Lst);
|
|
|
if(warningMoreExceed.isBreakpoint()){
|
|
|
breakpointCount++;
|
|
|
breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
|
|
@@ -6926,52 +7022,14 @@ public class AsyncTask {
|
|
|
}
|
|
|
|
|
|
|
|
|
- //2025年04月21日17:04:28 逻辑调整,需要取最近的十条数据,计算获取到十个值
|
|
|
- List<BigDecimal> tenVals = new ArrayList<>(10);
|
|
|
- List<TXinyiRobot> tXinyiRobots = this.xinyiRobotMapper.selectNRobot(INT_10);
|
|
|
- if(!CollectionUtils.isEmpty(tXinyiRobots) && tXinyiRobots.size() == INT_10){
|
|
|
- for (TXinyiRobot xinyiRobot : tXinyiRobots) {
|
|
|
- //判断 增加容错
|
|
|
- BigDecimal no3Hlj1JqrTemp = xinyiRobot.getNo3Hlj1Jqr();
|
|
|
- //#2好氧硝酸盐
|
|
|
- BigDecimal no3Hlj2JqrTemp = xinyiRobot.getNo3Hlj2Jqr();
|
|
|
- //1#缺氧出-硝酸盐
|
|
|
- BigDecimal no3Qyc1JqrTemp = xinyiRobot.getNo3Qyc1Jqr();
|
|
|
- BigDecimal nh31JqrTemp = xinyiRobot.getNh31Jqr();
|
|
|
- //2#缺氧出-硝酸盐
|
|
|
- BigDecimal no3Qyc2JqrTemp = xinyiRobot.getNo3Qyc2Jqr();
|
|
|
- BigDecimal nh32JqrTemp = xinyiRobot.getNh32Jqr();
|
|
|
- if(Objects.isNull(no3Qyc1JqrTemp))
|
|
|
- no3Qyc1JqrTemp = BigDecimal.ZERO;
|
|
|
- if(Objects.isNull(nh31JqrTemp))
|
|
|
- nh31JqrTemp = BigDecimal.ZERO;
|
|
|
- if(Objects.isNull(no3Hlj1JqrTemp))
|
|
|
- no3Hlj1JqrTemp = BigDecimal.ZERO;
|
|
|
- BigDecimal anDan1 = no3Qyc1JqrTemp.add(nh31JqrTemp).subtract(no3Hlj1JqrTemp);
|
|
|
-
|
|
|
- //判断 增加容错
|
|
|
- if(Objects.isNull(no3Qyc2JqrTemp))
|
|
|
- no3Qyc2JqrTemp = BigDecimal.ZERO;
|
|
|
- if(Objects.isNull(nh32JqrTemp))
|
|
|
- nh32JqrTemp = BigDecimal.ZERO;
|
|
|
- if(Objects.isNull(no3Hlj2JqrTemp))
|
|
|
- no3Hlj2JqrTemp = BigDecimal.ZERO;
|
|
|
- BigDecimal anDan2 = no3Qyc2JqrTemp.add(nh32JqrTemp).subtract(no3Hlj2JqrTemp);
|
|
|
- BigDecimal divide = anDan1.add(anDan2).divide(DECIMAL_2, INT_2, RoundingMode.HALF_UP);
|
|
|
- //2025年04月21日17:22:30 如果计算结果小于0,当0处理
|
|
|
- if(divide.compareTo(BigDecimal.ZERO) < 0)
|
|
|
- divide = BigDecimal.ZERO;
|
|
|
- tenVals.add(divide);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
warningMoreExceed = handleXinYiWarningRecordRobotMoreAD(csadBzz, tenVals, csadGkz, ROBOT_CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
|
|
|
if(warningMoreExceed.isBreakpoint()){
|
|
|
breakpointCount++;
|
|
|
breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
|
|
|
}
|
|
|
|
|
|
+ String anDan10Str = getBigDecimalList(tenVals);
|
|
|
+
|
|
|
Date nowDate = DateUtils.getNowDate();
|
|
|
//下面是处理多个指标的 【断点】报警
|
|
|
//断点
|
|
@@ -6996,7 +7054,7 @@ public class AsyncTask {
|
|
|
//插入该类型报警
|
|
|
this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordBreakPointOne);
|
|
|
//同时处理决策 不用调用大模型,本地处理问答
|
|
|
- addChatRecordByBreakPointsSingle(warningRecordBreakPointOne, tXinyiIndustry, normConfig, category);
|
|
|
+ addChatRecordByBreakPointsSingleNew(warningRecordBreakPointOne, tXinyiIndustry, normConfig, category);
|
|
|
}else{
|
|
|
log.info("化验室报警的时候,发现存在仪表故障(断点不变单个指标)的报警,并且已经有该类型报警了,不做任何处理");
|
|
|
//2025年03月06日10:52:57 逻辑调整:更新一直报警的那条记录的显示值
|
|
@@ -7010,7 +7068,7 @@ public class AsyncTask {
|
|
|
//更新数据库
|
|
|
this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
|
|
|
//继续调用决策【本地模拟的决策】
|
|
|
- addChatRecordByBreakPointsSingle(xinyiWarningRecord, tXinyiIndustry, normConfig, category);
|
|
|
+ addChatRecordByBreakPointsSingleNew(xinyiWarningRecord, tXinyiIndustry, normConfig, category);
|
|
|
}
|
|
|
//如果出现单指标报警 标识后续同指标是否可以继续报警
|
|
|
if(ROBOT_XSY_1.getCode().equals(category))
|