فهرست منبع

新增 缺氧氨氮1池和2池的 机理模型预测

王苗苗 4 هفته پیش
والد
کامیت
cf62baef17

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

@@ -499,6 +499,8 @@ public class BusinessEnum {
         XSY(5, "缺氧硝酸盐"),
         HY_XSY_1(6, "好氧池硝酸盐#1"),
         HY_XSY_2(7, "好氧池硝酸盐#2"),
+        QY_NH3_1(8, "缺氧氨氮#1"),
+        QY_NH3_2(9, "缺氧氨氮#2"),
         ;
 
         private final Integer code;

+ 142 - 0
slibra-quartz/src/main/java/com/slibra/quartz/task/RyTask.java

@@ -1813,6 +1813,12 @@ public class RyTask
             } catch (Exception e) {
                 log.error("调用跃渊的预测接口出现异常,异常信息为{}", e.getMessage());
             }*/
+            //2025年04月08日17:47:54 额外记录基地模型预测的值
+            try {
+                this.updateJDModelPredictQyNh31(tXinyiForecastComparison);
+            } catch (Exception e) {
+                log.error("处理 基地模型-缺氧氨氮#1预测的值的时候出现异常,异常信息为{}", e.getMessage());
+            }
             // this.xinyiForecastComparisonService.insertTXinyiForecastComparison(tXinyiForecastComparison);
             /*BigDecimal cscodBzz = new BigDecimal(XIAOSUANYAN_BZK);
             BigDecimal cscodGkz = new BigDecimal(XIAOSUANYAN_GKZ);*/
@@ -1848,6 +1854,12 @@ public class RyTask
             } catch (Exception e) {
                 log.error("调用跃渊的预测接口出现异常,异常信息为{}", e.getMessage());
             }*/
+            //2025年04月08日17:47:54 额外记录基地模型预测的值
+            try {
+                this.updateJDModelPredictQyNh32(tXinyiForecastComparison);
+            } catch (Exception e) {
+                log.error("处理 基地模型-缺氧氨氮#2预测的值的时候出现异常,异常信息为{}", e.getMessage());
+            }
             // this.xinyiForecastComparisonService.insertTXinyiForecastComparison(tXinyiForecastComparison);
             /*BigDecimal cscodBzz = new BigDecimal(XIAOSUANYAN_BZK);
             BigDecimal cscodGkz = new BigDecimal(XIAOSUANYAN_GKZ);*/
@@ -2077,6 +2089,136 @@ public class RyTask
         }
     }
 
+
+    /**
+     * 额外通过计算处理要保存的预测对象-机理模型缺氧氨氮1池
+     * @param tXinyiForecastComparison
+     */
+    private void updateJDModelPredictQyNh31(TXinyiForecastComparison tXinyiForecastComparison) {
+        //现获取基地模型的配置 如果没有执行返回
+        TPredictConf tPredictConfReq = new TPredictConf();
+        tPredictConfReq.setType(BusinessEnum.JLModelPredictEnum.QY_NH3_1.getCode());
+        List<TPredictConf> tPredictConfs = this.tpredictConfMapper.selectTPredictConfList(tPredictConfReq);
+        if(CollectionUtils.isEmpty(tPredictConfs)){
+            log.error("获取缺氧硝酸盐#1机理模型预测参数配置失败,无法处理");
+            return;
+        }
+        if(tPredictConfs.size() > 1){
+            log.error("获取缺氧硝酸盐#1机理模型预测参数配置查询多条配置信息,无法处理");
+            return;
+        }
+        //配置的值
+        TPredictConf tPredictConf = tPredictConfs.get(0);
+        BigDecimal a = Objects.isNull(tPredictConf.getA()) ? BigDecimal.valueOf(12.00) : tPredictConf.getA();
+        BigDecimal b = Objects.isNull(tPredictConf.getB()) ? BigDecimal.valueOf(59.20) : tPredictConf.getB();
+        int xMin = Objects.isNull(tPredictConf.getxMin()) ? 1 : tPredictConf.getxMin();
+        int xMax = Objects.isNull(tPredictConf.getxMax()) ? 4 : tPredictConf.getxMax();
+        int y1Min = Objects.isNull(tPredictConf.getY1Min()) ? 1 : tPredictConf.getY1Min();
+        int y1Max = Objects.isNull(tPredictConf.getY1Max()) ? 4 : tPredictConf.getY1Max();
+        BigDecimal x1 = Objects.isNull(tPredictConf.getX1()) ? BigDecimal.valueOf(84.56) : tPredictConf.getX1();
+        //计算第一个值逻辑处理
+        //计算X的值
+        Date nowDate = DateUtils.getNowDate();
+        BigDecimal x = this.xinyiIndustryMapper.getAvgJSNh3ByDate(DateUtil.format(DateUtils.plusHour(-xMax, nowDate), DateUtils.YYYYMMDDHH_TS), DateUtil.format(DateUtils.plusHour(-xMin, nowDate), DateUtils.YYYYMMDDHH_TS));
+        //计算y1
+        BigDecimal y1 = this.xinyiRobotMapper.getAvgQyNh31ByDate(DateUtil.format(DateUtils.plusHour(-y1Max, nowDate), DateUtils.YYYYMMDDHH_TS), DateUtil.format(DateUtils.plusHour(-y1Min, nowDate), DateUtils.YYYYMMDDHH_TS));
+        if(x.compareTo(x1) <= 0){//直接用  当前时间前12小时-6小时的出水COD均值 (时间段位配置的值)
+            tXinyiForecastComparison.setJlForecastOne(y1);
+        }else{//按照公式计算
+            tXinyiForecastComparison.setJlForecastOne(y1.add(a.multiply(x.subtract(x1).divide(b,NUMBER_SCALE_2, RoundingMode.HALF_UP))));
+        }
+
+        //计算第二个值逻辑处理
+        //计算X的值
+        nowDate = DateUtils.plusHour(1, nowDate);
+        x = this.xinyiIndustryMapper.getAvgJSNh3ByDate(DateUtil.format(DateUtils.plusHour(-xMax, nowDate), DateUtils.YYYYMMDDHH_TS), DateUtil.format(DateUtils.plusHour(-xMin, nowDate), DateUtils.YYYYMMDDHH_TS));
+        //计算y1
+        y1 = this.xinyiRobotMapper.getAvgQyNh31ByDate(DateUtil.format(DateUtils.plusHour(-y1Max, nowDate), DateUtils.YYYYMMDDHH_TS), DateUtil.format(DateUtils.plusHour(-y1Min, nowDate), DateUtils.YYYYMMDDHH_TS));
+        if(x.compareTo(x1) <= 0){//直接用  当前时间前12小时-6小时的出水COD均值 (时间段位配置的值)
+            tXinyiForecastComparison.setJlForecastTwo(y1);
+        }else{//按照公式计算
+            tXinyiForecastComparison.setJlForecastTwo(y1.add(a.multiply(x.subtract(x1).divide(b,NUMBER_SCALE_2, RoundingMode.HALF_UP))));
+        }
+
+
+        //计算第三个值逻辑处理
+        //计算X的值
+        nowDate = DateUtils.plusHour(1, nowDate);
+        x = this.xinyiIndustryMapper.getAvgJSNh3ByDate(DateUtil.format(DateUtils.plusHour(-xMax, nowDate), DateUtils.YYYYMMDDHH_TS), DateUtil.format(DateUtils.plusHour(-xMin, nowDate), DateUtils.YYYYMMDDHH_TS));
+        //计算y1
+        y1 = this.xinyiRobotMapper.getAvgQyNh31ByDate(DateUtil.format(DateUtils.plusHour(-y1Max, nowDate), DateUtils.YYYYMMDDHH_TS), DateUtil.format(DateUtils.plusHour(-y1Min, nowDate), DateUtils.YYYYMMDDHH_TS));
+        if(x.compareTo(x1) <= 0){//直接用  当前时间前12小时-6小时的出水COD均值 (时间段位配置的值)
+            tXinyiForecastComparison.setJlForecastThree(y1);
+        }else{//按照公式计算
+            tXinyiForecastComparison.setJlForecastThree(y1.add(a.multiply(x.subtract(x1).divide(b,NUMBER_SCALE_2, RoundingMode.HALF_UP))));
+        }
+    }
+
+
+    /**
+     * 额外通过计算处理要保存的预测对象-机理模型缺氧氨氮2池
+     * @param tXinyiForecastComparison
+     */
+    private void updateJDModelPredictQyNh32(TXinyiForecastComparison tXinyiForecastComparison) {
+        //现获取基地模型的配置 如果没有执行返回
+        TPredictConf tPredictConfReq = new TPredictConf();
+        tPredictConfReq.setType(BusinessEnum.JLModelPredictEnum.QY_NH3_2.getCode());
+        List<TPredictConf> tPredictConfs = this.tpredictConfMapper.selectTPredictConfList(tPredictConfReq);
+        if(CollectionUtils.isEmpty(tPredictConfs)){
+            log.error("获取缺氧硝酸盐#2机理模型预测参数配置失败,无法处理");
+            return;
+        }
+        if(tPredictConfs.size() > 1){
+            log.error("获取缺氧硝酸盐#2机理模型预测参数配置查询多条配置信息,无法处理");
+            return;
+        }
+        //配置的值
+        TPredictConf tPredictConf = tPredictConfs.get(0);
+        BigDecimal a = Objects.isNull(tPredictConf.getA()) ? BigDecimal.valueOf(12.00) : tPredictConf.getA();
+        BigDecimal b = Objects.isNull(tPredictConf.getB()) ? BigDecimal.valueOf(59.20) : tPredictConf.getB();
+        int xMin = Objects.isNull(tPredictConf.getxMin()) ? 1 : tPredictConf.getxMin();
+        int xMax = Objects.isNull(tPredictConf.getxMax()) ? 4 : tPredictConf.getxMax();
+        int y1Min = Objects.isNull(tPredictConf.getY1Min()) ? 1 : tPredictConf.getY1Min();
+        int y1Max = Objects.isNull(tPredictConf.getY1Max()) ? 4 : tPredictConf.getY1Max();
+        BigDecimal x1 = Objects.isNull(tPredictConf.getX1()) ? BigDecimal.valueOf(84.56) : tPredictConf.getX1();
+        //计算第一个值逻辑处理
+        //计算X的值
+        Date nowDate = DateUtils.getNowDate();
+        BigDecimal x = this.xinyiIndustryMapper.getAvgJSNh3ByDate(DateUtil.format(DateUtils.plusHour(-xMax, nowDate), DateUtils.YYYYMMDDHH_TS), DateUtil.format(DateUtils.plusHour(-xMin, nowDate), DateUtils.YYYYMMDDHH_TS));
+        //计算y1
+        BigDecimal y1 = this.xinyiRobotMapper.getAvgQyNh32ByDate(DateUtil.format(DateUtils.plusHour(-y1Max, nowDate), DateUtils.YYYYMMDDHH_TS), DateUtil.format(DateUtils.plusHour(-y1Min, nowDate), DateUtils.YYYYMMDDHH_TS));
+        if(x.compareTo(x1) <= 0){//直接用  当前时间前12小时-6小时的出水COD均值 (时间段位配置的值)
+            tXinyiForecastComparison.setJlForecastOne(y1);
+        }else{//按照公式计算
+            tXinyiForecastComparison.setJlForecastOne(y1.add(a.multiply(x.subtract(x1).divide(b,NUMBER_SCALE_2, RoundingMode.HALF_UP))));
+        }
+
+        //计算第二个值逻辑处理
+        //计算X的值
+        nowDate = DateUtils.plusHour(1, nowDate);
+        x = this.xinyiIndustryMapper.getAvgJSNh3ByDate(DateUtil.format(DateUtils.plusHour(-xMax, nowDate), DateUtils.YYYYMMDDHH_TS), DateUtil.format(DateUtils.plusHour(-xMin, nowDate), DateUtils.YYYYMMDDHH_TS));
+        //计算y1
+        y1 = this.xinyiRobotMapper.getAvgQyNh32ByDate(DateUtil.format(DateUtils.plusHour(-y1Max, nowDate), DateUtils.YYYYMMDDHH_TS), DateUtil.format(DateUtils.plusHour(-y1Min, nowDate), DateUtils.YYYYMMDDHH_TS));
+        if(x.compareTo(x1) <= 0){//直接用  当前时间前12小时-6小时的出水COD均值 (时间段位配置的值)
+            tXinyiForecastComparison.setJlForecastTwo(y1);
+        }else{//按照公式计算
+            tXinyiForecastComparison.setJlForecastTwo(y1.add(a.multiply(x.subtract(x1).divide(b,NUMBER_SCALE_2, RoundingMode.HALF_UP))));
+        }
+
+
+        //计算第三个值逻辑处理
+        //计算X的值
+        nowDate = DateUtils.plusHour(1, nowDate);
+        x = this.xinyiIndustryMapper.getAvgJSNh3ByDate(DateUtil.format(DateUtils.plusHour(-xMax, nowDate), DateUtils.YYYYMMDDHH_TS), DateUtil.format(DateUtils.plusHour(-xMin, nowDate), DateUtils.YYYYMMDDHH_TS));
+        //计算y1
+        y1 = this.xinyiRobotMapper.getAvgQyNh32ByDate(DateUtil.format(DateUtils.plusHour(-y1Max, nowDate), DateUtils.YYYYMMDDHH_TS), DateUtil.format(DateUtils.plusHour(-y1Min, nowDate), DateUtils.YYYYMMDDHH_TS));
+        if(x.compareTo(x1) <= 0){//直接用  当前时间前12小时-6小时的出水COD均值 (时间段位配置的值)
+            tXinyiForecastComparison.setJlForecastThree(y1);
+        }else{//按照公式计算
+            tXinyiForecastComparison.setJlForecastThree(y1.add(a.multiply(x.subtract(x1).divide(b,NUMBER_SCALE_2, RoundingMode.HALF_UP))));
+        }
+    }
+
     public void handleXinYiWarningsYC(BigDecimal csBzz, String[] split, BigDecimal csGkz, String category, String hour, TXinyiNormConfig normConfig, BigDecimal currentVal, TXinyiIndustry tXinyiIndustry, List<ChartBasic> chartsDataList, String date) {
         BigDecimal multiply = csBzz.multiply(new BigDecimal(MyConstants.SCALE_VALUE));
         TXinyiWarningRecord tXinyiWarningRecord = null;

+ 2 - 0
slibra-system/src/main/java/com/slibra/business/mapper/TXinyiIndustryMapper.java

@@ -112,4 +112,6 @@ public interface TXinyiIndustryMapper
     BigDecimal getAvgCSCodByDate(@Param("dateBegin") String dateBegin, @Param("dateEnd") String dateEnd);
 
     BigDecimal getAvgJSTnByDate(@Param("dateBegin") String dateBegin, @Param("dateEnd") String dateEnd);
+
+    BigDecimal getAvgJSNh3ByDate(@Param("dateBegin") String dateBegin, @Param("dateEnd") String dateEnd);
 }

+ 5 - 0
slibra-system/src/main/java/com/slibra/business/mapper/TXinyiRobotMapper.java

@@ -92,4 +92,9 @@ public interface TXinyiRobotMapper
     BigDecimal getAvgCSXsy1ByDate(@Param("dateBegin") String dateBegin, @Param("dateEnd") String dateEnd);
 
     BigDecimal getAvgCSXsy2ByDate(@Param("dateBegin") String dateBegin, @Param("dateEnd") String dateEnd);
+
+    BigDecimal getAvgQyNh31ByDate(@Param("dateBegin") String dateBegin, @Param("dateEnd") String dateEnd);
+
+    BigDecimal getAvgQyNh32ByDate(@Param("dateBegin") String dateBegin, @Param("dateEnd") String dateEnd);
+
 }

+ 11 - 3
slibra-system/src/main/resources/mapper/business/TXinyiIndustryMapper.xml

@@ -705,7 +705,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="getAvgJSCodByDate" resultType="java.math.BigDecimal">
         SELECT
-            avg( temp.val )
+            IFNULL(avg( temp.val ), 0)
         FROM
             ( SELECT JS_SLQ * JS_COD / 2 / 10000 val FROM t_xinyi_industry WHERE TEST_HOUR BETWEEN #{dateBegin} AND #{dateEnd} ) temp
     </select>
@@ -713,7 +713,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="getAvgCSCodByDate" resultType="java.math.BigDecimal">
         SELECT
-            AVG( CS_COD )
+            IFNULL(AVG( CS_COD ), 0)
         FROM
             t_xinyi_industry
         WHERE
@@ -724,8 +724,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="getAvgJSTnByDate" resultType="java.math.BigDecimal">
         SELECT
-            avg( temp.val )
+            IFNULL(avg( temp.val ), 0)
         FROM
             ( SELECT JS_SLQ * JS_TN / 2 / 10000 val FROM t_xinyi_industry WHERE TEST_HOUR BETWEEN #{dateBegin} AND #{dateEnd} ) temp
     </select>
+
+
+    <select id="getAvgJSNh3ByDate" resultType="java.math.BigDecimal">
+        SELECT
+            IFNULL(avg( temp.val ), 0)
+        FROM
+            ( SELECT JS_SLQ * JS_NH3 / 2 / 10000 val FROM t_xinyi_industry WHERE TEST_HOUR BETWEEN #{dateBegin} AND #{dateEnd} ) temp
+    </select>
 </mapper>

+ 22 - 2
slibra-system/src/main/resources/mapper/business/TXinyiRobotMapper.xml

@@ -372,7 +372,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="getAvgCSXsy1ByDate" resultType="java.math.BigDecimal">
         SELECT
-            AVG( NO3_HLJ1_JQR )
+            IFNULL(AVG( NO3_HLJ1_JQR ), 0)
         FROM
             t_xinyi_robot
         WHERE
@@ -383,7 +383,27 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="getAvgCSXsy2ByDate" resultType="java.math.BigDecimal">
         SELECT
-            AVG( NO3_HLJ2_JQR )
+            IFNULL(AVG( NO3_HLJ2_JQR ), 0)
+        FROM
+            t_xinyi_robot
+        WHERE
+            TEST_HOUR BETWEEN #{dateBegin}
+                AND  #{dateEnd}
+    </select>
+
+    <select id="getAvgQyNh31ByDate" resultType="java.math.BigDecimal">
+        SELECT
+            IFNULL(AVG( NH3_1_JQR ), 0)
+        FROM
+            t_xinyi_robot
+        WHERE
+            TEST_HOUR BETWEEN #{dateBegin}
+                AND  #{dateEnd}
+    </select>
+
+    <select id="getAvgQyNh32ByDate" resultType="java.math.BigDecimal">
+        SELECT
+            IFNULL(AVG( NH3_2_JQR ), 0)
         FROM
             t_xinyi_robot
         WHERE