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 da46591c..b4468f5f 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 @@ -26,4 +26,10 @@ public class WeFishController { public ResponseResult getQgcWeFishTKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(weFishService.getQgcWeFishTKendoListCust(dataSourceRequest)); } + + @PostMapping("/we/fisht/year/qgc/GetKendoListCust") + @Operation(summary = "全过程沿程鱼类变化情况有数据的流域和年份") + public ResponseResult getQgcFishStaticsYearList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcFishStaticsYearList(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeRvcdYearVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeRvcdYearVo.java new file mode 100644 index 00000000..96ce4c52 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeRvcdYearVo.java @@ -0,0 +1,15 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "沿程鱼类有数据流域年份") +public class WeRvcdYearVo { + + @Schema(description = "河段编码") + private String hbrvcd; + + @Schema(description = "年份") + private String yr; +} 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 0cc2c3f6..5f365be3 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,7 +4,12 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; +import java.util.List; +import java.util.Map; + public interface WeFishService { DataSourceResult getQgcWeFishTKendoListCust(DataSourceRequest dataSourceRequest); + + DataSourceResult>> getQgcFishStaticsYearList(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 86849c3b..686c02af 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 @@ -11,6 +11,7 @@ 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.WeFishTQgcVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeRvcdYearVo; import com.yfd.platform.qgc_env.wte.service.WeFishService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; @@ -20,6 +21,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -80,6 +82,39 @@ public class WeFishServiceImpl implements WeFishService { return result; } + @Override + public DataSourceResult>> getQgcFishStaticsYearList(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 = buildWeFishYearSql(baseId, hbrvcd, yr, rstcdList, paramMap); + List rows = microservicDynamicSQLMapper.getAllListWithResultType(sql, paramMap, WeRvcdYearVo.class); + + LinkedHashMap> yrMap = new LinkedHashMap<>(); + for (WeRvcdYearVo row : rows) { + if (row == null || StrUtil.isBlank(row.getHbrvcd()) || StrUtil.isBlank(row.getYr())) { + continue; + } + yrMap.computeIfAbsent(row.getHbrvcd(), key -> new ArrayList<>()).add(row.getYr()); + } + + DataSourceResult>> result = new DataSourceResult<>(); + if (yrMap.isEmpty()) { + result.setData(null); + result.setTotal(0L); + } else { + result.setData(java.util.Collections.singletonList(yrMap)); + result.setTotal(1L); + } + result.setAggregates(new HashMap<>()); + return result; + } + private String buildWeFishQgcGroupSql(String baseSql, GroupingInfo[] groupInfos) { if (groupInfos == null || groupInfos.length == 0) { return baseSql; @@ -147,6 +182,74 @@ public class WeFishServiceImpl implements WeFishService { return sql.toString(); } + private String buildWeFishYearSql(String baseId, + String hbrvcd, + String yr, + List rstcdList, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT t.HBRVCD AS hbrvcd, t.YR AS yr ") + .append("FROM (") + .append("SELECT section.HBRVCD, section.RSTCD, section.BASE_ID, TO_CHAR(we.TM, 'yyyy') AS yr ") + .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 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 ") + .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 "); + + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("weYearBaseId", baseId); + sql.append("AND section.BASE_ID = #{map.weYearBaseId} "); + } + if (StrUtil.isNotBlank(hbrvcd)) { + paramMap.put("weYearHbrvcd", hbrvcd); + sql.append("AND section.HBRVCD = #{map.weYearHbrvcd} "); + } + if (StrUtil.isNotBlank(yr)) { + paramMap.put("weYearYr", yr); + sql.append("AND TO_CHAR(we.TM, 'yyyy') = #{map.weYearYr} "); + } + if (CollUtil.isNotEmpty(rstcdList)) { + List placeholders = new ArrayList<>(); + int index = 0; + for (String rstcd : rstcdList) { + if (StrUtil.isBlank(rstcd)) { + continue; + } + String key = "weYearRstcd" + 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("GROUP BY section.BASE_ID, section.HBRVCD, section.RSTCD, TO_CHAR(we.TM, 'yyyy')") + .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.RSTCD = t2.STCD ") + .append("GROUP BY t.BASE_ID, t.HBRVCD, t.YR ") + .append("ORDER BY t.BASE_ID ASC NULLS LAST, t.HBRVCD ASC NULLS LAST, t.YR DESC"); + return sql.toString(); + } + private String buildWeFishQgcDetailSql() { return "SELECT " + "section.STCD AS stcd, " + @@ -421,22 +524,28 @@ public class WeFishServiceImpl implements WeFishService { private List normalizeWeFishQgcValues(Object value) { List values = new ArrayList<>(); + appendWeFishQgcValues(values, value); + return values; + } + + private void appendWeFishQgcValues(List values, Object value) { if (value == null) { - return values; + return; } if (value instanceof Iterable iterable) { for (Object item : iterable) { - values.add(item); + appendWeFishQgcValues(values, item); } - return values; + return; } if (value.getClass().isArray()) { Object[] array = (Object[]) value; - values.addAll(Arrays.asList(array)); - return values; + for (Object item : array) { + appendWeFishQgcValues(values, item); + } + return; } values.add(value); - return values; } private boolean isWeFishIntegerField(String field) { @@ -461,6 +570,40 @@ public class WeFishServiceImpl implements WeFishService { } } + private String getFirstWeFishFilterText(DataSourceRequest.FilterDescriptor filter, String fieldName) { + List values = getWeFishFilterTexts(filter, fieldName); + return CollUtil.isEmpty(values) ? null : values.get(0); + } + + private List getWeFishFilterTexts(DataSourceRequest.FilterDescriptor filter, String fieldName) { + List values = new ArrayList<>(); + collectWeFishFilterTexts(filter, fieldName, values); + return values; + } + + private void collectWeFishFilterTexts(DataSourceRequest.FilterDescriptor filter, String fieldName, List values) { + if (filter == null || StrUtil.isBlank(fieldName)) { + return; + } + if (fieldName.equalsIgnoreCase(filter.getField())) { + for (Object item : normalizeWeFishQgcValues(filter.getValue())) { + if (item == null) { + continue; + } + String text = String.valueOf(item).trim(); + if (StrUtil.isNotBlank(text)) { + values.add(text); + } + } + } + if (CollUtil.isEmpty(filter.getFilters())) { + return; + } + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + collectWeFishFilterTexts(child, fieldName, values); + } + } + private void fillWeFishDerivedFields(List list) { if (CollUtil.isEmpty(list)) { return;