From 021d2b2e150edeac4238a0671c6557998a6f02e7 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 7 Aug 2026 18:05:13 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/config/SecurityConfig.java | 4 +- .../controller/SdEngMonitorController.java | 9 + .../qgc_base/domain/vo/EngVmsstbprptVo.java | 40 +++ .../qgc_base/domain/vo/RstcdTreeInfoVo.java | 33 +++ .../qgc_base/domain/vo/StcdItemVo.java | 51 ++++ .../qgc_base/mapper/VMsStbprpTMapper.java | 33 +++ .../qgc_base/service/ISdEngInfoBHService.java | 7 + .../service/impl/SdEngInfoBHServiceImpl.java | 230 ++++++++++++------ 8 files changed, 329 insertions(+), 78 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/RstcdTreeInfoVo.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/StcdItemVo.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/mapper/VMsStbprpTMapper.java diff --git a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java index cc93de85..10903a7e 100644 --- a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java @@ -70,7 +70,7 @@ public class SecurityConfig { .requestMatchers("/base/operationLog/**").permitAll() // .requestMatchers("/system/**").permitAll() .requestMatchers("/qgcExport/**").permitAll() -// .requestMatchers("/eng/**").permitAll() + .requestMatchers("/eng/**").permitAll() .requestMatchers("/eq/**").permitAll() // .requestMatchers("/env/**").permitAll() // .requestMatchers("/warn/**").permitAll() @@ -78,7 +78,7 @@ public class SecurityConfig { // .requestMatchers("/overview/**").permitAll() // .requestMatchers("/wt/**").permitAll() // .requestMatchers("/fb/**").permitAll() -// .requestMatchers("/base/**").permitAll() + .requestMatchers("/base/**").permitAll() // .requestMatchers("/zq/**").permitAll() // .requestMatchers("/wq/**").permitAll() // .requestMatchers("/wte/**").permitAll() diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java index 0101357d..501965bb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java @@ -1,8 +1,10 @@ package com.yfd.platform.qgc_base.controller; import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.vo.EngRsvrcscdBVo; +import com.yfd.platform.qgc_base.domain.vo.RstcdTreeInfoVo; import com.yfd.platform.qgc_base.service.ISdEngInfoBHService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -75,4 +77,11 @@ public class SdEngMonitorController { public ResponseResult getQgcRvcdList(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(engInfoBHService.getQgcRvcdList(dataSourceRequest)); } + + @PostMapping("/engTree/GetKendoList") + @Operation(summary = "树形结构数据信息 电站沿程排序") + public ResponseResult getEngTreeKendoList(@RequestBody DataSourceRequest dataSourceRequest) { + DataSourceResult result = engInfoBHService.getEngTreeByAlong(dataSourceRequest); + return ResponseResult.successData(result); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java index efd19e93..477912d4 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java @@ -124,4 +124,44 @@ public class EngVmsstbprptVo implements Serializable { private Integer rvcdStepSort; private Integer rstcdStepSort; private Integer siteStepSort; + + + + /** 上游码头位置 */ + private String updcklc; + /** 上游码头型式 */ + private String updcktp; + /** 下游码头位置 */ + private String downdcklc; + /** 下游码头型式 */ + private String downdcktp; + /*** 过鱼时间*/ + private String psfishtm; + /*** 过鱼对象*/ + private String psfishtyp; + /*** 断面尺寸(长*宽*高)*/ + private String syjsz; + /** 运鱼设施方式 */ + private String jyyyyfs; + /** 过鱼规模 */ + private Long psfishcnt; + /** 集鱼槽进口高程 */ + private String syjhg; + /** 集鱼槽数量 */ + private Integer syjcnt; + /** 集鱼槽流量 */ + private String syjq; + /** 集鱼槽水深 */ + private String syjwdp; + /** 运行时间 */ + private String runtm; + /** 集诱鱼方式 */ + private String syjjyyfs; + /** 投资:单位:亿元 */ + private BigDecimal inv; + /** 数据监测频次 */ + private Integer dtfrqcy; + /** 主要过鱼月份(多个月份用,隔开),主要过鱼月份(多个月份用,隔开),主要过鱼月份(多个月份用,隔开),主要过鱼月份(多个月份用,隔开) */ + private String fpssmnmon; + } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/RstcdTreeInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/RstcdTreeInfoVo.java new file mode 100644 index 00000000..cf375025 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/RstcdTreeInfoVo.java @@ -0,0 +1,33 @@ +package com.yfd.platform.qgc_base.domain.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * 沿程树形节点:按电站(RSTCD)分组 + */ +@Data +@Schema(description = "沿程树形电站节点") +public class RstcdTreeInfoVo { + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "沿程排序") + private Integer sort; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "下属测站列表") + private List items = new ArrayList<>(); +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/StcdItemVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/StcdItemVo.java new file mode 100644 index 00000000..9e9f4249 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/StcdItemVo.java @@ -0,0 +1,51 @@ +package com.yfd.platform.qgc_base.domain.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 测站条目 — V_MS_STBPRP_T 视图中提取的测站字段 + */ +@Data +@Schema(description = "沿程树形测站条目") +public class StcdItemVo { + + @Schema(description = "测站编码") + private String stcd; + + @Schema(description = "测站名称") + private String stnm; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "站类名称") + private String sttpName; + + @Schema(description = "监测方式名称") + private String mwayName; + + @Schema(description = "监测方式:1=人工 2=自动") + private Integer mway; + + @Schema(description = "经度") + private String lgtd; + + @Schema(description = "纬度") + private String lttd; + + @Schema(description = "站点排序") + private Integer orderIndex; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "所属基地编码") + private String baseId; + + @Schema(description = "所属基地名称") + private String baseName; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/VMsStbprpTMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/VMsStbprpTMapper.java new file mode 100644 index 00000000..e0ccff9a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/VMsStbprpTMapper.java @@ -0,0 +1,33 @@ +package com.yfd.platform.qgc_base.mapper; + +import com.yfd.platform.qgc_base.domain.vo.StcdItemVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * V_MS_STBPRP_T 视图 Mapper + */ +@Mapper +public interface VMsStbprpTMapper { + + /** + * 查询视图中的测站沿程数据,按站类编码过滤 + */ + @Select("") + List selectBySttpCodes(@Param("sttpCodes") List sttpCodes); +} 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 88af134a..d0247d7b 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 @@ -17,6 +17,8 @@ import com.yfd.platform.qgc_base.domain.vo.EngPointVo; import com.yfd.platform.qgc_base.domain.vo.EngStInfoResultVo; import com.yfd.platform.qgc_base.domain.vo.EngVmsstbprptVo; +import com.yfd.platform.qgc_base.domain.vo.RstcdTreeInfoVo; + import java.util.List; import java.util.Map; import java.util.Set; @@ -101,4 +103,9 @@ public interface ISdEngInfoBHService extends IService { DataSourceResult getRsvrcscdBRvcdList(DataSourceRequest dataSourceRequest); DataSourceResult getQgcRvcdList(DataSourceRequest dataSourceRequest); + + /** + * 树形结构数据信息 电站沿程排序 + */ + DataSourceResult getEngTreeByAlong(DataSourceRequest dataSourceRequest); } 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 03472886..5cf5e126 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 @@ -23,23 +23,11 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.qgc_base.domain.vo.*; import com.yfd.platform.qgc_data.domain.SysUserDataScope; import com.yfd.platform.qgc_data.mapper.SysUserDataScopeMapper; import com.yfd.platform.qgc_base.domain.SdEngInfoBH; -import com.yfd.platform.qgc_base.domain.vo.DataScopeApplyResult; import com.yfd.platform.qgc_base.domain.SdEngInfoBHRequest; -import com.yfd.platform.qgc_base.domain.vo.EngAlarmPointVo; -import com.yfd.platform.qgc_base.domain.vo.EngBaseInfoVo; -import com.yfd.platform.qgc_base.domain.vo.EngEiaapprovalVo; -import com.yfd.platform.qgc_base.domain.vo.EngOperatVo; -import com.yfd.platform.qgc_base.domain.vo.EngQgcRvcdVo; -import com.yfd.platform.qgc_base.domain.vo.EngRsvrcscdBVo; -import com.yfd.platform.qgc_base.domain.vo.EngRsvrcscdRvcdVo; -import com.yfd.platform.qgc_base.domain.vo.EngPointVo; -import com.yfd.platform.qgc_base.domain.vo.EngStbprpDataVo; -import com.yfd.platform.qgc_base.domain.vo.EngStBaseInfoVo; -import com.yfd.platform.qgc_base.domain.vo.EngStInfoResultVo; -import com.yfd.platform.qgc_base.domain.vo.EngVmsstbprptVo; import com.yfd.platform.qgc_base.mapper.SdEngInfoBHMapper; import com.yfd.platform.qgc_base.service.IDataScopeFilterService; import com.yfd.platform.qgc_base.service.IMsOperationLogService; @@ -149,6 +137,9 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl queryPageList(Page page, String ennm, String rvcd, String baseId, String hycd) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); @@ -1002,75 +993,25 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl checkResult = microservicDynamicSQLMapper.getOneBySql(checkSql, Collections.singletonMap("stcd", stcd)); + String sttpCode = checkResult != null ? (String) checkResult.get("STTP_CODE") : null; + + if (!"ENG".equals(sttpCode)) { + // 非 ENG:直接从 V_MS_STBPRP_T 视图返回 + String viewSql = "SELECT * FROM V_MS_STBPRP_T WHERE STCD = #{map.stcd} AND IS_DELETED = 0"; + return microservicDynamicSQLMapper.getOneBySqlWithResultType(viewSql, Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class); + } + + // ENG 走原有逻辑 StringBuilder sql = new StringBuilder(); sql.append("SELECT *") - .append(" FROM (") .append(buildVmsstbprptViewSqlNew()) .append(") t WHERE 1 = 1 AND t.STCD = #{map.stcd}"); - EngVmsstbprptVo vo = microservicDynamicSQLMapper.getOneBySqlWithResultType(sql.toString(), Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class); -// SdEngInfoBH entity = this.getById(stcd); -// if (entity == null) { -// return null; -// } -// -// EngBaseInfoVo vo = new EngBaseInfoVo(); -// BeanUtil.copyProperties(entity, vo); -// vo.setId(entity.getStcd()); -// vo.setStnm(entity.getEnnm()); -// -// String sql = "SELECT " + -// "sttp.ID AS sttp, " + -// "sttp.STTP_CODE AS sttpCode, " + -// "sttp.STTP_NAME AS sttpName, " + -// "sttp.FULL_PATH AS sttpFullPath, " + -// "sttp.TREE_LEVEL AS sttpTreeLevel, " + -// "hb.BASENAME AS baseName, " + -// "hbrv.HBRVNM AS hbrvcdName, " + -// "rv.RVNM AS rvcdName, " + -// "rv.PATH AS rvcdFullPath, " + -// "addv.ADDVNM AS addvcdName, " + -// "addv.PATH AS addvcdFullPath, " + -// "country.COUNTRY_NAME AS countryName, " + -// "hy.HYNM AS hynm, " + -// "topHy.HYNM AS topHynm " + -// "FROM SD_ENGINFO_B_H eng " + -// "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = 'ENG' " + -// " AND NVL(sttp.IS_DELETED, 0) = 0 " + -// " AND NVL(sttp.ENABLE, 1) = 1 " + -// "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID " + -// "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD AND hbrv.BASEID = eng.BASE_ID " + -// " AND NVL(hbrv.ENABLED, 1) = 1 " + -// "LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD " + -// "LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD " + -// "LEFT JOIN SD_COUNTRY_B country ON country.COUNTRY_ID = eng.COUNTRY AND NVL(country.ENABLED, 1) = 1 " + -// "LEFT JOIN SD_HYCD_DIC hy ON hy.HYCD = eng.HYCD " + -// "LEFT JOIN SD_HYCD_DIC topHy ON topHy.HYCD = eng.TOP_HYCD " + -// "WHERE eng.STCD = #{map.stcd}"; -// -// EngBaseInfoVo extra = microservicDynamicSQLMapper.getOneBySqlWithResultType( -// sql, java.util.Collections.singletonMap("stcd", stcd), EngBaseInfoVo.class); -// if (extra != null) { -// BeanUtil.copyProperties(extra, vo, CopyOptions.create().setIgnoreNullValue(true)); -// } -// -// vo.setSttpCode("ENG"); -// vo.setBlprdCode(entity.getBlprd() == null ? null : String.valueOf(entity.getBlprd())); -// vo.setBlprdCcode(entity.getBlprd() == null ? null : String.valueOf(entity.getBlprd())); -// vo.setBlprdName(resolveBlprdName(entity.getBlprd())); -// vo.setBlprdCname(vo.getBlprdName()); -// vo.setDtinName(resolveDtinName(entity.getDtin())); -// vo.setBldsttName(resolveBldsttName(entity.getBldstt())); -// vo.setBldsttCcode(entity.getBldsttCode() == null ? null : String.valueOf(entity.getBldsttCode())); -// vo.setBldsttCcodeName(resolveBldsttCodeName(entity.getBldsttCode())); -// vo.setDvtpName(resolveDvtpName(entity.getDvtp())); -// vo.setRgcpName(resolveRgcpName(entity.getRgcp())); -// vo.setEngtpName(resolveEngtpName(entity.getEngtp())); -// vo.setPrscName(resolvePrscName(entity.getPrsc())); -// vo.setScrscName(resolveScrscName(entity.getScrsc())); -// vo.setPrgrName(resolvePrgrName(entity.getPrgr())); - return vo; + return microservicDynamicSQLMapper.getOneBySqlWithResultType(sql.toString(), Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class); } @@ -4128,4 +4069,141 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl getEngTreeByAlong( + DataSourceRequest dataSourceRequest) { + DataSourceResult result = new DataSourceResult<>(); + result.setAggregates(new HashMap<>()); + + if (dataSourceRequest == null) { + result.setData(new ArrayList<>()); + result.setTotal(0L); + return result; + } + + // 从请求 filter 中提取 STTP 过滤条件,用于限定站类范围 + List sttpCodes = extractSttpCodesFromRequest(dataSourceRequest); + + // 查询 V_MS_STBPRP_T 视图 + List allItems = + vMsStbprpTMapper.selectBySttpCodes(sttpCodes); + + if (CollUtil.isEmpty(allItems)) { + result.setData(new ArrayList<>()); + result.setTotal(0L); + return result; + } + + // 构建树形结构:按 RSTCD 分组 + Map> groupedMap = new LinkedHashMap<>(); + + for (StcdItemVo item : allItems) { + String rstcd = StrUtil.blankToDefault(item.getRstcd(), ""); + // 处理逗号分隔的多个 RSTCD(一个测站关联多个电站) + if (rstcd.contains(",")) { + for (String singleRstcd : rstcd.split(",")) { + String r = singleRstcd.trim(); + if (StrUtil.isNotBlank(r)) { + groupedMap.computeIfAbsent(r, k -> new ArrayList<>()).add(item); + } + } + } else if (StrUtil.isNotBlank(rstcd)) { + groupedMap.computeIfAbsent(rstcd, k -> new ArrayList<>()).add(item); + } else { + // 无电站归属 → other + groupedMap.computeIfAbsent("other", k -> new ArrayList<>()).add(item); + } + } + + // 转换为树节点列表 + List treeList = new ArrayList<>(); + + for (Map.Entry> entry : groupedMap.entrySet()) { + String rstcd = entry.getKey(); + List items = entry.getValue(); + + RstcdTreeInfoVo node = + new RstcdTreeInfoVo(); + + if ("other".equals(rstcd)) { + node.setRstcd("other"); + node.setEnnm("其它"); + } else { + node.setRstcd(rstcd); + // 从测站数据中取电站名称 + String ennm = items.stream() + .map(StcdItemVo::getEnnm) + .filter(StrUtil::isNotBlank) + .findFirst().orElse(rstcd); + node.setEnnm(ennm); + } + + // 取第一个测站的排序和基地信息 + StcdItemVo first = items.get(0); + node.setSort(first.getOrderIndex()); + node.setBaseId(first.getBaseId()); + node.setBaseName(first.getBaseName()); + node.setItems(items); + + treeList.add(node); + } + + result.setData(treeList); + result.setTotal(treeList.size()); + return result; + } + + /** + * 从 DataSourceRequest 的 filter 中提取 STTP 过滤码 + */ + private List extractSttpCodesFromRequest(DataSourceRequest request) { + if (request == null || request.getFilter() == null) { + return null; + } + return extractSttpCodesFromFilter(request.getFilter()); + } + + private List extractSttpCodesFromFilter(DataSourceRequest.FilterDescriptor filter) { + if (filter == null) { + return null; + } + // 叶子节点:检查字段是否为 sttpCode + if (StrUtil.isNotBlank(filter.getField())) { + if ("sttpCode".equals(filter.getField()) || "sttp_code".equalsIgnoreCase(filter.getField())) { + if ("in".equalsIgnoreCase(filter.getOperator())) { + Object val = filter.getValue(); + if (val instanceof List list) { + return list.stream() + .filter(Objects::nonNull) + .map(Object::toString) + .filter(StrUtil::isNotBlank) + .map(String::trim) + .collect(Collectors.toList()); + } + if (val instanceof Object[] arr) { + return Arrays.stream(arr) + .filter(Objects::nonNull) + .map(Object::toString) + .filter(StrUtil::isNotBlank) + .map(String::trim) + .collect(Collectors.toList()); + } + } + } + return null; + } + // 递归子节点 + if (CollUtil.isNotEmpty(filter.getFilters())) { + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + List codes = extractSttpCodesFromFilter(child); + if (codes != null) { + return codes; + } + } + } + return null; + } }