From e84b3df57f5b2dd7cd88357aba1a32bfa7503c31 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 30 Apr 2026 11:38:27 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FishDraftDataController.java | 15 ++++ .../data/service/IFishImportService.java | 4 ++ .../service/impl/FishImportServiceImpl.java | 72 ++++++++++++++++--- 3 files changed, 82 insertions(+), 9 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java b/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java index 2b19f33..fd0b529 100644 --- a/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java +++ b/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java @@ -29,6 +29,7 @@ import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -921,6 +922,20 @@ public class FishDraftDataController { } } + if (StringUtils.hasText(data.getBaseId()) && StringUtils.hasText(data.getRstcd())) { + if (!fishImportService.validateStationBelongsToBase(data.getRstcd(), data.getBaseId())) { + warnings.add("baseId"); + warnings.add("rstcd"); + } + } + + if (StringUtils.hasText(data.getRstcd()) && StringUtils.hasText(data.getStcd())) { + if (!fishImportService.validateFpssBelongsToStation(data.getStcd(), data.getRstcd())) { + warnings.add("stcd"); + warnings.add("rstcd"); + } + } + // if (data.getSourceType() != null && !data.getSourceType().isEmpty()) { // data.setSourceType(fishImportService.parseSourceType(data.getSourceType().trim())); // } diff --git a/backend/src/main/java/com/yfd/platform/data/service/IFishImportService.java b/backend/src/main/java/com/yfd/platform/data/service/IFishImportService.java index b4505f1..fd5074d 100644 --- a/backend/src/main/java/com/yfd/platform/data/service/IFishImportService.java +++ b/backend/src/main/java/com/yfd/platform/data/service/IFishImportService.java @@ -43,5 +43,9 @@ public interface IFishImportService { String parseSourceType(String value); + boolean validateStationBelongsToBase(String stationCode, String baseId); + + boolean validateFpssBelongsToStation(String fpssCode, String stationCode); + void processAttachments(FishImportResult result, ZipFileUtil.ZipContent zipContent); } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java b/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java index d63a1e2..e4177f1 100644 --- a/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java @@ -60,6 +60,7 @@ public class FishImportServiceImpl implements IFishImportService { private static final Map STATION_NAME_CACHE = new LinkedHashMap<>(); private static final Map STATION_CODE_TO_NAME_CACHE = new LinkedHashMap<>(); + private static final Map STATION_TO_BASE_CACHE = new LinkedHashMap<>(); private static final Map BASE_NAME_CACHE = new LinkedHashMap<>(); private static final Map BASE_CODE_TO_NAME_CACHE = new LinkedHashMap<>(); private static final Map RIVER_NAME_CACHE = new LinkedHashMap<>(); @@ -69,6 +70,7 @@ public class FishImportServiceImpl implements IFishImportService { private static final Map FISH_CODE_TO_NAME_CACHE = new LinkedHashMap<>(); private static final Map FPSS_BH_CACHE = new LinkedHashMap<>(); private static final Map FPSS_CODE_TO_NAME_CACHE = new LinkedHashMap<>(); + private static final Map FPSS_TO_STATION_CACHE = new LinkedHashMap<>(); private static final Map ISFS_DICT_CACHE = new LinkedHashMap<>(); private static final String DICT_CODE_FISH = "FISH_TYPE"; @@ -151,7 +153,6 @@ public class FishImportServiceImpl implements IFishImportService { return result; } - List unrecognizedHeaders = new ArrayList<>(); Map columnIndexMap = new HashMap<>(EXCEL_COLUMN_INDEX_MAPPING); int totalRows = sheet.getLastRowNum(); @@ -171,9 +172,8 @@ public class FishImportServiceImpl implements IFishImportService { result.setFailedCount(result.getFailedCount() + 1); } } - result.setSummary(String.format("共解析%d条数据,失败%d条,未识别字段:%s", - result.getSuccessCount(), result.getFailedCount(), - unrecognizedHeaders.isEmpty() ? "无" : String.join(", ", unrecognizedHeaders))); + result.setSummary(String.format("共解析%d条数据,失败%d条", + result.getSuccessCount(), result.getFailedCount())); return result; } @@ -400,10 +400,41 @@ public class FishImportServiceImpl implements IFishImportService { // importRow.getWarnings().add("字段[" + fieldName + "]解析异常: " + e.getMessage()); } } + validateStationFpssRelation(data, importRow); importRow.setData(data); return importRow; } + private void validateStationFpssRelation(FishDraftData data, FishImportResult.FishImportRow importRow) { + loadStationAndBaseCache(); + if (StringUtils.hasText(data.getBaseId()) && StringUtils.hasText(data.getRstcd())) { + if (!validateStationBelongsToBase(data.getRstcd(), data.getBaseId())) { + if (!importRow.getWarnings().contains("baseId")) { + importRow.getWarnings().add("baseId"); + } + if (!importRow.getWarnings().contains("rstcd")) { + importRow.getWarnings().add("rstcd"); + } + if (!importRow.getWarnings().contains("stcd")) { + importRow.getWarnings().add("stcd"); + } + } + } + if (StringUtils.hasText(data.getRstcd()) && StringUtils.hasText(data.getStcd())) { + if (!validateFpssBelongsToStation(data.getStcd(), data.getRstcd())) { + if (!importRow.getWarnings().contains("baseId")) { + importRow.getWarnings().add("baseId"); + } + if (!importRow.getWarnings().contains("stcd")) { + importRow.getWarnings().add("stcd"); + } + if (!importRow.getWarnings().contains("rstcd")) { + importRow.getWarnings().add("rstcd"); + } + } + } + } + private void loadStationAndBaseCache() { if (STATION_NAME_CACHE.isEmpty()) { List stationList = engInfoBHMapper.selectList(null); @@ -412,10 +443,12 @@ public class FishImportServiceImpl implements IFishImportService { STATION_NAME_CACHE.put(station.getEnnm().trim().toLowerCase(), station.getStcd()); } if (StringUtils.hasText(station.getStcd())) { -// STATION_NAME_CACHE.put(station.getStcd().trim().toLowerCase(), station.getStcd()); if (StringUtils.hasText(station.getEnnm())) { STATION_CODE_TO_NAME_CACHE.put(station.getStcd().trim().toLowerCase(), station.getEnnm().trim().toLowerCase()); } + if (StringUtils.hasText(station.getBaseId())) { + STATION_TO_BASE_CACHE.put(station.getStcd().trim().toLowerCase(), station.getBaseId()); + } } } } @@ -427,7 +460,6 @@ public class FishImportServiceImpl implements IFishImportService { BASE_NAME_CACHE.put(base.getBasename().trim().toLowerCase(), base.getBaseid()); } if (StringUtils.hasText(base.getBaseid())) { -// BASE_NAME_CACHE.put(base.getBaseid().trim().toLowerCase(), base.getBaseid()); if (StringUtils.hasText(base.getBasename())) { BASE_CODE_TO_NAME_CACHE.put(base.getBaseid().trim().toLowerCase(), base.getBasename().trim().toLowerCase()); } @@ -442,7 +474,6 @@ public class FishImportServiceImpl implements IFishImportService { RIVER_NAME_CACHE.put(river.getRvnm().trim().toLowerCase(), river.getRvcd()); } if (StringUtils.hasText(river.getRvcd())) { -// RIVER_NAME_CACHE.put(river.getRvcd().trim().toLowerCase(), river.getRvcd()); if (StringUtils.hasText(river.getRvnm())) { RIVER_CODE_TO_NAME_CACHE.put(river.getRvcd().trim().toLowerCase(), river.getRvnm().trim().toLowerCase()); } @@ -457,7 +488,6 @@ public class FishImportServiceImpl implements IFishImportService { FISH_DICT_CACHE.put(fishDictoryB.getName().trim().toLowerCase(), fishDictoryB.getCode()); } if (StringUtils.hasText(fishDictoryB.getCode())) { -// FISH_DICT_CACHE.put(fishDictoryB.getCode().trim().toLowerCase(), fishDictoryB.getCode()); if (StringUtils.hasText(fishDictoryB.getName())) { FISH_CODE_TO_NAME_CACHE.put(fishDictoryB.getCode().trim().toLowerCase(), fishDictoryB.getName().trim().toLowerCase()); } @@ -472,10 +502,12 @@ public class FishImportServiceImpl implements IFishImportService { FPSS_BH_CACHE.put(sdFpssBH.getStnm().trim().toLowerCase(), sdFpssBH.getStcd()); } if (StringUtils.hasText(sdFpssBH.getStcd())) { -// FPSS_BH_CACHE.put(sdFpssBH.getStcd().trim().toLowerCase(), sdFpssBH.getStcd()); if (StringUtils.hasText(sdFpssBH.getStnm())) { FPSS_CODE_TO_NAME_CACHE.put(sdFpssBH.getStcd().trim().toLowerCase(), sdFpssBH.getStnm().trim().toLowerCase()); } + if (StringUtils.hasText(sdFpssBH.getRstcd())) { + FPSS_TO_STATION_CACHE.put(sdFpssBH.getStcd().trim().toLowerCase(), sdFpssBH.getRstcd()); + } } } } @@ -667,6 +699,28 @@ public class FishImportServiceImpl implements IFishImportService { return null; } + @Override + public boolean validateStationBelongsToBase(String stationCode, String baseId) { + if (stationCode == null || baseId == null) { + return false; + } + loadStationAndBaseCache(); + String stationLower = stationCode.trim().toLowerCase(); + String cachedBaseId = STATION_TO_BASE_CACHE.get(stationLower); + return baseId.equalsIgnoreCase(cachedBaseId); + } + + @Override + public boolean validateFpssBelongsToStation(String fpssCode, String stationCode) { + if (fpssCode == null || stationCode == null) { + return false; + } + loadStationAndBaseCache(); + String fpssLower = fpssCode.trim().toLowerCase(); + String cachedStationCode = FPSS_TO_STATION_CACHE.get(fpssLower); + return stationCode.equalsIgnoreCase(cachedStationCode); + } + private String validateFishType(String fishName, FishImportResult.FishImportRow importRow) { if (fishName == null) { return null;