浏览代码

临时提交

王苗苗 1 月之前
父节点
当前提交
91a44b73cb
共有 1 个文件被更改,包括 255 次插入0 次删除
  1. 255 0
      slibra-quartz/src/main/java/com/slibra/quartz/task/AsyncTask.java

+ 255 - 0
slibra-quartz/src/main/java/com/slibra/quartz/task/AsyncTask.java

@@ -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) {
 
         //先查看数据是否有断点--单指标  断点--多指标