From c17bf6fd08c078dfb3c20d27ab4a7a7fb2453616 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 5 Aug 2026 17:12:47 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0excel=E7=BB=BC?= =?UTF-8?q?=E5=90=88=E5=AF=BC=E5=87=BA=E5=9D=9D=E4=B8=8A=E3=80=81=E5=9D=9D?= =?UTF-8?q?=E4=B8=8B=E6=B0=B4=E4=BD=8D=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_export/domain/SdHydropwR.java | 89 +++++++++++++++++++ .../qgc_export/domain/SdHydropwdayS.java | 72 +++++++++++++++ .../qgc_export/mapper/SdHydropwRMapper.java | 28 ++++++ .../mapper/SdHydropwdaySMapper.java | 28 ++++++ .../qgc_export/processor/DzProcessor.java | 20 +++++ .../processor/DzVariationProcessor.java | 25 ++++++ .../processor/ExportIndicatorProcessor.java | 1 + .../processor/HydropwIndicatorProcessor.java | 69 ++++++++++++++ .../qgc_export/processor/RzProcessor.java | 20 +++++ .../processor/RzVariationProcessor.java | 25 ++++++ .../service/impl/QgcExportServiceImpl.java | 60 ++++++++++++- .../mapper/qgc_export/SdHydropwRMapper.xml | 23 +++++ .../mapper/qgc_export/SdHydropwdaySMapper.xml | 23 +++++ 13 files changed, 480 insertions(+), 3 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_export/domain/SdHydropwR.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_export/domain/SdHydropwdayS.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_export/mapper/SdHydropwRMapper.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_export/mapper/SdHydropwdaySMapper.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_export/processor/DzProcessor.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_export/processor/DzVariationProcessor.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_export/processor/HydropwIndicatorProcessor.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_export/processor/RzProcessor.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_export/processor/RzVariationProcessor.java create mode 100644 backend/src/main/resources/mapper/qgc_export/SdHydropwRMapper.xml create mode 100644 backend/src/main/resources/mapper/qgc_export/SdHydropwdaySMapper.xml diff --git a/backend/src/main/java/com/yfd/platform/qgc_export/domain/SdHydropwR.java b/backend/src/main/java/com/yfd/platform/qgc_export/domain/SdHydropwR.java new file mode 100644 index 00000000..7264ddcc --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_export/domain/SdHydropwR.java @@ -0,0 +1,89 @@ +package com.yfd.platform.qgc_export.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 电站运行数据表(小时级) + * 对应 Oracle 表: QGC_REFA.SD_HYDROPW_R + */ +@Data +@TableName("SD_HYDROPW_R") +public class SdHydropwR implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.INPUT) + private String id; + + /** 水电工程编码 */ + private String stcd; + + /** 数据时间 */ + private Date tm; + + /** 坝上水位 (m) */ + private BigDecimal rz; + + /** 蓄水量 */ + private BigDecimal w; + + /** 坝下水位 (m) */ + private BigDecimal dz; + + /** 入库流量 */ + private BigDecimal qi; + + /** 出库流量 */ + private BigDecimal qo; + + /** 发电流量 */ + private BigDecimal qn; + + /** 泄洪流量 */ + private BigDecimal qgt; + + /** 生态流量 */ + private BigDecimal qec; + + /** 灌溉流量 */ + private BigDecimal qc; + + /** 发电量 */ + private BigDecimal ge; + + /** 平均出力 */ + private BigDecimal na; + + /** 生态流量是否达标 */ + private Integer sfdb; + + /** 泄洪水量 */ + private BigDecimal gtw; + + /** 发电水量 */ + private BigDecimal wge; + + /** 区间流量 */ + private BigDecimal qr; + + /** 耗水率 */ + private BigDecimal wr; + + /** 记录人等... */ + private String recordUser; + private Date recordTime; + private String modifyUser; + private Date modifyTime; + private Integer isDeleted; + private String deleteUser; + private Date deleteTime; + private String fid; + private String remark; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_export/domain/SdHydropwdayS.java b/backend/src/main/java/com/yfd/platform/qgc_export/domain/SdHydropwdayS.java new file mode 100644 index 00000000..85b5f78d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_export/domain/SdHydropwdayS.java @@ -0,0 +1,72 @@ +package com.yfd.platform.qgc_export.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 电站运行数据日统计表 + * 对应 Oracle 表: QGC_REFA.SD_HYDROPWDAY_S + */ +@Data +@TableName("SD_HYDROPWDAY_S") +public class SdHydropwdayS implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.INPUT) + private String id; + + /** 水电工程编码 */ + private String stcd; + + /** 时间 */ + private Date dt; + + /** 坝上水位 (m) */ + private BigDecimal rz; + + /** 蓄水量 */ + private BigDecimal w; + + /** 坝下水位 (m) */ + private BigDecimal dz; + + /** 入库流量 */ + private BigDecimal qi; + + /** 出库流量 */ + private BigDecimal qo; + + /** 发电流量 */ + private BigDecimal qn; + + /** 泄洪流量 */ + private BigDecimal qgt; + + /** 生态流量 */ + private BigDecimal qec; + + /** 灌溉流量 */ + private BigDecimal qc; + + /** 发电量 */ + private BigDecimal ge; + + /** 平均出力 */ + private BigDecimal na; + + /** 记录人等... */ + private String recordUser; + private Date recordTime; + private String modifyUser; + private Date modifyTime; + private Integer isDeleted; + private String deleteUser; + private Date deleteTime; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_export/mapper/SdHydropwRMapper.java b/backend/src/main/java/com/yfd/platform/qgc_export/mapper/SdHydropwRMapper.java new file mode 100644 index 00000000..6b8faf0e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_export/mapper/SdHydropwRMapper.java @@ -0,0 +1,28 @@ +package com.yfd.platform.qgc_export.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.qgc_export.domain.SdHydropwR; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * SD_HYDROPW_R 电站运行小时数据 Mapper + */ +public interface SdHydropwRMapper extends BaseMapper { + + /** + * 批量查询测站在指定时间范围内的原始小时数据(动态字段) + * + * @param stcdList 测站编码列表 + * @param fieldName 查询字段名(RZ/DZ) + * @param startTime 起始时间 + * @param endTime 结束时间 + * @return [STCD, TM, VALUE] + */ + List> selectRawData(@Param("stcdList") List stcdList, + @Param("fieldName") String fieldName, + @Param("startTime") String startTime, + @Param("endTime") String endTime); +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_export/mapper/SdHydropwdaySMapper.java b/backend/src/main/java/com/yfd/platform/qgc_export/mapper/SdHydropwdaySMapper.java new file mode 100644 index 00000000..5757b572 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_export/mapper/SdHydropwdaySMapper.java @@ -0,0 +1,28 @@ +package com.yfd.platform.qgc_export.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.qgc_export.domain.SdHydropwdayS; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * SD_HYDROPWDAY_S 电站运行日数据 Mapper + */ +public interface SdHydropwdaySMapper extends BaseMapper { + + /** + * 批量查询测站在指定时间范围内的原始日数据(动态字段) + * + * @param stcdList 测站编码列表 + * @param fieldName 查询字段名(RZ/DZ) + * @param startTime 起始时间 + * @param endTime 结束时间 + * @return [STCD, DT, VALUE] + */ + List> selectRawData(@Param("stcdList") List stcdList, + @Param("fieldName") String fieldName, + @Param("startTime") String startTime, + @Param("endTime") String endTime); +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_export/processor/DzProcessor.java b/backend/src/main/java/com/yfd/platform/qgc_export/processor/DzProcessor.java new file mode 100644 index 00000000..83a8c58e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_export/processor/DzProcessor.java @@ -0,0 +1,20 @@ +package com.yfd.platform.qgc_export.processor; + +import org.springframework.stereotype.Component; + +/** + * 坝下水位(DZ) 标准格式处理器 + */ +@Component +public class DzProcessor extends HydropwIndicatorProcessor { + + @Override + public String getFieldName() { + return "DZ"; + } + + @Override + public String getSheetName() { + return "坝下水位"; + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_export/processor/DzVariationProcessor.java b/backend/src/main/java/com/yfd/platform/qgc_export/processor/DzVariationProcessor.java new file mode 100644 index 00000000..f34ce869 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_export/processor/DzVariationProcessor.java @@ -0,0 +1,25 @@ +package com.yfd.platform.qgc_export.processor; + +import org.springframework.stereotype.Component; + +/** + * 坝下水位(DZ) 日变幅格式处理器 + */ +@Component +public class DzVariationProcessor extends HydropwIndicatorProcessor { + + @Override + public String getFieldName() { + return "DZ"; + } + + @Override + public String getSheetName() { + return "坝下水位日变幅"; + } + + @Override + public boolean isVariation() { + return true; + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_export/processor/ExportIndicatorProcessor.java b/backend/src/main/java/com/yfd/platform/qgc_export/processor/ExportIndicatorProcessor.java index 997e411b..c24728f9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_export/processor/ExportIndicatorProcessor.java +++ b/backend/src/main/java/com/yfd/platform/qgc_export/processor/ExportIndicatorProcessor.java @@ -26,6 +26,7 @@ public interface ExportIndicatorProcessor { *
  • V/Q/Z 河道水情 → "ZQ"
  • *
  • WQ 水质 → "WQ"
  • *
  • DWT 出库水温 → "WTRV"
  • + *
  • RZ/DZ 坝上/坝下水位 → "ENG"
  • *
  • QEC 生态流量 → 待定
  • * */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_export/processor/HydropwIndicatorProcessor.java b/backend/src/main/java/com/yfd/platform/qgc_export/processor/HydropwIndicatorProcessor.java new file mode 100644 index 00000000..b9712dcb --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_export/processor/HydropwIndicatorProcessor.java @@ -0,0 +1,69 @@ +package com.yfd.platform.qgc_export.processor; + +import com.yfd.platform.qgc_export.mapper.SdHydropwRMapper; +import com.yfd.platform.qgc_export.mapper.SdHydropwdaySMapper; + +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 电站运行指标处理器基类 — RZ(坝上水位)/DZ(坝下水位) 使用 SD_HYDROPW_R / SD_HYDROPWDAY_S 表 + *

    + * 子类标注 @Component,getSttpType() 固定返回 "ENG"。 + * 动态字段名由子类 getFieldName() 返回。 + */ +public abstract class HydropwIndicatorProcessor implements ExportIndicatorProcessor { + + protected SdHydropwRMapper sdHydropwRMapper; + protected SdHydropwdaySMapper sdHydropwdaySMapper; + + private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + public void setMappers(SdHydropwRMapper rMapper, SdHydropwdaySMapper sMapper) { + this.sdHydropwRMapper = rMapper; + this.sdHydropwdaySMapper = sMapper; + } + + @Override + public String getSttpType() { + return "ENG"; + } + + @Override + public int getDecimalPlaces() { + return 3; + } + + @Override + public List queryRawData(List stcds, Date startTime, Date endTime, boolean isDaily) { + String startStr = SDF.format(startTime); + String endStr = SDF.format(endTime); + + List> rawList; + if (isDaily) { + rawList = sdHydropwdaySMapper.selectRawData(stcds, getFieldName(), startStr, endStr); + } else { + rawList = sdHydropwRMapper.selectRawData(stcds, getFieldName(), startStr, endStr); + } + + List rows = new ArrayList<>(); + if (rawList != null) { + for (Map map : rawList) { + String stcd = (String) map.get("STCD"); + Date tm = (Date) map.get(isDaily ? "DT" : "TM"); + BigDecimal value = toBigDecimal(map.get("VALUE")); + if (stcd != null && tm != null && value != null) { + rows.add(new IndicatorDataRow(stcd, tm, value)); + } + } + } + return rows; + } + + private BigDecimal toBigDecimal(Object val) { + if (val instanceof BigDecimal) return (BigDecimal) val; + if (val instanceof Number) return BigDecimal.valueOf(((Number) val).doubleValue()); + return null; + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_export/processor/RzProcessor.java b/backend/src/main/java/com/yfd/platform/qgc_export/processor/RzProcessor.java new file mode 100644 index 00000000..c00dd40f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_export/processor/RzProcessor.java @@ -0,0 +1,20 @@ +package com.yfd.platform.qgc_export.processor; + +import org.springframework.stereotype.Component; + +/** + * 坝上水位(RZ) 标准格式处理器 + */ +@Component +public class RzProcessor extends HydropwIndicatorProcessor { + + @Override + public String getFieldName() { + return "RZ"; + } + + @Override + public String getSheetName() { + return "坝上水位"; + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_export/processor/RzVariationProcessor.java b/backend/src/main/java/com/yfd/platform/qgc_export/processor/RzVariationProcessor.java new file mode 100644 index 00000000..f7ed04d9 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_export/processor/RzVariationProcessor.java @@ -0,0 +1,25 @@ +package com.yfd.platform.qgc_export.processor; + +import org.springframework.stereotype.Component; + +/** + * 坝上水位(RZ) 日变幅格式处理器 + */ +@Component +public class RzVariationProcessor extends HydropwIndicatorProcessor { + + @Override + public String getFieldName() { + return "RZ"; + } + + @Override + public String getSheetName() { + return "坝上水位日变幅"; + } + + @Override + public boolean isVariation() { + return true; + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_export/service/impl/QgcExportServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_export/service/impl/QgcExportServiceImpl.java index 4657094a..e21b57ed 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_export/service/impl/QgcExportServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_export/service/impl/QgcExportServiceImpl.java @@ -7,6 +7,8 @@ import com.yfd.platform.qgc_export.mapper.SdWqRMapper; import com.yfd.platform.qgc_export.mapper.SdWqdaySMapper; import com.yfd.platform.qgc_export.mapper.SdWtrvRMapper; import com.yfd.platform.qgc_export.mapper.SdWtrvdaySMapper; +import com.yfd.platform.qgc_export.mapper.SdHydropwRMapper; +import com.yfd.platform.qgc_export.mapper.SdHydropwdaySMapper; import com.yfd.platform.qgc_export.mapper.StationMappingMapper; import com.yfd.platform.qgc_export.processor.*; import com.yfd.platform.qgc_export.service.IQgcExportService; @@ -29,7 +31,16 @@ import java.util.stream.Collectors; * 综合导出服务实现(月度报表) *

    * 格式:每月一个 Excel 文件 → ZIP 下载。 - * 每个 Excel 含多个 Sheet,顺序:水温→PH→溶解氧→电导率→浊度→流速→流量→水位。 + * 每个 Excel 含多个 Sheet,顺序由前端 dataField 参数决定。 + * + *

    支持的指标

    + *
      + *
    • WQ: wtmp/ph/dox/cond/tu → STTP=WQ, 8个汇总指标(含小时达标率)
    • + *
    • 河道水情: v/q/z → STTP=ZQ, 7个汇总指标
    • + *
    • 出库水温: dwt → STTP=WTRV, 2个Sheet(标准+日变幅)
    • + *
    • 坝上水位: rz → STTP=ENG, 2个Sheet(标准+日变幅)
    • + *
    • 坝下水位: dz → STTP=ENG, 2个Sheet(标准+日变幅)
    • + *
    * *

    Sheet 结构

    *
    @@ -93,6 +104,20 @@ public class QgcExportServiceImpl implements IQgcExportService {
         @Resource
         private DwtVariationProcessor dwtVariationProcessor;
     
    +    // RZ/DZ 坝上/坝下水位相关(STTP=ENG)
    +    @Resource
    +    private SdHydropwRMapper sdHydropwRMapper;
    +    @Resource
    +    private SdHydropwdaySMapper sdHydropwdaySMapper;
    +    @Resource
    +    private RzProcessor rzProcessor;
    +    @Resource
    +    private RzVariationProcessor rzVariationProcessor;
    +    @Resource
    +    private DzProcessor dzProcessor;
    +    @Resource
    +    private DzVariationProcessor dzVariationProcessor;
    +
         private static final SimpleDateFormat SDF_TIME = new SimpleDateFormat("dd日 HH时");
     
         /** 基础汇总指标(7个) */
    @@ -293,6 +318,22 @@ public class QgcExportServiceImpl implements IQgcExportService {
                     result.add(dwtVariationProcessor);
                     continue;
                 }
    +            // RZ 坝上水位 → 展开为标准格式 + 日变幅两个 Sheet
    +            if ("rz".equals(field)) {
    +                rzProcessor.setMappers(sdHydropwRMapper, sdHydropwdaySMapper);
    +                rzVariationProcessor.setMappers(sdHydropwRMapper, sdHydropwdaySMapper);
    +                result.add(rzProcessor);
    +                result.add(rzVariationProcessor);
    +                continue;
    +            }
    +            // DZ 坝下水位 → 展开为标准格式 + 日变幅两个 Sheet
    +            if ("dz".equals(field)) {
    +                dzProcessor.setMappers(sdHydropwRMapper, sdHydropwdaySMapper);
    +                dzVariationProcessor.setMappers(sdHydropwRMapper, sdHydropwdaySMapper);
    +                result.add(dzProcessor);
    +                result.add(dzVariationProcessor);
    +                continue;
    +            }
     
                 ExportIndicatorProcessor p = processorMap.get(field);
                 if (p != null) {
    @@ -314,11 +355,24 @@ public class QgcExportServiceImpl implements IQgcExportService {
             if (rstcds == null || rstcds.isEmpty()) return result;
     
             List mappings = stationMappingMapper.selectList(
    -                new LambdaQueryWrapper().in(StationMapping::getRstcd, rstcds));
    +                new LambdaQueryWrapper()
    +                        .in(StationMapping::getRstcd, rstcds)
    +                        .or()
    +                        .in(StationMapping::getStcd, rstcds)
    +        );
     
    +        // 添加逻辑:如果 sttp 是 "ENG",则 rstcd 赋值为 stcd
    +        mappings.forEach(mapping -> {
    +            if ("ENG".equals(mapping.getSttp())) {
    +                mapping.setRstcd(mapping.getStcd());
    +            }
    +        });
             Map> byRstcd = new LinkedHashMap<>();
    +
             for (StationMapping m : mappings) {
    -            if (m.getRstcd() == null) continue;
    +            if (!"ENG".equals(m.getSttp()) && m.getRstcd() == null) {
    +                continue;
    +            }
                 byRstcd.computeIfAbsent(m.getRstcd(), k -> new ArrayList<>()).add(m);
             }
     
    diff --git a/backend/src/main/resources/mapper/qgc_export/SdHydropwRMapper.xml b/backend/src/main/resources/mapper/qgc_export/SdHydropwRMapper.xml
    new file mode 100644
    index 00000000..7b39431f
    --- /dev/null
    +++ b/backend/src/main/resources/mapper/qgc_export/SdHydropwRMapper.xml
    @@ -0,0 +1,23 @@
    +
    +
    +
    +
    +    
    +    
    +
    +
    diff --git a/backend/src/main/resources/mapper/qgc_export/SdHydropwdaySMapper.xml b/backend/src/main/resources/mapper/qgc_export/SdHydropwdaySMapper.xml
    new file mode 100644
    index 00000000..abb89678
    --- /dev/null
    +++ b/backend/src/main/resources/mapper/qgc_export/SdHydropwdaySMapper.xml
    @@ -0,0 +1,23 @@
    +
    +
    +
    +
    +    
    +    
    +
    +