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