王苗苗 1 周之前
父節點
當前提交
60819bf77f

+ 10 - 0
slibra-common/src/main/java/com/slibra/common/constant/MyConstants.java

@@ -450,6 +450,16 @@ public class MyConstants {
             "## 三、解决方案 ##\n" +
             "建议检查@@@0仪表是否有故障情况,同时检查仪表的输出模块是否工作正常,确保数据的采集和传输。";
 
+    public static final String ROBOT_SJYC_ANSWER_REPLACE = "## 解决方案 ##\n" +
+            "## 一、数据表现 ##\n" +
+            "**@@@0连续检测**:\n" +
+            "**@@@0连续检测变化趋势**:数据异常;\n" +
+            "## 二、原因分析 ##\n" +
+            "@@@0连续检测发生数据异常问题,@@@0连续检测设备可能存在问题\n" +
+            "## 三、解决方案 ##\n" +
+            "建议检查@@@0连续检测设备是否存在问题,检查连续检测输出模块是否工作正常,确保数据的采集和传输。并可人工采样确认,必要时通知厂家排查连续检测设备问题。";
+
+
     public static final String SINGLE_BREAKPOINT_ANSWER_REPLACE = "## 解决方案 ##\n" +
             "## 一、数据表现 ##\n" +
             "**@@@0浓度**:`0`mg/L\n" +

+ 114 - 56
slibra-quartz/src/main/java/com/slibra/quartz/task/AsyncTask.java

@@ -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))