Browse Source

feat: 增加光伏气象资源数据查询导出接口

- 新增 PvMeteorologicalResourceData 查询接口返回气象数据表原始数据
- 新增导出功能
- 新增 PvMeteorologicalResourceDataQuery 和 VO 类
taosj 1 month ago
parent
commit
564bfc890e

+ 77 - 0
forecast-backend-server/src/main/java/com/ufo/project/data/controller/DataController.java

@@ -1,5 +1,6 @@
 package com.ufo.project.data.controller;
 
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.time.Instant;
 import java.time.ZoneOffset;
@@ -23,6 +24,8 @@ import com.ufo.base.framework.web.page.TableDataInfo;
 import com.ufo.base.common.utils.poi.ExcelUtil;
 import com.ufo.project.data.domain.IrradiancePowerComparisonQuery;
 import com.ufo.project.data.domain.vo.IrradiancePowerComparisonVO;
+import com.ufo.project.data.domain.vo.PvMeteorologicalResourceDataQuery;
+import com.ufo.project.data.domain.vo.PvMeteorologicalResourceDataVO;
 import com.ufo.project.data.domain.vo.PvPlantCumulativeReportQuery;
 import com.ufo.project.data.domain.vo.PvPlantCumulativeReportVO;
 import com.ufo.project.data.domain.vo.ShortTermPowerForecastReportQuery;
@@ -175,6 +178,80 @@ public class DataController extends BaseController
         util.exportExcel(response, list, "光伏电场累计报表");
     }
 
+    /**
+     * 光伏气象资源数据
+     */
+    @PreAuthorize("@ss.hasPermi('data:pvMeteorologicalResourceData:list')")
+    @PostMapping("/pvMeteorologicalResourceData")
+    public TableDataInfo pvMeteorologicalResourceData(@RequestBody PvMeteorologicalResourceDataQuery query)
+    {
+        List<PvMeteorologicalResourceDataVO> list = buildMeteorologicalList(
+                query.getEntityId(), query.getStartTime(), query.getEndTime());
+        return getDataTable(list);
+    }
+
+    /**
+     * 光伏气象资源数据导出
+     */
+    @PreAuthorize("@ss.hasPermi('data:pvMeteorologicalResourceData:export')")
+    @Log(title = "光伏气象资源数据", businessType = BusinessType.EXPORT)
+    @PostMapping("/pvMeteorologicalResourceData/export")
+    public void pvMeteorologicalResourceDataExport(HttpServletResponse response,
+            @RequestBody PvMeteorologicalResourceDataQuery query)
+    {
+        List<PvMeteorologicalResourceDataVO> list = buildMeteorologicalList(
+                query.getEntityId(), query.getStartTime(), query.getEndTime());
+        ExcelUtil<PvMeteorologicalResourceDataVO> util = new ExcelUtil<>(PvMeteorologicalResourceDataVO.class);
+        util.exportExcel(response, list, "光伏气象资源数据");
+    }
+
+    /**
+     * 构建气象资源数据列表
+     */
+    private List<PvMeteorologicalResourceDataVO> buildMeteorologicalList(String entityId, String startTime, String endTime)
+    {
+        Long stationId = parseLong(entityId);
+        String startStr = formatOffsetDateTimeDay(startTime);
+        String endStr = formatOffsetDateTimeDay(endTime);
+        List<DataWeatherLocal> list = weatherLocalService.selectWeatherFieldsByTimeRange(stationId, startStr, endStr);
+        if (list == null || list.isEmpty()) return new ArrayList<>();
+
+        List<PvMeteorologicalResourceDataVO> result = new ArrayList<>();
+        for (DataWeatherLocal item : list)
+        {
+            if (item.getTm() == null) continue;
+            PvMeteorologicalResourceDataVO vo = new PvMeteorologicalResourceDataVO();
+            vo.setTime(new java.text.SimpleDateFormat("yyyy-MM-dd").format(item.getTm()));
+            vo.setTotalIrradiation(toDecimal(item.getIrradiance()));
+            vo.setBoardTemperature(toDecimal(item.getBoardTemperature()));
+            vo.setWindSpeed(toDecimal(item.getWindSpeed()));
+            vo.setWindDirection(toDecimal(item.getWindDirection()));
+            vo.setTemperature(toDecimal(item.getTemperature()));
+            vo.setHumidity(toDecimal(item.getHumidity()));
+            vo.setPressure(toDecimal(item.getPressure()));
+            result.add(vo);
+        }
+        return result;
+    }
+
+    /**
+     * 将 Double 转为 BigDecimal,null 时返回 0
+     */
+    private BigDecimal toDecimal(Double value)
+    {
+        if (value == null) return BigDecimal.ZERO;
+        return new BigDecimal(value);
+    }
+
+    /**
+     * 将 yyyy-MM-dd 转换为 ISO 8601 格式的当天起止时间(+08:00)
+     */
+    private String formatOffsetDateTimeDay(String dateStr)
+    {
+        if (dateStr == null || dateStr.isEmpty()) return dateStr;
+        return dateStr + "T00:00:00+08:00";
+    }
+
     /**
      * 构建对比数据列表
      */

+ 54 - 0
forecast-backend-server/src/main/java/com/ufo/project/data/domain/vo/PvMeteorologicalResourceDataQuery.java

@@ -0,0 +1,54 @@
+package com.ufo.project.data.domain.vo;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 光伏气象资源数据查询参数
+ *
+ * @author ufo
+ * @date 2026-09-08
+ */
+public class PvMeteorologicalResourceDataQuery
+{
+    /** 站点/场站 id */
+    @NotBlank(message = "站点id不能为空")
+    private String entityId;
+
+    /** 开始时间 yyyy-MM-dd */
+    @NotBlank(message = "开始时间不能为空")
+    private String startTime;
+
+    /** 结束时间 yyyy-MM-dd */
+    @NotBlank(message = "结束时间不能为空")
+    private String endTime;
+
+    public String getEntityId()
+    {
+        return entityId;
+    }
+
+    public void setEntityId(String entityId)
+    {
+        this.entityId = entityId;
+    }
+
+    public String getStartTime()
+    {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime)
+    {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime()
+    {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime)
+    {
+        this.endTime = endTime;
+    }
+}

+ 128 - 0
forecast-backend-server/src/main/java/com/ufo/project/data/domain/vo/PvMeteorologicalResourceDataVO.java

@@ -0,0 +1,128 @@
+package com.ufo.project.data.domain.vo;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import com.ufo.base.framework.aspectj.lang.annotation.Excel;
+
+/**
+ * 光伏气象资源数据视图对象
+ *
+ * @author ufo
+ * @date 2026-09-08
+ */
+public class PvMeteorologicalResourceDataVO implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 时间(yyyy-MM-dd) */
+    @Excel(name = "时间")
+    private String time;
+
+    /** 总辐照度 W/m² */
+    @Excel(name = "总辐照度(W/m²)")
+    private BigDecimal totalIrradiation;
+
+    /** 组件温度 ℃ */
+    @Excel(name = "组件温度(℃)")
+    private BigDecimal boardTemperature;
+
+    /** 风速 m/s */
+    @Excel(name = "风速(m/s)")
+    private BigDecimal windSpeed;
+
+    /** 风向 度 */
+    @Excel(name = "风向(度)")
+    private BigDecimal windDirection;
+
+    /** 温度 ℃ */
+    @Excel(name = "温度(℃)")
+    private BigDecimal temperature;
+
+    /** 湿度 %RH */
+    @Excel(name = "湿度(%RH)")
+    private BigDecimal humidity;
+
+    /** 气压 hPa */
+    @Excel(name = "气压(hPa)")
+    private BigDecimal pressure;
+
+    public String getTime()
+    {
+        return time;
+    }
+
+    public void setTime(String time)
+    {
+        this.time = time;
+    }
+
+    public BigDecimal getTotalIrradiation()
+    {
+        return totalIrradiation;
+    }
+
+    public void setTotalIrradiation(BigDecimal totalIrradiation)
+    {
+        this.totalIrradiation = totalIrradiation;
+    }
+
+    public BigDecimal getBoardTemperature()
+    {
+        return boardTemperature;
+    }
+
+    public void setBoardTemperature(BigDecimal boardTemperature)
+    {
+        this.boardTemperature = boardTemperature;
+    }
+
+    public BigDecimal getWindSpeed()
+    {
+        return windSpeed;
+    }
+
+    public void setWindSpeed(BigDecimal windSpeed)
+    {
+        this.windSpeed = windSpeed;
+    }
+
+    public BigDecimal getWindDirection()
+    {
+        return windDirection;
+    }
+
+    public void setWindDirection(BigDecimal windDirection)
+    {
+        this.windDirection = windDirection;
+    }
+
+    public BigDecimal getTemperature()
+    {
+        return temperature;
+    }
+
+    public void setTemperature(BigDecimal temperature)
+    {
+        this.temperature = temperature;
+    }
+
+    public BigDecimal getHumidity()
+    {
+        return humidity;
+    }
+
+    public void setHumidity(BigDecimal humidity)
+    {
+        this.humidity = humidity;
+    }
+
+    public BigDecimal getPressure()
+    {
+        return pressure;
+    }
+
+    public void setPressure(BigDecimal pressure)
+    {
+        this.pressure = pressure;
+    }
+}