diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index 4d36f326..ee809112 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -87,6 +87,12 @@ public class WeFishController { return ResponseResult.successData(weFishService.getWeFishStatList(dataSourceRequest)); } + @PostMapping("/we/fisht/detail/GetKendoListCust") + @Operation(summary = "沿程鱼类变化情况二级弹窗") + public ResponseResult getWeFishDetailList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getWeFishDetailList(dataSourceRequest)); + } + @PostMapping("/we/fishList/stat/qgc/GetKendoListCust") @Operation(summary = "环保部-水生生态调查-水生生态面板") public ResponseResult getQgcFishListStat(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishDetailVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishDetailVo.java new file mode 100644 index 00000000..cae4f59b --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishDetailVo.java @@ -0,0 +1,36 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Accessors(chain = true) +@Schema(description = "沿程鱼类变化情况二级弹窗") +public class WeFishDetailVo { + + @Schema(description = "电站编码") + private String rsctd; + + @Schema(description = "电站名称") + private String rsctdName; + + @Schema(description = "鱼类列表") + private List fishList; + + @Schema(description = "断面列表") + private List stcdList; + + @Data + @Accessors(chain = true) + @Schema(description = "断面信息") + public static class StationItem { + @Schema(description = "断面编码") + private String stcd; + + @Schema(description = "断面名称") + private String stnm; + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index c84beeba..22a3f189 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -4,6 +4,7 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishListQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishListStatQgcVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeFishDetailVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeMsstbprptVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishPointQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; @@ -41,6 +42,8 @@ public interface WeFishService { DataSourceResult getWeFishStatList(DataSourceRequest dataSourceRequest); + DataSourceResult getWeFishDetailList(DataSourceRequest dataSourceRequest); + DataSourceResult getQgcFishListStat(DataSourceRequest dataSourceRequest); DataSourceResult getQgcWeFishPoint(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java index e332cf1e..8e7cd3c9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java @@ -12,6 +12,7 @@ import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishListQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishListStatQgcVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeFishDetailVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeMsstbprptVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishPointQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; @@ -439,6 +440,30 @@ public class WeFishServiceImpl implements WeFishService { return buildWeFishStatResult(rows); } + @Override + public DataSourceResult getWeFishDetailList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + Page page = loadOptions == null ? null + : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + Map paramMap = new HashMap<>(); + DataSourceRequest.FilterDescriptor filter = dataSourceRequest == null ? null : dataSourceRequest.getFilter(); + + String baseId = firstNonBlankWeFishFilter(filter, "baseId", "base_id"); + String rstcd = getFirstWeFishFilterText(filter, "stcd"); + String rvcd = firstNonBlankWeFishFilter(filter, "rvcd", "hbrvcd"); + String yr = getFirstWeFishFilterText(filter, "yr"); + String ty = getFirstWeFishFilterText(filter, "ty"); + + String sql = buildWeFishDetailSql(baseId, rstcd, rvcd, yr, ty, paramMap); + List> rows = microservicDynamicSQLMapper.pageAllList(page, sql, paramMap); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(buildWeFishDetailResult(rows)); + result.setTotal(page != null ? page.getTotal() : (long) rows.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getQgcWeFishStatList(DataSourceRequest dataSourceRequest) { Map paramMap = new HashMap<>(); @@ -922,6 +947,129 @@ public class WeFishServiceImpl implements WeFishService { return result; } + private String buildWeFishDetailSql(String baseId, + String rstcd, + String rvcd, + String yr, + String ty, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("section.RSTCD AS rstcd, ") + .append("eng.ENNM AS rstcdName, ") + .append("TO_CHAR(WM_CONCAT(DISTINCT section.STCD)) AS stcd, ") + .append("TO_CHAR(WM_CONCAT(DISTINCT section.STNM)) AS stnm, ") + .append("TO_CHAR(WM_CONCAT(DISTINCT dict.NAME)) AS name ") + .append("FROM SD_WE_B_H section ") + .append("INNER JOIN SD_WE_R we ON section.STCD = we.STCD ") + .append(" AND NVL(we.IS_DELETED, 0) = 0 ") + .append(" AND NVL(we.STATUS, 1) = 1 ") + .append("INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID ") + .append(" AND NVL(fish.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON section.RSTCD = eng.STCD ") + .append(" AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_FISHDICTORY_B dict ON fish.FTP = dict.ID ") + .append(" AND NVL(dict.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(section.USFL, 0) = 1 ") + .append("AND section.RSTCD IS NOT NULL ") + .append("AND dict.NAME IS NOT NULL "); + + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("weFishDetailBaseId", baseId); + sql.append("AND section.BASE_ID = #{map.weFishDetailBaseId} "); + } + if (StrUtil.isNotBlank(rstcd)) { + paramMap.put("weFishDetailRstcd", rstcd); + sql.append("AND section.RSTCD = #{map.weFishDetailRstcd} "); + } + if (StrUtil.isNotBlank(rvcd)) { + paramMap.put("weFishDetailRvcd", rvcd); + sql.append("AND section.HBRVCD = #{map.weFishDetailRvcd} "); + } + if (StrUtil.isNotBlank(yr)) { + paramMap.put("weFishDetailYr", yr); + sql.append("AND TO_CHAR(we.TM, 'yyyy') = #{map.weFishDetailYr} "); + } + if (StrUtil.isNotBlank(ty)) { + paramMap.put("weFishDetailTy", ty); + sql.append("AND CASE ") + .append("WHEN dict.SPEC_ORIGIN = 2 THEN '1' ") + .append("WHEN dict.SPEC_ORIGIN = 1 AND NVL(dict.PTYPE, -1) <> 6 THEN '2' ") + .append("WHEN dict.SPEC_ORIGIN = 1 AND dict.PTYPE = 6 THEN '3' ") + .append("END = #{map.weFishDetailTy} "); + } + + sql.append("GROUP BY section.RSTCD, eng.ENNM ") + .append("ORDER BY eng.ENNM ASC NULLS LAST"); + return sql.toString(); + } + + private List buildWeFishDetailResult(List> rows) { + List result = new ArrayList<>(); + if (CollUtil.isEmpty(rows)) { + return result; + } + for (Map row : rows) { + String stcd = safeWeFishString(firstPresentWeFishValue(row, "STCD", "stcd")); + String stnm = safeWeFishString(firstPresentWeFishValue(row, "STNM", "stnm")); + String fishNames = safeWeFishString(firstPresentWeFishValue(row, "NAME", "name")); + + WeFishDetailVo vo = new WeFishDetailVo() + .setRsctd(safeWeFishString(firstPresentWeFishValue(row, "RSTCD", "rstcd"))) + .setRsctdName(safeWeFishString(firstPresentWeFishValue(row, "RSTCDNAME", "rstcdName"))) + .setFishList(splitWeFishText(fishNames)) + .setStcdList(buildWeFishStationItems(stcd, stnm)); + result.add(vo); + } + return result; + } + + private List buildWeFishStationItems(String stcdText, String stnmText) { + List result = new ArrayList<>(); + if (StrUtil.isBlank(stcdText) || StrUtil.isBlank(stnmText)) { + return result; + } + List stcdList = splitWeFishText(stcdText); + List stnmList = splitWeFishText(stnmText); + int size = Math.min(stcdList.size(), stnmList.size()); + for (int i = 0; i < size; i++) { + result.add(new WeFishDetailVo.StationItem() + .setStcd(stcdList.get(i)) + .setStnm(stnmList.get(i))); + } + return result; + } + + private List splitWeFishText(String text) { + if (StrUtil.isBlank(text)) { + return new ArrayList<>(); + } + String[] parts = text.split(","); + List result = new ArrayList<>(); + Set seen = new HashSet<>(); + for (String part : parts) { + String value = StrUtil.trim(part); + if (StrUtil.isBlank(value) || !seen.add(value)) { + continue; + } + result.add(value); + } + return result; + } + + private String firstNonBlankWeFishFilter(DataSourceRequest.FilterDescriptor filter, String... fields) { + if (fields == null) { + return null; + } + for (String field : fields) { + String value = getFirstWeFishFilterText(filter, field); + if (StrUtil.isNotBlank(value)) { + return value; + } + } + return null; + } + private String buildWeFishListStatQgcDetailSql() { return "SELECT " + "dict.FISH_ID AS id, " +