|
@@ -6661,7 +6661,262 @@ public class AsyncTask {
|
|
|
}
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
+ * 2025年04月18日15:53:45 由于报警逻辑和以前几乎完全不一样在,所以在保留原有的基础上,新增了该方法。
|
|
|
+ * 机器人化验室报警逻辑处理
|
|
|
+ * @param tXinyiRobot
|
|
|
+ * @param normConfig
|
|
|
+ * @param tXinyiIndustry
|
|
|
+ */
|
|
|
+ private void robotWarningDetailNew(TXinyiRobot tXinyiRobot, TXinyiNormConfig normConfig, TXinyiIndustry tXinyiIndustry) {
|
|
|
+
|
|
|
+ //先查看数据是否有断点--单指标 断点--多指标
|
|
|
+ int breakpointCount = 0;
|
|
|
+ List<TXinyiWarningRecord> breakPointList = new ArrayList<>();//断点集合
|
|
|
+
|
|
|
+ //判断单指标断点,后续同指标的其他报警是否可以继续执行
|
|
|
+ boolean xsy1Execute = true;
|
|
|
+ boolean xsy2Execute = true;
|
|
|
+ boolean csADExecute = true;
|
|
|
+
|
|
|
+ //#1好氧硝酸盐
|
|
|
+ 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();
|
|
|
+
|
|
|
+ //总氮的标准值和管控值
|
|
|
+ BigDecimal cszzBzz = normConfig.getCszzBzz();
|
|
|
+ BigDecimal cszzGkz = normConfig.getCszzGkz();
|
|
|
+ //氨氮的标准值和管控值
|
|
|
+ BigDecimal csadBzz = normConfig.getCsadBzz();
|
|
|
+ BigDecimal csadGkz = normConfig.getCsadGkz();
|
|
|
+
|
|
|
+ BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
|
|
|
+ BigDecimal jsslSjz = normConfig.getJsslSjz();
|
|
|
+
|
|
|
+ WarningMoreExceed warningMoreExceed = null;
|
|
|
+ if(!Objects.isNull(no3Hlj1Jqr)){
|
|
|
+ warningMoreExceed = handleXinYiWarningRecordRobotMore(cszzBzz, no3Hlj1Jqr, cszzGkz, ROBOT_XSY_1.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
|
|
|
+ if(warningMoreExceed.isBreakpoint()){
|
|
|
+ breakpointCount++;
|
|
|
+ breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if(!Objects.isNull(no3Hlj2Jqr)){
|
|
|
+ warningMoreExceed = handleXinYiWarningRecordRobotMore(cszzBzz, no3Hlj2Jqr, cszzGkz, ROBOT_XSY_2.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
|
|
|
+ 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(csadBzz, divide, csadGkz, ROBOT_CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
|
|
|
+ if(warningMoreExceed.isBreakpoint()){
|
|
|
+ breakpointCount++;
|
|
|
+ breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
|
|
|
+ }
|
|
|
+
|
|
|
+ Date nowDate = DateUtils.getNowDate();
|
|
|
+ //下面是处理多个指标的 【断点】报警
|
|
|
+ //断点
|
|
|
+ TXinyiWarningRecord warningRecord = TXinyiWarningRecord.builder().symbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode()).status(0).build();
|
|
|
+ List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecord);
|
|
|
+ if(breakpointCount < 1){//恢复正常 关闭多个断点报警
|
|
|
+ //2025年02月28日15:18:30 即使多指标断点,也是按具体分类报警 关闭多个报警
|
|
|
+ if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
|
|
|
+ for (TXinyiWarningRecord tXinyiWarningRecord : tXinyiWarningRecords) {
|
|
|
+ closeWarning(tXinyiWarningRecord);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }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("化验室报警的时候,发现存在仪表故障(断点不变单个指标)的报警,并且已经有该类型报警了,不做任何处理");
|
|
|
+ //2025年03月06日10:52:57 逻辑调整:更新一直报警的那条记录的显示值
|
|
|
+ TXinyiWarningRecord xinyiWarningRecord = tXinyiBreakPointSingleWarningRecords.get(0);
|
|
|
+ xinyiWarningRecord.setWarningVal(warningRecordBreakPointOne.getWarningVal());
|
|
|
+ xinyiWarningRecord.setTime(warningRecordBreakPointOne.getTime());
|
|
|
+ xinyiWarningRecord.setUpdateTime(nowDate);
|
|
|
+ xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
|
|
|
+ //2024年7月31日09:20:47 报警的原因(超标还是超管控也需要更新)
|
|
|
+// xinyiWarningRecord.setReason(warningRecordBreakPointOne.getReason());
|
|
|
+ //更新数据库
|
|
|
+ this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
|
|
|
+ //继续调用决策【本地模拟的决策】
|
|
|
+ addChatRecordByBreakPointsSingle(xinyiWarningRecord, tXinyiIndustry, normConfig, category);
|
|
|
+ }
|
|
|
+ //如果出现单指标报警 标识后续同指标是否可以继续报警
|
|
|
+ if(ROBOT_XSY_1.getCode().equals(category))
|
|
|
+ xsy1Execute = false;
|
|
|
+ if(ROBOT_XSY_2.getCode().equals(category))
|
|
|
+ xsy2Execute = false;
|
|
|
+ if(ROBOT_CS_AD.getCode().equals(category))
|
|
|
+ csADExecute = false;
|
|
|
+ //2025年02月28日15:18:30 即使多指标断点,也是按具体分类报警 关闭多个报警
|
|
|
+ if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
|
|
|
+ for (TXinyiWarningRecord tXinyiWarningRecord : tXinyiWarningRecords) {
|
|
|
+ closeWarning(tXinyiWarningRecord);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ //逻辑调整:要按指标报多指标断点 需要当前的集合和原来的集合判断,新的报警增加,如果之前有了报警则不处理
|
|
|
+ if(CollectionUtils.isEmpty(tXinyiWarningRecords)){
|
|
|
+ //新增的断点的数据全部都报警
|
|
|
+ for (TXinyiWarningRecord tXinyiWarningRecord : breakPointList) {
|
|
|
+ String category = tXinyiWarningRecord.getCategory();
|
|
|
+ //后续对应的指标是否可以进行报警
|
|
|
+ //如果出现单指标报警 标识后续同指标是否可以继续报警
|
|
|
+ if(ROBOT_XSY_1.getCode().equals(category))
|
|
|
+ xsy1Execute = false;
|
|
|
+ if(ROBOT_XSY_2.getCode().equals(category))
|
|
|
+ xsy2Execute = false;
|
|
|
+ if(ROBOT_CS_AD.getCode().equals(category))
|
|
|
+ csADExecute = false;
|
|
|
+ //关闭该指标的其他类型的报警
|
|
|
+ closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
|
|
|
+ //原来集合里存放的都是单指标异常 下面2个值需要重新赋值
|
|
|
+ tXinyiWarningRecord.setReason(category + BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getMsg());
|
|
|
+ tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
|
|
|
+ this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
|
|
|
+ //同时处理决策 不用调用大模型,本地处理问答
|
|
|
+ addChatRecordByBreakPointsMore(tXinyiWarningRecord, tXinyiIndustry, normConfig);
|
|
|
+ }
|
|
|
+ }else{//之前存在报警了 所以需要2个集合数据进行匹配,如果新的和原来的一样则不用做任何操作【持续报警】;如果不一样,则新的要报警,老报警要关闭
|
|
|
+ List<TXinyiWarningRecord> breakPointListNew = new ArrayList<>(breakPointList);//断点集合[需要新增的]
|
|
|
+ breakPointListNew.removeAll(tXinyiWarningRecords);
|
|
|
+ List<TXinyiWarningRecord> breakPointListClose = new ArrayList<>(tXinyiWarningRecords);//断点集合[需要关闭的] 还有2这重叠的,这种重叠的,是不需要做任何操作的,持续报警
|
|
|
+ breakPointListClose.removeAll(breakPointList);
|
|
|
+ //插入新的报警
|
|
|
+ if(!CollectionUtils.isEmpty(breakPointListNew)){
|
|
|
+ for (TXinyiWarningRecord tXinyiWarningRecord : breakPointListNew) {
|
|
|
+ String category = tXinyiWarningRecord.getCategory();
|
|
|
+ //后续对应的指标是否可以进行报警
|
|
|
+ //如果出现单指标报警 标识后续同指标是否可以继续报警
|
|
|
+ if(ROBOT_XSY_1.getCode().equals(category))
|
|
|
+ xsy1Execute = false;
|
|
|
+ if(ROBOT_XSY_2.getCode().equals(category))
|
|
|
+ xsy2Execute = false;
|
|
|
+ if(ROBOT_CS_AD.getCode().equals(category))
|
|
|
+ csADExecute = false;
|
|
|
+ //关闭该指标的其他类型的报警
|
|
|
+ closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
|
|
|
+ //新插入
|
|
|
+ //原来集合里存放的都是单指标异常 下面2个值需要重新赋值
|
|
|
+ tXinyiWarningRecord.setReason(category + BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getMsg());
|
|
|
+ tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
|
|
|
+ this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
|
|
|
+ //同时处理决策 不用调用大模型,本地处理问答
|
|
|
+ addChatRecordByBreakPointsMore(tXinyiWarningRecord, tXinyiIndustry, normConfig);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //关闭老的报警
|
|
|
+ if(!CollectionUtils.isEmpty(breakPointListClose)){
|
|
|
+ for (TXinyiWarningRecord tXinyiWarningRecord : breakPointListClose) {
|
|
|
+ //老的报警,新的没有出现,关闭
|
|
|
+ closeWarning(tXinyiWarningRecord);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //2025年03月06日10:56:41 需要额外记录哪些是历史报警,现在仍然报警的,这种的更新部分信息,更新决策内容
|
|
|
+ List<TXinyiWarningRecord> breakPointListContinue = new ArrayList<>(tXinyiWarningRecords);
|
|
|
+ breakPointListContinue.removeAll(breakPointListNew);
|
|
|
+ if(!CollectionUtils.isEmpty(breakPointListContinue)){
|
|
|
+ for (TXinyiWarningRecord tXinyiWarningRecord : breakPointListContinue) {
|
|
|
+ //2025年03月06日10:52:57 逻辑调整:更新一直报警的那条记录的显示值
|
|
|
+ //需要匹配新的报警中的最新的值
|
|
|
+ String category = tXinyiWarningRecord.getCategory();
|
|
|
+ TXinyiWarningRecord tXinyiWarningRecordContinue = tXinyiWarningRecord;//兜底处理
|
|
|
+ Optional<TXinyiWarningRecord> optional = breakPointListNew.stream().filter(r -> category.equals(r.getCategory())).findAny();
|
|
|
+ if(optional.isPresent()){
|
|
|
+ tXinyiWarningRecordContinue = optional.get();
|
|
|
+ log.info("存在之前多指标断点,现在仍然断点的数据{}", JSON.toJSONString(tXinyiWarningRecordContinue));
|
|
|
+ }
|
|
|
+ tXinyiWarningRecord.setWarningVal(tXinyiWarningRecordContinue.getWarningVal());
|
|
|
+ tXinyiWarningRecord.setTime(tXinyiWarningRecordContinue.getTime());
|
|
|
+ tXinyiWarningRecord.setUpdateTime(nowDate);
|
|
|
+ tXinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
|
|
|
+ //从单指标变成多指标 这个不可以修改
|
|
|
+// tXinyiWarningRecord.setReason(tXinyiWarningRecordContinue.getReason());
|
|
|
+ //更新数据库
|
|
|
+ this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(tXinyiWarningRecord);
|
|
|
+ //继续调用决策【本地模拟的决策】
|
|
|
+ addChatRecordByBreakPointsMore(tXinyiWarningRecord, tXinyiIndustry, normConfig);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //如果出现多指标问题,后续的报警不再处理
|
|
|
+ //2025年03月03日17:31:53 只有上述指标出现异常的,才不可以报警,不会让所有的都不报警
|
|
|
+// return;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //#1好氧硝酸盐
|
|
|
+ if(no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0 && xsy1Execute){
|
|
|
+ if(!Objects.isNull(cszzBzz)){
|
|
|
+ handleXinYiWarningsRobotOrigin(cszzBzz, no3Hlj1Jqr, cszzGkz, ROBOT_XSY_1.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //#2好氧硝酸盐
|
|
|
+ if(no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0 && xsy2Execute){
|
|
|
+ if(!Objects.isNull(cszzBzz)){
|
|
|
+ handleXinYiWarningsRobotOrigin(cszzBzz, no3Hlj2Jqr, cszzGkz, ROBOT_XSY_2.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //2#缺氧出-硝酸盐
|
|
|
+ if(!Objects.isNull(csadBzz) && csADExecute){
|
|
|
+ handleXinYiWarningsRobotOrigin(csadBzz, divide, csadGkz, ROBOT_CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * 机器人化验室报警逻辑处理
|
|
|
+ * @param tXinyiRobot
|
|
|
+ * @param normConfig
|
|
|
+ * @param tXinyiIndustry
|
|
|
+ */
|
|
|
private void robotWarningDetail(TXinyiRobot tXinyiRobot, TXinyiNormConfig normConfig, TXinyiIndustry tXinyiIndustry) {
|
|
|
|
|
|
//先查看数据是否有断点--单指标 断点--多指标
|