From bd11b3ba5752b232000e022dcb80b3b12ac945d5 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 08:22:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=8E=AF=E4=BF=9D=E9=83=A8-=E6=B2=BF?= =?UTF-8?q?=E7=A8=8B=E9=B1=BC=E7=B1=BB=E5=8F=98=E5=8C=96=E6=83=85=E5=86=B5?= =?UTF-8?q?=E6=9F=B1=E7=8A=B6=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wte/controller/WeFishController.java | 6 + .../wte/entity/vo/WeFishStatQgcVo.java | 26 +++ .../qgc_env/wte/service/WeFishService.java | 3 + .../wte/service/impl/WeFishServiceImpl.java | 149 ++++++++++++++++++ 4 files changed, 184 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishStatQgcVo.java 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 671a59d0..90336189 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 @@ -38,4 +38,10 @@ public class WeFishController { public ResponseResult getQgcWeFishStatics(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(weFishService.getQgcWeFishStatics(dataSourceRequest)); } + + @PostMapping("/we/fisht/stat/qgc/GetKendoListCust") + @Operation(summary = "环保部-沿程鱼类变化情况柱状图") + public ResponseResult getQgcWeFishStatList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeFishStatList(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishStatQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishStatQgcVo.java new file mode 100644 index 00000000..0ad18a62 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishStatQgcVo.java @@ -0,0 +1,26 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Map; + +@Data +@Schema(description = "全过程沿程鱼类变化情况柱状图") +public class WeFishStatQgcVo { + + @Schema(description = "电站编码") + private String stcd; + + @Schema(description = "电站名称") + private String stnm; + + @Schema(description = "鱼类类型总数") + private Long total; + + @Schema(description = "鱼类类型明细,key 为鱼类类型,value 为鱼种类数量") + private Map detail; + + @Schema(description = "排序") + private Integer sort; +} 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 f3342731..9e353f97 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 @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.wte.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeStaticsVo; @@ -15,4 +16,6 @@ public interface WeFishService { DataSourceResult>> getQgcFishStaticsYearList(DataSourceRequest dataSourceRequest); DataSourceResult getQgcWeFishStatics(DataSourceRequest dataSourceRequest); + + DataSourceResult getQgcWeFishStatList(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 0836b964..55c5fcc4 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 @@ -10,6 +10,7 @@ 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_env.wte.entity.vo.WeFishStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeRvcdYearVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeStaticsVo; @@ -145,6 +146,52 @@ public class WeFishServiceImpl implements WeFishService { return result; } + @Override + public DataSourceResult getQgcWeFishStatList(DataSourceRequest dataSourceRequest) { + Map paramMap = new HashMap<>(); + DataSourceRequest.FilterDescriptor filter = dataSourceRequest == null ? null : dataSourceRequest.getFilter(); + + String baseId = getFirstWeFishFilterText(filter, "baseId"); + String hbrvcd = getFirstWeFishFilterText(filter, "hbrvcd"); + String yr = getFirstWeFishFilterText(filter, "yr"); + List rstcdList = getWeFishFilterTexts(filter, "rstcd"); + + String sql = buildWeFishStatQgcSql(baseId, hbrvcd, yr, rstcdList, paramMap); + List> rows = microservicDynamicSQLMapper.getAllList(sql, paramMap); + + LinkedHashMap resultMap = new LinkedHashMap<>(); + for (Map row : rows) { + String stcd = safeWeFishString(firstPresentWeFishValue(row, "STCD", "stcd")); + if (StrUtil.isBlank(stcd)) { + continue; + } + WeFishStatQgcVo vo = resultMap.computeIfAbsent(stcd, key -> { + WeFishStatQgcVo item = new WeFishStatQgcVo(); + item.setStcd(key); + item.setStnm(safeWeFishString(firstPresentWeFishValue(row, "STNM", "stnm"))); + item.setSort(toWeFishIntegerValue(firstPresentWeFishValue(row, "SORT", "sort"))); + item.setTotal(0L); + item.setDetail(new LinkedHashMap<>()); + return item; + }); + Long num = toWeFishLongValue(firstPresentWeFishValue(row, "NUM", "num")); + if (num == null) { + num = 0L; + } + String ty = safeWeFishString(firstPresentWeFishValue(row, "TY", "ty")); + if (StrUtil.isNotBlank(ty)) { + vo.getDetail().put(ty, num); + } + vo.setTotal((vo.getTotal() == null ? 0L : vo.getTotal()) + num); + } + + DataSourceResult result = new DataSourceResult<>(); + result.setData(new ArrayList<>(resultMap.values())); + result.setTotal((long) resultMap.size()); + result.setAggregates(new HashMap<>()); + return result; + } + private String buildWeFishQgcGroupSql(String baseSql, GroupingInfo[] groupInfos) { if (groupInfos == null || groupInfos.length == 0) { return baseSql; @@ -280,6 +327,86 @@ public class WeFishServiceImpl implements WeFishService { return sql.toString(); } + private String buildWeFishStatQgcSql(String baseId, + String hbrvcd, + String yr, + List rstcdList, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT t.STCD AS stcd, t.STNM AS stnm, t.NUM AS num, t.TY AS ty, t2.SORT AS sort ") + .append("FROM (") + .append("SELECT section.RSTCD AS STCD, ") + .append("eng.ENNM AS STNM, ") + .append("COUNT(DISTINCT fish.FTP) AS NUM, ") + .append("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 AS TY ") + .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 eng.STCD = section.RSTCD ") + .append(" AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN V_SD_FISHDICTORY_B dict ON fish.FTP = dict.FISH_ID ") + .append(" AND (section.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') ") + .append("WHERE NVL(section.USFL, 0) = 1 "); + + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("weFishStatBaseId", baseId); + sql.append("AND section.BASE_ID = #{map.weFishStatBaseId} "); + } + if (StrUtil.isNotBlank(hbrvcd)) { + paramMap.put("weFishStatHbrvcd", hbrvcd); + sql.append("AND section.HBRVCD = #{map.weFishStatHbrvcd} "); + } + if (StrUtil.isNotBlank(yr)) { + paramMap.put("weFishStatYr", yr); + sql.append("AND TO_CHAR(we.TM, 'yyyy') = #{map.weFishStatYr} "); + } + if (CollUtil.isNotEmpty(rstcdList)) { + List placeholders = new ArrayList<>(); + int index = 0; + for (String rstcd : rstcdList) { + if (StrUtil.isBlank(rstcd)) { + continue; + } + String key = "weFishStatRstcd" + index++; + paramMap.put(key, rstcd); + placeholders.add("#{map." + key + "}"); + } + if (CollUtil.isNotEmpty(placeholders)) { + sql.append("AND section.RSTCD IN (").append(String.join(", ", placeholders)).append(") "); + } + } + + 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 IS NOT NULL ") + .append("GROUP BY section.RSTCD, eng.ENNM, 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") + .append(") t ") + .append("INNER JOIN (") + .append("SELECT det.STCD, det.SORT, cfg.RVCD ") + .append("FROM MS_ALONG_B cfg ") + .append("INNER JOIN MS_ALONGDET_B det ON cfg.ID = det.ALONG_ID ") + .append("WHERE det.STTP = 'ENG' ") + .append(" AND cfg.CODE = 'common' ") + .append(" AND NVL(det.IS_DELETED, 0) = 0 ") + .append(" AND NVL(cfg.IS_DELETED, 0) = 0") + .append(") t2 ON t.STCD = t2.STCD ") + .append("ORDER BY t2.SORT ASC NULLS LAST, t.STCD ASC, t.TY ASC"); + return sql.toString(); + } + private String buildWeFishStaticsSql(String baseId, String hbrvcd, String yr, @@ -687,6 +814,28 @@ public class WeFishServiceImpl implements WeFishService { } } + private Integer toWeFishIntegerValue(Object value) { + if (value == null) { + return null; + } + if (value instanceof Number number) { + return number.intValue(); + } + try { + return Integer.parseInt(String.valueOf(value).trim()); + } catch (Exception ex) { + return null; + } + } + + private String safeWeFishString(Object value) { + if (value == null) { + return null; + } + String text = String.valueOf(value).trim(); + return StrUtil.isBlank(text) ? null : text; + } + private String getFirstWeFishFilterText(DataSourceRequest.FilterDescriptor filter, String fieldName) { List values = getWeFishFilterTexts(filter, fieldName); return CollUtil.isEmpty(values) ? null : values.get(0);