diff --git a/backend/src/main/java/com/yfd/platform/qgc_export/mapper/MsAlongdetBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_export/mapper/MsAlongdetBMapper.java new file mode 100644 index 00000000..1d39f300 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_export/mapper/MsAlongdetBMapper.java @@ -0,0 +1,25 @@ +package com.yfd.platform.qgc_export.mapper; + +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * MS_ALONGDET_B 沿程配置详情表 Mapper + */ +public interface MsAlongdetBMapper { + + /** + * 查询指定 STTP 类型的出库沿程配置(IO_DIRECTION=1),按 SORT 排序。 + */ + List> selectAlongStations(@Param("sttp") String sttp, + @Param("rstcdList") List rstcdList); + + /** + * 查询所有沿程配置的电站排序(MS_ALONG_B JOIN MS_ALONGDET_B), + * 按 MS_ALONG_B.ORDER_INDEX, MS_ALONGDET_B.SORT 排序。 + * 返回 RSTCD, ORDER_INDEX。 + */ + List> selectAlongSortOrder(@Param("rstcdList") List rstcdList); +} 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 05089b7e..637a7fbf 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 @@ -13,6 +13,7 @@ import com.yfd.platform.qgc_export.mapper.SdHydropwdaySMapper; import com.yfd.platform.qgc_export.mapper.SdQecRMapper; import com.yfd.platform.qgc_export.mapper.SdQecdaySMapper; import com.yfd.platform.qgc_export.mapper.StationMappingMapper; +import com.yfd.platform.qgc_export.mapper.MsAlongdetBMapper; import com.yfd.platform.qgc_export.processor.*; import com.yfd.platform.qgc_export.service.IQgcExportService; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqRuleVo; @@ -142,6 +143,9 @@ public class QgcExportServiceImpl implements IQgcExportService { @Resource private EngEqDataService engEqDataService; + @Resource + private MsAlongdetBMapper msAlongdetBMapper; + private static final SimpleDateFormat SDF_TIME = new SimpleDateFormat("dd日 HH时"); private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @@ -174,10 +178,8 @@ public class QgcExportServiceImpl implements IQgcExportService { return; } - // 4. 电站顺序 - List stationOrder = new ArrayList<>(stationRes.displayNames.keySet()); - - // 5. 每月一个 ExcelData + // 4. 电站顺序:优先按沿程配置 MS_ALONG_B.ORDER_INDEX 排序,其余保持前端传入顺序 + List stationOrder = buildAlongSortedOrder(stationCodes, stationRes); String timestamp = String.valueOf(System.currentTimeMillis()); List excelList = new ArrayList<>(); for (String month : months) { @@ -188,6 +190,7 @@ public class QgcExportServiceImpl implements IQgcExportService { // 判断是否包含水质指标,后续用于追加 WQ 合规 Sheet boolean hasWqIndicator = false; for (ExportIndicatorProcessor processor : processors) { + String sttp = processor.getSttpType(); List> rows; // QEC 自定义三栏达标率格式 if (processor instanceof QecProcessor) { @@ -197,7 +200,6 @@ public class QgcExportServiceImpl implements IQgcExportService { } if (rows != null) { List headers; - String sttp = processor.getSttpType(); if (processor instanceof QecProcessor) { // 分部标题作为列标题(合并单元格) String[] sectionTitles = {"生态流量达标率(环保部)", "生态流量达标率(水利部)", "生态流量达标率(多年平均)"}; @@ -824,6 +826,47 @@ public class QgcExportServiceImpl implements IQgcExportService { return result; } + /** + * 按沿程配置 MS_ALONG_B.ORDER_INDEX 排序电站列表。 + * 有沿程配置的电站排前面,无配置的保持原有顺序排后面。 + */ + private List buildAlongSortedOrder(List rstcds, StationResolution stationRes) { + if (rstcds.isEmpty()) return Collections.emptyList(); + + // 查询沿程配置:MS_ALONGDET_B JOIN MS_ALONG_B,按 ORDER_INDEX, SORT 排序 + List> alongList = msAlongdetBMapper.selectAlongSortOrder(rstcds); + if (alongList.isEmpty()) { + return new ArrayList<>(stationRes.displayNames.keySet()); + } + + // 按 ORDER_INDEX 分组去重,保留每站的最小 ORDER_INDEX + Map rstcdOrderMap = new LinkedHashMap<>(); + for (Map row : alongList) { + String rstcd = (String) row.get("RSTCD"); + Object orderIdx = row.get("ORDER_INDEX"); + if (rstcd != null && orderIdx != null && !rstcdOrderMap.containsKey(rstcd)) { + rstcdOrderMap.put(rstcd, ((Number) orderIdx).intValue()); + } + } + + // 有沿程配置的电站按 ORDER_INDEX 升序,无配置的排后面 + List alongSorted = new ArrayList<>(); + List remaining = new ArrayList<>(); + for (String rstcd : stationRes.displayNames.keySet()) { + if (rstcdOrderMap.containsKey(rstcd)) { + alongSorted.add(rstcd); + } else { + remaining.add(rstcd); + } + } + alongSorted.sort(Comparator.comparingInt(rstcdOrderMap::get)); + + List result = new ArrayList<>(alongSorted); + result.addAll(remaining); + log.info("沿程排序完成,有沿程={}, 无沿程={}", alongSorted.size(), remaining.size()); + return result; + } + // ======================== 月份范围 ======================== private MonthRange buildMonthRange(String month) { diff --git a/backend/src/main/resources/mapper/qgc_export/MsAlongdetBMapper.xml b/backend/src/main/resources/mapper/qgc_export/MsAlongdetBMapper.xml new file mode 100644 index 00000000..0500cd83 --- /dev/null +++ b/backend/src/main/resources/mapper/qgc_export/MsAlongdetBMapper.xml @@ -0,0 +1,42 @@ + + + + + + + + + + +