Browse Source

机理模型增加 好氧池硝酸盐#1 和 好氧池硝酸盐#2 的预测数据处理

王苗苗 6 days ago
parent
commit
9b25221966

BIN
.DS_Store


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

@@ -497,6 +497,8 @@ public class BusinessEnum {
         TP(3, "出水正磷盐"),
         AD(4, "缺氧氨氮"),
         XSY(5, "缺氧硝酸盐"),
+        HY_XSY_1(6, "好氧池硝酸盐#1"),
+        HY_XSY_2(7, "好氧池硝酸盐#2"),
         ;
 
         private final Integer code;

+ 2 - 2
slibra-quartz/src/main/java/com/slibra/quartz/task/GetRealTimeData.java

@@ -36,8 +36,8 @@ public class GetRealTimeData {
 
         // 给定时间段的起始时间和结束时间
 
-        LocalDateTime startTime = LocalDateTime.parse("2025-03-04T13:00:00");
-        LocalDateTime endTime = LocalDateTime.parse("2025-03-04T13:10:00");
+        LocalDateTime startTime = LocalDateTime.parse("2025-03-19T15:00:00");
+        LocalDateTime endTime = LocalDateTime.parse("2025-03-19T16:00:00");
 
         // 每个小时的时间格式
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

+ 153 - 7
slibra-quartz/src/main/java/com/slibra/quartz/task/RyTask.java

@@ -1444,9 +1444,9 @@ public class RyTask
             }
             //2025年02月11日15:48:07 额外记录基地模型预测的值
             try {
-                this.updateJDModelPredict(tXinyiForecastComparison);
+                this.updateJDModelPredictCod(tXinyiForecastComparison);
             } catch (Exception e) {
-                log.error("处理 基地模型预测的值的时候出现异常,异常信息为{}", e.getMessage());
+                log.error("处理 基地模型cod预测的值的时候出现异常,异常信息为{}", e.getMessage());
             }
             // this.xinyiForecastComparisonService.insertTXinyiForecastComparison(tXinyiForecastComparison);
             BigDecimal cscodBzz = normConfig.getCscodBzz();
@@ -1609,6 +1609,12 @@ public class RyTask
             } catch (Exception e) {
                 log.error("调用跃渊的预测接口出现异常,异常信息为{}", e.getMessage());
             }
+            //2025年02月11日15:48:07 额外记录基地模型预测的值
+            try {
+                this.updateJDModelPredictHyXsy1(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);*/
@@ -1644,6 +1650,12 @@ public class RyTask
             } catch (Exception e) {
                 log.error("调用跃渊的预测接口出现异常,异常信息为{}", e.getMessage());
             }
+            //2025年02月11日15:48:07 额外记录基地模型预测的值
+            try {
+                this.updateJDModelPredictHyXsy2(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);*/
@@ -1819,7 +1831,11 @@ public class RyTask
             this.xinyiForecastComparisonService.insertTXinyiForecastComparison(tXinyiForecastComparison);
     }
 
-    private void updateJDModelPredict(TXinyiForecastComparison tXinyiForecastComparison) {
+    /**
+     * 额外通过计算处理要保存的预测对象-机理模型cod预测
+     * @param tXinyiForecastComparison
+     */
+    private void updateJDModelPredictCod(TXinyiForecastComparison tXinyiForecastComparison) {
         //现获取基地模型的配置 如果没有执行返回
         TPredictConf tPredictConfReq = new TPredictConf();
         tPredictConfReq.setType(BusinessEnum.JLModelPredictEnum.COD.getCode());
@@ -1836,10 +1852,10 @@ public class RyTask
         TPredictConf tPredictConf = tPredictConfs.get(0);
         BigDecimal a = Objects.isNull(tPredictConf.getA()) ? BigDecimal.valueOf(30) : tPredictConf.getA();
         BigDecimal b = Objects.isNull(tPredictConf.getB()) ? BigDecimal.valueOf(55.14) : tPredictConf.getB();
-        Integer xMin = Objects.isNull(tPredictConf.getxMin()) ? 12 : tPredictConf.getxMin();
-        Integer xMax = Objects.isNull(tPredictConf.getxMax()) ? 18 : tPredictConf.getxMax();
-        Integer y1Min = Objects.isNull(tPredictConf.getY1Min()) ? 6 : tPredictConf.getY1Min();
-        Integer y1Max = Objects.isNull(tPredictConf.getY1Max()) ? 12 : tPredictConf.getY1Max();
+        int xMin = Objects.isNull(tPredictConf.getxMin()) ? 12 : tPredictConf.getxMin();
+        int xMax = Objects.isNull(tPredictConf.getxMax()) ? 18 : tPredictConf.getxMax();
+        int y1Min = Objects.isNull(tPredictConf.getY1Min()) ? 6 : tPredictConf.getY1Min();
+        int y1Max = Objects.isNull(tPredictConf.getY1Max()) ? 12 : tPredictConf.getY1Max();
         BigDecimal x1 = Objects.isNull(tPredictConf.getX1()) ? BigDecimal.valueOf(91.85) : tPredictConf.getX1();
         //计算第一个值逻辑处理
         //计算X的值
@@ -1879,6 +1895,136 @@ public class RyTask
         }
     }
 
+
+    /**
+     * 额外通过计算处理要保存的预测对象-机理模型好氧硝酸盐#1预测
+     * @param tXinyiForecastComparison
+     */
+    private void updateJDModelPredictHyXsy1(TXinyiForecastComparison tXinyiForecastComparison) {
+        //现获取基地模型的配置 如果没有执行返回
+        TPredictConf tPredictConfReq = new TPredictConf();
+        tPredictConfReq.setType(BusinessEnum.JLModelPredictEnum.HY_XSY_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(6) : tPredictConf.getA();
+        BigDecimal b = Objects.isNull(tPredictConf.getB()) ? BigDecimal.valueOf(56.86) : tPredictConf.getB();
+        int xMin = Objects.isNull(tPredictConf.getxMin()) ? 7 : tPredictConf.getxMin();
+        int xMax = Objects.isNull(tPredictConf.getxMax()) ? 12 : tPredictConf.getxMax();
+        int y1Min = Objects.isNull(tPredictConf.getY1Min()) ? 7 : tPredictConf.getY1Min();
+        int y1Max = Objects.isNull(tPredictConf.getY1Max()) ? 12 : tPredictConf.getY1Max();
+        BigDecimal x1 = Objects.isNull(tPredictConf.getX1()) ? BigDecimal.valueOf(94.77) : tPredictConf.getX1();
+        //计算第一个值逻辑处理
+        //计算X的值
+        Date nowDate = DateUtils.getNowDate();
+        BigDecimal x = this.xinyiIndustryMapper.getAvgJSTnByDate(DateUtil.format(DateUtils.plusHour(-xMax, nowDate), DateUtils.YYYYMMDDHH_TS), DateUtil.format(DateUtils.plusHour(-xMin, nowDate), DateUtils.YYYYMMDDHH_TS));
+        //计算y1
+        BigDecimal y1 = this.xinyiRobotMapper.getAvgCSXsy1ByDate(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.getAvgJSTnByDate(DateUtil.format(DateUtils.plusHour(-xMax, nowDate), DateUtils.YYYYMMDDHH_TS), DateUtil.format(DateUtils.plusHour(-xMin, nowDate), DateUtils.YYYYMMDDHH_TS));
+        //计算y1
+        y1 = this.xinyiRobotMapper.getAvgCSXsy1ByDate(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.getAvgJSTnByDate(DateUtil.format(DateUtils.plusHour(-xMax, nowDate), DateUtils.YYYYMMDDHH_TS), DateUtil.format(DateUtils.plusHour(-xMin, nowDate), DateUtils.YYYYMMDDHH_TS));
+        //计算y1
+        y1 = this.xinyiRobotMapper.getAvgCSXsy1ByDate(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 updateJDModelPredictHyXsy2(TXinyiForecastComparison tXinyiForecastComparison) {
+        //现获取基地模型的配置 如果没有执行返回
+        TPredictConf tPredictConfReq = new TPredictConf();
+        tPredictConfReq.setType(BusinessEnum.JLModelPredictEnum.HY_XSY_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(6) : tPredictConf.getA();
+        BigDecimal b = Objects.isNull(tPredictConf.getB()) ? BigDecimal.valueOf(56.86) : tPredictConf.getB();
+        int xMin = Objects.isNull(tPredictConf.getxMin()) ? 7 : tPredictConf.getxMin();
+        int xMax = Objects.isNull(tPredictConf.getxMax()) ? 12 : tPredictConf.getxMax();
+        int y1Min = Objects.isNull(tPredictConf.getY1Min()) ? 7 : tPredictConf.getY1Min();
+        int y1Max = Objects.isNull(tPredictConf.getY1Max()) ? 12 : tPredictConf.getY1Max();
+        BigDecimal x1 = Objects.isNull(tPredictConf.getX1()) ? BigDecimal.valueOf(94.77) : tPredictConf.getX1();
+        //计算第一个值逻辑处理
+        //计算X的值
+        Date nowDate = DateUtils.getNowDate();
+        BigDecimal x = this.xinyiIndustryMapper.getAvgJSTnByDate(DateUtil.format(DateUtils.plusHour(-xMax, nowDate), DateUtils.YYYYMMDDHH_TS), DateUtil.format(DateUtils.plusHour(-xMin, nowDate), DateUtils.YYYYMMDDHH_TS));
+        //计算y1
+        BigDecimal y1 = this.xinyiRobotMapper.getAvgCSXsy2ByDate(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.getAvgJSTnByDate(DateUtil.format(DateUtils.plusHour(-xMax, nowDate), DateUtils.YYYYMMDDHH_TS), DateUtil.format(DateUtils.plusHour(-xMin, nowDate), DateUtils.YYYYMMDDHH_TS));
+        //计算y1
+        y1 = this.xinyiRobotMapper.getAvgCSXsy2ByDate(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.getAvgJSTnByDate(DateUtil.format(DateUtils.plusHour(-xMax, nowDate), DateUtils.YYYYMMDDHH_TS), DateUtil.format(DateUtils.plusHour(-xMin, nowDate), DateUtils.YYYYMMDDHH_TS));
+        //计算y1
+        y1 = this.xinyiRobotMapper.getAvgCSXsy2ByDate(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 - 2
slibra-system/src/main/java/com/slibra/business/domain/TPredictConf.java

@@ -19,8 +19,8 @@ public class TPredictConf extends BaseEntity
     /** 主键 */
     private Long id;
 
-    /** 预测类型(0出水COD 1出水氨氮 2出水总氮 3出水正磷盐 4缺氧氨氮 5缺氧硝酸盐 ) */
-    @Excel(name = "预测类型", readConverterExp = "0=出水COD,1=出水氨氮,2=出水总氮,3=出水正磷盐,4=缺氧氨氮,5=缺氧硝酸盐")
+    /** 预测类型(0出水COD 1出水氨氮 2出水总氮 3出水正磷盐 4缺氧氨氮 5缺氧硝酸盐 6好氧池硝酸盐#1 7好氧池硝酸盐#2) */
+    @Excel(name = "预测类型", readConverterExp = "0出水COD 1出水氨氮 2出水总氮 3出水正磷盐 4缺氧氨氮 5缺氧硝酸盐 6好氧池硝酸盐#1 7好氧池硝酸盐#2")
     private Integer type;
 
     /** Y1 可选择时间起始小时-最小值 */

+ 13 - 0
slibra-system/src/main/java/com/slibra/business/domain/TXinyiRobot.java

@@ -1,6 +1,7 @@
 package com.slibra.business.domain;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.AllArgsConstructor;
@@ -12,6 +13,8 @@ import org.apache.commons.lang3.builder.ToStringStyle;
 import com.slibra.common.annotation.Excel;
 import com.slibra.common.core.domain.BaseEntity;
 
+import static com.slibra.common.constant.MyConstants.NUMBER_SCALE_2;
+
 /**
  * 信义化验数据对象 t_xinyi_robot
  * 
@@ -176,4 +179,14 @@ public class TXinyiRobot
     /** 截止时间 */
     private String timeEnd;
 
+    public static void main(String[] args) {
+        BigDecimal y1 = new BigDecimal("1");
+        BigDecimal a = new BigDecimal("2");
+        BigDecimal x = new BigDecimal("6");
+        BigDecimal x1 = new BigDecimal("4");
+        BigDecimal b = new BigDecimal("5");
+        System.out.println(y1.add(a.multiply(x.subtract(x1).divide(b,NUMBER_SCALE_2, RoundingMode.HALF_UP))));
+        System.out.println(y1.add(a.multiply(x.subtract(x1)).divide(b,NUMBER_SCALE_2, RoundingMode.HALF_UP)));
+    }
+
 }

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

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

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

@@ -1,5 +1,6 @@
 package com.slibra.business.mapper;
 
+import java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.List;
 
@@ -87,4 +88,8 @@ public interface TXinyiRobotMapper
     List<ChartBasic> selectAD2ByDate(@Param("start") String dayBefore3Str, @Param("end") String nowDateStr);
 
     List<ChartBasic> selectCodByDate(@Param("start") String dayBefore3Str, @Param("end") String nowDateStr);
+
+    BigDecimal getAvgCSXsy1ByDate(@Param("dateBegin") String dateBegin, @Param("dateEnd") String dateEnd);
+
+    BigDecimal getAvgCSXsy2ByDate(@Param("dateBegin") String dateBegin, @Param("dateEnd") String dateEnd);
 }

+ 8 - 0
slibra-system/src/main/resources/mapper/business/TXinyiIndustryMapper.xml

@@ -616,4 +616,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             TEST_HOUR BETWEEN #{dateBegin}
                 AND  #{dateEnd}
     </select>
+
+
+    <select id="getAvgJSTnByDate" resultType="java.math.BigDecimal">
+        SELECT
+            avg( temp.val )
+        FROM
+            ( SELECT JS_SLQ * JS_TN / 2 / 10000 val FROM t_xinyi_industry WHERE TEST_HOUR BETWEEN #{dateBegin} AND #{dateEnd} ) temp
+    </select>
 </mapper>

+ 21 - 0
slibra-system/src/main/resources/mapper/business/TXinyiRobotMapper.xml

@@ -369,4 +369,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </where>
         order by id desc
     </select>
+
+    <select id="getAvgCSXsy1ByDate" resultType="java.math.BigDecimal">
+        SELECT
+            AVG( NO3_HLJ1_JQR )
+        FROM
+            t_xinyi_robot
+        WHERE
+            TEST_HOUR BETWEEN #{dateBegin}
+                AND  #{dateEnd}
+    </select>
+
+
+    <select id="getAvgCSXsy2ByDate" resultType="java.math.BigDecimal">
+        SELECT
+            AVG( NO3_HLJ2_JQR )
+        FROM
+            t_xinyi_robot
+        WHERE
+            TEST_HOUR BETWEEN #{dateBegin}
+                AND  #{dateEnd}
+    </select>
 </mapper>