瀏覽代碼

将put和delete提交方式改为post

xusl 2 年之前
父節點
當前提交
acd7bd8a15

+ 6 - 0
.gitignore

@@ -0,0 +1,6 @@
+/ssiLogs/
+/backend/target/
+/auditBak/
+/analysis/
+/backend/src/main/resources/static/
+/backend/target/

+ 0 - 4
backend/src/main/java/com/jiayue/ssi/entity/ForecastPowerShortTerm.java

@@ -4,14 +4,10 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
-
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import javax.validation.constraints.Digits;
 import java.math.BigDecimal;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
 import java.util.Date;
 
 

+ 171 - 0
backend/src/main/java/com/jiayue/ssi/entity/Nwp.java

@@ -0,0 +1,171 @@
+package com.jiayue.ssi.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.Digits;
+import java.math.BigDecimal;
+
+/**
+ * 数值天气预报实时数据
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2018/10/23 9:16
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName(value = "t_nwp")
+public class Nwp {
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private String id;
+
+    /**
+     * 预测时间
+     */
+    private Long preTime;
+
+    /**
+     * 场站ID
+     */
+    private String farmId;
+    /**
+     * 生成日期
+     */
+    private String scDate;
+    /**
+     * 生成时间
+     */
+    private String scTime;
+    /**
+     * 预测日期
+     */
+    private String preDate;
+
+    /**
+     * 温度
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal t = new BigDecimal(-99);
+    /**
+     * 湿度
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal rh = new BigDecimal(-99);
+    /**
+     * 气压
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal pressure = new BigDecimal(-99);
+    /**
+     * 短波辐射
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal swr = new BigDecimal(-99);
+
+    /**
+     * 长波辐射
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal lwr = new BigDecimal(-99);
+    /**
+     * 直辐射
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal directRadiation = new BigDecimal(-99);
+    /**
+     * 散辐射
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal diffuseRadiation = new BigDecimal(-99);
+    /**
+     * 热感通量
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal senf = new BigDecimal(-99);
+    /**
+     * 10米风速
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws10 = new BigDecimal(-99);
+    /**
+     * 30米风速
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws30 = new BigDecimal(-99);
+    /**
+     * 50米风速
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws50 = new BigDecimal(-99);
+    /**
+     * 70米风速
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws70 = new BigDecimal(-99);
+    /**
+     * 80米风速
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws80 = new BigDecimal(-99);
+    /**
+     * 90米风速
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws90 = new BigDecimal(-99);
+    /**
+     * 100米风速
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws100 = new BigDecimal(-99);
+    /**
+     * 170米风速
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws170 = new BigDecimal(-99);
+    /**
+     * 10米风向
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd10 = new BigDecimal(-99);
+    /**
+     * 30米风向
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd30 = new BigDecimal(-99);
+    /**
+     * 50米风向
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd50 = new BigDecimal(-99);
+    /**
+     * 70米风向
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd70 = new BigDecimal(-99);
+    /**
+     * 80米风向
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd80 = new BigDecimal(-99);
+    /**
+     * 90米风向
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd90 = new BigDecimal(-99);
+    /**
+     * 100米风向
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd100 = new BigDecimal(-99);
+    /**
+     * 170米风向
+     */
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd170 = new BigDecimal(-99);
+}

+ 16 - 0
backend/src/main/java/com/jiayue/ssi/mapper/NwpMapper.java

@@ -0,0 +1,16 @@
+package com.jiayue.ssi.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jiayue.ssi.entity.Nwp;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ *  NWPMapper
+ *
+ * @author xsl
+ * @since 2023-03-10
+ */
+@Mapper
+public interface NwpMapper extends BaseMapper<Nwp> {
+
+}

+ 23 - 0
backend/src/main/java/com/jiayue/ssi/service/NwpService.java

@@ -0,0 +1,23 @@
+package com.jiayue.ssi.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jiayue.ssi.entity.Nwp;
+
+import java.util.List;
+
+
+/**
+* 短期接口
+* @author xsl
+* @date 2023/2/16
+*/
+public interface NwpService extends IService<Nwp> {
+    /**
+     * 按时间段删除数据
+     *
+     * @param startTime
+     * @param endTime
+     * @param listNwp
+     */
+    void deleteBetweenAndPreTime(Long startTime, Long endTime, List<Nwp> listNwp);
+}

+ 148 - 157
backend/src/main/java/com/jiayue/ssi/service/impl/FileAnalysisService.java

@@ -2,9 +2,12 @@ package com.jiayue.ssi.service.impl;
 
 import cn.hutool.core.util.StrUtil;
 import com.jiayue.ssi.entity.ForecastPowerShortTerm;
+import com.jiayue.ssi.entity.Nwp;
 import com.jiayue.ssi.service.ForecastPowerShortTermService;
+import com.jiayue.ssi.service.NwpService;
 import com.jiayue.ssi.util.DateUtils;
 import com.jiayue.ssi.util.FileUtil;
+import com.jiayue.ssi.util.NumberUtils;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
@@ -17,6 +20,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.io.*;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -37,6 +41,8 @@ public class FileAnalysisService {
 
     @Autowired
     ForecastPowerShortTermService forecastPowerShortTermService;
+    @Autowired
+    NwpService nwpService;
 
     @SneakyThrows
     public void analysisJob() {
@@ -55,7 +61,7 @@ public class FileAnalysisService {
         }
         log.info("系统扫描路径【" + dirFile.getPath() + "】");
 
-        Collection<File> files = FileUtils.listFiles(dirFile, new String[]{"RB", "txt"}, false);
+        Collection<File> files = FileUtils.listFiles(dirFile, new String[]{"RB"}, false);
         String dayStr = new SimpleDateFormat("yyyyMMdd").format(new Date());//当前时间格式化为年月日
         if (files != null && files.size() > 0) {
             for (File file : files) {
@@ -102,69 +108,69 @@ public class FileAnalysisService {
                     }
 
                     //用于解析一体化数据,将解析出的数据保存短期历史表和一体化实时表
-//                    if (file.getName().startsWith("NWP")) {
-//                        try {
-//                            List<Nwp> listNwp = fileAnalysisNwp(file);
-//                            Nwp nwpData = null;
-//                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-//                            if (listNwp != null && listNwp.size() > 0) {
-//                                while (listNwp.get(listNwp.size() - 1).getPreTime() < DateTimeUtil.getMillisecondsSubDay() + 4 * 24 * 60 * 60 * 1000 - timeD) {
-//                                    nwpData = new Nwp();
-//                                    long time = 0;
-//                                    try {
-//                                        time = sdf.parse(listNwp.get(listNwp.size() - 96).getPreDate()).getTime() + 24 * 60 * 60 * 1000;
-//                                    } catch (ParseException e) {
-//                                        e.printStackTrace();
-//                                    }
-//                                    nwpData.setFarmId(listNwp.get(listNwp.size() - 96).getFarmId());
-//                                    nwpData.setScDate(listNwp.get(listNwp.size() - 96).getScDate());
-//                                    nwpData.setScTime(listNwp.get(listNwp.size() - 96).getScTime());
-//                                    nwpData.setPreDate(sdf.format(time));
-//                                    nwpData.setPreTime(listNwp.get(listNwp.size() - 1).getPreTime() + timeD);
-//                                    nwpData.setT(listNwp.get(listNwp.size() - 96).getT());//温度
-//                                    nwpData.setRh(listNwp.get(listNwp.size() - 96).getRh());//湿度
-//                                    nwpData.setPressure(listNwp.get(listNwp.size() - 96).getPressure());//气压
-//                                    nwpData.setSwr(listNwp.get(listNwp.size() - 96).getSwr());//辐射
-//                                    nwpData.setLwr(listNwp.get(listNwp.size() - 96).getLwr());//辐射
-//                                    nwpData.setDiffuseRadiation(listNwp.get(listNwp.size() - 96).getDiffuseRadiation());//散接辐射
-//                                    nwpData.setDirectRadiation(listNwp.get(listNwp.size() - 96).getDirectRadiation());//直接辐射
-//
-//                                    nwpData.setSenf(listNwp.get(listNwp.size() - 96).getSenf());//热感通量
-//
-//                                    nwpData.setWs10(listNwp.get(listNwp.size() - 96).getWs10());//10 m 风速
-//                                    nwpData.setWs30(listNwp.get(listNwp.size() - 96).getWs30());//30 m 风速
-//                                    nwpData.setWs50(listNwp.get(listNwp.size() - 96).getWs50());//50 m 风速
-//                                    nwpData.setWs70(listNwp.get(listNwp.size() - 96).getWs70());//70 m 风速
-//                                    nwpData.setWs80(listNwp.get(listNwp.size() - 96).getWs80());//80 m 风速
-//                                    nwpData.setWs90(listNwp.get(listNwp.size() - 96).getWs90());//90 m 风速
-//                                    nwpData.setWs100(listNwp.get(listNwp.size() - 96).getWs100());//100 m 风速
-//                                    nwpData.setWs170(listNwp.get(listNwp.size() - 96).getWs170());//170 m 风速
-//
-//                                    nwpData.setWd10(listNwp.get(listNwp.size() - 96).getWd10());//10 m 风向
-//                                    nwpData.setWd30(listNwp.get(listNwp.size() - 96).getWd30());//30 m 风向
-//                                    nwpData.setWd50(listNwp.get(listNwp.size() - 96).getWd50());//50 m 风向
-//                                    nwpData.setWd70(listNwp.get(listNwp.size() - 96).getWd70());//70 m 风向
-//                                    nwpData.setWd80(listNwp.get(listNwp.size() - 96).getWd80());//80 m 风向
-//                                    nwpData.setWd90(listNwp.get(listNwp.size() - 96).getWd90());//90 m 风向
-//                                    nwpData.setWd100(listNwp.get(listNwp.size() - 96).getWd100());//100 m 风向
-//                                    nwpData.setWd170(listNwp.get(listNwp.size() - 96).getWd170());//170 m 风向
-//                                    listNwp.add(nwpData);
-//                                }
-//                            } else {
-//                                flag = false;
-//                                log.info(file.getName() + "文件数据内容为空、不能正常解析 、移除该文件、执行数据修正功能");
-//                            }
-//
-//                            //保存NWP实时数据
-//                            Long startTime = listNwp.get(0).getPreTime();
-//                            Long endTime = listNwp.get(listNwp.size() - 1).getPreTime();//删除相同时间数据
-//                            nwpService.deleteBetweenAndPreTime(startTime, endTime, listNwp);
-//                            flag = true;
-//                        } catch (Exception e) {
-//                            log.error("解析NWP文件失败", e);
-//                            flag = false;
-//                        }
-//                    }
+                    if (file.getName().startsWith("NWP")) {
+                        try {
+                            List<Nwp> listNwp = fileAnalysisNwp(file);
+                            Nwp nwpData = null;
+                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                            if (listNwp != null && listNwp.size() > 0) {
+                                while (listNwp.get(listNwp.size() - 1).getPreTime() < currentDate + 4 * 24 * 60 * 60 * 1000 - timeD) {
+                                    nwpData = new Nwp();
+                                    long time = 0;
+                                    try {
+                                        time = sdf.parse(listNwp.get(listNwp.size() - 96).getPreDate()).getTime() + 24 * 60 * 60 * 1000;
+                                    } catch (ParseException e) {
+                                        e.printStackTrace();
+                                    }
+                                    nwpData.setFarmId(listNwp.get(listNwp.size() - 96).getFarmId());
+                                    nwpData.setScDate(listNwp.get(listNwp.size() - 96).getScDate());
+                                    nwpData.setScTime(listNwp.get(listNwp.size() - 96).getScTime());
+                                    nwpData.setPreDate(sdf.format(time));
+                                    nwpData.setPreTime(listNwp.get(listNwp.size() - 1).getPreTime() + timeD);
+                                    nwpData.setT(listNwp.get(listNwp.size() - 96).getT());//温度
+                                    nwpData.setRh(listNwp.get(listNwp.size() - 96).getRh());//湿度
+                                    nwpData.setPressure(listNwp.get(listNwp.size() - 96).getPressure());//气压
+                                    nwpData.setSwr(listNwp.get(listNwp.size() - 96).getSwr());//辐射
+                                    nwpData.setLwr(listNwp.get(listNwp.size() - 96).getLwr());//辐射
+                                    nwpData.setDiffuseRadiation(listNwp.get(listNwp.size() - 96).getDiffuseRadiation());//散接辐射
+                                    nwpData.setDirectRadiation(listNwp.get(listNwp.size() - 96).getDirectRadiation());//直接辐射
+
+                                    nwpData.setSenf(listNwp.get(listNwp.size() - 96).getSenf());//热感通量
+
+                                    nwpData.setWs10(listNwp.get(listNwp.size() - 96).getWs10());//10 m 风速
+                                    nwpData.setWs30(listNwp.get(listNwp.size() - 96).getWs30());//30 m 风速
+                                    nwpData.setWs50(listNwp.get(listNwp.size() - 96).getWs50());//50 m 风速
+                                    nwpData.setWs70(listNwp.get(listNwp.size() - 96).getWs70());//70 m 风速
+                                    nwpData.setWs80(listNwp.get(listNwp.size() - 96).getWs80());//80 m 风速
+                                    nwpData.setWs90(listNwp.get(listNwp.size() - 96).getWs90());//90 m 风速
+                                    nwpData.setWs100(listNwp.get(listNwp.size() - 96).getWs100());//100 m 风速
+                                    nwpData.setWs170(listNwp.get(listNwp.size() - 96).getWs170());//170 m 风速
+
+                                    nwpData.setWd10(listNwp.get(listNwp.size() - 96).getWd10());//10 m 风向
+                                    nwpData.setWd30(listNwp.get(listNwp.size() - 96).getWd30());//30 m 风向
+                                    nwpData.setWd50(listNwp.get(listNwp.size() - 96).getWd50());//50 m 风向
+                                    nwpData.setWd70(listNwp.get(listNwp.size() - 96).getWd70());//70 m 风向
+                                    nwpData.setWd80(listNwp.get(listNwp.size() - 96).getWd80());//80 m 风向
+                                    nwpData.setWd90(listNwp.get(listNwp.size() - 96).getWd90());//90 m 风向
+                                    nwpData.setWd100(listNwp.get(listNwp.size() - 96).getWd100());//100 m 风向
+                                    nwpData.setWd170(listNwp.get(listNwp.size() - 96).getWd170());//170 m 风向
+                                    listNwp.add(nwpData);
+                                }
+                            } else {
+                                flag = false;
+                                log.info(file.getName() + "文件数据内容为空、不能正常解析 、移除该文件、执行数据修正功能");
+                            }
+
+                            //保存NWP实时数据
+                            Long startTime = listNwp.get(0).getPreTime();
+                            Long endTime = listNwp.get(listNwp.size() - 1).getPreTime();//删除相同时间数据
+                            nwpService.deleteBetweenAndPreTime(startTime, endTime, listNwp);
+                            flag = true;
+                        } catch (Exception e) {
+                            log.error("解析NWP文件失败", e);
+                            flag = false;
+                        }
+                    }
 
                     if (flag) {
                         //移除文件备份到临时文件下
@@ -187,99 +193,84 @@ public class FileAnalysisService {
         }
     }
 
-//    /**
-//     * NWP解析
-//     *
-//     * @param file 文件路径
-//     * @return 样例集合
-//     */
-//    private List<Nwp> fileAnalysisNwp(File file) {
-//        List<Nwp> listNwp = new ArrayList<>();
-//        if (file.renameTo(file)) {
-//            InputStreamReader readNwp = null;
-//            BufferedReader bufferedReaderNwp = null;
-//            try {
-//                readNwp = new InputStreamReader(new FileInputStream(file), "utf-8");//考虑到编码格式
-//                bufferedReaderNwp = new BufferedReader(readNwp);
-//                String fileName = file.getName();
-//                fileName = fileName.substring(fileName.indexOf("_") + 1, fileName.lastIndexOf("."));
-//                String lineTxt;
-//                Nwp nwpData = null;
-//                BigDecimal nwpDirectRadiation = new BigDecimal(0.7); //直接辐射
-//                BigDecimal nwpDiffuseRadiation = new BigDecimal(0.3); //散接辐射
-//
-//                while ((lineTxt = bufferedReaderNwp.readLine()) != null) {
-//                    //NWP文件按照Tab方式截取
-//                    String[] datas = lineTxt.split("\t");
-//                    if (datas.length >= 35 && datas[0].startsWith("#")) {
-//                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-//                        if (datas != null && datas.length > 0) {
-//                            //过滤当天的数据
-//                            //if (sdf.parse(datas[5]).getTime() >= TimeUtils.getMillisecondsSubDay() + 24 * 60 * 60 *
-//                            // 1000) {
-//                            nwpData = new Nwp();
-//
-//                            //将截取的文件放入nwpData中
-//                            nwpData.setFarmId(datas[1]);
-//                            nwpData.setScDate(datas[2]);
-//                            nwpData.setScTime(datas[3]);
-//                            nwpData.setPreDate(datas[4]);
-//                            nwpData.setPreTime(sdf.parse(datas[5]).getTime());//采集时间 与 短期预测时间关联
-//                            nwpData.setT(NumberUtils.subtract(new BigDecimal(datas[6]), new BigDecimal(273.15)));//温度
-//
-//                            nwpData.setSenf(new BigDecimal(datas[11]).setScale(2, RoundingMode.HALF_UP));//感热
-//                            nwpData.setSwr(new BigDecimal(datas[9]).setScale(2, RoundingMode.HALF_UP));//短波辐射(相当于总辐射)
-//                            nwpData.setLwr(new BigDecimal(datas[10]).setScale(2, RoundingMode.HALF_UP));//短波辐射(相当于总辐射)
-//                            nwpData.setPressure(new BigDecimal(datas[8]).setScale(2, RoundingMode.HALF_UP));//地表气压
-//                            nwpData.setRh(new BigDecimal(datas[7]).setScale(2, RoundingMode.HALF_UP));//2m相对湿度
-//                            nwpData.setDiffuseRadiation(new BigDecimal(datas[9]).multiply(nwpDiffuseRadiation).setScale(2, RoundingMode.HALF_UP));//散接辐射
-//                            nwpData.setDirectRadiation(new BigDecimal(datas[9]).multiply(nwpDirectRadiation).setScale(2, RoundingMode.HALF_UP));//直接辐射
-//
-//                            nwpData.setWs10(new BigDecimal(datas[19]).setScale(2, RoundingMode.HALF_UP));
-//                            nwpData.setWs30(new BigDecimal(datas[20]).setScale(2, RoundingMode.HALF_UP));
-//                            nwpData.setWs50(new BigDecimal(datas[21]).setScale(2, RoundingMode.HALF_UP));
-//                            nwpData.setWs70(new BigDecimal(datas[22]).setScale(2, RoundingMode.HALF_UP));
-//                            nwpData.setWs80(new BigDecimal(datas[23]).setScale(2, RoundingMode.HALF_UP));
-//                            nwpData.setWs90(new BigDecimal(datas[24]).setScale(2, RoundingMode.HALF_UP));
-//                            nwpData.setWs100(new BigDecimal(datas[25]).setScale(2, RoundingMode.HALF_UP));
-//                            nwpData.setWs170(new BigDecimal(datas[26]).setScale(2, RoundingMode.HALF_UP));
-//                            nwpData.setWd10(new BigDecimal(datas[27]).setScale(2, RoundingMode.HALF_UP));
-//                            nwpData.setWd30(new BigDecimal(datas[28]).setScale(2, RoundingMode.HALF_UP));
-//                            nwpData.setWd50(new BigDecimal(datas[29]).setScale(2, RoundingMode.HALF_UP));
-//                            nwpData.setWd70(new BigDecimal(datas[30]).setScale(2, RoundingMode.HALF_UP));
-//                            nwpData.setWd80(new BigDecimal(datas[31]).setScale(2, RoundingMode.HALF_UP));
-//                            nwpData.setWd90(new BigDecimal(datas[32]).setScale(2, RoundingMode.HALF_UP));
-//                            nwpData.setWd100(new BigDecimal(datas[33]).setScale(2, RoundingMode.HALF_UP));
-//                            nwpData.setWd170(new BigDecimal(datas[34]).setScale(2, RoundingMode.HALF_UP));
-//                            listNwp.add(nwpData);
-//                            //}
-//                        }
-//                    }
-//                }
-//            } catch (IOException | ParseException | RuntimeException e) {
-//                log.error("系统错误:", e);
-//                // 进行告警
-//                String name = "NWP文件解析失败";
-//                String describe = "请查看NWP文件格式是否正常";
-////                String errorInfo = CommonUtil.printStackTraceToString(e);
-//                String solution = "请修改NWP文件内容";
-////                super.saveSysAlarm(SysAlarmTypeEnum.Other.name(), name, describe, SysAlarmPritorityEnum
-////                .AlarmPritorityLow.name(), errorInfo, solution);
-//                File destFile = new File(file.getPath().replaceFirst("new", "error"));
-//                if (destFile.exists()) {
-//                    destFile.delete();
-//                }
-//                try {
-//                    FileUtils.moveFile(file, destFile);
-//                } catch (IOException e1) {
-//                    log.error(file.getName() + "文件解析失败", e);
-//                }
-//            } finally {
-//                close(bufferedReaderNwp, readNwp);
-//            }
-//        }
-//        return listNwp;
-//    }
+    /**
+     * NWP解析
+     *
+     * @param file 文件路径
+     * @return 样例集合
+     */
+    private List<Nwp> fileAnalysisNwp(File file) {
+        List<Nwp> listNwp = new ArrayList<>();
+        if (file.renameTo(file)) {
+            InputStreamReader readNwp = null;
+            BufferedReader bufferedReaderNwp = null;
+            try {
+                readNwp = new InputStreamReader(new FileInputStream(file), "utf-8");//考虑到编码格式
+                bufferedReaderNwp = new BufferedReader(readNwp);
+                String lineTxt;
+                Nwp nwpData = null;
+                BigDecimal nwpDirectRadiation = new BigDecimal(0.7); //直接辐射
+                BigDecimal nwpDiffuseRadiation = new BigDecimal(0.3); //散接辐射
+
+                while ((lineTxt = bufferedReaderNwp.readLine()) != null) {
+                    //NWP文件按照Tab方式截取
+                    String[] datas = lineTxt.split("\t");
+                    if (datas.length >= 35 && datas[0].startsWith("#")) {
+                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                        if (datas != null && datas.length > 0) {
+                            //过滤当天的数据
+                            nwpData = new Nwp();
+                            //将截取的文件放入nwpData中
+                            nwpData.setFarmId(datas[1]);
+                            nwpData.setScDate(datas[2]);
+                            nwpData.setScTime(datas[3]);
+                            nwpData.setPreDate(datas[4]);
+                            nwpData.setPreTime(sdf.parse(datas[5]).getTime());//采集时间 与 短期预测时间关联
+                            nwpData.setT(NumberUtils.subtract(new BigDecimal(datas[6]), new BigDecimal(273.15)));//温度
+                            nwpData.setSenf(new BigDecimal(datas[11]).setScale(2, RoundingMode.HALF_UP));//感热
+                            nwpData.setSwr(new BigDecimal(datas[9]).setScale(2, RoundingMode.HALF_UP));//短波辐射(相当于总辐射)
+                            nwpData.setLwr(new BigDecimal(datas[10]).setScale(2, RoundingMode.HALF_UP));//短波辐射(相当于总辐射)
+                            nwpData.setPressure(new BigDecimal(datas[8]).setScale(2, RoundingMode.HALF_UP));//地表气压
+                            nwpData.setRh(new BigDecimal(datas[7]).setScale(2, RoundingMode.HALF_UP));//2m相对湿度
+                            nwpData.setDiffuseRadiation(new BigDecimal(datas[9]).multiply(nwpDiffuseRadiation).setScale(2, RoundingMode.HALF_UP));//散接辐射
+                            nwpData.setDirectRadiation(new BigDecimal(datas[9]).multiply(nwpDirectRadiation).setScale(2, RoundingMode.HALF_UP));//直接辐射
+                            nwpData.setWs10(new BigDecimal(datas[19]).setScale(2, RoundingMode.HALF_UP));
+                            nwpData.setWs30(new BigDecimal(datas[20]).setScale(2, RoundingMode.HALF_UP));
+                            nwpData.setWs50(new BigDecimal(datas[21]).setScale(2, RoundingMode.HALF_UP));
+                            nwpData.setWs70(new BigDecimal(datas[22]).setScale(2, RoundingMode.HALF_UP));
+                            nwpData.setWs80(new BigDecimal(datas[23]).setScale(2, RoundingMode.HALF_UP));
+                            nwpData.setWs90(new BigDecimal(datas[24]).setScale(2, RoundingMode.HALF_UP));
+                            nwpData.setWs100(new BigDecimal(datas[25]).setScale(2, RoundingMode.HALF_UP));
+                            nwpData.setWs170(new BigDecimal(datas[26]).setScale(2, RoundingMode.HALF_UP));
+                            nwpData.setWd10(new BigDecimal(datas[27]).setScale(2, RoundingMode.HALF_UP));
+                            nwpData.setWd30(new BigDecimal(datas[28]).setScale(2, RoundingMode.HALF_UP));
+                            nwpData.setWd50(new BigDecimal(datas[29]).setScale(2, RoundingMode.HALF_UP));
+                            nwpData.setWd70(new BigDecimal(datas[30]).setScale(2, RoundingMode.HALF_UP));
+                            nwpData.setWd80(new BigDecimal(datas[31]).setScale(2, RoundingMode.HALF_UP));
+                            nwpData.setWd90(new BigDecimal(datas[32]).setScale(2, RoundingMode.HALF_UP));
+                            nwpData.setWd100(new BigDecimal(datas[33]).setScale(2, RoundingMode.HALF_UP));
+                            nwpData.setWd170(new BigDecimal(datas[34]).setScale(2, RoundingMode.HALF_UP));
+                            listNwp.add(nwpData);
+                        }
+                    }
+                }
+            } catch (IOException | ParseException | RuntimeException e) {
+                log.error("系统错误:", e);
+                File destFile = new File(file.getPath().replaceFirst("new", "error"));
+                if (destFile.exists()) {
+                    destFile.delete();
+                }
+                try {
+                    FileUtils.moveFile(file, destFile);
+                } catch (IOException e1) {
+                    log.error(file.getName() + "文件解析失败", e);
+                }
+            } finally {
+                close(bufferedReaderNwp, readNwp);
+            }
+        }
+        return listNwp;
+    }
 
     /**
      * update文件解析

+ 40 - 0
backend/src/main/java/com/jiayue/ssi/service/impl/NwpServiceImpl.java

@@ -0,0 +1,40 @@
+package com.jiayue.ssi.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jiayue.ssi.entity.Nwp;
+import com.jiayue.ssi.mapper.NwpMapper;
+import com.jiayue.ssi.service.NwpService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.List;
+
+
+@Service
+@Slf4j
+public class NwpServiceImpl extends ServiceImpl<NwpMapper, Nwp> implements NwpService {
+  @Autowired
+  NwpMapper nwpMapper;
+
+  /**
+   * 按时间段删除数据
+   *
+   * @param startTime
+   * @param endTime
+   * @param listNwp
+   */
+  @Transactional(propagation = Propagation.REQUIRED)
+  @Override
+  public void deleteBetweenAndPreTime(Long startTime, Long endTime, List<Nwp> listNwp) {
+    QueryWrapper wrapper = new QueryWrapper<>();
+    wrapper.ge("pre_time",startTime);
+    wrapper.le("pre_time",endTime);
+    this.remove(wrapper);
+    //保存NWP数据
+    this.saveBatch(listNwp);
+  }
+
+}

+ 141 - 0
backend/src/main/java/com/jiayue/ssi/util/NumberUtils.java

@@ -0,0 +1,141 @@
+package com.jiayue.ssi.util;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.math.BigDecimal;
+
+/**
+ * 提供高精度的运算支持
+ *
+ * @author bizy
+ * @version 2.0
+ */
+@Slf4j
+public class NumberUtils {
+    private NumberUtils() {
+    }
+
+    /**
+     * 精确的加法运算.
+     *
+     * @param b1    加数
+     * @param b2    加数
+     * @param scale 运算结果小数后精确的位数
+     * @return 结果
+     */
+    public static BigDecimal add(BigDecimal b1, BigDecimal b2, int scale) {
+        return b1.add(b2).setScale(scale, BigDecimal.ROUND_HALF_UP);
+    }
+
+    /**
+     * 精确的加法运算.
+     *
+     * @param b1 加数
+     * @param b2 加数
+     * @return 保留2位小数
+     */
+    public static BigDecimal add(BigDecimal b1, BigDecimal b2) {
+        return b1.add(b2).setScale(2, BigDecimal.ROUND_HALF_UP);
+    }
+
+    /**
+     * 精确的减法运算.
+     *
+     * @param b1    被减数
+     * @param b2    减数
+     * @param scale 运算结果小数后精确的位数
+     * @return 结果
+     */
+    public static BigDecimal subtract(BigDecimal b1, BigDecimal b2, int scale) {
+        return b1.subtract(b2).setScale(scale, BigDecimal.ROUND_HALF_UP);
+    }
+
+
+    /**
+     * 精确的减法运算.
+     *
+     * @param b1 被减数
+     * @param b2 减数
+     * @return 结果 保留2位小数
+     */
+    public static BigDecimal subtract(BigDecimal b1, BigDecimal b2) {
+        return b1.subtract(b2).setScale(2, BigDecimal.ROUND_HALF_UP);
+    }
+
+    /**
+     * 提供精确的乘法运算,并对运算结果截位.
+     *
+     * @param b1    乘数
+     * @param b2    乘数
+     * @param scale 运算结果小数后精确的位数
+     * @return 结果
+     */
+    public static BigDecimal multiply(BigDecimal b1, BigDecimal b2, int scale) {
+        if (scale < 0) {
+            throw new IllegalArgumentException("The scale must be a positive integer or zero");
+        }
+        return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP);
+    }
+
+    /**
+     * 提供精确的乘法运算,并对运算结果截位.
+     *
+     * @param b1 乘数
+     * @param b2 乘数
+     * @return 结果 保留2位小数
+     */
+    public static BigDecimal multiply(BigDecimal b1, BigDecimal b2) {
+        return b1.multiply(b2).setScale(2, BigDecimal.ROUND_HALF_UP);
+    }
+
+
+    /**
+     * 提供(相对)精确的除法运算. 由scale参数指定精度,以后的数字四舍五入.
+     *
+     * @param b1    被除数
+     * @param b2    除数
+     * @param scale 表示表示需要精确到小数点以后几位
+     * @return 结果
+     */
+    public static BigDecimal divide(BigDecimal b1, BigDecimal b2, int scale) {
+        if (scale < 0) {
+            throw new IllegalArgumentException("The scale must be a positive integer or zero");
+        }
+        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP);
+    }
+
+    /**
+     * 提供(相对)精确的除法运算. 由scale参数指定精度,以后的数字四舍五入.
+     *
+     * @param b1 被除数
+     * @param b2 除数
+     * @return 结果 保留2位小数
+     */
+    public static BigDecimal divide(BigDecimal b1, BigDecimal b2) {
+        return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);
+    }
+
+    /**
+     * 提供精确的小数位四舍五入处理.
+     *
+     * @param b     需要四舍五入的数字
+     * @param scale 小数点后保留几位
+     * @return TODO
+     */
+    public static BigDecimal round(BigDecimal b, int scale) {
+        if (scale < 0) {
+            throw new IllegalArgumentException("The scale must be a positive integer or zero");
+        }
+        return b.setScale(scale, BigDecimal.ROUND_HALF_UP);
+    }
+
+    /**
+     * 提供精确的小数位四舍五入处理.
+     *
+     * @param b 需要四舍五入的数字
+     * @return 保留2位小数
+     */
+    public static BigDecimal round(BigDecimal b) {
+        return b.setScale(2, BigDecimal.ROUND_HALF_UP);
+    }
+}

+ 1 - 0
ui/.gitignore

@@ -15,3 +15,4 @@ tests/**/coverage/
 *.njsproj
 *.sln
 /src/main/resources/static/
+/target/

File diff suppressed because it is too large
+ 503 - 289
ui/yarn.lock


Some files were not shown because too many files changed in this diff