From 57015b1e28efc2f85a08cff501626e69c0d73f79 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 4 Jun 2026 14:50:59 +0800 Subject: [PATCH 01/39] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=B5=81?= =?UTF-8?q?=E5=9F=9F=E5=AF=B9=E8=B1=A1=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/qgc_base/domain/SdHbrvDic.java | 50 +++++++++++++++- .../platform/qgc_base/domain/SdHycdDic.java | 51 +++++++++++++++- .../platform/qgc_base/domain/SdHydrobase.java | 41 +++++++++++++ .../platform/qgc_base/domain/SdRvcdDic.java | 59 ++++++++++++++----- .../src/main/resources/application-devtw.yml | 2 +- backend/src/main/resources/application.yml | 2 +- .../mapper/qgc_base/SdHbrvDicMapper.xml | 24 ++++++-- .../mapper/qgc_base/SdHycdDicMapper.xml | 22 +++++-- .../mapper/qgc_base/SdHydrobaseMapper.xml | 16 ++++- .../mapper/qgc_base/SdRvcdDicMapper.xml | 19 ++++-- 10 files changed, 249 insertions(+), 37 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdHbrvDic.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdHbrvDic.java index 94b45e33..6c355d33 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdHbrvDic.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdHbrvDic.java @@ -5,10 +5,11 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; +import java.util.Date; /** *

- * 水电基地流域表 + * 水电基地河段字典表 *

*/ @Data @@ -29,6 +30,11 @@ public class SdHbrvDic implements Serializable { */ private String hbrvnm; + /** + * 所属基地流域编码,根节点为空 + */ + private String phbrvcd; + /** * 水电基地编码 */ @@ -49,8 +55,48 @@ public class SdHbrvDic implements Serializable { */ private Integer orderIndex; + /** + * 备注 + */ + private String remark; + /** * 是否启用:0=禁用 1=启用 */ private Integer enabled; -} \ No newline at end of file + + /** + * 创建人 + */ + private String recordUser; + + /** + * 创建时间 + */ + private Date recordTime; + + /** + * 更新人 + */ + private String modifyUser; + + /** + * 更新时间 + */ + private Date modifyTime; + + /** + * 是否已删除:0=未删除 1=已删除 + */ + private Integer isDeleted; + + /** + * 删除人 + */ + private String deleteUser; + + /** + * 删除时间 + */ + private Date deleteTime; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdHycdDic.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdHycdDic.java index 4d8826ea..fe161975 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdHycdDic.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdHycdDic.java @@ -5,6 +5,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; +import java.util.Date; /** *

@@ -30,7 +31,7 @@ public class SdHycdDic implements Serializable { private String hynm; /** - * 所属公司编码,根节点为0 + * 所属公司编码,根节点为空 */ private String phycd; @@ -49,14 +50,18 @@ public class SdHycdDic implements Serializable { */ private Integer orderIndex; + /** + * 备注 + */ + private String remark; /** - * 所属国家,关联SD_COUNTRY_B.COUNTRY_ID + * 所属国家 */ private String country; /** - * 公司Logo + * 公司LOGO */ private String logo; @@ -80,4 +85,44 @@ public class SdHycdDic implements Serializable { */ private Integer lx; + /** + * 是否启用:0=禁用 1=启用 + */ + private Integer enabled; + + /** + * 创建人 + */ + private String recordUser; + + /** + * 创建时间 + */ + private Date recordTime; + + /** + * 更新人 + */ + private String modifyUser; + + /** + * 更新时间 + */ + private Date modifyTime; + + /** + * 是否已删除:0=未删除 1=已删除 + */ + private Integer isDeleted; + + /** + * 删除人 + */ + private String deleteUser; + + /** + * 删除时间 + */ + private Date deleteTime; + } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdHydrobase.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdHydrobase.java index 296090ae..acd0c913 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdHydrobase.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdHydrobase.java @@ -5,6 +5,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; +import java.util.Date; /** *

@@ -63,4 +64,44 @@ public class SdHydrobase implements Serializable { * 简称 */ private String shortname; + + /** + * 是否启用:0=禁用 1=启用 + */ + private Integer enabled; + + /** + * 创建人 + */ + private String recordUser; + + /** + * 创建时间 + */ + private Date recordTime; + + /** + * 更新人 + */ + private String modifyUser; + + /** + * 更新时间 + */ + private Date modifyTime; + + /** + * 是否已删除:0=未删除 1=已删除 + */ + private Integer isDeleted; + + /** + * 删除人 + */ + private String deleteUser; + + /** + * 删除时间 + */ + private Date deleteTime; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdRvcdDic.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdRvcdDic.java index 2b92f18d..53178c88 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdRvcdDic.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdRvcdDic.java @@ -5,6 +5,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; +import java.util.Date; import java.util.List; /** @@ -71,10 +72,15 @@ public class SdRvcdDic implements Serializable { private Double perimeter; /** - * 所属国家,关联SD_COUNTRY_B.COUNTRY_ID + * 所属国家 */ private String country; + /** + * 流域LOGO + */ + private String logo; + /** * 简介 */ @@ -86,20 +92,10 @@ public class SdRvcdDic implements Serializable { private String inffile; /** - * 简称 + * 流域简称 */ private String shortname; - /** - * 气象预报 0=不支持 1=支持 - */ - private Integer weatherForecast; - - /** - * 气象反演 0=不支持 1=支持 - */ - private Integer weatherInversion; - /** * 范围 */ @@ -111,9 +107,44 @@ public class SdRvcdDic implements Serializable { private String baseid; /** - * 地图专题流域标识:1=是 0否 + * 是否启用:0=禁用 1=启用 */ - private Integer ismap; + private Integer enabled; + + /** + * 创建人 + */ + private String recordUser; + + /** + * 创建时间 + */ + private Date recordTime; + + /** + * 更新人 + */ + private String modifyUser; + + /** + * 更新时间 + */ + private Date modifyTime; + + /** + * 是否已删除:0=未删除 1=已删除 + */ + private Integer isDeleted; + + /** + * 删除人 + */ + private String deleteUser; + + /** + * 删除时间 + */ + private Date deleteTime; /** * 子节点(用于树形结构,不映射数据库字段) diff --git a/backend/src/main/resources/application-devtw.yml b/backend/src/main/resources/application-devtw.yml index e34ac55d..597cd003 100644 --- a/backend/src/main/resources/application-devtw.yml +++ b/backend/src/main/resources/application-devtw.yml @@ -13,7 +13,7 @@ spring: druid: master: driverClassName: oracle.jdbc.OracleDriver - url: "${DB_MASTER_URL:jdbc:oracle:thin:@172.16.31.190:1521/SDLYZ}" + url: "${DB_MASTER_URL:jdbc:oracle:thin:@172.16.21.134:1521/SDLYZ}" username: "${DB_MASTER_USERNAME:QGC_REFA}" password: "${DB_MASTER_PASSWORD:Y4M4K1oCkL8U}" initial-size: 5 diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index cd6f706e..03a78ea5 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: profiles: - active: prod + active: devtw jasypt: encryptor: diff --git a/backend/src/main/resources/mapper/qgc_base/SdHbrvDicMapper.xml b/backend/src/main/resources/mapper/qgc_base/SdHbrvDicMapper.xml index 09f8a32d..8bdffbb7 100644 --- a/backend/src/main/resources/mapper/qgc_base/SdHbrvDicMapper.xml +++ b/backend/src/main/resources/mapper/qgc_base/SdHbrvDicMapper.xml @@ -5,31 +5,47 @@ - + + + + + + + + + + - \ No newline at end of file + diff --git a/backend/src/main/resources/mapper/qgc_base/SdHycdDicMapper.xml b/backend/src/main/resources/mapper/qgc_base/SdHycdDicMapper.xml index 4ed2f89c..a222e511 100644 --- a/backend/src/main/resources/mapper/qgc_base/SdHycdDicMapper.xml +++ b/backend/src/main/resources/mapper/qgc_base/SdHycdDicMapper.xml @@ -10,18 +10,28 @@ - - + + - + - + + + + + + + + + SELECT * FROM SD_HYCD_DIC - WHERE PHYCD IS NULL OR PHYCD = '' OR PHYCD = '0' + WHERE NVL(ENABLED, 1) = 1 + AND NVL(IS_DELETED, 0) = 0 + AND (PHYCD IS NULL OR PHYCD = '' OR PHYCD = '0') ORDER BY ORDER_INDEX ASC diff --git a/backend/src/main/resources/mapper/qgc_base/SdHydrobaseMapper.xml b/backend/src/main/resources/mapper/qgc_base/SdHydrobaseMapper.xml index 839bafd4..8e6a6398 100644 --- a/backend/src/main/resources/mapper/qgc_base/SdHydrobaseMapper.xml +++ b/backend/src/main/resources/mapper/qgc_base/SdHydrobaseMapper.xml @@ -10,14 +10,24 @@ - + + + + + + + + + SELECT * FROM SD_HYDROBASE - WHERE PBASEID IS NULL OR PBASEID = '' OR PBASEID = '0' + WHERE NVL(ENABLED, 1) = 1 + AND NVL(IS_DELETED, 0) = 0 + AND (PBASEID IS NULL OR PBASEID = '' OR PBASEID = '0') ORDER BY ORDER_INDEX ASC diff --git a/backend/src/main/resources/mapper/qgc_base/SdRvcdDicMapper.xml b/backend/src/main/resources/mapper/qgc_base/SdRvcdDicMapper.xml index e4f11d28..913d985a 100644 --- a/backend/src/main/resources/mapper/qgc_base/SdRvcdDicMapper.xml +++ b/backend/src/main/resources/mapper/qgc_base/SdRvcdDicMapper.xml @@ -15,19 +15,27 @@ + - - - + + + + + + + + SELECT * FROM SD_RVCD_DIC - WHERE GRD =3 AND - PRVCD IS NULL OR PRVCD = '' OR PRVCD = '0' + WHERE NVL(ENABLED, 1) = 1 + AND NVL(IS_DELETED, 0) = 0 + AND (PRVCD IS NULL OR PRVCD = '' OR PRVCD = '0') ORDER BY ORDER_INDEX ASC From e1d8809a031a7a907b7fd2ce1b556773cb943a3b Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 4 Jun 2026 16:43:36 +0800 Subject: [PATCH 02/39] =?UTF-8?q?fix:=20=E4=B8=8B=E6=8B=89=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SdRvcdDicController.java | 16 +++ .../qgc_base/service/ISdRvcdDicService.java | 7 + .../service/impl/SdHbrvDicServiceImpl.java | 4 +- .../service/impl/SdRvcdDicServiceImpl.java | 127 ++++++++++++++++++ .../mapper/data/FishDraftDataMapper.xml | 2 +- .../mapper/data/FishStatisticsMapper.xml | 2 +- .../mapper/data/ImportTaskRowMapper.xml | 2 +- .../mapper/data/SysUserDataScopeMapper.xml | 2 +- 8 files changed, 156 insertions(+), 6 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdRvcdDicController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdRvcdDicController.java index 9a1c6bdc..4ee42f4c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdRvcdDicController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdRvcdDicController.java @@ -102,4 +102,20 @@ public class SdRvcdDicController { boolean result = rvcdDicService.deleteRvcdDic(rvcd); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @GetMapping("/selectForDropdown") + @Operation(summary = "下拉框列表查询") + public ResponseResult selectForDropdown( + @RequestParam(required = false) String rvnm, + @RequestParam(required = false) String rvcd) { + return ResponseResult.successData(rvcdDicService.selectForDropdown(rvnm, rvcd)); + } + + @GetMapping("/regDropdown") + @Operation(summary = "下拉框列表查询(注册)") + public ResponseResult regDropdown( + @RequestParam(required = false) String rvnm, + @RequestParam(required = false) String rvcd) { + return ResponseResult.successData(rvcdDicService.regDropdown(rvnm, rvcd)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdRvcdDicService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdRvcdDicService.java index 38e299f0..8eee4131 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdRvcdDicService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdRvcdDicService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.yfd.platform.qgc_base.domain.SdRvcdDic; import java.util.List; +import java.util.Set; /** *

@@ -43,10 +44,16 @@ public interface ISdRvcdDicService extends IService { */ boolean deleteRvcdDic(String rvcd); + Set getUserAuthorizedStationCodes(); + /** * 获取流域树形结构 * @param rvcd 流域编码(可选,为空则返回全部) * @param rvnm 流域名称(可选,用于模糊搜索) */ List getTree(String rvcd, String rvnm); + + List selectForDropdown(String rvnm, String rvcd); + + List regDropdown(String rvnm, String rvcd); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHbrvDicServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHbrvDicServiceImpl.java index dde43f59..6adc2def 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHbrvDicServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHbrvDicServiceImpl.java @@ -96,7 +96,7 @@ public class SdHbrvDicServiceImpl extends ServiceImpl implements ISdRvcdDicService { + @Resource + private SdEngInfoBHMapper engInfoBHMapper; + + @Resource + private SysUserDataScopeMapper sysUserDataScopeMapper; + @Override public Page queryPageList(Page page, String rvnm, String prvcd) { return this.page(page, this.lambdaQuery() @@ -103,6 +116,120 @@ public class SdRvcdDicServiceImpl extends ServiceImpl selectForDropdown(String rvnm, String rvcd) { + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.like(rvnm != null && !rvnm.isEmpty(), SdRvcdDic::getRvnm, rvnm) + .eq(rvcd != null && !rvcd.isEmpty(), SdRvcdDic::getRvcd, rvcd) + .eq(SdRvcdDic::getEnabled, 1) + .orderByAsc(SdRvcdDic::getBaseid,SdRvcdDic::getOrderIndex); + if("admin".equals(SecurityUtils.getCurrentUsername())){ + return this.list(wrapper); + } + Set authorizedStations = getUserAuthorizedStationCodes(); + if (authorizedStations != null && !authorizedStations.isEmpty()) { + List engInfos = engInfoBHMapper.selectList( + new LambdaQueryWrapper() + .select(SdEngInfoBH::getRvcd) + .in(SdEngInfoBH::getStcd, authorizedStations) + ); + List rvcds = engInfos.stream() + .map(SdEngInfoBH::getRvcd) + .filter(id -> id != null && !id.isEmpty()) + .distinct() + .toList(); + + if (!rvcds.isEmpty()) { + List list = this.list(wrapper); + return list.stream() + .filter(rvcdDic -> rvcds.contains(rvcdDic.getRvcd())) + .collect(Collectors.toList()); + } else { + return new ArrayList<>(); + } + }else { + return new ArrayList<>(); + } + } + + + @Override + public Set getUserAuthorizedStationCodes() { + String userId = SecurityUtils.getUserId(); + List sysUserDataScopes = sysUserDataScopeMapper.selectList( + new LambdaQueryWrapper() + .eq(SysUserDataScope::getUserId, userId) + .select(SysUserDataScope::getOrgId, SysUserDataScope::getOrgType) + ); + + if (sysUserDataScopes == null || sysUserDataScopes.isEmpty()) { + return new HashSet<>(); + } + + + Set stationCodes = new HashSet<>(); + Set basinCodes = new HashSet<>(); + + for (SysUserDataScope scope : sysUserDataScopes) { + String orgType = scope.getOrgType(); + String orgId = scope.getOrgId(); + + if ("STATION".equals(orgType)) { + SdEngInfoBH station = engInfoBHMapper.selectById(orgId); + if (station != null) { + if (station.getRvcd() != null) { + basinCodes.add(station.getRvcd()); + } + if (station.getStcd() != null) { + stationCodes.add(station.getStcd()); + } + + } + } else if ("RVCD".equals(orgType)) { + List stationList = engInfoBHMapper.selectByRvcd(orgId); + if (stationList != null) { + for (SdEngInfoBH station : stationList) { + if (station.getStcd() != null) { + stationCodes.add(station.getStcd()); + } + if (station.getEnnm() != null) { + basinCodes.add(station.getRvcd()); + } + } + } + + } + } + if (!stationCodes.isEmpty()) { + return stationCodes; + } + + if (!basinCodes.isEmpty()) { + List engInfos = engInfoBHMapper.selectList( + new LambdaQueryWrapper() + .select(SdEngInfoBH::getStcd) + .in(SdEngInfoBH::getRvcd, basinCodes) + ); + return engInfos.stream() + .map(SdEngInfoBH::getStcd) + .collect(Collectors.toSet()); + } + + return stationCodes; + } + + + @Override + public List regDropdown(String rvnm, String rvcd) { + return this.lambdaQuery() + .like(rvnm != null && !rvnm.isEmpty(), SdRvcdDic::getRvnm, rvnm) + .eq(rvcd != null && !rvcd.isEmpty(), SdRvcdDic::getRvcd, rvcd) + .eq(SdRvcdDic::getEnabled, 1) + .orderByAsc(SdRvcdDic::getBaseid,SdRvcdDic::getOrderIndex) + .list(); + } + private void buildTreeRecursive(SdRvcdDic parent, Map> childrenMap, Set rootRvcdSet) { List children = childrenMap.get(parent.getRvcd()); if (children != null && !children.isEmpty()) { diff --git a/backend/src/main/resources/mapper/data/FishDraftDataMapper.xml b/backend/src/main/resources/mapper/data/FishDraftDataMapper.xml index a2e54147..442b5c8a 100644 --- a/backend/src/main/resources/mapper/data/FishDraftDataMapper.xml +++ b/backend/src/main/resources/mapper/data/FishDraftDataMapper.xml @@ -1,7 +1,7 @@ - + diff --git a/backend/src/main/resources/mapper/data/FishStatisticsMapper.xml b/backend/src/main/resources/mapper/data/FishStatisticsMapper.xml index 53218609..8fa08150 100644 --- a/backend/src/main/resources/mapper/data/FishStatisticsMapper.xml +++ b/backend/src/main/resources/mapper/data/FishStatisticsMapper.xml @@ -1,7 +1,7 @@ - + diff --git a/backend/src/main/resources/mapper/data/ImportTaskRowMapper.xml b/backend/src/main/resources/mapper/data/ImportTaskRowMapper.xml index 78a617a6..5278483b 100644 --- a/backend/src/main/resources/mapper/data/ImportTaskRowMapper.xml +++ b/backend/src/main/resources/mapper/data/ImportTaskRowMapper.xml @@ -1,7 +1,7 @@ - + diff --git a/backend/src/main/resources/mapper/data/SysUserDataScopeMapper.xml b/backend/src/main/resources/mapper/data/SysUserDataScopeMapper.xml index b5d72bda..47fa5c30 100644 --- a/backend/src/main/resources/mapper/data/SysUserDataScopeMapper.xml +++ b/backend/src/main/resources/mapper/data/SysUserDataScopeMapper.xml @@ -1,7 +1,7 @@ - + From 5f7179949a945c114ebea2215b6b6fcb47d35071 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 4 Jun 2026 17:11:50 +0800 Subject: [PATCH 03/39] =?UTF-8?q?fix:=20=E6=B5=81=E5=9F=9F=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E4=B8=8B=E6=8B=89=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_base/mapper/SdRvcdDicMapper.java | 5 ++ .../service/impl/SdRvcdDicServiceImpl.java | 13 ++-- .../mapper/qgc_base/SdRvcdDicMapper.xml | 76 +++++++++++++++++++ 3 files changed, 87 insertions(+), 7 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdRvcdDicMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdRvcdDicMapper.java index 00b83828..07e27cc9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdRvcdDicMapper.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdRvcdDicMapper.java @@ -22,4 +22,9 @@ public interface SdRvcdDicMapper extends BaseMapper { * 查询所有根流域 */ List selectRootList(); + + /** + * 注册场景下拉框查询 + */ + List selectRegDropdown(@Param("rvnm") String rvnm, @Param("rvcd") String rvcd); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java index b962fdc6..9f6fce88 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java @@ -222,12 +222,7 @@ public class SdRvcdDicServiceImpl extends ServiceImpl regDropdown(String rvnm, String rvcd) { - return this.lambdaQuery() - .like(rvnm != null && !rvnm.isEmpty(), SdRvcdDic::getRvnm, rvnm) - .eq(rvcd != null && !rvcd.isEmpty(), SdRvcdDic::getRvcd, rvcd) - .eq(SdRvcdDic::getEnabled, 1) - .orderByAsc(SdRvcdDic::getBaseid,SdRvcdDic::getOrderIndex) - .list(); + return this.baseMapper.selectRegDropdown(rvnm, rvcd); } private void buildTreeRecursive(SdRvcdDic parent, Map> childrenMap, Set rootRvcdSet) { @@ -241,4 +236,8 @@ public class SdRvcdDicServiceImpl extends ServiceImpl()); } } -} \ No newline at end of file + + private boolean isRootRvcd(SdRvcdDic item) { + return item == null || !StringUtils.hasText(item.getPrvcd()) || "0".equals(item.getPrvcd()); + } +} diff --git a/backend/src/main/resources/mapper/qgc_base/SdRvcdDicMapper.xml b/backend/src/main/resources/mapper/qgc_base/SdRvcdDicMapper.xml index 913d985a..1bc653d5 100644 --- a/backend/src/main/resources/mapper/qgc_base/SdRvcdDicMapper.xml +++ b/backend/src/main/resources/mapper/qgc_base/SdRvcdDicMapper.xml @@ -53,4 +53,80 @@ ORDER BY ORDER_INDEX ASC + + From 272b85b275c040449dee9ce5664f90c15e21cc13 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 4 Jun 2026 17:17:15 +0800 Subject: [PATCH 04/39] =?UTF-8?q?fix:=20=E6=B5=81=E5=9F=9F=E4=B8=8B?= =?UTF-8?q?=E6=8B=89=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_base/service/impl/SdRvcdDicServiceImpl.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java index 9f6fce88..a98cc3fc 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java @@ -118,14 +118,9 @@ public class SdRvcdDicServiceImpl extends ServiceImpl selectForDropdown(String rvnm, String rvcd) { - - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.like(rvnm != null && !rvnm.isEmpty(), SdRvcdDic::getRvnm, rvnm) - .eq(rvcd != null && !rvcd.isEmpty(), SdRvcdDic::getRvcd, rvcd) - .eq(SdRvcdDic::getEnabled, 1) - .orderByAsc(SdRvcdDic::getBaseid,SdRvcdDic::getOrderIndex); + List dropdownList = this.baseMapper.selectRegDropdown(rvnm, rvcd); if("admin".equals(SecurityUtils.getCurrentUsername())){ - return this.list(wrapper); + return dropdownList; } Set authorizedStations = getUserAuthorizedStationCodes(); if (authorizedStations != null && !authorizedStations.isEmpty()) { @@ -141,8 +136,7 @@ public class SdRvcdDicServiceImpl extends ServiceImpl list = this.list(wrapper); - return list.stream() + return dropdownList.stream() .filter(rvcdDic -> rvcds.contains(rvcdDic.getRvcd())) .collect(Collectors.toList()); } else { From 820eb3754877a56ca100fe9cdb8887a1deb393fe Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 4 Jun 2026 18:00:10 +0800 Subject: [PATCH 05/39] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=B5=81?= =?UTF-8?q?=E5=9F=9F=E6=A0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/TreeStructureServiceImpl.java | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/TreeStructureServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/TreeStructureServiceImpl.java index 0f627d39..4ceb2135 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/TreeStructureServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/TreeStructureServiceImpl.java @@ -353,17 +353,14 @@ public class TreeStructureServiceImpl implements ITreeStructureService { public List> getRvcdEngTree(String rvcd, String engName) { List> result = new ArrayList<>(); - // 1. 查询流域列表 - List rvcdList; + // 1. 查询流域列表,名称与排序口径对齐注册下拉 + List rvcdList = rvcdDicMapper.selectRegDropdown(null, null); if (StringUtils.hasText(rvcd)) { - rvcdList = rvcdDicMapper.selectByPrvcd(rvcd); - SdRvcdDic singleRvcd = rvcdDicMapper.selectById(rvcd); - if (singleRvcd != null && !rvcdList.contains(singleRvcd)) { - rvcdList = new ArrayList<>(); - rvcdList.add(singleRvcd); - } - } else { - rvcdList = rvcdDicMapper.selectRootList(); + Map rvcdMap = rvcdList.stream() + .collect(Collectors.toMap(SdRvcdDic::getRvcd, item -> item, (left, right) -> left)); + rvcdList = rvcdList.stream() + .filter(item -> isSameOrDescendantRvcd(item, rvcd, rvcdMap)) + .collect(Collectors.toList()); } // 2. 预加载所有流域下的电站(按流域分组) @@ -428,6 +425,24 @@ public class TreeStructureServiceImpl implements ITreeStructureService { return result; } + private boolean isSameOrDescendantRvcd(SdRvcdDic current, String targetRvcd, Map rvcdMap) { + if (current == null || !StringUtils.hasText(targetRvcd)) { + return false; + } + if (targetRvcd.equals(current.getRvcd())) { + return true; + } + Set visited = new HashSet<>(); + SdRvcdDic cursor = current; + while (cursor != null && StringUtils.hasText(cursor.getPrvcd()) && visited.add(cursor.getRvcd())) { + if (targetRvcd.equals(cursor.getPrvcd())) { + return true; + } + cursor = rvcdMap.get(cursor.getPrvcd()); + } + return false; + } + @Override public List> getBaseEngTree(String baseId, String engName) { List> result = new ArrayList<>(); From 1db7cc507506f09f190668c9b09e11098eaefd09 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 4 Jun 2026 18:17:30 +0800 Subject: [PATCH 06/39] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=9D=83?= =?UTF-8?q?=E9=99=90=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SysUserDataScopeServiceImpl.java | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/SysUserDataScopeServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/SysUserDataScopeServiceImpl.java index 1f106acb..2ecb857f 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/SysUserDataScopeServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/SysUserDataScopeServiceImpl.java @@ -172,6 +172,7 @@ public class SysUserDataScopeServiceImpl extends ServiceImpl orgNameMap = new HashMap<>(); + Map rvcdOrderMap = new HashMap<>(); // 3.1 查询流域名称 (BASIN) if (groupedByType.containsKey("RVCD")) { @@ -181,8 +182,30 @@ public class SysUserDataScopeServiceImpl extends ServiceImpl basins = rvcdDicMapper.selectBatchIds(rvcds); - basins.forEach(basin -> orgNameMap.put(basin.getRvcd(), basin.getRvnm())); + List dropdownBasins = rvcdDicMapper.selectRegDropdown(null, null); + Set handledRvcds = new HashSet<>(); + int dropdownOrder = 0; + + for (SdRvcdDic basin : dropdownBasins) { + dropdownOrder++; + if (rvcds.contains(basin.getRvcd())) { + orgNameMap.put(basin.getRvcd(), basin.getRvnm()); + rvcdOrderMap.put(basin.getRvcd(), String.format("%010d", dropdownOrder)); + handledRvcds.add(basin.getRvcd()); + } + } + + Set missingRvcds = rvcds.stream() + .filter(rvcd -> !handledRvcds.contains(rvcd)) + .collect(Collectors.toSet()); + + if (CollUtil.isNotEmpty(missingRvcds)) { + List basins = rvcdDicMapper.selectBatchIds(missingRvcds); + basins.forEach(basin -> { + orgNameMap.put(basin.getRvcd(), basin.getRvnm()); + rvcdOrderMap.put(basin.getRvcd(), String.format("ROOT-%010d", basin.getOrderIndex() == null ? Integer.MAX_VALUE : basin.getOrderIndex())); + }); + } } } @@ -251,6 +274,21 @@ public class SysUserDataScopeServiceImpl extends ServiceImpl { + boolean leftRvcd = "RVCD".equals(left.getOrgType()); + boolean rightRvcd = "RVCD".equals(right.getOrgType()); + if (leftRvcd && rightRvcd) { + String leftKey = rvcdOrderMap.getOrDefault(left.getOrgId(), "9999999999"); + String rightKey = rvcdOrderMap.getOrDefault(right.getOrgId(), "9999999999"); + int compare = leftKey.compareTo(rightKey); + if (compare != 0) { + return compare; + } + return StrUtil.nullToDefault(left.getOrgId(), "").compareTo(StrUtil.nullToDefault(right.getOrgId(), "")); + } + return 0; + }); + return voList; } From 17007d8a18495713b5c13c76f21f531358bbd675 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 4 Jun 2026 18:28:52 +0800 Subject: [PATCH 07/39] =?UTF-8?q?fix:=20=E4=B8=8B=E6=8B=89=E6=A1=86?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=9F=A5=E8=AF=A2(=E6=B3=A8=E5=86=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_base/mapper/SdRvcdDicMapper.java | 5 ++ .../service/impl/SdRvcdDicServiceImpl.java | 2 +- .../mapper/qgc_base/SdRvcdDicMapper.xml | 82 +++++++++++++++++++ 3 files changed, 88 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdRvcdDicMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdRvcdDicMapper.java index 07e27cc9..537d2e5f 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdRvcdDicMapper.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdRvcdDicMapper.java @@ -27,4 +27,9 @@ public interface SdRvcdDicMapper extends BaseMapper { * 注册场景下拉框查询 */ List selectRegDropdown(@Param("rvnm") String rvnm, @Param("rvcd") String rvcd); + + /** + * 注册场景下拉框查询,仅返回能被电站表 RVCD 命中的流域 + */ + List selectRegDropdownWithEng(@Param("rvnm") String rvnm, @Param("rvcd") String rvcd); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java index a98cc3fc..f1768cd5 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java @@ -216,7 +216,7 @@ public class SdRvcdDicServiceImpl extends ServiceImpl regDropdown(String rvnm, String rvcd) { - return this.baseMapper.selectRegDropdown(rvnm, rvcd); + return this.baseMapper.selectRegDropdownWithEng(rvnm, rvcd); } private void buildTreeRecursive(SdRvcdDic parent, Map> childrenMap, Set rootRvcdSet) { diff --git a/backend/src/main/resources/mapper/qgc_base/SdRvcdDicMapper.xml b/backend/src/main/resources/mapper/qgc_base/SdRvcdDicMapper.xml index 1bc653d5..fe7a7a8c 100644 --- a/backend/src/main/resources/mapper/qgc_base/SdRvcdDicMapper.xml +++ b/backend/src/main/resources/mapper/qgc_base/SdRvcdDicMapper.xml @@ -129,4 +129,86 @@ ORDER BY t.ORDER_PATH ASC, t.RVCD ASC + + From af87b8ca9a6485181a94302e477ce184e517d49a Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 4 Jun 2026 19:42:35 +0800 Subject: [PATCH 08/39] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E8=BF=87?= =?UTF-8?q?=E9=B1=BC=E6=95=B0=E6=8D=AE=E5=A1=AB=E6=8A=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_base/domain/StationBasinInfo.java | 2 + .../qgc_base/mapper/SdEngInfoBHMapper.java | 6 ++ .../qgc_data/domain/FishDraftData.java | 6 ++ .../qgc_data/domain/ImportTaskRow.java | 2 + .../service/impl/FishImportServiceImpl.java | 71 ++++++++++-------- .../service/impl/ImportTaskServiceImpl.java | 2 + .../controller/SmsVerifyCodeController.java | 12 +-- .../system/service/impl/UserServiceImpl.java | 18 +++-- .../mapper/data/SysUserDataScopeMapper.xml | 75 +++++++++++++------ .../mapper/qgc_base/SdEngInfoBHMapper.xml | 26 ++++++- 10 files changed, 151 insertions(+), 69 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/StationBasinInfo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/StationBasinInfo.java index ac1f326c..d0c53bd6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/StationBasinInfo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/StationBasinInfo.java @@ -8,4 +8,6 @@ public class StationBasinInfo { private String ennm; // 电站名称 private String hbrvcd; // 流域编码 private String hbrvnm; // 流域名称 + private String rvcd; + private String rvnm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdEngInfoBHMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdEngInfoBHMapper.java index 2a4fa27c..9ce5b3ee 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdEngInfoBHMapper.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdEngInfoBHMapper.java @@ -40,5 +40,11 @@ public interface SdEngInfoBHMapper extends BaseMapper { List selectByHbrvcdList(@Param("hbrvcdList") List hbrvcdList); + /** + * 根据基地流域编码列表批量查询电站 + */ + List selectByRvcdList(@Param("rvcdList") List rvcdList); + + List selectStationBasinInfo(); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/domain/FishDraftData.java b/backend/src/main/java/com/yfd/platform/qgc_data/domain/FishDraftData.java index f3f02325..567d883d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/domain/FishDraftData.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/domain/FishDraftData.java @@ -237,6 +237,12 @@ public class FishDraftData implements Serializable { @TableField(exist = false) private String rvcd; + /** + * 流域编码 + */ + @TableField(exist = false) + private String rvnm; + /** * 基地流域编码 */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/domain/ImportTaskRow.java b/backend/src/main/java/com/yfd/platform/qgc_data/domain/ImportTaskRow.java index 71527dc8..3112c103 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/domain/ImportTaskRow.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/domain/ImportTaskRow.java @@ -47,6 +47,8 @@ public class ImportTaskRow implements Serializable { private String rvcd; + private String rvnm; + private String baseId; private String baseName; diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java index 6df1f3fd..fbecd30c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java @@ -133,7 +133,7 @@ public class FishImportServiceImpl implements IFishImportService { EXCEL_COLUMN_MAPPING.put("过鱼设施名称", "fpname"); - EXCEL_COLUMN_INDEX_MAPPING.put(0, "hbrvcd"); + EXCEL_COLUMN_INDEX_MAPPING.put(0, "rvcd"); EXCEL_COLUMN_INDEX_MAPPING.put(1, "stationName"); EXCEL_COLUMN_INDEX_MAPPING.put(2, "stnm"); EXCEL_COLUMN_INDEX_MAPPING.put(3, "strdt"); @@ -186,11 +186,11 @@ public class FishImportServiceImpl implements IFishImportService { Map columnIndexMap = new HashMap<>(EXCEL_COLUMN_INDEX_MAPPING); - Set allowedHbrvcdSet = new HashSet<>(); + Set allowedRvcdSet = new HashSet<>(); Set directStcdSet = new HashSet<>(); List sdFpssList=new ArrayList<>(); - List allowedHbrvcdList = new ArrayList<>(); + List allowedRvcdList = new ArrayList<>(); List directStcdList = new ArrayList<>(); if (uploadUserId != null) { List permissions = userDataScopeMapper.selectValidPermissions(uploadUserId); @@ -203,8 +203,8 @@ public class FishImportServiceImpl implements IFishImportService { continue; } - if ("HBRVCD".equals(orgType)) { - allowedHbrvcdSet.add(orgId); + if ("RVCD".equals(orgType)) { + allowedRvcdSet.add(orgId); } else if ("STATION".equals(orgType)) { directStcdSet.add(orgId); } @@ -213,9 +213,9 @@ public class FishImportServiceImpl implements IFishImportService { } - if (!allowedHbrvcdSet.isEmpty() || !directStcdSet.isEmpty()) { - if (!allowedHbrvcdSet.isEmpty()) { - List stationsFromHbrv = engInfoBHMapper.selectByHbrvcdList(new ArrayList<>(allowedHbrvcdSet)); + if (!allowedRvcdSet.isEmpty() || !directStcdSet.isEmpty()) { + if (!allowedRvcdSet.isEmpty()) { + List stationsFromHbrv = engInfoBHMapper.selectByRvcdList(new ArrayList<>(allowedRvcdSet)); for (SdEngInfoBH station : stationsFromHbrv) { if (station.getStcd() != null) { directStcdSet.add(station.getStcd()); @@ -229,16 +229,16 @@ public class FishImportServiceImpl implements IFishImportService { if (station.getStcd() != null) { directStcdSet.add(station.getStcd()); } - if (station.getHbrvcd() != null) { - allowedHbrvcdSet.add(station.getHbrvcd()); + if (station.getRvcd() != null) { + allowedRvcdSet.add(station.getRvcd()); } } } } - if(!allowedHbrvcdSet.isEmpty()){ - List sdHbrvDics = sdHbrvDicMapper.selectList(new LambdaQueryWrapper().in(SdHbrvDic::getHbrvcd, allowedHbrvcdSet).select(SdHbrvDic::getHbrvcd, SdHbrvDic::getHbrvnm)); - allowedHbrvcdList.addAll(sdHbrvDics); + if(!allowedRvcdSet.isEmpty()){ + List sdRvcdDics = rvcdDicMapper.selectList(new LambdaQueryWrapper().in(SdRvcdDic::getRvcd, allowedRvcdSet).select(SdRvcdDic::getRvcd, SdRvcdDic::getRvnm)); + allowedRvcdList.addAll(sdRvcdDics); } if (!directStcdSet.isEmpty()) { @@ -258,7 +258,7 @@ public class FishImportServiceImpl implements IFishImportService { continue; } - FishImportResult.FishImportRow importRow = parseRow(result, row, columnIndexMap, i, uploadUserId,allowedHbrvcdList,directStcdList,sdFpssList); + FishImportResult.FishImportRow importRow = parseRow(result, row, columnIndexMap, i, uploadUserId,allowedRvcdList,directStcdList,sdFpssList); result.setTotalCount(result.getTotalCount() + 1); if (importRow.getData() != null && importRow.getWarnings().isEmpty()) { result.addSuccessRow(importRow); @@ -274,7 +274,7 @@ public class FishImportServiceImpl implements IFishImportService { return result; } - private FishImportResult.FishImportRow parseRow(FishImportResult result, Row row, Map columnIndexMap, int rowIndex, String userId,List allowedHbrvcdList,List directStcdList,List sdFpssList) { + private FishImportResult.FishImportRow parseRow(FishImportResult result, Row row, Map columnIndexMap, int rowIndex, String userId,List allowRvcdList,List directStcdList,List sdFpssList) { FishImportResult.FishImportRow importRow = new FishImportResult.FishImportRow(rowIndex); @@ -323,13 +323,19 @@ public class FishImportServiceImpl implements IFishImportService { } break; case "rvcd": - if (StringUtils.hasText(cellValue)) { - String rvcd = resolveRiverCode(cellValue.trim()); - if (rvcd == null) { - importRow.getWarnings().add(fieldName); - data.setRvcd(cellValue); + if (!StringUtils.hasText(cellValue)) { + importRow.getWarnings().add("rvcd"); + data.setHbrvcd(cellValue); + data.setHbrvnm(cellValue); + } else { + String rvcdCode = allowRvcdList.stream().filter(sdRvcdDic -> sdRvcdDic.getRvnm().equals(cellValue.trim())).map(SdRvcdDic::getRvcd).findFirst().orElse( null); + if (StrUtil.isBlank(rvcdCode)) { + importRow.getWarnings().add("rvcd"); + data.setRvcd(cellValue.trim()); + data.setRvnm(cellValue.trim()); } else { - data.setRvcd(rvcd); + data.setRvcd(rvcdCode); + data.setRvnm(cellValue.trim()); } } break; @@ -338,17 +344,18 @@ public class FishImportServiceImpl implements IFishImportService { importRow.getWarnings().add("hbrvcd"); data.setHbrvcd(cellValue); data.setHbrvnm(cellValue); - } else { - String hbrvcdCode = allowedHbrvcdList.stream().filter(sdHbrvDic -> sdHbrvDic.getHbrvnm().equals(cellValue.trim())).map(SdHbrvDic::getHbrvcd).findFirst().orElse( null); - if (StrUtil.isBlank(hbrvcdCode)) { - importRow.getWarnings().add("hbrvcd"); - data.setHbrvcd(cellValue.trim()); - data.setHbrvnm(cellValue.trim()); - } else { - data.setHbrvcd(hbrvcdCode); - data.setHbrvnm(cellValue.trim()); - } } +// else { +// String hbrvcdCode = allowedHbrvcdList.stream().filter(sdHbrvDic -> sdHbrvDic.getHbrvnm().equals(cellValue.trim())).map(SdHbrvDic::getHbrvcd).findFirst().orElse( null); +// if (StrUtil.isBlank(hbrvcdCode)) { +// importRow.getWarnings().add("hbrvcd"); +// data.setHbrvcd(cellValue.trim()); +// data.setHbrvnm(cellValue.trim()); +// } else { +// data.setHbrvcd(hbrvcdCode); +// data.setHbrvnm(cellValue.trim()); +// } +// } // break; case "tm": @@ -618,7 +625,7 @@ public class FishImportServiceImpl implements IFishImportService { private void validateStationFpssRelation(FishDraftData data, FishImportResult.FishImportRow importRow) { - if (importRow.getWarnings().contains("hbrvcd")) { + if (importRow.getWarnings().contains("rvcd")) { if (!importRow.getWarnings().contains("rstcd")) { importRow.getWarnings().add("rstcd"); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/ImportTaskServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/ImportTaskServiceImpl.java index db0b1550..c4c829d5 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/ImportTaskServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/ImportTaskServiceImpl.java @@ -263,6 +263,7 @@ public class ImportTaskServiceImpl extends ServiceImpl selectedStationCodes = new HashSet<>(); if (StringUtils.isNotEmpty(stationCode)) { @@ -250,8 +250,8 @@ public class SmsVerifyCodeController { } Set selectedBasinCodes = new HashSet<>(); - if (StringUtils.isNotEmpty(hbrvcdCode)) { - selectedBasinCodes.addAll(Arrays.asList(hbrvcdCode.split(","))); + if (StringUtils.isNotEmpty(rvcdCode)) { + selectedBasinCodes.addAll(Arrays.asList(rvcdCode.split(","))); } // Set addedStationCodes = new HashSet<>(); @@ -262,13 +262,13 @@ public class SmsVerifyCodeController { } List allStationsInBasin = engInfoBHService.lambdaQuery() - .eq(SdEngInfoBH::getHbrvcd, basinCode) + .eq(SdEngInfoBH::getRvcd, basinCode) .list(); if (allStationsInBasin == null || allStationsInBasin.isEmpty()) { SysUserDataScope scope = new SysUserDataScope(); scope.setUserId(userId); - scope.setOrgType("HBRVCD"); + scope.setOrgType("RVCD"); scope.setOrgId(basinCode); scope.setStatus(1); scope.setPermissionType("READ"); @@ -286,7 +286,7 @@ public class SmsVerifyCodeController { if (allStationsSelected) { SysUserDataScope scope = new SysUserDataScope(); scope.setUserId(userId); - scope.setOrgType("HBRVCD"); + scope.setOrgType("RVCD"); scope.setOrgId(basinCode); scope.setStatus(1); scope.setPermissionType("READ"); diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java index bdc2fa5e..cdd40b31 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java @@ -709,24 +709,28 @@ public class UserServiceImpl extends ServiceImpl impleme String orgId = scope.getOrgId(); String orgName = scope.getOrgName(); - if ("HBRVCD".equals(orgType)) { - if (orgName != null) { + if ("RVCD".equals(orgType)) { + if (StrUtil.isNotBlank(orgName)) { basinNameSet.add(orgName); } if (orgId != null) { if (stationBasinInfos != null) { - List stcdList = stationBasinInfos.stream().filter(info -> info.getHbrvcd().equals(orgId)).map(StationBasinInfo::getEnnm).toList(); - stationNameSet.addAll(stcdList); + List stcdList = stationBasinInfos.stream().filter(info -> info.getRvcd().equals(orgId)).map(StationBasinInfo::getEnnm).toList(); + if(!stcdList.isEmpty()){ + stationNameSet.addAll(stcdList); + } } } } else if ("STATION".equals(orgType)) { - if (orgName != null) { + if (StrUtil.isNotBlank(orgName)) { stationNameSet.add(orgName); } if (orgId != null) { if (stationBasinInfos != null) { - String hbrbcd = stationBasinInfos.stream().filter(info -> info.getStcd().equals(orgId)).map(StationBasinInfo::getHbrvnm).findFirst().orElse(null); - basinNameSet.add(hbrbcd); + String rvcd = stationBasinInfos.stream().filter(info -> info.getStcd().equals(orgId)).map(StationBasinInfo::getRvnm).findFirst().orElse(null); + if(StrUtil.isNotBlank(rvcd)){ + basinNameSet.add(rvcd); + } } } } diff --git a/backend/src/main/resources/mapper/data/SysUserDataScopeMapper.xml b/backend/src/main/resources/mapper/data/SysUserDataScopeMapper.xml index 47fa5c30..7f4f65d0 100644 --- a/backend/src/main/resources/mapper/data/SysUserDataScopeMapper.xml +++ b/backend/src/main/resources/mapper/data/SysUserDataScopeMapper.xml @@ -103,36 +103,69 @@ ORDER BY s.CREATED_AT DESC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml b/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml index 0e04883c..09252e15 100644 --- a/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml +++ b/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml @@ -238,15 +238,25 @@ + + + + + + + + + + + + + From eddf659bc2617f0d7c1c8ec40a469271b4b15a59 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 5 Jun 2026 09:30:48 +0800 Subject: [PATCH 09/39] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E8=BF=87?= =?UTF-8?q?=E9=B1=BC=E6=95=B0=E6=8D=AE=E5=A1=AB=E6=8A=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_base/domain/SdEngInfoBHRequest.java | 1 + .../service/impl/SdEngInfoBHServiceImpl.java | 3 + .../controller/FishDraftDataController.java | 65 ++- .../qgc_data/service/IFishImportService.java | 4 +- .../service/impl/FishImportServiceImpl.java | 379 +++++++++++------- 5 files changed, 288 insertions(+), 164 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBHRequest.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBHRequest.java index 5227bdb2..402b3bda 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBHRequest.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBHRequest.java @@ -12,6 +12,7 @@ import java.util.List; public class SdEngInfoBHRequest { private String baseId; private String hbrvcd; + private String rvcd; private List basIds; private List hbrvcds; private List rvcds; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java index d1e63e39..cf90f151 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -84,11 +85,13 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl rvcds = sdEngInfoBHRequest.getRvcds(); List hbrvcds = sdEngInfoBHRequest.getHbrvcds(); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(StringUtils.hasText(baseId), SdEngInfoBH::getBaseId, baseId) .eq(StringUtils.hasText(hbrvcd), SdEngInfoBH::getHbrvcd, hbrvcd) + .eq(StrUtil.isNotBlank(rvcd), SdEngInfoBH::getRvcd, rvcd) .in(rvcds != null && !rvcds.isEmpty(), SdEngInfoBH::getRvcd, rvcds) .in(hbrvcds != null && !hbrvcds.isEmpty(), SdEngInfoBH::getHbrvcd, hbrvcds) .like(StringUtils.hasText(ennm), SdEngInfoBH::getEnnm, ennm) diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/controller/FishDraftDataController.java b/backend/src/main/java/com/yfd/platform/qgc_data/controller/FishDraftDataController.java index 6c3b3ce6..00c3b5c9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/controller/FishDraftDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/controller/FishDraftDataController.java @@ -1095,21 +1095,25 @@ public class FishDraftDataController { private void validateAndNormalizeData(FishDraftData data, FishImportResult.FishImportRow importRow, List warnings) { if (data.getStcd() == null || data.getStcd().isEmpty()) { - warnings.add("stcd"); + addWarning(warnings, "stcd"); } else { String stcd = fishImportService.resolveFpssCode(data.getStcd(), data.getStnm()); if (stcd == null) { - warnings.add("stcd"); + addWarning(warnings, "stcd"); + } else { + data.setStcd(stcd); } } if (data.getRstcd() != null && !data.getRstcd().isEmpty()) { String stationCode = fishImportService.resolveStationCode(data.getRstcd(), data.getEnnm()); if (stationCode == null) { - warnings.add("rstcd"); + addWarning(warnings, "rstcd"); + } else { + data.setRstcd(stationCode); } } else { - warnings.add("rstcd"); + addWarning(warnings, "rstcd"); } // if (data.getBaseId() != null && !data.getBaseId().isEmpty()) { @@ -1122,14 +1126,18 @@ public class FishDraftDataController { if (data.getHbrvcd() != null && !data.getHbrvcd().isEmpty()) { String baseId = fishImportService.resolveHbrvcdCode(data.getHbrvcd(), data.getHbrvnm()); if (baseId == null) { - warnings.add("hbrvcd"); + addWarning(warnings, "hbrvcd"); + } else { + data.setHbrvcd(baseId); } } if (data.getRvcd() != null && !data.getRvcd().isEmpty()) { - String rvcd = fishImportService.resolveRiverCode(data.getRvcd(), data.getRvcd()); + String rvcd = fishImportService.resolveRiverCode(data.getRvcd(), data.getRvnm()); if (rvcd == null) { - warnings.add("rvcd"); + addWarning(warnings, "rvcd"); + } else { + data.setRvcd(rvcd); } } @@ -1145,55 +1153,64 @@ public class FishDraftDataController { // } if (data.getFtp() == null || data.getFtp().isEmpty()) { - warnings.add("ftp"); + addWarning(warnings, "ftp"); } else { String ftpCode = fishImportService.resolveFishDictCode(data.getFtp(), data.getFtpName()); if (ftpCode == null) { - warnings.add("ftp"); + addWarning(warnings, "ftp"); + } else { + data.setFtp(ftpCode); } } if (data.getFcnt() == null) { - warnings.add("fcnt"); + addWarning(warnings, "fcnt"); } if (data.getStrdt() == null) { - warnings.add("strdt"); + addWarning(warnings, "strdt"); } if (data.getEnddt() != null && data.getStrdt() != null && data.getEnddt().before(data.getStrdt())) { - warnings.add("enddt"); + addWarning(warnings, "enddt"); } if (data.getDirection() == null || data.getDirection().isEmpty()) { - warnings.add("direction"); + addWarning(warnings, "direction"); } else { String direction = fishImportService.resolveDirection(data.getDirection().trim(), importRow); if (direction == null) { - warnings.add("direction"); + addWarning(warnings, "direction"); } } if (data.getIsfs() == null) { - warnings.add("isfs"); + addWarning(warnings, "isfs"); } else { String isfs = fishImportService.resolveIsfs(String.valueOf(data.getIsfs()), importRow); if (isfs == null) { - warnings.add("isfs"); + addWarning(warnings, "isfs"); } } if (StringUtils.hasText(data.getHbrvcd()) && StringUtils.hasText(data.getRstcd())) { if (!fishImportService.validateStationBelongsToBase(data.getRstcd(), data.getHbrvcd())) { - warnings.add("hbrvcd"); - warnings.add("rstcd"); + addWarning(warnings, "hbrvcd"); + addWarning(warnings, "rstcd"); + } + } + + if (StringUtils.hasText(data.getRvcd()) && StringUtils.hasText(data.getRstcd())) { + if (!fishImportService.validateStationBelongsToRiver(data.getRstcd(), data.getRvcd())) { + addWarning(warnings, "rvcd"); + addWarning(warnings, "rstcd"); } } if (StringUtils.hasText(data.getRstcd()) && StringUtils.hasText(data.getStcd())) { if (!fishImportService.validateFpssBelongsToStation(data.getStcd(), data.getRstcd())) { - warnings.add("stcd"); - warnings.add("rstcd"); + addWarning(warnings, "stcd"); + addWarning(warnings, "rstcd"); } } @@ -1202,6 +1219,12 @@ public class FishDraftDataController { // } } + private void addWarning(List warnings, String field) { + if (!warnings.contains(field)) { + warnings.add(field); + } + } + @PostMapping("/validateAndMatchRow") @Operation(summary = "校验数据并匹配到成功或失败列表") public ResponseResult validateAndMatchRow(@RequestBody FishImportRowRequest request) { @@ -1324,4 +1347,4 @@ public class FishDraftDataController { Thread.currentThread().interrupt(); } } -} \ No newline at end of file +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/service/IFishImportService.java b/backend/src/main/java/com/yfd/platform/qgc_data/service/IFishImportService.java index 1aafd8a1..44bfdb8d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/service/IFishImportService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/service/IFishImportService.java @@ -50,10 +50,12 @@ public interface IFishImportService { boolean validateStationBelongsToBase(String stationCode, String baseId); + boolean validateStationBelongsToRiver(String stationCode, String rvcd); + boolean validateFpssBelongsToStation(String fpssCode, String stationCode); void processAttachments(FishImportResult result, ZipFileUtil.ZipContent zipContent); void processAttachmentsAsync(List dataList, String tempDir); -} \ No newline at end of file +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java index fbecd30c..13f0f4c8 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java @@ -831,248 +831,343 @@ public class FishImportServiceImpl implements IFishImportService { public String resolveStationCode(String stationName) { - if (stationName == null) { + String normalizedName = normalizeInput(stationName); + if (!StringUtils.hasText(normalizedName)) { return null; } - String lowerName = stationName.toLowerCase().trim(); - if (STATION_NAME_CACHE.containsKey(lowerName)) { - return STATION_NAME_CACHE.get(lowerName); + SdEngInfoBH exactMatch = findFirst(engInfoBHMapper.selectList(new LambdaQueryWrapper() + .select(SdEngInfoBH::getStcd, SdEngInfoBH::getEnnm) + .eq(SdEngInfoBH::getEnnm, normalizedName))); + if (exactMatch != null) { + return exactMatch.getStcd(); } - for (Map.Entry entry : STATION_NAME_CACHE.entrySet()) { - if (entry.getKey().contains(lowerName)) { - return entry.getValue(); - } - } - return null; + SdEngInfoBH fuzzyMatch = findFirst(engInfoBHMapper.selectList(new LambdaQueryWrapper() + .select(SdEngInfoBH::getStcd, SdEngInfoBH::getEnnm) + .like(SdEngInfoBH::getEnnm, normalizedName))); + return fuzzyMatch == null ? null : fuzzyMatch.getStcd(); } public String resolveFpssCode(String name) { - if (name == null) { + String normalizedName = normalizeInput(name); + if (!StringUtils.hasText(normalizedName)) { return null; } - String lowerName = name.toLowerCase().trim(); - if (FPSS_BH_CACHE.containsKey(lowerName)) { - return FPSS_BH_CACHE.get(lowerName); + SdFpssBH exactMatch = findFirst(fpssBHMapper.selectList(new LambdaQueryWrapper() + .select(SdFpssBH::getStcd, SdFpssBH::getStnm, SdFpssBH::getRstcd) + .eq(SdFpssBH::getStnm, normalizedName))); + if (exactMatch != null) { + return exactMatch.getStcd(); } - for (Map.Entry entry : FPSS_BH_CACHE.entrySet()) { - if (entry.getKey().contains(lowerName)) { - return entry.getValue(); - } - } - return null; + SdFpssBH fuzzyMatch = findFirst(fpssBHMapper.selectList(new LambdaQueryWrapper() + .select(SdFpssBH::getStcd, SdFpssBH::getStnm, SdFpssBH::getRstcd) + .like(SdFpssBH::getStnm, normalizedName))); + return fuzzyMatch == null ? null : fuzzyMatch.getStcd(); } @Override public String resolveStationCode(String code, String stationName) { - if (code == null && stationName == null) { + String normalizedCode = normalizeInput(code); +// String normalizedName = normalizeInput(stationName); + if (!StringUtils.hasText(normalizedCode)) { return null; } - loadStationAndBaseCache(); - String lowerCode = code != null ? code.trim().toLowerCase() : null; - String lowerName = stationName != null ? stationName.trim().toLowerCase() : null; - if (lowerCode != null && lowerName != null) { - String cachedName = STATION_CODE_TO_NAME_CACHE.get(lowerCode); - if (cachedName != null && cachedName.equals(lowerName)) { - return code.trim(); + if (StringUtils.hasText(normalizedCode)) { + SdEngInfoBH exact = findFirst(engInfoBHMapper.selectList(new LambdaQueryWrapper() + .select(SdEngInfoBH::getStcd, SdEngInfoBH::getEnnm) + .eq(SdEngInfoBH::getStcd, normalizedCode))); +// .eq(SdEngInfoBH::getEnnm, normalizedName))); + if (exact != null) { + return exact.getStcd(); } } - String resultByName = resolveStationCode(stationName); - if (resultByName != null && resultByName.equalsIgnoreCase(code)) { - return resultByName; - } +// if (StringUtils.hasText(normalizedCode)) { +// SdEngInfoBH byCode = engInfoBHMapper.selectById(normalizedCode); +// if (byCode != null && (!StringUtils.hasText(normalizedName) || normalizedName.equals(byCode.getEnnm()))) { +// return byCode.getStcd(); +// } +// } +// if (StringUtils.hasText(normalizedName)) { +// String resultByName = resolveStationCode(normalizedName); +// if (!StringUtils.hasText(normalizedCode) || normalizedCode.equalsIgnoreCase(resultByName)) { +// return resultByName; +// } +// } return null; } @Override public String resolveFpssCode(String code, String name) { - if (code == null && name == null) { + String normalizedCode = normalizeInput(code); +// String normalizedName = normalizeInput(name); + if (!StringUtils.hasText(normalizedCode)) { return null; } - loadStationAndBaseCache(); - String lowerCode = code != null ? code.trim().toLowerCase() : null; - String lowerName = name != null ? name.trim().toLowerCase() : null; - if (lowerCode != null && lowerName != null) { - String cachedName = FPSS_CODE_TO_NAME_CACHE.get(lowerCode); - if (cachedName != null && cachedName.equals(lowerName)) { - return code.trim(); + if (StringUtils.hasText(normalizedCode)) { + SdFpssBH exact = findFirst(fpssBHMapper.selectList(new LambdaQueryWrapper() + .select(SdFpssBH::getStcd, SdFpssBH::getStnm, SdFpssBH::getRstcd) + .eq(SdFpssBH::getStcd, normalizedCode))); +// .eq(SdFpssBH::getStnm, normalizedName))); + if (exact != null) { + return exact.getStcd(); } } - String resultByName = resolveFpssCode(name); - if (resultByName != null && resultByName.equalsIgnoreCase(code)) { - return resultByName; - } +// if (StringUtils.hasText(normalizedCode)) { +// SdFpssBH byCode = fpssBHMapper.selectById(normalizedCode); +// if (byCode != null && (!StringUtils.hasText(normalizedName) || normalizedName.equals(byCode.getStnm()))) { +// return byCode.getStcd(); +// } +// } +// if (StringUtils.hasText(normalizedName)) { +// String resultByName = resolveFpssCode(normalizedName); +// if (!StringUtils.hasText(normalizedCode) || normalizedCode.equalsIgnoreCase(resultByName)) { +// return resultByName; +// } +// } return null; } public String resolveFishDictCode(String name) { - if (name == null) { + String normalizedName = normalizeInput(name); + if (!StringUtils.hasText(normalizedName)) { return null; } - String lowerName = name.toLowerCase().trim(); - if (FISH_DICT_CACHE.containsKey(lowerName)) { - return FISH_DICT_CACHE.get(lowerName); + SdFishDictoryB exactMatch = findFirst(fishDictoryBMapper.selectList(new LambdaQueryWrapper() + .select(SdFishDictoryB::getCode, SdFishDictoryB::getName) + .eq(SdFishDictoryB::getName, normalizedName))); + if (exactMatch != null) { + return exactMatch.getCode(); } - for (Map.Entry entry : FISH_DICT_CACHE.entrySet()) { - if (entry.getKey().contains(lowerName) || lowerName.contains(entry.getKey())) { - return entry.getValue(); - } - } - return null; + SdFishDictoryB fuzzyMatch = findFirst(fishDictoryBMapper.selectList(new LambdaQueryWrapper() + .select(SdFishDictoryB::getCode, SdFishDictoryB::getName) + .and(wrapper -> wrapper.like(SdFishDictoryB::getName, normalizedName) + .or() + .like(SdFishDictoryB::getAlias, normalizedName)))); + return fuzzyMatch == null ? null : fuzzyMatch.getCode(); } @Override public String resolveFishDictCode(String code, String name) { - if (code == null && name == null) { + String normalizedCode = normalizeInput(code); +// String normalizedName = normalizeInput(name); + if (!StringUtils.hasText(normalizedCode)) { return null; } - loadStationAndBaseCache(); - String lowerCode = code != null ? code.trim().toLowerCase() : null; - String lowerName = name != null ? name.trim().toLowerCase() : null; - if (lowerCode != null && lowerName != null) { - String cachedName = FISH_CODE_TO_NAME_CACHE.get(lowerCode); - if (cachedName != null && cachedName.equals(lowerName)) { - return code.trim(); + if (StringUtils.hasText(normalizedCode)) { + SdFishDictoryB exact = findFirst(fishDictoryBMapper.selectList(new LambdaQueryWrapper() + .select(SdFishDictoryB::getCode, SdFishDictoryB::getName) + .eq(SdFishDictoryB::getCode, normalizedCode))); +// .eq(SdFishDictoryB::getName, normalizedName))); + if (exact != null) { + return exact.getCode(); } } - String resultByName = resolveFishDictCode(name); - if (resultByName != null && resultByName.equalsIgnoreCase(code)) { - return resultByName; - } +// if (StringUtils.hasText(normalizedCode)) { +// SdFishDictoryB byCode = findFirst(fishDictoryBMapper.selectList(new LambdaQueryWrapper() +// .select(SdFishDictoryB::getCode, SdFishDictoryB::getName) +// .eq(SdFishDictoryB::getCode, normalizedCode))); +// if (byCode != null && (!StringUtils.hasText(normalizedName) || normalizedName.equals(byCode.getName()))) { +// return byCode.getCode(); +// } +// } +// if (StringUtils.hasText(normalizedName)) { +// String resultByName = resolveFishDictCode(normalizedName); +// if (!StringUtils.hasText(normalizedCode) || normalizedCode.equalsIgnoreCase(resultByName)) { +// return resultByName; +// } +// } return null; } public String resolveBaseCode(String baseName) { - if (baseName == null) { + String normalizedName = normalizeInput(baseName); + if (!StringUtils.hasText(normalizedName)) { return null; } - String lowerName = baseName.toLowerCase().trim(); - if (BASE_NAME_CACHE.containsKey(lowerName)) { - return BASE_NAME_CACHE.get(lowerName); + SdHydrobase exactMatch = findFirst(hydrobaseMapper.selectList(new LambdaQueryWrapper() + .select(SdHydrobase::getBaseid, SdHydrobase::getBasename) + .eq(SdHydrobase::getBasename, normalizedName))); + if (exactMatch != null) { + return exactMatch.getBaseid(); } - for (Map.Entry entry : BASE_NAME_CACHE.entrySet()) { - if (entry.getKey().contains(lowerName)) { - return entry.getValue(); - } - } - return null; + SdHydrobase fuzzyMatch = findFirst(hydrobaseMapper.selectList(new LambdaQueryWrapper() + .select(SdHydrobase::getBaseid, SdHydrobase::getBasename) + .like(SdHydrobase::getBasename, normalizedName))); + return fuzzyMatch == null ? null : fuzzyMatch.getBaseid(); } @Override public String resolveBaseCode(String code, String baseName) { - if (code == null && baseName == null) { + String normalizedCode = normalizeInput(code); + String normalizedName = normalizeInput(baseName); + if (!StringUtils.hasText(normalizedCode) && !StringUtils.hasText(normalizedName)) { return null; } - loadStationAndBaseCache(); - String lowerCode = code != null ? code.trim().toLowerCase() : null; - String lowerName = baseName != null ? baseName.trim().toLowerCase() : null; - if (lowerCode != null && lowerName != null) { - String cachedName = BASE_CODE_TO_NAME_CACHE.get(lowerCode); - if (cachedName != null && cachedName.equals(lowerName)) { - return code.trim(); + if (StringUtils.hasText(normalizedCode) && StringUtils.hasText(normalizedName)) { + SdHydrobase exact = findFirst(hydrobaseMapper.selectList(new LambdaQueryWrapper() + .select(SdHydrobase::getBaseid, SdHydrobase::getBasename) + .eq(SdHydrobase::getBaseid, normalizedCode) + .eq(SdHydrobase::getBasename, normalizedName))); + if (exact != null) { + return exact.getBaseid(); } } - String resultByName = resolveBaseCode(baseName); - if (resultByName != null && resultByName.equalsIgnoreCase(code)) { - return resultByName; + if (StringUtils.hasText(normalizedCode)) { + SdHydrobase byCode = hydrobaseMapper.selectById(normalizedCode); + if (byCode != null && (!StringUtils.hasText(normalizedName) || normalizedName.equals(byCode.getBasename()))) { + return byCode.getBaseid(); + } + } + if (StringUtils.hasText(normalizedName)) { + String resultByName = resolveBaseCode(normalizedName); + if (!StringUtils.hasText(normalizedCode) || normalizedCode.equalsIgnoreCase(resultByName)) { + return resultByName; + } } return null; } public String resolveRiverCode(String riverName) { - if (riverName == null) { + String normalizedName = normalizeInput(riverName); + if (!StringUtils.hasText(normalizedName)) { return null; } - String lowerName = riverName.toLowerCase().trim(); - if (RIVER_NAME_CACHE.containsKey(lowerName)) { - return RIVER_NAME_CACHE.get(lowerName); + SdRvcdDic exactMatch = findFirst(rvcdDicMapper.selectList(new LambdaQueryWrapper() + .select(SdRvcdDic::getRvcd, SdRvcdDic::getRvnm) + .eq(SdRvcdDic::getRvnm, normalizedName))); + if (exactMatch != null) { + return exactMatch.getRvcd(); } - for (Map.Entry entry : RIVER_NAME_CACHE.entrySet()) { - if (entry.getKey().contains(lowerName)) { - return entry.getValue(); - } - } - return null; + SdRvcdDic fuzzyMatch = findFirst(rvcdDicMapper.selectList(new LambdaQueryWrapper() + .select(SdRvcdDic::getRvcd, SdRvcdDic::getRvnm) + .like(SdRvcdDic::getRvnm, normalizedName))); + return fuzzyMatch == null ? null : fuzzyMatch.getRvcd(); } public String resolveHbrvcdCode(String riverName) { - if (riverName == null) { + String normalizedName = normalizeInput(riverName); + if (!StringUtils.hasText(normalizedName)) { return null; } - String lowerName = riverName.toLowerCase().trim(); - if (HBRVCD_NAME_CACHE.containsKey(lowerName)) { - return HBRVCD_NAME_CACHE.get(lowerName); + SdHbrvDic exactMatch = findFirst(sdHbrvDicMapper.selectList(new LambdaQueryWrapper() + .select(SdHbrvDic::getHbrvcd, SdHbrvDic::getHbrvnm) + .eq(SdHbrvDic::getHbrvnm, normalizedName))); + if (exactMatch != null) { + return exactMatch.getHbrvcd(); } - for (Map.Entry entry : HBRVCD_NAME_CACHE.entrySet()) { - if (entry.getKey().contains(lowerName)) { - return entry.getValue(); - } - } - return null; + SdHbrvDic fuzzyMatch = findFirst(sdHbrvDicMapper.selectList(new LambdaQueryWrapper() + .select(SdHbrvDic::getHbrvcd, SdHbrvDic::getHbrvnm) + .like(SdHbrvDic::getHbrvnm, normalizedName))); + return fuzzyMatch == null ? null : fuzzyMatch.getHbrvcd(); } @Override public String resolveRiverCode(String code, String riverName) { - if (code == null && riverName == null) { + String normalizedCode = normalizeInput(code); +// String normalizedName = normalizeInput(riverName); + if (!StringUtils.hasText(normalizedCode)) { return null; } - loadStationAndBaseCache(); - String lowerCode = code != null ? code.trim().toLowerCase() : null; - String lowerName = riverName != null ? riverName.trim().toLowerCase() : null; - if (lowerCode != null && lowerName != null) { - String cachedName = RIVER_CODE_TO_NAME_CACHE.get(lowerCode); - if (cachedName != null && cachedName.equals(lowerName)) { - return code.trim(); + if (StringUtils.hasText(normalizedCode)) { + SdRvcdDic exact = findFirst(rvcdDicMapper.selectList(new LambdaQueryWrapper() + .select(SdRvcdDic::getRvcd, SdRvcdDic::getRvnm) + .eq(SdRvcdDic::getRvcd, normalizedCode))); +// .eq(SdRvcdDic::getRvnm, normalizedName))); + if (exact != null) { + return exact.getRvcd(); } } - String resultByName = resolveRiverCode(riverName); - if (resultByName != null && resultByName.equalsIgnoreCase(code)) { - return resultByName; - } +// if (StringUtils.hasText(normalizedCode)) { +// SdRvcdDic byCode = rvcdDicMapper.selectById(normalizedCode); +// if (byCode != null && (!StringUtils.hasText(normalizedName) || normalizedName.equals(byCode.getRvnm()))) { +// return byCode.getRvcd(); +// } +// } +// if (StringUtils.hasText(normalizedName)) { +// String resultByName = resolveRiverCode(normalizedName); +// if (!StringUtils.hasText(normalizedCode) || normalizedCode.equalsIgnoreCase(resultByName)) { +// return resultByName; +// } +// } return null; } @Override public String resolveHbrvcdCode(String code, String riverName) { - if (code == null && riverName == null) { + String normalizedCode = normalizeInput(code); +// String normalizedName = normalizeInput(riverName); + if (!StringUtils.hasText(normalizedCode)) { return null; } - loadStationAndBaseCache(); - String lowerCode = code != null ? code.trim().toLowerCase() : null; - String lowerName = riverName != null ? riverName.trim().toLowerCase() : null; - if (lowerCode != null && lowerName != null) { - String cachedName = HBRVCD_CODE_TO_NAME_CACHE.get(lowerCode); - if (cachedName != null && cachedName.equals(lowerName)) { - return code.trim(); + if (StringUtils.hasText(normalizedCode)) { + SdHbrvDic exact = findFirst(sdHbrvDicMapper.selectList(new LambdaQueryWrapper() + .select(SdHbrvDic::getHbrvcd, SdHbrvDic::getHbrvnm) + .eq(SdHbrvDic::getHbrvcd, normalizedCode))); +// .eq(SdHbrvDic::getHbrvnm, normalizedName))); + if (exact != null) { + return exact.getHbrvcd(); } } - String resultByName = resolveHbrvcdCode(riverName); - if (resultByName != null && resultByName.equalsIgnoreCase(code)) { - return resultByName; - } +// if (StringUtils.hasText(normalizedCode)) { +// SdHbrvDic byCode = sdHbrvDicMapper.selectById(normalizedCode); +// if (byCode != null && (!StringUtils.hasText(normalizedName) || normalizedName.equals(byCode.getHbrvnm()))) { +// return byCode.getHbrvcd(); +// } +// } +// if (StringUtils.hasText(normalizedName)) { +// String resultByName = resolveHbrvcdCode(normalizedName); +// if (!StringUtils.hasText(normalizedCode) || normalizedCode.equalsIgnoreCase(resultByName)) { +// return resultByName; +// } +// } return null; } @Override public boolean validateStationBelongsToBase(String stationCode, String baseId) { - if (stationCode == null || baseId == null) { + String normalizedStationCode = normalizeInput(stationCode); + String normalizedBaseId = normalizeInput(baseId); + if (!StringUtils.hasText(normalizedStationCode) || !StringUtils.hasText(normalizedBaseId)) { return false; } - loadStationAndBaseCache(); - String stationLower = stationCode.trim().toLowerCase(); - String cachedBaseId = STATION_TO_BASE_CACHE.get(stationLower); - return baseId.equalsIgnoreCase(cachedBaseId); + return findFirst(engInfoBHMapper.selectList(new LambdaQueryWrapper() + .select(SdEngInfoBH::getStcd) + .eq(SdEngInfoBH::getStcd, normalizedStationCode) + .eq(SdEngInfoBH::getHbrvcd, normalizedBaseId))) != null; + } + + @Override + public boolean validateStationBelongsToRiver(String stationCode, String rvcd) { + String normalizedStationCode = normalizeInput(stationCode); + String normalizedRvcd = normalizeInput(rvcd); + if (!StringUtils.hasText(normalizedStationCode) || !StringUtils.hasText(normalizedRvcd)) { + return false; + } + return findFirst(engInfoBHMapper.selectList(new LambdaQueryWrapper() + .select(SdEngInfoBH::getStcd) + .eq(SdEngInfoBH::getStcd, normalizedStationCode) + .eq(SdEngInfoBH::getRvcd, normalizedRvcd))) != null; } @Override public boolean validateFpssBelongsToStation(String fpssCode, String stationCode) { - if (fpssCode == null || stationCode == null) { + String normalizedFpssCode = normalizeInput(fpssCode); + String normalizedStationCode = normalizeInput(stationCode); + if (!StringUtils.hasText(normalizedFpssCode) || !StringUtils.hasText(normalizedStationCode)) { return false; } - loadStationAndBaseCache(); - String fpssLower = fpssCode.trim().toLowerCase(); - String cachedStationCode = FPSS_TO_STATION_CACHE.get(fpssLower); - return stationCode.equalsIgnoreCase(cachedStationCode); + return findFirst(fpssBHMapper.selectList(new LambdaQueryWrapper() + .select(SdFpssBH::getStcd) + .eq(SdFpssBH::getStcd, normalizedFpssCode) + .eq(SdFpssBH::getRstcd, normalizedStationCode))) != null; + } + + private String normalizeInput(String value) { + return StringUtils.hasText(value) ? value.trim() : null; + } + + private T findFirst(List list) { + return list == null || list.isEmpty() ? null : list.get(0); } private String validateFishType(String fishName, FishImportResult.FishImportRow importRow) { @@ -1762,4 +1857,4 @@ public class FishImportServiceImpl implements IFishImportService { Thread.currentThread().interrupt(); } } -} \ No newline at end of file +} From 4f9e80a99c060b01603492d55370e463fe3c6d30 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 5 Jun 2026 10:32:26 +0800 Subject: [PATCH 10/39] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E7=94=B5?= =?UTF-8?q?=E7=AB=99=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/qgc_base/domain/SdEngInfoBH.java | 108 +++++++++++++++++- .../mapper/qgc_base/SdEngInfoBHMapper.xml | 66 +++++++---- 2 files changed, 148 insertions(+), 26 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBH.java index f316193c..1770f06e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBH.java @@ -96,26 +96,56 @@ public class SdEngInfoBH implements Serializable { @TableField("BASE_ID") private String baseId; + /** + * 所属基地名称 + */ + @TableField("BASE_NAME") + private String baseName; + /** * 所属基地流域编码 */ private String hbrvcd; /** - * 所属流域代码,关联SD_LYSXJGX_QGC.RVCD + * 所属基地河段名称 + */ + @TableField("HBRVCD_NAME") + private String hbrvcdName; + + /** + * 所属流域代码,关联SD_RVCD_DIC.RVCD */ private String rvcd; + /** + * 所属流域名称 + */ + @TableField("RVCD_NAME") + private String rvcdName; + /** * 所属行政区编码,关联SD_ADDVCD_DIC.ADDVCD */ private String addvcd; + /** + * 所属行政区名称 + */ + @TableField("ADDVCD_NAME") + private String addvcdName; + /** * 所属国家,关联SD_COUNTRY_B.COUNTRY_ID */ private String country; + /** + * 所属国家名称 + */ + @TableField("COUNTRY_NAME") + private String countryName; + /** * 所属河段编码 */ @@ -132,11 +162,22 @@ public class SdEngInfoBH implements Serializable { private String hycd; /** - * 所属集团名称,关联SD_HYDROCOCD_DIC.HYCD + * 所属公司名称 + */ + private String hynm; + + /** + * 所属集团编码,关联SD_HYDROCOCD_DIC.HYCD */ @TableField("TOP_HYCD") private String topHycd; + /** + * 所属集团名称 + */ + @TableField("TOP_HYNM") + private String topHynm; + /** * 规划设计日期 */ @@ -1178,4 +1219,65 @@ public class SdEngInfoBH implements Serializable { * 植被覆盖调查时间 */ private Date vlsrTm; -} \ No newline at end of file + + /** + * 创建人 + */ + private String recordUser; + + /** + * 创建时间 + */ + private Date recordTime; + + /** + * 更新人 + */ + private String modifyUser; + + /** + * 更新时间 + */ + private Date modifyTime; + + /** + * 是否已删除 + */ + private Integer isDeleted; + + /** + * 删除人 + */ + private String deleteUser; + + /** + * 删除时间 + */ + private Date deleteTime; + + /** + * 环境监测数据接入情况:2=已全部接入 1=部分接入 0=未接入 + */ + @TableField("DTIN_ENV") + private Integer dtinEnv; + + /** + * 最新运行状态:1=运行中 2=未运行 + */ + private Integer runState; + + /** + * 告警状态 + */ + private String warnState; + + /** + * 开展环保自动检测工作状态:0=暂无数据 1=正常 + */ + private Integer coenvwState; + + /** + * 在线地址 + */ + private String url; +} diff --git a/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml b/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml index 09252e15..135852bf 100644 --- a/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml +++ b/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml @@ -14,19 +14,26 @@ - - - + + + + + + + + - + - - + + + + @@ -39,7 +46,7 @@ - + @@ -47,8 +54,8 @@ - - + + @@ -80,7 +87,7 @@ - + @@ -89,17 +96,17 @@ - + - + - + @@ -138,7 +145,7 @@ - + @@ -178,12 +185,13 @@ - + - + + @@ -193,9 +201,9 @@ - - - + + + @@ -215,11 +223,11 @@ - + - - + + @@ -228,7 +236,19 @@ - + + + + + + + + + + + + + From 62f50fd96bf39079135b30a5bf45a21bc312ee03 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 5 Jun 2026 11:01:06 +0800 Subject: [PATCH 11/39] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E8=BF=87?= =?UTF-8?q?=E9=B1=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_base/controller/SdEngInfoBHController.java | 4 ++-- .../platform/qgc_base/mapper/SdEngInfoBHMapper.java | 2 +- .../qgc_base/service/ISdEngInfoBHService.java | 2 +- .../qgc_base/service/impl/SdEngInfoBHServiceImpl.java | 4 ++-- .../qgc_base/service/impl/SdRvcdDicServiceImpl.java | 2 +- .../service/impl/TreeStructureServiceImpl.java | 6 +++--- .../resources/mapper/qgc_base/SdEngInfoBHMapper.xml | 11 +++++++++-- 7 files changed, 19 insertions(+), 12 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngInfoBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngInfoBHController.java index feb06ac0..e7687e86 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngInfoBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngInfoBHController.java @@ -65,8 +65,8 @@ public class SdEngInfoBHController { @GetMapping("/getByRvcd") @Operation(summary = "根据流域编码查询电站") - public ResponseResult getByRvcd(@RequestParam String rvcd) { - return ResponseResult.successData(engInfoBHService.getByRvcd(rvcd)); + public ResponseResult getByRvcd(@RequestParam String rvcd, @RequestParam String reachcd) { + return ResponseResult.successData(engInfoBHService.getByRvcd(rvcd,reachcd)); } @PostMapping("/dropdown") diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdEngInfoBHMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdEngInfoBHMapper.java index 9ce5b3ee..98945a3b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdEngInfoBHMapper.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdEngInfoBHMapper.java @@ -27,7 +27,7 @@ public interface SdEngInfoBHMapper extends BaseMapper { /** * 根据流域编码查询电站列表(通过关联关系) */ - List selectByRvcd(@Param("rvcd") String rvcd); + List selectByRvcd(@Param("rvcd") String rvcd,@Param("reachcd") String reachcd); /** * 根据基地流域编码查询电站列表 diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java index 5a14f586..437a6bbd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java @@ -37,7 +37,7 @@ public interface ISdEngInfoBHService extends IService { /** * 根据流域编码查询电站 */ - List getByRvcd(String rvcd); + List getByRvcd(String rvcd,String reachcd); /** * 电站下拉列表(根据基地编码筛选 + 支持名称模糊搜索) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java index cf90f151..8cfcdc33 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java @@ -76,8 +76,8 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl getByRvcd(String rvcd) { - return engInfoBHMapper.selectByRvcd(rvcd); + public List getByRvcd(String rvcd,String reachcd) { + return engInfoBHMapper.selectByRvcd(rvcd,reachcd); } @Override diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java index f1768cd5..c9341c3f 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java @@ -181,7 +181,7 @@ public class SdRvcdDicServiceImpl extends ServiceImpl stationList = engInfoBHMapper.selectByRvcd(orgId); + List stationList = engInfoBHMapper.selectByRvcd(null,orgId); if (stationList != null) { for (SdEngInfoBH station : stationList) { if (station.getStcd() != null) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/TreeStructureServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/TreeStructureServiceImpl.java index 4ceb2135..1ddff22c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/TreeStructureServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/TreeStructureServiceImpl.java @@ -61,7 +61,7 @@ public class TreeStructureServiceImpl implements ITreeStructureService { Map> rvcdEngMap = new HashMap<>(); for (SdRvcdDic rvcdDic : rvcdList) { - List engList = engInfoBHMapper.selectByRvcd(rvcdDic.getRvcd()); + List engList = engInfoBHMapper.selectByRvcd(null,rvcdDic.getRvcd()); // 如果提供了电站名称参数,进行模糊匹配筛选 if (StringUtils.hasText(engName) && engList != null) { @@ -172,7 +172,7 @@ public class TreeStructureServiceImpl implements ITreeStructureService { // 2. 预加载所有流域下的电站(按流域分组) Map> rvcdEngMap = new HashMap<>(); for (SdRvcdDic rvcdDic : rvcdList) { - List engList = engInfoBHMapper.selectByRvcd(rvcdDic.getRvcd()); + List engList = engInfoBHMapper.selectByRvcd(null,rvcdDic.getRvcd()); // 如果提供了电站名称参数,进行模糊匹配筛选 if (StringUtils.hasText(engName) && engList != null) { @@ -366,7 +366,7 @@ public class TreeStructureServiceImpl implements ITreeStructureService { // 2. 预加载所有流域下的电站(按流域分组) Map> rvcdEngMap = new HashMap<>(); for (SdRvcdDic rvcdDic : rvcdList) { - List engList = engInfoBHMapper.selectByRvcd(rvcdDic.getRvcd()); + List engList = engInfoBHMapper.selectByRvcd(null,rvcdDic.getRvcd()); // 如果提供了电站名称参数,进行模糊匹配筛选 if (StringUtils.hasText(engName) && engList != null) { diff --git a/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml b/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml index 135852bf..58f9c214 100644 --- a/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml +++ b/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml @@ -292,8 +292,15 @@ - \ No newline at end of file + From d20269b15635b4ad8625c3c933545ca39f38a7a8 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 5 Jun 2026 13:34:24 +0800 Subject: [PATCH 14/39] =?UTF-8?q?fix:=20=E7=94=A8=E6=88=B7=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=E6=B3=A8=E5=86=8C=E6=9F=A5=E8=AF=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_base/domain/StationBasinInfo.java | 1 + .../system/service/impl/UserServiceImpl.java | 157 +++++++++++++++--- .../mapper/qgc_base/SdEngInfoBHMapper.xml | 6 +- 3 files changed, 141 insertions(+), 23 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/StationBasinInfo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/StationBasinInfo.java index d0c53bd6..45712859 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/StationBasinInfo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/StationBasinInfo.java @@ -10,4 +10,5 @@ public class StationBasinInfo { private String hbrvnm; // 流域名称 private String rvcd; private String rvnm; + private String reachcd; } diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java index cdd40b31..0b108700 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java @@ -12,9 +12,11 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_data.domain.SysUserDataScope; import com.yfd.platform.qgc_data.mapper.SysUserDataScopeMapper; +import com.yfd.platform.qgc_base.domain.SdRvcdDic; import com.yfd.platform.qgc_base.domain.StationBasinInfo; import com.yfd.platform.qgc_base.mapper.SdEngInfoBHMapper; import com.yfd.platform.qgc_base.mapper.SdHbrvDicMapper; +import com.yfd.platform.qgc_base.mapper.SdRvcdDicMapper; import com.yfd.platform.system.domain.LoginUser; import com.yfd.platform.system.domain.SysRole; import com.yfd.platform.system.domain.SysUser; @@ -66,6 +68,9 @@ public class UserServiceImpl extends ServiceImpl impleme @Resource private SdEngInfoBHMapper sdEngInfoBHMapper; + + @Resource + private SdRvcdDicMapper sdRvcdDicMapper; /** * 文件空间配置 */ @@ -693,7 +698,44 @@ public class UserServiceImpl extends ServiceImpl impleme userScopeMap.computeIfAbsent(scope.getUserId(), k -> new ArrayList<>()).add(scope); } } + List stationBasinInfos = sdEngInfoBHMapper.selectStationBasinInfo(); + List activeRvcdList = sdRvcdDicMapper.selectList(new LambdaQueryWrapper() + .eq(SdRvcdDic::getEnabled, 1) + .eq(SdRvcdDic::getIsDeleted, 0)); + Map rvcdMap = new HashMap<>(); + if (activeRvcdList != null) { + for (SdRvcdDic basin : activeRvcdList) { + if (StrUtil.isNotBlank(basin.getRvcd())) { + rvcdMap.put(basin.getRvcd(), basin); + } + } + } + Map rvcdDisplayNameMap = new HashMap<>(); + Map rvcdOrderPathMap = new HashMap<>(); + for (String rvcd : rvcdMap.keySet()) { + rvcdDisplayNameMap.put(rvcd, buildRvcdDisplayName(rvcd, rvcdMap, rvcdDisplayNameMap)); + rvcdOrderPathMap.put(rvcd, buildRvcdOrderPath(rvcd, rvcdMap, rvcdOrderPathMap)); + } + + Map stationNameMap = new HashMap<>(); + Map stationReachcdMap = new HashMap<>(); + Map> rvcdStationNamesMap = new HashMap<>(); + if (stationBasinInfos != null) { + for (StationBasinInfo info : stationBasinInfos) { + if (StrUtil.isNotBlank(info.getStcd()) && StrUtil.isNotBlank(info.getEnnm())) { + stationNameMap.put(info.getStcd(), info.getEnnm()); + } + if (StrUtil.isNotBlank(info.getStcd()) && StrUtil.isNotBlank(info.getReachcd())) { + stationReachcdMap.put(info.getStcd(), info.getReachcd()); + } + if (StrUtil.isBlank(info.getReachcd()) || StrUtil.isBlank(info.getEnnm())) { + continue; + } + addStationToRvcdIndex(rvcdStationNamesMap, info.getReachcd(), info.getEnnm(), rvcdMap); + } + } + for (SysUser record : records) { String userId = record.getId(); @@ -701,48 +743,119 @@ public class UserServiceImpl extends ServiceImpl impleme record.setRoles(roles); List scopes = userScopeMap.getOrDefault(userId, Collections.emptyList()); - Set basinNameSet = new LinkedHashSet<>(); + Set basinCodeSet = new LinkedHashSet<>(); Set stationNameSet = new LinkedHashSet<>(); for (SysUserDataScope scope : scopes) { String orgType = scope.getOrgType(); String orgId = scope.getOrgId(); - String orgName = scope.getOrgName(); if ("RVCD".equals(orgType)) { - if (StrUtil.isNotBlank(orgName)) { - basinNameSet.add(orgName); - } - if (orgId != null) { - if (stationBasinInfos != null) { - List stcdList = stationBasinInfos.stream().filter(info -> info.getRvcd().equals(orgId)).map(StationBasinInfo::getEnnm).toList(); - if(!stcdList.isEmpty()){ - stationNameSet.addAll(stcdList); - } + if (StrUtil.isNotBlank(orgId)) { + basinCodeSet.add(orgId); + Set stationNames = rvcdStationNamesMap.get(orgId); + if (stationNames != null && !stationNames.isEmpty()) { + stationNameSet.addAll(stationNames); } } } else if ("STATION".equals(orgType)) { - if (StrUtil.isNotBlank(orgName)) { - stationNameSet.add(orgName); - } - if (orgId != null) { - if (stationBasinInfos != null) { - String rvcd = stationBasinInfos.stream().filter(info -> info.getStcd().equals(orgId)).map(StationBasinInfo::getRvnm).findFirst().orElse(null); - if(StrUtil.isNotBlank(rvcd)){ - basinNameSet.add(rvcd); - } + if (StrUtil.isNotBlank(orgId)) { + String stationName = stationNameMap.get(orgId); + if (StrUtil.isNotBlank(stationName)) { + stationNameSet.add(stationName); + } else if (StrUtil.isNotBlank(scope.getOrgName())) { + stationNameSet.add(scope.getOrgName()); + } + + String reachcd = stationReachcdMap.get(orgId); + if (StrUtil.isNotBlank(reachcd)) { + basinCodeSet.add(reachcd); } } } } - record.setBasinNames(basinNameSet.isEmpty() ? null : String.join(",", basinNameSet)); - record.setStationNames(stationNameSet.isEmpty() ? null : String.join(",", stationNameSet)); + List sortedBasinNames = basinCodeSet.stream() + .sorted(Comparator.comparing((String code) -> rvcdOrderPathMap.getOrDefault(code, "~~~~~~~~~~")) + .thenComparing((String code) -> rvcdDisplayNameMap.getOrDefault(code, code), + Comparator.nullsLast(Comparator.naturalOrder())) + .thenComparing(Comparator.naturalOrder())) + .map(code -> rvcdDisplayNameMap.getOrDefault(code, code)) + .filter(StrUtil::isNotBlank) + .distinct() + .toList(); + + List sortedStationNames = stationNameSet.stream() + .filter(StrUtil::isNotBlank) + .sorted() + .toList(); + + record.setBasinNames(sortedBasinNames.isEmpty() ? null : String.join(",", sortedBasinNames)); + record.setStationNames(sortedStationNames.isEmpty() ? null : String.join(",", sortedStationNames)); } return mapPage; } + private void addStationToRvcdIndex(Map> rvcdStationNamesMap, String reachcd, + String stationName, Map rvcdMap) { + if (StrUtil.isBlank(reachcd) || StrUtil.isBlank(stationName)) { + return; + } + String currentCode = reachcd; + while (StrUtil.isNotBlank(currentCode)) { + rvcdStationNamesMap.computeIfAbsent(currentCode, key -> new LinkedHashSet<>()).add(stationName); + SdRvcdDic current = rvcdMap.get(currentCode); + if (current == null || StrUtil.isBlank(current.getPrvcd()) || "0".equals(current.getPrvcd())) { + break; + } + if (Objects.equals(current.getPrvcd(), currentCode)) { + break; + } + currentCode = current.getPrvcd(); + } + } + + private String buildRvcdDisplayName(String rvcd, Map rvcdMap, Map cache) { + if (StrUtil.isBlank(rvcd)) { + return null; + } + if (cache.containsKey(rvcd)) { + return cache.get(rvcd); + } + SdRvcdDic current = rvcdMap.get(rvcd); + if (current == null) { + return rvcd; + } + String currentName = StrUtil.blankToDefault(current.getRvnm(), rvcd); + String parentCode = current.getPrvcd(); + if (StrUtil.isBlank(parentCode) || "0".equals(parentCode)) { + return currentName; + } + String parentName = buildRvcdDisplayName(parentCode, rvcdMap, cache); + return StrUtil.isBlank(parentName) ? currentName : parentName + "-" + currentName; + } + + private String buildRvcdOrderPath(String rvcd, Map rvcdMap, Map cache) { + if (StrUtil.isBlank(rvcd)) { + return null; + } + if (cache.containsKey(rvcd)) { + return cache.get(rvcd); + } + SdRvcdDic current = rvcdMap.get(rvcd); + if (current == null) { + return "~~~~~~~~~~/" + rvcd; + } + String currentSegment = String.format("%010d", current.getOrderIndex() == null ? 999999999 : current.getOrderIndex()); + String parentCode = current.getPrvcd(); + if (StrUtil.isBlank(parentCode) || "0".equals(parentCode)) { + return currentSegment; + } + String parentPath = buildRvcdOrderPath(parentCode, rvcdMap, cache); + return StrUtil.isBlank(parentPath) ? currentSegment : parentPath + "/" + currentSegment; + } + /*********************************** * 用途说明:比较登录名称是否有重复 * 参数说明 diff --git a/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml b/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml index 58f9c214..b33d0dca 100644 --- a/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml +++ b/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml @@ -256,6 +256,9 @@ + + + @@ -263,10 +266,11 @@ SELECT e.STCD, e.ENNM, + e.REACHCD, e.RVCD, h.RVNM FROM SD_ENGINFO_B_H e - INNER JOIN SD_RVCD_DIC h ON e.RVCD = h.RVCD + LEFT JOIN SD_RVCD_DIC h ON e.RVCD = h.RVCD From 4522383206a8e9edbb1dd0558028e7bf4746e919 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 5 Jun 2026 13:54:32 +0800 Subject: [PATCH 15/39] =?UTF-8?q?fix:=20=E8=BF=87=E9=B1=BC=E5=A1=AB?= =?UTF-8?q?=E6=8A=A5=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/qgc_base/mapper/SdEngInfoBHMapper.java | 5 ++++- .../qgc_data/service/impl/FishImportServiceImpl.java | 6 +++--- .../main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml | 9 +++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdEngInfoBHMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdEngInfoBHMapper.java index 98945a3b..2c886d73 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdEngInfoBHMapper.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdEngInfoBHMapper.java @@ -44,7 +44,10 @@ public interface SdEngInfoBHMapper extends BaseMapper { * 根据基地流域编码列表批量查询电站 */ List selectByRvcdList(@Param("rvcdList") List rvcdList); - + /** + * 根据基地流域编码列表批量查询电站 + */ + List selectByReachcdList(@Param("rvcdList") List rvcdList); List selectStationBasinInfo(); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java index 13f0f4c8..a0f59e16 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java @@ -215,7 +215,7 @@ public class FishImportServiceImpl implements IFishImportService { if (!allowedRvcdSet.isEmpty() || !directStcdSet.isEmpty()) { if (!allowedRvcdSet.isEmpty()) { - List stationsFromHbrv = engInfoBHMapper.selectByRvcdList(new ArrayList<>(allowedRvcdSet)); + List stationsFromHbrv = engInfoBHMapper.selectByReachcdList(new ArrayList<>(allowedRvcdSet)); for (SdEngInfoBH station : stationsFromHbrv) { if (station.getStcd() != null) { directStcdSet.add(station.getStcd()); @@ -230,7 +230,7 @@ public class FishImportServiceImpl implements IFishImportService { directStcdSet.add(station.getStcd()); } if (station.getRvcd() != null) { - allowedRvcdSet.add(station.getRvcd()); + allowedRvcdSet.add(station.getReachcd()); } } } @@ -1146,7 +1146,7 @@ public class FishImportServiceImpl implements IFishImportService { return findFirst(engInfoBHMapper.selectList(new LambdaQueryWrapper() .select(SdEngInfoBH::getStcd) .eq(SdEngInfoBH::getStcd, normalizedStationCode) - .eq(SdEngInfoBH::getRvcd, normalizedRvcd))) != null; + .eq(SdEngInfoBH::getReachcd, normalizedRvcd))) != null; } @Override diff --git a/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml b/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml index b33d0dca..515f6b3f 100644 --- a/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml +++ b/backend/src/main/resources/mapper/qgc_base/SdEngInfoBHMapper.xml @@ -331,5 +331,14 @@ ORDER BY HBRVCD, ORDER_INDEX ASC + + From 94a587774f61daaf59e890c46526f0c10a503a56 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 5 Jun 2026 14:23:54 +0800 Subject: [PATCH 16/39] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E8=BF=87?= =?UTF-8?q?=E9=B1=BC=E8=AE=BE=E6=96=BD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FishImportServiceImpl.java | 195 ++++++++++++++++-- 1 file changed, 183 insertions(+), 12 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java index a0f59e16..f9629141 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java @@ -40,6 +40,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; @Service @Slf4j @@ -213,9 +214,23 @@ public class FishImportServiceImpl implements IFishImportService { } + Map rvcdMap = new HashMap<>(); if (!allowedRvcdSet.isEmpty() || !directStcdSet.isEmpty()) { if (!allowedRvcdSet.isEmpty()) { - List stationsFromHbrv = engInfoBHMapper.selectByReachcdList(new ArrayList<>(allowedRvcdSet)); + List activeRvcdList = rvcdDicMapper.selectList(new LambdaQueryWrapper() + .eq(SdRvcdDic::getEnabled, 1) + .eq(SdRvcdDic::getIsDeleted, 0) + .select(SdRvcdDic::getRvcd, SdRvcdDic::getRvnm, SdRvcdDic::getPrvcd, SdRvcdDic::getOrderIndex)); + if (activeRvcdList != null) { + for (SdRvcdDic rvcdDic : activeRvcdList) { + if (StrUtil.isNotBlank(rvcdDic.getRvcd())) { + rvcdMap.put(rvcdDic.getRvcd(), rvcdDic); + } + } + } + + Set expandedReachcdSet = expandReachcdScope(allowedRvcdSet, rvcdMap); + List stationsFromHbrv = engInfoBHMapper.selectByReachcdList(new ArrayList<>(expandedReachcdSet)); for (SdEngInfoBH station : stationsFromHbrv) { if (station.getStcd() != null) { directStcdSet.add(station.getStcd()); @@ -229,7 +244,7 @@ public class FishImportServiceImpl implements IFishImportService { if (station.getStcd() != null) { directStcdSet.add(station.getStcd()); } - if (station.getRvcd() != null) { + if (station.getReachcd() != null) { allowedRvcdSet.add(station.getReachcd()); } } @@ -237,8 +252,34 @@ public class FishImportServiceImpl implements IFishImportService { } if(!allowedRvcdSet.isEmpty()){ - List sdRvcdDics = rvcdDicMapper.selectList(new LambdaQueryWrapper().in(SdRvcdDic::getRvcd, allowedRvcdSet).select(SdRvcdDic::getRvcd, SdRvcdDic::getRvnm)); - allowedRvcdList.addAll(sdRvcdDics); + if (rvcdMap.isEmpty()) { + List activeRvcdList = rvcdDicMapper.selectList(new LambdaQueryWrapper() + .eq(SdRvcdDic::getEnabled, 1) + .eq(SdRvcdDic::getIsDeleted, 0) + .select(SdRvcdDic::getRvcd, SdRvcdDic::getRvnm, SdRvcdDic::getPrvcd, SdRvcdDic::getOrderIndex)); + if (activeRvcdList != null) { + for (SdRvcdDic rvcdDic : activeRvcdList) { + if (StrUtil.isNotBlank(rvcdDic.getRvcd())) { + rvcdMap.put(rvcdDic.getRvcd(), rvcdDic); + } + } + } + } + + Map rvcdDisplayNameMap = new HashMap<>(); + Map rvcdOrderPathMap = new HashMap<>(); + for (String rvcd : allowedRvcdSet) { + rvcdDisplayNameMap.put(rvcd, buildRvcdDisplayName(rvcd, rvcdMap, rvcdDisplayNameMap)); + rvcdOrderPathMap.put(rvcd, buildRvcdOrderPath(rvcd, rvcdMap, rvcdOrderPathMap)); + } + + allowedRvcdList.addAll(allowedRvcdSet.stream() + .map(rvcdMap::get) + .filter(Objects::nonNull) + .peek(item -> item.setRvnm(rvcdDisplayNameMap.getOrDefault(item.getRvcd(), item.getRvnm()))) + .sorted(Comparator.comparing((SdRvcdDic item) -> rvcdOrderPathMap.getOrDefault(item.getRvcd(), "~~~~~~~~~~")) + .thenComparing(SdRvcdDic::getRvcd, Comparator.nullsLast(String::compareTo))) + .toList()); } if (!directStcdSet.isEmpty()) { @@ -251,6 +292,20 @@ public class FishImportServiceImpl implements IFishImportService { } + Map allowedRvcdNameToCodeMap = allowedRvcdList.stream() + .filter(item -> StrUtil.isNotBlank(item.getRvnm()) && StrUtil.isNotBlank(item.getRvcd())) + .collect(Collectors.toMap(SdRvcdDic::getRvnm, SdRvcdDic::getRvcd, (left, right) -> left, LinkedHashMap::new)); + Map allowedRvcdLastNameToCodeMap = buildAllowedRvcdLastNameToCodeMap(allowedRvcdList); + Map allowedRvcdCodeToNameMap = allowedRvcdList.stream() + .filter(item -> StrUtil.isNotBlank(item.getRvcd()) && StrUtil.isNotBlank(item.getRvnm())) + .collect(Collectors.toMap(SdRvcdDic::getRvcd, SdRvcdDic::getRvnm, (left, right) -> left, LinkedHashMap::new)); + Map directStationNameToCodeMap = directStcdList.stream() + .filter(item -> StrUtil.isNotBlank(item.getEnnm()) && StrUtil.isNotBlank(item.getStcd())) + .collect(Collectors.toMap(SdEngInfoBH::getEnnm, SdEngInfoBH::getStcd, (left, right) -> left, LinkedHashMap::new)); + Map fpssNameToCodeMap = sdFpssList.stream() + .filter(item -> StrUtil.isNotBlank(item.getStnm()) && StrUtil.isNotBlank(item.getStcd())) + .collect(Collectors.toMap(SdFpssBH::getStnm, SdFpssBH::getStcd, (left, right) -> left, LinkedHashMap::new)); + int totalRows = sheet.getLastRowNum(); for (int i = 1; i <= totalRows; i++) { Row row = sheet.getRow(i); @@ -258,7 +313,9 @@ public class FishImportServiceImpl implements IFishImportService { continue; } - FishImportResult.FishImportRow importRow = parseRow(result, row, columnIndexMap, i, uploadUserId,allowedRvcdList,directStcdList,sdFpssList); + FishImportResult.FishImportRow importRow = parseRow(result, row, columnIndexMap, i, uploadUserId, + allowedRvcdNameToCodeMap, allowedRvcdLastNameToCodeMap, allowedRvcdCodeToNameMap, + directStationNameToCodeMap, fpssNameToCodeMap); result.setTotalCount(result.getTotalCount() + 1); if (importRow.getData() != null && importRow.getWarnings().isEmpty()) { result.addSuccessRow(importRow); @@ -274,7 +331,12 @@ public class FishImportServiceImpl implements IFishImportService { return result; } - private FishImportResult.FishImportRow parseRow(FishImportResult result, Row row, Map columnIndexMap, int rowIndex, String userId,List allowRvcdList,List directStcdList,List sdFpssList) { + private FishImportResult.FishImportRow parseRow(FishImportResult result, Row row, Map columnIndexMap, + int rowIndex, String userId, Map allowRvcdNameToCodeMap, + Map allowRvcdLastNameToCodeMap, + Map allowRvcdCodeToNameMap, + Map directStationNameToCodeMap, + Map fpssNameToCodeMap) { FishImportResult.FishImportRow importRow = new FishImportResult.FishImportRow(rowIndex); @@ -294,7 +356,7 @@ public class FishImportServiceImpl implements IFishImportService { data.setEnnm(cellValue.trim()); data.setRstcd(cellValue); } else { - String stcd = directStcdList.stream().filter(sdEngInfoBH -> sdEngInfoBH.getEnnm().equals(cellValue.trim())).map(SdEngInfoBH::getStcd).findFirst().orElse( null); + String stcd = directStationNameToCodeMap.get(cellValue.trim()); if (StrUtil.isBlank(stcd)) { importRow.getWarnings().add("rstcd"); data.setEnnm(cellValue.trim()); @@ -325,17 +387,17 @@ public class FishImportServiceImpl implements IFishImportService { case "rvcd": if (!StringUtils.hasText(cellValue)) { importRow.getWarnings().add("rvcd"); - data.setHbrvcd(cellValue); - data.setHbrvnm(cellValue); + data.setRvcd(cellValue); + data.setRvnm(cellValue); } else { - String rvcdCode = allowRvcdList.stream().filter(sdRvcdDic -> sdRvcdDic.getRvnm().equals(cellValue.trim())).map(SdRvcdDic::getRvcd).findFirst().orElse( null); + String rvcdCode = resolveAllowedRvcdCode(cellValue.trim(), allowRvcdNameToCodeMap, allowRvcdLastNameToCodeMap); if (StrUtil.isBlank(rvcdCode)) { importRow.getWarnings().add("rvcd"); data.setRvcd(cellValue.trim()); data.setRvnm(cellValue.trim()); } else { data.setRvcd(rvcdCode); - data.setRvnm(cellValue.trim()); + data.setRvnm(allowRvcdCodeToNameMap.getOrDefault(rvcdCode, cellValue.trim())); } } break; @@ -536,7 +598,7 @@ public class FishImportServiceImpl implements IFishImportService { importRow.getWarnings().add("stcd"); data.setStcd(cellValue); } else { - String stcd = sdFpssList.stream().filter(sdFpssBH -> sdFpssBH.getStnm().equals(cellValue.trim())).map(SdFpssBH::getStcd).findFirst().orElse( null); + String stcd = fpssNameToCodeMap.get(cellValue.trim()); if (StrUtil.isBlank(stcd)) { importRow.getWarnings().add("stcd"); data.setStcd(cellValue.trim()); @@ -561,6 +623,115 @@ public class FishImportServiceImpl implements IFishImportService { return importRow; } + private Map buildAllowedRvcdLastNameToCodeMap(List allowedRvcdList) { + Map uniqueMap = new LinkedHashMap<>(); + Set duplicateNames = new HashSet<>(); + for (SdRvcdDic item : allowedRvcdList) { + if (item == null || StrUtil.isBlank(item.getRvnm()) || StrUtil.isBlank(item.getRvcd())) { + continue; + } + String lastName = extractLastRvcdName(item.getRvnm()); + if (StrUtil.isBlank(lastName)) { + continue; + } + String existed = uniqueMap.putIfAbsent(lastName, item.getRvcd()); + if (existed != null && !Objects.equals(existed, item.getRvcd())) { + duplicateNames.add(lastName); + } + } + duplicateNames.forEach(uniqueMap::remove); + return uniqueMap; + } + + private String resolveAllowedRvcdCode(String inputName, Map allowRvcdNameToCodeMap, + Map allowRvcdLastNameToCodeMap) { + if (StrUtil.isBlank(inputName)) { + return null; + } + String exactCode = allowRvcdNameToCodeMap.get(inputName); + if (StrUtil.isNotBlank(exactCode)) { + return exactCode; + } + return allowRvcdLastNameToCodeMap.get(extractLastRvcdName(inputName)); + } + + private String extractLastRvcdName(String rvnm) { + if (StrUtil.isBlank(rvnm)) { + return null; + } + int separatorIndex = rvnm.lastIndexOf('-'); + return separatorIndex >= 0 ? StrUtil.trim(rvnm.substring(separatorIndex + 1)) : StrUtil.trim(rvnm); + } + + private Set expandReachcdScope(Set allowedRvcdSet, Map rvcdMap) { + if (allowedRvcdSet == null || allowedRvcdSet.isEmpty() || rvcdMap == null || rvcdMap.isEmpty()) { + return Collections.emptySet(); + } + Set result = new LinkedHashSet<>(); + for (String rvcd : rvcdMap.keySet()) { + if (isInRvcdScope(rvcd, allowedRvcdSet, rvcdMap)) { + result.add(rvcd); + } + } + return result; + } + + private boolean isInRvcdScope(String currentRvcd, Set allowedRvcdSet, Map rvcdMap) { + String code = currentRvcd; + Set visited = new HashSet<>(); + while (StrUtil.isNotBlank(code) && visited.add(code)) { + if (allowedRvcdSet.contains(code)) { + return true; + } + SdRvcdDic current = rvcdMap.get(code); + if (current == null || StrUtil.isBlank(current.getPrvcd()) || "0".equals(current.getPrvcd())) { + break; + } + code = current.getPrvcd(); + } + return false; + } + + private String buildRvcdDisplayName(String rvcd, Map rvcdMap, Map cache) { + if (StrUtil.isBlank(rvcd)) { + return null; + } + if (cache.containsKey(rvcd)) { + return cache.get(rvcd); + } + SdRvcdDic current = rvcdMap.get(rvcd); + if (current == null) { + return rvcd; + } + String currentName = StrUtil.blankToDefault(current.getRvnm(), rvcd); + String parentCode = current.getPrvcd(); + if (StrUtil.isBlank(parentCode) || "0".equals(parentCode)) { + return currentName; + } + String parentName = buildRvcdDisplayName(parentCode, rvcdMap, cache); + return StrUtil.isBlank(parentName) ? currentName : parentName + "-" + currentName; + } + + private String buildRvcdOrderPath(String rvcd, Map rvcdMap, Map cache) { + if (StrUtil.isBlank(rvcd)) { + return null; + } + if (cache.containsKey(rvcd)) { + return cache.get(rvcd); + } + SdRvcdDic current = rvcdMap.get(rvcd); + if (current == null) { + return "~~~~~~~~~~/" + rvcd; + } + String currentSegment = String.format("%010d", current.getOrderIndex() == null ? 999999999 : current.getOrderIndex()); + String parentCode = current.getPrvcd(); + if (StrUtil.isBlank(parentCode) || "0".equals(parentCode)) { + return currentSegment; + } + String parentPath = buildRvcdOrderPath(parentCode, rvcdMap, cache); + return StrUtil.isBlank(parentPath) ? currentSegment : parentPath + "/" + currentSegment; + } + /** * 解析鱼类体长范围 From df2c74c5e0d4ef594ff558f2da1849c479031f45 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 5 Jun 2026 17:02:34 +0800 Subject: [PATCH 17/39] =?UTF-8?q?fix:=20=E5=88=86=E9=A1=B5=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E8=BF=87=E9=B1=BC=E6=95=B0=E6=8D=AE=EF=BC=88=E5=85=B3?= =?UTF-8?q?=E8=81=94=E7=94=B5=E7=AB=99=E5=92=8C=E8=AE=BE=E6=96=BD=EF=BC=89?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_data/domain/vo/FishDraftDataVO.java | 7 ++++- .../qgc_data/mapper/FishDraftDataMapper.java | 4 ++- .../impl/FishDraftDataServiceImpl.java | 8 +++-- .../mapper/data/FishDraftDataMapper.xml | 30 +++++++++++++++++-- 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/domain/vo/FishDraftDataVO.java b/backend/src/main/java/com/yfd/platform/qgc_data/domain/vo/FishDraftDataVO.java index 8f58d3ee..b87da039 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/domain/vo/FishDraftDataVO.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/domain/vo/FishDraftDataVO.java @@ -202,6 +202,11 @@ public class FishDraftDataVO implements Serializable { */ private String rvcd; + /** + * 流域名称(全路径) + */ + private String rvnm; + /** * 电站经度(电站表) */ @@ -241,4 +246,4 @@ public class FishDraftDataVO implements Serializable { * 基地流域编码 */ private String hbrvnm; -} \ No newline at end of file +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/mapper/FishDraftDataMapper.java b/backend/src/main/java/com/yfd/platform/qgc_data/mapper/FishDraftDataMapper.java index baa8d260..994d4e48 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/mapper/FishDraftDataMapper.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/mapper/FishDraftDataMapper.java @@ -23,6 +23,7 @@ public interface FishDraftDataMapper extends BaseMapper { @Param("stcd") String stcd, @Param("rstcd") String rstcd, @Param("baseId") String baseId, + @Param("rvcd") String rvcd, @Param("direction") String direction, @Param("status") String status, @Param("ftp") String ftp, @@ -38,6 +39,7 @@ public interface FishDraftDataMapper extends BaseMapper { List selectJoinList(@Param("stcd") String stcd, @Param("rstcd") String rstcd, @Param("baseId") String baseId, + @Param("rvcd") String rvcd, @Param("direction") String direction, @Param("status") String status, @Param("ftp") String ftp, @@ -79,4 +81,4 @@ public interface FishDraftDataMapper extends BaseMapper { */ @Select("SELECT COUNT(*) FROM FISH_DRAFT_DATA WHERE APPROVAL_ID = #{approvalId}") int countByApprovalId(@Param("approvalId") Long approvalId); -} \ No newline at end of file +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java index 2d723be6..62aa0e8c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java @@ -89,6 +89,7 @@ public class FishDraftDataServiceImpl extends ServiceImpl resultPage = fishDraftDataMapper.selectJoinPage(page, stcd, rstcd, baseId, direction, status, ftp, startTime, endTime,userId,hbrvcd,approvalId); + Page resultPage = fishDraftDataMapper.selectJoinPage(page, stcd, rstcd, baseId, rvcd, direction, status, ftp, startTime, endTime,userId,hbrvcd,approvalId); fillUserNames(resultPage.getRecords()); return resultPage; } @@ -117,13 +118,14 @@ public class FishDraftDataServiceImpl extends ServiceImpl list = fishDraftDataMapper.selectJoinList(stcd, rstcd, baseId, direction, status, ftp, startTime, endTime); + List list = fishDraftDataMapper.selectJoinList(stcd, rstcd, baseId, rvcd, direction, status, ftp, startTime, endTime); fillUserNames(list); return list; } @@ -665,4 +667,4 @@ public class FishDraftDataServiceImpl extends ServiceImpl + @@ -85,7 +86,7 @@ D.ID, D.STCD, E.HBRVCD, - G.HBRVNM, + NULL AS HBRVNM, D.TM, D.FTP, FB.NAME FTPNAME, @@ -120,13 +121,27 @@ E.ENNM, E.BASE_ID, H.BASENAME, - E.RVCD, + E.REACHCD AS RVCD, + R.RVNM, E.LGTD, E.LTTD, E.ORDER_INDEX, D.ROW_INDEX + + LEFT JOIN ( + SELECT + d.RVCD, + LTRIM(SYS_CONNECT_BY_PATH(d.RVNM, '-'), '-') AS RVNM + FROM SD_RVCD_DIC d + WHERE NVL(d.ENABLED, 1) = 1 + AND NVL(d.IS_DELETED, 0) = 0 + START WITH d.PRVCD IS NULL OR d.PRVCD = '' OR d.PRVCD = '0' + CONNECT BY PRIOR d.RVCD = d.PRVCD + ) R ON R.RVCD = E.REACHCD + +