2 コミット 972b385e4a ... 0a50953744

作者 SHA1 メッセージ 日付
  王苗苗 0a50953744 进水总磷因为大模型有点问题,暂时注释掉 ToDo 后续放开 1 週間 前
  王苗苗 d34d422588 临时提交 1 週間 前

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

@@ -185,9 +185,15 @@ public class MyConstants {
     public static final long MAX_COUNT = 30L;
     public static final String MAX_COUNT_STR = "30+";
 
+    public static final int INDEX_0 = 0;
     public static final int INDEX_1 = 1;
     public static final int INDEX_2 = 2;
     public static final int INDEX_3 = 3;
+    public static final int INDEX_4 = 4;
+    public static final int INDEX_5 = 5;
+    public static final int INDEX_6 = 6;
+    public static final int INDEX_7 = 7;
+    public static final int INDEX_8 = 8;
     public static final int INT_2 = 2;
     public static final int INT_3 = 3;
     public static final int INT_4 = 4;
@@ -498,6 +504,17 @@ public class MyConstants {
     public static final String EXCEEDVAL = "EXCEEDVAL";
     public static final String LASTVAL = "LASTVAL";
 
+    //高低值报警本地决策内容
+    public static final String GDZ_ANSWER_REPLACE = "## 解决方案 ##\n" +
+            "## 一、数据表现 ##\n" +
+            "**@@@0浓度**:@@@1\n" +
+            "**@@@0变化趋势**:发生连续高低值数据异常;\n" +
+            "## 二、原因分析 ##\n" +
+            "进水氨氮仪表发生高低值连续切换的数据异常,疑似设备故障\n" +
+            "## 三、解决方案##\n" +
+            "建议检查仪表运行状态是否存在设备故障等问题。问题解决后,建议继续观察,以确保问题不再复发。\n" +
+            "如果长时间持续大于6小时,需完成主管局备案并监测平台标记,必要时采取第三方人工监测,监测周期间隔不大于6小时,数据报送每天不少于4次,监测技术要求可参考HJ91.1执行。";
+
     public static void main(String[] args) {
         System.out.println(DecimalUtils.getAbsAndScale(new BigDecimal("2.211"), MyConstants.INT_0));
         System.out.println(DecimalUtils.getAbsAndScaleStr("2.211", MyConstants.INT_0));

+ 1 - 0
slibra-common/src/main/java/com/slibra/common/enums/BusinessEnum.java

@@ -452,6 +452,7 @@ public class BusinessEnum {
         //        SJYC_DDYC(9, "数据异常(单点异常 - 超过标准值)"),  //此种类型 代维导致异常的,现在无规律,无法处理
         INDUSTRY_SYNC_ERROR(10, "在线仪表数据同步失败"),
         ROBOT_SYNC_ERROR(11, "连续检测数据同步失败"),
+        SJYC_GDZ(12, "数据异常"),
         ;
 
         private final Integer code;

+ 4 - 0
slibra-common/src/main/java/com/slibra/common/utils/third/StringUtil.java

@@ -272,6 +272,10 @@ public class StringUtil {
         return StringUtils.join(list, separator);
     }
 
+    public static String join(List<BigDecimal> list, String separator) {
+        return StringUtils.join(list, separator);
+    }
+
     /**
      * @param str
      * @return

+ 301 - 52
slibra-quartz/src/main/java/com/slibra/quartz/task/AsyncTask.java

@@ -22,6 +22,7 @@ import com.slibra.common.utils.DateUtils;
 import com.slibra.common.utils.LocalDateTimeUtil;
 import com.slibra.common.utils.StringUtils;
 import com.slibra.common.utils.format.WaterFormat;
+import com.slibra.common.utils.third.StringUtil;
 import com.slibra.common.utils.uuid.IdUtils;
 import com.slibra.quartz.business.JsCsFormatData;
 import inference.InferenceAPIsServiceGrpc;
@@ -2063,7 +2064,8 @@ public class AsyncTask {
 
         //进水相关报警
         //进水总磷超标报警
-        BigDecimal jsTp = tXinyiIndustry.getJsTp();
+        //2025年04月16日18:29:37 进水总磷因为大模型有点问题,暂时注释掉 ToDo 后续放开
+        /*BigDecimal jsTp = tXinyiIndustry.getJsTp();
         warningMoreExceed = handleXinYiWarningRecordJSMore(jszlSjz, jsTp, BusinessEnum.WarningCategoryEnum.JS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
         if(warningMoreExceed.isBreakpoint()){
             breakpointCount++;
@@ -2072,7 +2074,7 @@ public class AsyncTask {
         if(warningMoreExceed.isNoChange()){
             noChange++;
             noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
-        }
+        }*/
 
         //进水COD超标报警
         BigDecimal jsCod = tXinyiIndustry.getJsCod();
@@ -2598,8 +2600,9 @@ public class AsyncTask {
             handleXinYiWarningsCsOrigin(csadBzz, csNh3, csadGkz, BusinessEnum.WarningCategoryEnum.CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
         if(csSSExecute && !Objects.isNull(csSSBzz) && csSSBzz.compareTo(BigDecimal.ZERO) > 0 && !Objects.isNull(csssGkz) && csssGkz.compareTo(BigDecimal.ZERO) > 0)
             handleXinYiWarningsCsOrigin(csSSBzz, csSS, csssGkz, BusinessEnum.WarningCategoryEnum.CS_SS.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsSs(), jsslSjz, normConfig.getJsssSjz()));
-        if(jsZLExecute && !Objects.isNull(jszlSjz) && jszlSjz.compareTo(BigDecimal.ZERO) > 0)
-            handleXinYiWarningRecordJSOrigin(jszlSjz, jsTp, BusinessEnum.WarningCategoryEnum.JS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
+        //2025年04月16日18:29:37 进水总磷因为大模型有点问题,暂时注释掉 ToDo 后续放开
+        /*if(jsZLExecute && !Objects.isNull(jszlSjz) && jszlSjz.compareTo(BigDecimal.ZERO) > 0)
+            handleXinYiWarningRecordJSOrigin(jszlSjz, jsTp, BusinessEnum.WarningCategoryEnum.JS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));*/
         if(jsCodExecute && !Objects.isNull(jscodSjz) && jscodSjz.compareTo(BigDecimal.ZERO) > 0)
             handleXinYiWarningRecordJSOrigin(jscodSjz, jsCod, BusinessEnum.WarningCategoryEnum.JS_COD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsCod(), jsslSjz, normConfig.getJscodSjz()));
         if(jsZDExecute && !Objects.isNull(jszdSjz) && jszdSjz.compareTo(BigDecimal.ZERO) > 0)
@@ -4093,54 +4096,17 @@ public class AsyncTask {
         TXinyiIndustry tXinyiIndustry1 = tXinyiIndustries.get(INDEX_1);//前一个小时
 
         //单点突变-异常升高报警
-        TXinyiWarningRecord warningRecordYCSG = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode()).status(0).build();
-        List<TXinyiWarningRecord> tXinyiNoChangeYCSGRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordYCSG);
-        //是否存在异常升高的问题
-        if(!CollectionUtils.isEmpty(tXinyiIndustries) && tXinyiIndustries.size() == INT_3){
-            //2025年02月21日14:33:37 这里要改成当前值和上个小时比较  上个小时和上上个小时比较
-            Map<String, BigDecimal> resultMap = existsYCSG(currentVal, category, tXinyiIndustries);
-            BigDecimal exceedVal = resultMap.get(EXCEEDVAL);
-            if(!Objects.isNull(exceedVal)){//这里不能只返回一个布尔类型的结果,因为还要获取百分比的值
-                //关闭同类型的其他报警
-                closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode());
-                //触发报警 并且模拟大模型返回决策问答数据
-                if(CollectionUtils.isEmpty(tXinyiNoChangeYCSGRecords)){
-                    //插入该类型报警
-                    warningRecordYCSG.setTime(nowDate);
-                    warningRecordYCSG.setReason(category + BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getMsg());
-                    warningRecordYCSG.setWaterType(BusinessEnum.WaterTypeEnum.JS.getCode());
-                    warningRecordYCSG.setSymbol(BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode());
-                    warningRecordYCSG.setCreateBy(WARNING_DEFAULT_CREATE);
-                    warningRecordYCSG.setCreateTime(nowDate);
-                    warningRecordYCSG.setWarningVal(currentVal);
-                    warningRecordYCSG.setDesignVal(jsBzz);
-                    warningRecordYCSG.setRemark(ZERO_SZ_WARNING.getCode());
-                    warningRecordYCSG.setCwrwfhz(cwrwfhz);
-                    warningRecordYCSG.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
-                    this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordYCSG);
-                    //同时处理决策 不用调用大模型,本地处理问答
-                    addChatRecordByYCSG(warningRecordYCSG, tXinyiIndustry, normConfig, category, exceedVal, resultMap.get(LASTVAL));
-                }else{
-                    log.info("工业库报警的时候,发现存在异常升高的报警,并且已经有该类型报警了,不做任何处理");
-                }
-                //后续的报警不再进行
-                log.info("工业库报警的时候,发现存在{}异常升高的报警,后续报警不再处理", category);
-                return;
-            }else{//不存在 查看历史是否有报警,有的话关闭
-                if(!CollectionUtils.isEmpty(tXinyiNoChangeYCSGRecords)){
-                    TXinyiWarningRecord warningRecordExists = tXinyiNoChangeYCSGRecords.get(0);
-                    warningRecordExists.setStatus(2);
-                    warningRecordExists.setOffTime(nowDate);
-                    warningRecordExists.setUpdateTime(nowDate);
-                    warningRecordExists.setUpdateBy(WARNING_DEFAULT_CREATE);
-                    this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(warningRecordExists);
-                }
-            }
-        }
+        if (existsJsNh3YCSG(jsBzz, currentVal, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiIndustries, nowDate))
+            return;
 
         //单点突变-异常偏低报警
         //2025年04月15日15:45:48 这种的暂时先不报
 
+        //2025年04月16日14:35:48 新增高低值设备报警
+        if (existsJsNh3GDZ(jsBzz, currentVal, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiIndustries, nowDate))
+            return;
+
+        //最开始的工艺报警  (超标准工艺报警) 2025年04月16日15:40:23 改成只有超标准才会报警,并且具体逻辑做拆分 todo
 
         BigDecimal multiply = jsBzz.multiply(new BigDecimal(MyConstants.SCALE_VALUE));
         TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
@@ -4249,6 +4215,113 @@ public class AsyncTask {
 
     }
 
+    private boolean existsJsNh3YCSG(BigDecimal jsBzz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiIndustry> tXinyiIndustries, Date nowDate) {
+        if(!CollectionUtils.isEmpty(tXinyiIndustries) && tXinyiIndustries.size() == INT_8){
+            //查询同类型的历史报警
+            TXinyiWarningRecord warningRecordYCSG = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode()).status(0).build();
+            List<TXinyiWarningRecord> tXinyiNoChangeYCSGRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordYCSG);
+            //2025年02月21日14:33:37 这里要改成当前值和上个小时比较  上个小时和上上个小时比较
+            Map<String, BigDecimal> resultMap = existsYCSGJsNh3(currentVal, category, tXinyiIndustries);
+            BigDecimal exceedVal = resultMap.get(EXCEEDVAL);
+            if(!Objects.isNull(exceedVal)){//这里不能只返回一个布尔类型的结果,因为还要获取百分比的值
+                //关闭同类型的其他报警
+                closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode());
+                //触发报警 并且模拟大模型返回决策问答数据
+                if(CollectionUtils.isEmpty(tXinyiNoChangeYCSGRecords)){
+                    //插入该类型报警
+                    warningRecordYCSG.setTime(nowDate);
+                    warningRecordYCSG.setReason(category + BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getMsg());
+                    warningRecordYCSG.setWaterType(BusinessEnum.WaterTypeEnum.JS.getCode());
+                    warningRecordYCSG.setSymbol(BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode());
+                    warningRecordYCSG.setCreateBy(WARNING_DEFAULT_CREATE);
+                    warningRecordYCSG.setCreateTime(nowDate);
+                    warningRecordYCSG.setWarningVal(currentVal);
+                    warningRecordYCSG.setDesignVal(jsBzz);
+                    warningRecordYCSG.setRemark(ZERO_SZ_WARNING.getCode());
+                    warningRecordYCSG.setCwrwfhz(cwrwfhz);
+                    warningRecordYCSG.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
+                    this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordYCSG);
+                    //同时处理决策 不用调用大模型,本地处理问答
+                    addChatRecordByYCSG(warningRecordYCSG, tXinyiIndustry, normConfig, category, exceedVal, resultMap.get(LASTVAL));
+                }else{
+                    log.info("工业库报警的时候,发现存在异常升高的报警,并且已经有该类型报警了,不做任何处理");
+                    //2025年04月16日15:56:47 这种的继续报警,所以决策还需要再次调用一次
+                    addChatRecordByYCSG(warningRecordYCSG, tXinyiIndustry, normConfig, category, exceedVal, resultMap.get(LASTVAL));
+                }
+                //后续的报警不再进行
+                log.info("工业库报警的时候,发现存在{}异常升高的报警,后续报警不再处理", category);
+                return true;
+            }else{//不存在 查看历史是否有报警,有的话关闭
+                if(!CollectionUtils.isEmpty(tXinyiNoChangeYCSGRecords)){
+                    closeWarning(tXinyiNoChangeYCSGRecords.get(0));
+                }
+            }
+        }
+        return false;
+    }
+
+
+    private boolean existsJsNh3GDZ(BigDecimal jsBzz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiIndustry> tXinyiIndustries, Date nowDate) {
+        if(!CollectionUtils.isEmpty(tXinyiIndustries) && tXinyiIndustries.size() == INT_8){
+            //查询同类型的历史报警
+            TXinyiWarningRecord warningRecordGDZ = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.SJYC_GDZ.getCode()).status(0).build();
+            List<TXinyiWarningRecord> tXinyiNoChangeGDZRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordGDZ);
+            //2025年02月21日14:33:37 这里要改成当前值和上个小时比较  上个小时和上上个小时比较
+            Map<String, BigDecimal> resultMap = existsGdzJsNh3(currentVal, category, tXinyiIndustries);
+            BigDecimal exceedVal = resultMap.get(EXCEEDVAL);
+            if(!Objects.isNull(exceedVal)){//这里不能只返回一个布尔类型的结果,因为还要获取百分比的值
+                //拼接决策的最近8小时的值
+                String last8Str = this.getJsNh3Str8(tXinyiIndustries);
+                //关闭同类型的其他报警
+                closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.SJYC_GDZ.getCode());
+                //触发报警 并且模拟大模型返回决策问答数据
+                if(CollectionUtils.isEmpty(tXinyiNoChangeGDZRecords)){
+                    //插入该类型报警
+                    warningRecordGDZ.setTime(nowDate);
+                    warningRecordGDZ.setReason(category + BusinessEnum.WarningSymbolEnum.SJYC_GDZ.getMsg());
+                    warningRecordGDZ.setWaterType(BusinessEnum.WaterTypeEnum.JS.getCode());
+                    warningRecordGDZ.setSymbol(BusinessEnum.WarningSymbolEnum.SJYC_GDZ.getCode());
+                    warningRecordGDZ.setCreateBy(WARNING_DEFAULT_CREATE);
+                    warningRecordGDZ.setCreateTime(nowDate);
+                    warningRecordGDZ.setWarningVal(currentVal);
+                    warningRecordGDZ.setDesignVal(jsBzz);
+                    warningRecordGDZ.setRemark(ZERO_SZ_WARNING.getCode());
+                    warningRecordGDZ.setCwrwfhz(cwrwfhz);
+                    warningRecordGDZ.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
+                    this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordGDZ);
+                    //同时处理决策 不用调用大模型,本地处理问答
+                    addChatRecordByGDZ(warningRecordGDZ, tXinyiIndustry, normConfig, category, exceedVal, resultMap.get(LASTVAL), last8Str);
+                }else{
+                    log.info("工业库报警的时候,发现存在高低值的报警,并且已经有该类型报警了,不做任何处理");
+                    //2025年04月16日15:56:47 这种的继续报警,所以决策还需要再次调用一次
+                    addChatRecordByGDZ(warningRecordGDZ, tXinyiIndustry, normConfig, category, exceedVal, resultMap.get(LASTVAL), last8Str);
+                }
+                //后续的报警不再进行
+                log.info("工业库报警的时候,发现存在{}高低值的报警,后续报警不再处理", category);
+                return true;
+            }else{//不存在 查看历史是否有报警,有的话关闭
+                if(!CollectionUtils.isEmpty(tXinyiNoChangeGDZRecords)){
+                    closeWarning(tXinyiNoChangeGDZRecords.get(0));
+                }
+            }
+        }
+        return false;
+    }
+
+    private String getJsNh3Str8(List<TXinyiIndustry> tXinyiIndustries) {
+//        return StringUtil.join(tXinyiIndustries.stream().map(TXinyiIndustry::getJsNh3).collect(Collectors.toList()) , "mg/L、");
+        int size = tXinyiIndustries.size();
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < size; i++) {
+            TXinyiIndustry tXinyiIndustry = tXinyiIndustries.get(i);
+            if(i < size - 1)
+                sb.append(tXinyiIndustry.getJsNh3()).append("mg/L、");
+            else
+                sb.append("mg/L");
+        }
+        return sb.toString();
+    }
+
 
     /**
      * 通过输入的值 生成对应类型的报警对象(进水)
@@ -4570,6 +4643,132 @@ public class AsyncTask {
 
 
 
+    /**
+     *
+     * 2025年04月16日14:20:11 异常升高逻辑也不同指标不同的判断方式
+     * 【工业库异常升高】先判断该指标是否超过最大值,如果超过了,返回对应的超过的值; 如果没有超标,返回null。
+     * 一个字段返回用作2个地方
+     * 2025年03月06日10:35:30 判断是否超标,不再获取最近3个小时;最近2个小时比较即可。
+     * 2025年03月19日10:47:18 返回逻辑调整:额外再返回一个上个小时同指标的值,决策力需要展示该值。
+     * @param currentVal
+     * @param category
+     * @param industryList
+     * @return
+     */
+    private Map<String, BigDecimal> existsYCSGJsNh3(BigDecimal currentVal, String category, List<TXinyiIndustry> industryList) {
+
+        Map<String, BigDecimal> resultMap = new HashMap<>();
+        TXinyiIndustry tXinyiIndustry1 = industryList.get(INDEX_1);
+//        BigDecimal compareVal = BigDecimal.valueOf(YCSG_VAL_CONF);
+        BigDecimal compareVal = BigDecimal.valueOf(0.7D);
+        BigDecimal jsNh31 = tXinyiIndustry1.getJsNh3();
+        TXinyiIndustry tXinyiIndustryCurrent = industryList.get(INDEX_0);
+        BigDecimal jsTn = tXinyiIndustryCurrent.getJsTn();
+        if(!Objects.isNull(currentVal) && !Objects.isNull(jsNh31)){
+            BigDecimal divide1 = currentVal.subtract(jsNh31).divide(jsNh31, NUMBER_SCALE_4, RoundingMode.HALF_UP);
+            //2025年04月16日14:28:55 除非条件修改: 触发条件:(现在-前一小时)/前一小时*100%> 70%  and  进水氨氮 > 58 and 进水总氮<65
+            if(divide1.compareTo(compareVal) > 0  && currentVal.compareTo(BigDecimal.valueOf(58)) > 0 && jsTn.compareTo(BigDecimal.valueOf(65)) < 0){
+                resultMap.put(EXCEEDVAL, divide1);
+                resultMap.put(LASTVAL, jsNh31);
+            }
+        }
+        return resultMap;
+    }
+
+
+    /**
+     * 进水氨氮是否存在高低值切换
+     * @param currentVal
+     * @param category
+     * @param industryList
+     * @return
+     */
+    private Map<String, BigDecimal> existsGdzJsNh3(BigDecimal currentVal, String category, List<TXinyiIndustry> industryList) {
+
+        Map<String, BigDecimal> resultMap = new HashMap<>();
+        BigDecimal compareValHigh = BigDecimal.valueOf(58);
+        BigDecimal compareValLow = BigDecimal.valueOf(13);
+
+        if(gdzJsNh3(compareValHigh, compareValLow, industryList))
+            resultMap.put(EXCEEDVAL, compareValHigh);//这里随便存一个值就可以 有值代表存在高低值  没有就是不存在
+        return resultMap;
+    }
+
+    /**
+     * 判断8个值 是否存在高低值切换报警
+     * @param compareValHigh
+     * @param compareValLow
+     * @param industryList
+     * @return
+     */
+    private boolean gdzJsNh3(BigDecimal compareValHigh, BigDecimal compareValLow, List<TXinyiIndustry> industryList) {
+        BigDecimal jsNh30 = industryList.get(INDEX_0).getJsNh3();
+        BigDecimal jsNh31 = industryList.get(INDEX_1).getJsNh3();
+        BigDecimal jsNh32 = industryList.get(INDEX_2).getJsNh3();
+        BigDecimal jsNh33 = industryList.get(INDEX_3).getJsNh3();
+        BigDecimal jsNh34 = industryList.get(INDEX_4).getJsNh3();
+        BigDecimal jsNh35 = industryList.get(INDEX_5).getJsNh3();
+        BigDecimal jsNh36 = industryList.get(INDEX_6).getJsNh3();
+        BigDecimal jsNh37 = industryList.get(INDEX_7).getJsNh3();
+
+        //判断规则:
+        return commonGdzCompare(compareValHigh, compareValLow, jsNh30, jsNh31, jsNh32, jsNh33, jsNh34, jsNh35, jsNh36, jsNh37);
+    }
+
+    private boolean commonGdzCompare(BigDecimal compareValHigh, BigDecimal compareValLow, BigDecimal jsNh30, BigDecimal jsNh31, BigDecimal jsNh32, BigDecimal jsNh33, BigDecimal jsNh34, BigDecimal jsNh35, BigDecimal jsNh36, BigDecimal jsNh37) {
+        boolean result = false;
+        if(high(jsNh30, compareValHigh) && low(jsNh31, compareValLow) && high(jsNh32, compareValHigh) && low(jsNh33, compareValLow))
+            result = true;
+        if(high(jsNh30, compareValHigh) && high(jsNh31, compareValHigh) && low(jsNh32, compareValLow) && low(jsNh33, compareValLow)
+                && high(jsNh34, compareValHigh) && high(jsNh35, compareValHigh) && low(jsNh36, compareValLow) && low(jsNh37, compareValLow))
+            result = true;
+        if(high(jsNh30, compareValHigh) && low(jsNh31, compareValLow) && low(jsNh32, compareValLow) && high(jsNh33, compareValHigh))
+            result = true;
+        if(high(jsNh30, compareValHigh) && low(jsNh31, compareValLow) && low(jsNh32, compareValLow) && low(jsNh33, compareValLow) && high(jsNh34, compareValHigh))
+            result = true;
+
+        if(low(jsNh30, compareValLow) && high(jsNh31, compareValHigh) && low(jsNh32, compareValLow) && high(jsNh33, compareValHigh))
+            result = true;
+        if(low(jsNh30, compareValLow) && low(jsNh31, compareValLow) && high(jsNh32, compareValHigh) && high(jsNh33, compareValHigh)
+                && low(jsNh34, compareValLow) && low(jsNh35, compareValLow) && high(jsNh36, compareValHigh) && high(jsNh37, compareValHigh))
+            result = true;
+        if(low(jsNh30, compareValLow) && high(jsNh31, compareValHigh) && high(jsNh32, compareValHigh) && low(jsNh33, compareValLow))
+            result = true;
+        if(low(jsNh30, compareValLow) && high(jsNh31, compareValHigh) && high(jsNh32, compareValHigh) && high(jsNh33, compareValHigh) && low(jsNh34, compareValLow))
+            result = true;
+        return result;
+    }
+
+
+    /**
+     *
+     * 判断 origin 是否 大于 compare  大于返回true
+     * @param origin
+     * @param compare
+     * @return
+     */
+    private boolean high(BigDecimal origin, BigDecimal compare){
+        if(Objects.isNull(origin) || Objects.isNull(compare))
+            return false;
+        return origin.compareTo(compare) > 0;
+    }
+
+
+    /**
+     *
+     * 判断 origin 是否 小于 compare  小于于返回true
+     * @param origin
+     * @param compare
+     * @return
+     */
+    private boolean low(BigDecimal origin, BigDecimal compare){
+        if(Objects.isNull(origin) || Objects.isNull(compare))
+            return false;
+        return origin.compareTo(compare) < 0;
+    }
+
+
+
     /**
      *
      * 【工业库异常升高】先判断该指标是否超过最大值,如果超过了,返回对应的超过的值; 如果没有超标,返回null。
@@ -5478,6 +5677,31 @@ public class AsyncTask {
         this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
     }
 
+
+
+    private void addChatRecordByGDZ(TXinyiWarningRecord warningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, String category, BigDecimal exceedVal, BigDecimal lastVal, String last8Str) {
+        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.SJYC_GDZ.getMsg());//本地问题
+//        chatReq.setAnswer(category + YCSG_ANSWER_ONE + exceedVal.multiply(BigDecimal_100) + "%" + YCSG_ANSWER_TWO + warningRecord.getWarningVal() + YCSG_ANSWER_THREE);
+        chatReq.setAnswer(GDZ_ANSWER_REPLACE.replaceAll("@@@0", category).replaceAll("@@@1", last8Str));//只替换最近8小时的值 和 类型
+        chatReq.setWarningId(String.valueOf(warningRecord.getId()));
+        chatReq.setCounts(1);//问答次数
+
+        chatReq.setCreateBy(WARNING_DEFAULT_CREATE);
+        chatReq.setCreateTime(DateUtils.getNowDate());
+        this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
+    }
+
     private void addChatRecordByYCSG(TXinyiWarningRecord warningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, String category, BigDecimal exceedVal, BigDecimal lastVal) {
         ChatReq chatReq = new ChatReq();
         //保存聊天记录
@@ -5668,6 +5892,29 @@ public class AsyncTask {
         System.out.println("\n对已有分组结果按键反转排序(降序):");
         reversedAfter.forEach((k, v) -> System.out.println(k + ": " + v));
 
+
+        System.out.println("------");
+        List<BigDecimal> list = new ArrayList<>();
+        list.add(BigDecimal.valueOf(1));
+        list.add(BigDecimal.valueOf(1.2));
+        list.add(BigDecimal.valueOf(1.4));
+        list.add(BigDecimal.valueOf(1.5));
+        list.add(BigDecimal.valueOf(1.00));
+        String join = StringUtil.join(list, "mg/L、");
+        System.out.println(join);
+
+
+        int size = list.size();
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < size; i++) {
+            BigDecimal bigDecimal = list.get(i);
+            if(i < size - 1)
+                sb.append(bigDecimal).append("mg/L、");
+            else
+                sb.append("mg/L");
+        }
+        System.out.println(sb.toString());
+
     }
 
     /**
@@ -5939,14 +6186,15 @@ public class AsyncTask {
         }
 
 
-        if(!Objects.isNull(tpRccJqr)){
+        //2025年04月16日18:29:37 进水总磷因为大模型有点问题,暂时注释掉 ToDo 后续放开
+        /*if(!Objects.isNull(tpRccJqr)){
             BigDecimal csTp = tpRccJqr.divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP);
             warningMoreExceed = handleXinYiWarningRecordRobotMore(cszlBzz, csTp, cszlGkz, ROBOT_ECCZLSY.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
             if(warningMoreExceed.isBreakpoint()){
                 breakpointCount++;
                 breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
             }
-        }
+        }*/
 
 
         //判断 增加容错
@@ -6166,12 +6414,13 @@ public class AsyncTask {
         }
 
         //总磷
-        if(!Objects.isNull(tpRccJqr) && tpRccJqr.compareTo(BigDecimal.ZERO) > 0 && ecczlxyExecute){
+        //2025年04月16日18:29:37 进水总磷因为大模型有点问题,暂时注释掉 ToDo 后续放开
+        /*if(!Objects.isNull(tpRccJqr) && tpRccJqr.compareTo(BigDecimal.ZERO) > 0 && ecczlxyExecute){
             BigDecimal csTp = tpRccJqr.divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP);
             if(!Objects.isNull(cszlBzz)){
                 handleXinYiWarningsRobotOrigin(cszlBzz, csTp, cszlGkz, ROBOT_ECCZLSY.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
             }
-        }
+        }*/
 
 
         //2#缺氧出-硝酸盐