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 ac7db929..5b0af248 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
@@ -24,10 +24,9 @@ public interface ExportIndicatorProcessor {
* 测站类型(STTP),用于区分同一电站下不同用途的测站。
*
* - V/Q/Z 河道水情 → "ZQ"
- * - WQ 水质 → null(不区分类型,取第一个测站)
+ * - WQ 水质 → "WQ"
* - QEC 生态流量 → 待定
*
- * 返回 null 表示不按 STTP 过滤,取该电站的第一个测站。
*/
default String getSttpType() {
return null;
diff --git a/backend/src/main/java/com/yfd/platform/qgc_export/processor/WqIndicatorProcessor.java b/backend/src/main/java/com/yfd/platform/qgc_export/processor/WqIndicatorProcessor.java
index c0bde5df..ad80b4c0 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_export/processor/WqIndicatorProcessor.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_export/processor/WqIndicatorProcessor.java
@@ -27,7 +27,7 @@ public abstract class WqIndicatorProcessor implements ExportIndicatorProcessor {
@Override
public String getSttpType() {
- return null; // 水质不按STTP过滤,取第一个测站
+ return "WQ";
}
@Override
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 10542479..9cbc4a56 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
@@ -103,7 +103,6 @@ public class QgcExportServiceImpl implements IQgcExportService {
// 2. 收集所有需要的 STTP 类型
Set sttpTypes = processors.stream()
.map(ExportIndicatorProcessor::getSttpType)
- .filter(Objects::nonNull)
.collect(Collectors.toCollection(LinkedHashSet::new));
// 3. 电站 → 测站映射
@@ -113,11 +112,8 @@ public class QgcExportServiceImpl implements IQgcExportService {
return;
}
- // 4. 电站顺序 + 列标题(测站名称)
+ // 4. 电站顺序
List stationOrder = new ArrayList<>(stationRes.displayNames.keySet());
- List headerNames = stationOrder.stream()
- .map(stationRes::getDisplayName)
- .toList();
// 5. 每月一个 ExcelData
List excelList = new ArrayList<>();
@@ -129,9 +125,13 @@ public class QgcExportServiceImpl implements IQgcExportService {
for (ExportIndicatorProcessor processor : processors) {
List> rows = buildSheetRows(processor, mr, stationOrder, stationRes);
if (rows != null) {
+ // 按当前处理器 STTP 类型获取对应的测站名称
+ String sttp = processor.getSttpType();
List headers = new ArrayList<>();
headers.add("日期");
- headers.addAll(headerNames);
+ for (String rstcd : stationOrder) {
+ headers.add(stationRes.getDisplayName(rstcd, sttp));
+ }
sheets.add(new ExportZipUtil.SheetData(processor.getSheetName(), headers, rows));
}
}
@@ -303,26 +303,39 @@ public class QgcExportServiceImpl implements IQgcExportService {
continue;
}
- // 测站名称:优先 ZQ 类型 STNM → 任意 STNM → ENNM → RSTCD
- String displayName = null;
- for (StationMapping m : rows) {
- if ("ZQ".equals(m.getSttp()) && m.getStnm() != null) {
- displayName = m.getStnm();
- break;
- }
- }
- if (displayName == null) {
+ // 默认测站名称:按请求的 STTP 类型优先级 → 任意 STNM → ENNM → RSTCD
+ String defaultDisplayName = null;
+ for (String sttp : sttpTypes) {
for (StationMapping m : rows) {
- if (m.getStnm() != null) { displayName = m.getStnm(); break; }
+ if (sttp.equals(m.getSttp()) && m.getStnm() != null) {
+ defaultDisplayName = m.getStnm();
+ break;
+ }
+ }
+ if (defaultDisplayName != null) break;
+ }
+ if (defaultDisplayName == null) {
+ for (StationMapping m : rows) {
+ if (m.getStnm() != null) { defaultDisplayName = m.getStnm(); break; }
}
}
- if (displayName == null) {
- displayName = rows.get(0).getEnnm();
+ if (defaultDisplayName == null) {
+ defaultDisplayName = rows.get(0).getEnnm();
}
- if (displayName == null) {
- displayName = rstcd;
+ if (defaultDisplayName == null) {
+ defaultDisplayName = rstcd;
}
- result.displayNames.put(rstcd, displayName);
+ result.displayNames.put(rstcd, defaultDisplayName);
+
+ // 按 STTP 类型分别记录测站名称(水质 Sheet 用 WQ 名称,水情 Sheet 用 ZQ 名称)
+ Map sttpNames = new LinkedHashMap<>();
+ for (StationMapping m : rows) {
+ String sttp = m.getSttp();
+ if (sttp != null && m.getStnm() != null && !sttpNames.containsKey(sttp)) {
+ sttpNames.put(sttp, m.getStnm());
+ }
+ }
+ result.sttpDisplayNames.put(rstcd, sttpNames);
// STTP → STCD 映射
Map sttpMap = new LinkedHashMap<>();
@@ -460,22 +473,38 @@ public class QgcExportServiceImpl implements IQgcExportService {
// ======================== 内部数据类 ========================
private static class StationResolution {
+ /** 默认测站名称(fallback),RSTCD → displayName */
final Map displayNames = new LinkedHashMap<>();
+ /** 按 STTP 分组的测站名称,RSTCD → {STTP → displayName} */
+ final Map> sttpDisplayNames = new LinkedHashMap<>();
+ /** STTP → STCD 映射,RSTCD → {STTP → STCD} */
final Map> sttpStcdMap = new LinkedHashMap<>();
+ /** 获取默认测站名称 */
String getDisplayName(String rstcd) {
return displayNames.getOrDefault(rstcd, rstcd);
}
/**
- * 获取指定 STTP 的测站编码。sttp 为 null 时返回第一个可用的 STCD。
+ * 获取指定 STTP 类型的测站名称。
+ * 优先返回该 STTP 对应的名称,若无则返回默认名称。
+ */
+ String getDisplayName(String rstcd, String sttp) {
+ Map inner = sttpDisplayNames.get(rstcd);
+ if (inner != null) {
+ String name = inner.get(sttp);
+ if (name != null) return name;
+ }
+ return getDisplayName(rstcd);
+ }
+
+ /**
+ * 获取指定 STTP 的测站编码。
*/
String getStcd(String rstcd, String sttp) {
Map inner = sttpStcdMap.get(rstcd);
if (inner == null || inner.isEmpty()) return null;
- if (sttp != null) return inner.get(sttp);
- // sttp 为 null:返回第一个可用的 STCD
- return inner.values().iterator().next();
+ return inner.get(sttp);
}
}