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),用于区分同一电站下不同用途的测站。 * - * 返回 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); } }