From 206165fb4ec34ffcedfbd904c10c557648bd1f3d Mon Sep 17 00:00:00 2001 From: hekaiyu <13673834656@163.com> Date: Wed, 10 Dec 2025 18:03:12 +0800 Subject: [PATCH] =?UTF-8?q?T1H=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/base/entity/WeatherData.java | 6 ++ .../controller/WeatherDataController.java | 34 +++++++++-- .../java/org/jeecg/job/DownloadT1hJob.java | 26 ++++---- .../org/jeecg/service/WeatherDataService.java | 8 +-- .../service/impl/WeatherDataServiceImpl.java | 59 +++++++++++-------- 5 files changed, 87 insertions(+), 46 deletions(-) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/WeatherData.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/WeatherData.java index d66af6c..cd2cafb 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/WeatherData.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/WeatherData.java @@ -86,4 +86,10 @@ public class WeatherData implements Serializable { */ @TableField(value = "share_index") private Integer shareIndex; + + /** + * 日期批次 + */ + @TableField(value = "time_batch") + private String timeBatch; } \ No newline at end of file diff --git a/jeecg-module-weather/src/main/java/org/jeecg/controller/WeatherDataController.java b/jeecg-module-weather/src/main/java/org/jeecg/controller/WeatherDataController.java index 845e210..4169e88 100644 --- a/jeecg-module-weather/src/main/java/org/jeecg/controller/WeatherDataController.java +++ b/jeecg-module-weather/src/main/java/org/jeecg/controller/WeatherDataController.java @@ -1,5 +1,6 @@ package org.jeecg.controller; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.v3.oas.annotations.Operation; import jakarta.annotation.Resource; @@ -8,6 +9,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.common.constant.enums.WeatherDataSourceEnum; import org.jeecg.common.constant.enums.WeatherFileSuffixEnum; import org.jeecg.common.system.query.PageRequest; import org.jeecg.job.DownloadT1hJob; @@ -22,6 +24,7 @@ import org.springframework.web.bind.annotation.*; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; +import java.util.stream.Collectors; @Slf4j @Validated @@ -68,6 +71,24 @@ public class WeatherDataController { return Result.ok(resultVo); } } + /** + * 查询批次列表 + * @return + */ + @AutoLog(value = "查询批次列表") + @Operation(summary = "查询批次列表") + @GetMapping(value = "getTimeBatch") + public Result getTimeBatch() { + List timeBatchList = weatherDataService + .list(new LambdaQueryWrapper() + .select(WeatherData::getTimeBatch) // 只查询需要的字段 + .eq(WeatherData::getDataSource, WeatherDataSourceEnum.T1H.getKey())) + .stream() + .map(WeatherData::getTimeBatch) + .distinct() + .collect(Collectors.toList()); + return Result.OK(timeBatchList); + } /** * 气象预测 @@ -78,9 +99,10 @@ public class WeatherDataController { @GetMapping(value = "getWeatherData") public Result getWeatherData(Integer dataType, Integer weatherType, + String timeBatch, @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime, int hour) { - return Result.OK(weatherDataService.getWeatherData(dataType, weatherType, startTime, hour)); + return Result.OK(weatherDataService.getWeatherData(dataType, weatherType, timeBatch, startTime, hour)); } /** @@ -90,8 +112,8 @@ public class WeatherDataController { @AutoLog(value = "气象预测-气象预览") @Operation(summary = "气象预测-气象预览") @GetMapping(value = "getWeatherDataPreview") - public Result getWeatherDataPreview(String weatherId,Integer weatherType) { - return Result.OK(weatherDataService.getWeatherDataPreview(weatherId, weatherType)); + public Result getWeatherDataPreview(String weatherId,Integer weatherType, String timeBatch) { + return Result.OK(weatherDataService.getWeatherDataPreview(weatherId, weatherType,timeBatch)); } /** @@ -102,11 +124,12 @@ public class WeatherDataController { @Operation(summary = "气象预测-气象折线图") @GetMapping(value = "getDataLine") public Result getDataLine(Integer dataType, + String timeBatch, @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime, @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime, double longitude, double latitude) { - return Result.OK(weatherDataService.getDataLine(dataType,startTime,endTime,longitude,latitude)); + return Result.OK(weatherDataService.getDataLine(dataType,timeBatch,startTime,endTime,longitude,latitude)); } /** @@ -117,11 +140,12 @@ public class WeatherDataController { @Operation(summary = "气象预测-风场玫瑰图") @GetMapping(value = "getWindRose") public Result getWindRose(Integer dataType, + String timeBatch, @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime, @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime, double longitude, double latitude) { - return Result.OK(weatherDataService.getWindRose(dataType,startTime,endTime,longitude,latitude)); + return Result.OK(weatherDataService.getWindRose(dataType,timeBatch,startTime,endTime,longitude,latitude)); } @AutoLog(value = "删除气象数据") diff --git a/jeecg-module-weather/src/main/java/org/jeecg/job/DownloadT1hJob.java b/jeecg-module-weather/src/main/java/org/jeecg/job/DownloadT1hJob.java index 5683bcc..fb78e8b 100644 --- a/jeecg-module-weather/src/main/java/org/jeecg/job/DownloadT1hJob.java +++ b/jeecg-module-weather/src/main/java/org/jeecg/job/DownloadT1hJob.java @@ -51,9 +51,9 @@ public class DownloadT1hJob { // 第二阶段:合并文件 mergeT1hFiles(baseTime); // 合并后删除原始文件 - Arrays.stream(new File(getFullPath(t1hDownloadProperties.getT1hPath())).listFiles()).filter(File::isFile).forEach(File::delete); + Arrays.stream(new File(getFullPath(t1hDownloadProperties.getT1hPath(), baseTime)).listFiles()).filter(File::isFile).forEach(File::delete); // 更新气象文件信息 - saveWeatherData(); + saveWeatherData(baseTime); log.info("T1H文件下载任务执行完成"); } catch (Exception e) { log.error("T1H文件下载任务执行失败", e); @@ -88,8 +88,8 @@ public class DownloadT1hJob { ProcessBuilder processBuilder = new ProcessBuilder( "python", getPythonScriptPath(t1hDownloadProperties.getMergeT1hPy()), - "--indir", getFullPath(t1hDownloadProperties.getT1hPath()), - "--output_dir", getFullPath(systemStorageProperties.getT1h()), + "--indir", getFullPath(t1hDownloadProperties.getT1hPath(), baseTime), + "--output_dir", getFullPath(systemStorageProperties.getT1h(), baseTime), "--variables", String.join(",", variables), "--forecast_times", String.join(",", forecastTimes), "--base_date", baseTime @@ -98,7 +98,7 @@ public class DownloadT1hJob { ExecutePyUtils.executePythonProcess(processBuilder, "文件合并"); } - private void saveWeatherData(){ + private void saveWeatherData(String baseTime){ //删除一个月前的文件 LocalDateTime oneMonthAgo = LocalDateTime.now().minusMonths(1); List weatherDatas = weatherDataService.list(new LambdaQueryWrapper().lt(WeatherData::getDataStartTime, oneMonthAgo)); @@ -114,7 +114,7 @@ public class DownloadT1hJob { // 删除数据库记录 weatherDataService.remove(new LambdaQueryWrapper().eq(WeatherData::getDataSource, WeatherDataSourceEnum.T1H.getKey())); // 读取目录文件信息 - List weatherFileInfos = readFolderFiles(getFullPath(systemStorageProperties.getT1h())); + List weatherFileInfos = readFolderFiles(baseTime); //保存文件信息 weatherDataService.saveBatch(weatherFileInfos); } @@ -140,7 +140,7 @@ public class DownloadT1hJob { getPythonScriptPath(t1hDownloadProperties.getDownloadT1hPy()), "--base-time", baseTime, "--element", element, - "--output-dir", getFullPath(t1hDownloadProperties.getT1hPath()), + "--output-dir", getFullPath(t1hDownloadProperties.getT1hPath(), baseTime), "--forecast-hours", forecastHours, "--auth-token", t1hDownloadProperties.getT1hKey(), "--data-type", t1hDownloadProperties.getDataType() @@ -164,18 +164,19 @@ public class DownloadT1hJob { return forecastTimes; } - public List readFolderFiles(String folderPath) { + public List readFolderFiles(String baseTime) { + String folderPath = getFullPath(systemStorageProperties.getT1h(), baseTime); try (Stream paths = Files.list(Paths.get(folderPath))) { return paths.filter(Files::isRegularFile) .map(Path::toFile) - .map(this::extractFileInfo) + .map(file -> extractFileInfo(file, baseTime)) .collect(Collectors.toList()); } catch (IOException e) { throw new RuntimeException("读取文件夹失败: " + folderPath, e); } } - private WeatherData extractFileInfo(File file) { + private WeatherData extractFileInfo(File file, String baseTime) { WeatherData data = new WeatherData(); data.setFileName(file.getName()); data.setFileSize((double) file.length() / 1024 / 1024); // MB @@ -186,6 +187,7 @@ public class DownloadT1hJob { data.setCreateTime(new Date()); data.setMd5Value(calculateMD5(file.getAbsolutePath())); data.setShareTotal(1); + data.setTimeBatch(baseTime); return data; } @@ -218,8 +220,8 @@ public class DownloadT1hJob { /** * 获取完整路径 */ - private String getFullPath(String relativePath) { - return systemStorageProperties.getRootPath() + File.separator + relativePath; + private String getFullPath(String relativePath, String baseTime) { + return systemStorageProperties.getRootPath() + File.separator + relativePath + File.separator + baseTime; } /** diff --git a/jeecg-module-weather/src/main/java/org/jeecg/service/WeatherDataService.java b/jeecg-module-weather/src/main/java/org/jeecg/service/WeatherDataService.java index b650e7d..da7aaa7 100644 --- a/jeecg-module-weather/src/main/java/org/jeecg/service/WeatherDataService.java +++ b/jeecg-module-weather/src/main/java/org/jeecg/service/WeatherDataService.java @@ -11,10 +11,10 @@ import java.util.List; public interface WeatherDataService extends IService { - WeatherResultVO getWeatherData(Integer dataType, Integer weatherType, LocalDateTime startTime, int hour); - WeatherResultVO getWeatherDataPreview(String weatherId, Integer weatherType); - WindDataLineVO getDataLine(Integer dataType, LocalDateTime startTime, LocalDateTime endTime, double longitude, double latitude); - List getWindRose(Integer dataType, LocalDateTime startTime, LocalDateTime endTime,double longitude, double latitude); + WeatherResultVO getWeatherData(Integer dataType, Integer weatherType, String timeBatch, LocalDateTime startTime, int hour); + WeatherResultVO getWeatherDataPreview(String weatherId, Integer weatherType, String timeBatch); + WindDataLineVO getDataLine(Integer dataType, String timeBatch, LocalDateTime startTime, LocalDateTime endTime, double longitude, double latitude); + List getWindRose(Integer dataType, String timeBatch, LocalDateTime startTime, LocalDateTime endTime,double longitude, double latitude); /** * 分页查询气象数据 diff --git a/jeecg-module-weather/src/main/java/org/jeecg/service/impl/WeatherDataServiceImpl.java b/jeecg-module-weather/src/main/java/org/jeecg/service/impl/WeatherDataServiceImpl.java index 73ba899..3435c1f 100644 --- a/jeecg-module-weather/src/main/java/org/jeecg/service/impl/WeatherDataServiceImpl.java +++ b/jeecg-module-weather/src/main/java/org/jeecg/service/impl/WeatherDataServiceImpl.java @@ -71,22 +71,22 @@ public class WeatherDataServiceImpl extends ServiceImpl weatherDataList = weatherDataMapper.selectList(new LambdaQueryWrapper(). - between(WeatherData::getDataStartTime, startTime, endTime).eq(WeatherData::getDataSource,dataType)); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.between(WeatherData::getDataStartTime, startTime, endTime).eq(WeatherData::getDataSource,dataType); + if(StringUtils.isNotBlank(timeBatch)){ + queryWrapper.eq(WeatherData::getTimeBatch, timeBatch); + } + List weatherDataList = weatherDataMapper.selectList(queryWrapper); + if (weatherDataList == null || weatherDataList.isEmpty()) { throw new IllegalArgumentException("时间范围内没有气象数据"); } @@ -228,19 +233,19 @@ public class WeatherDataServiceImpl extends ServiceImpl getWindRose(Integer dataType, LocalDateTime startTime, LocalDateTime endTime, + public List getWindRose(Integer dataType, String timeBatch, LocalDateTime startTime, LocalDateTime endTime, double longitude, double latitude) { // 参数校验 if (startTime == null || endTime == null || startTime.isAfter(endTime)) { throw new IllegalArgumentException("时间参数无效"); } - List weatherDataList = weatherDataMapper.selectList( - new LambdaQueryWrapper() - .between(WeatherData::getDataStartTime, startTime, endTime) - .eq(WeatherData::getDataSource, dataType) - ); - + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.between(WeatherData::getDataStartTime, startTime, endTime).eq(WeatherData::getDataSource, dataType); + if(StringUtils.isNotBlank(timeBatch)){ + queryWrapper.eq(WeatherData::getTimeBatch, timeBatch); + } + List weatherDataList = weatherDataMapper.selectList(queryWrapper); if (weatherDataList == null || weatherDataList.isEmpty()) { throw new IllegalArgumentException("时间范围内没有气象数据"); } @@ -718,9 +723,13 @@ public class WeatherDataServiceImpl extends ServiceImpl weatherDataList = weatherDataMapper.selectList(new LambdaQueryWrapper(). - eq(WeatherData::getDataStartTime, targetTime).eq(WeatherData::getDataSource,dataTypeEnum.getKey())); + private WeatherResultVO processWeatherData(Integer weatherType, String timeBatch, LocalDateTime targetTime, WeatherDataSourceEnum dataTypeEnum) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(WeatherData::getDataStartTime, targetTime).eq(WeatherData::getDataSource,dataTypeEnum.getKey()); + if(StringUtils.isNotBlank(timeBatch)){ + queryWrapper.eq(WeatherData::getTimeBatch, timeBatch); + } + List weatherDataList = weatherDataMapper.selectList(queryWrapper); WeatherResultVO weatherResultVO = new WeatherResultVO(); String filePath = getWeatherFilePath(weatherDataList, targetTime); validateFile(filePath);