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 0c424fbc..b9a881bb 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 @@ -75,6 +75,12 @@ public class WeFishController { return ResponseResult.successData(weFishService.getWeCompareBarList(dataSourceRequest)); } + @PostMapping("/we/fishPage/qgc/GetKendoListCust") + @Operation(summary = "环保部-水生生态调查二级页面") + public ResponseResult getQgcWeFishPageList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeFishPageList(dataSourceRequest)); + } + @PostMapping("/base/evnmAutoMonitor/GetKendoListCust") @Operation(summary = "环保自动监测开展情况") public ResponseResult getEnvmAutoMonitorList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishPageQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishPageQgcVo.java new file mode 100644 index 00000000..ad5c68b0 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishPageQgcVo.java @@ -0,0 +1,37 @@ +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.math.BigDecimal; + +@Data +@Accessors(chain = true) +@Schema(description = "环保部-水生生态调查二级页面数据") +public class WeFishPageQgcVo { + + @Schema(description = "鱼类名称") + private String ftp; + + @Schema(description = "科属") + private String genus; + + @Schema(description = "开始年份鱼类总量") + private Integer startFtpCnt; + + @Schema(description = "开始年份总量") + private Integer startCnt; + + @Schema(description = "开始年份占比") + private BigDecimal startYear; + + @Schema(description = "结束年份鱼类总量") + private Integer endFtpCnt; + + @Schema(description = "结束年份总量") + private Integer endCnt; + + @Schema(description = "结束年份占比") + private BigDecimal endYear; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishPageTableVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishPageTableVo.java new file mode 100644 index 00000000..99298e48 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishPageTableVo.java @@ -0,0 +1,22 @@ +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 WeFishPageTableVo { + + @Schema(description = "表头") + private List columns; + + @Schema(description = "表格数据") + private Object dataSource; + + @Schema(description = "总数") + private Long total; +} 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 305739f4..fe6da23e 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 @@ -9,6 +9,7 @@ import com.yfd.platform.qgc_env.wte.entity.vo.WeEnvmAutoMonitorVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishDetailVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishHbbQgcDetailVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeMsstbprptVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeFishPageTableVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishPointQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatTabVo; @@ -43,6 +44,8 @@ public interface WeFishService { DataSourceResult getWeCompareBarList(DataSourceRequest dataSourceRequest); + DataSourceResult getQgcWeFishPageList(DataSourceRequest dataSourceRequest); + DataSourceResult getEnvmAutoMonitorList(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 d6006313..d6fa20be 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 @@ -18,6 +18,8 @@ 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.WeFishHbbQgcDetailVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeFishPageQgcVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeFishPageTableVo; 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; @@ -480,6 +482,136 @@ public class WeFishServiceImpl implements WeFishService { return result; } + @Override + public DataSourceResult getQgcWeFishPageList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + DataSourceRequest.FilterDescriptor filter = dataSourceRequest == null ? null : dataSourceRequest.getFilter(); + + String startYear = resolveWeFishStringFilterValue(dataSourceRequest, loadOptions, "startYear"); + String endYear = resolveWeFishStringFilterValue(dataSourceRequest, loadOptions, "endYear"); + if (StrUtil.isBlank(startYear)) { + throw new IllegalArgumentException("开始年份不能为空!"); + } + if (StrUtil.isBlank(endYear)) { + throw new IllegalArgumentException("结束年份(endYear)不能为空!"); + } + + String baseId = resolveWeFishStringFilterValue(dataSourceRequest, loadOptions, "baseId"); + String hbrvcd = resolveWeFishStringFilterValue(dataSourceRequest, loadOptions, "hbrvcd"); + String rstcd = resolveWeFishStringFilterValue(dataSourceRequest, loadOptions, "rstcd"); + String ftp = resolveWeFishStringFilterValue(dataSourceRequest, loadOptions, "ftp"); + + Map paramMap = new HashMap<>(); + paramMap.put("startYear", startYear); + paramMap.put("endYear", endYear); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ftp, genus, startFtpCnt, startCnt, startYear, endFtpCnt, endCnt, endYear ") + .append("FROM (") + .append("SELECT dict.NAME AS ftp, ") + .append("CONCAT(CONCAT(dict.FAMILY,'-'),dict.GENUS) as genus, ") + .append("agg.startYear AS startYear, agg.endYear AS endYear, ") + .append("agg.startCnt AS startCnt, agg.startFtpCnt AS startFtpCnt, ") + .append("agg.endCnt AS endCnt, agg.endFtpCnt AS endFtpCnt ") + .append("FROM (") + .append("SELECT ftp, hbrvcd, ") + .append("ROUND(MAX(startYear), 2) AS startYear, ") + .append("ROUND(MAX(endYear), 2) AS endYear, ") + .append("MAX(startCnt) AS startCnt, ") + .append("MAX(startFtpCnt) AS startFtpCnt, ") + .append("MAX(endCnt) AS endCnt, ") + .append("MAX(endFtpCnt) AS endFtpCnt ") + .append("FROM (") + .append("SELECT fishAgg.ftp AS ftp, fishAgg.hbrvcd AS hbrvcd, fishAgg.fcnt AS fcnt, ") + .append("CASE WHEN fishAgg.yr = #{map.startYear} ") + .append("THEN CASE WHEN NVL(totalAgg.fcnt, 0) = 0 THEN 0 ELSE 100 * fishAgg.fcnt / totalAgg.fcnt END END AS startYear, ") + .append("CASE WHEN fishAgg.yr = #{map.endYear} ") + .append("THEN CASE WHEN NVL(totalAgg.fcnt, 0) = 0 THEN 0 ELSE 100 * fishAgg.fcnt / totalAgg.fcnt END END AS endYear, ") + .append("CASE WHEN fishAgg.yr = #{map.startYear} THEN fishAgg.fcnt END AS startFtpCnt, ") + .append("CASE WHEN fishAgg.yr = #{map.startYear} THEN totalAgg.fcnt END AS startCnt, ") + .append("CASE WHEN fishAgg.yr = #{map.endYear} THEN fishAgg.fcnt END AS endFtpCnt, ") + .append("CASE WHEN fishAgg.yr = #{map.endYear} THEN totalAgg.fcnt END AS endCnt ") + .append("FROM (") + .append("SELECT fish.FTP AS ftp, section.HBRVCD AS hbrvcd, SUM(NVL(fish.FCNT, 0)) AS fcnt, TO_CHAR(we.TM, 'YYYY') AS yr ") + .append("FROM SD_WE_R we ") + .append("INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID ") + .append(" AND NVL(fish.IS_DELETED, 0) = 0 ") + .append("INNER JOIN SD_WE_B_H section ON section.STCD = we.STCD ") + .append("INNER JOIN V_SD_FISHDICTORY_B dictFilter ON dictFilter.FISH_ID = fish.FTP ") + .append(" AND (section.HBRVCD = dictFilter.RVCD OR dictFilter.RVCD = 'ZY') ") + .append("WHERE NVL(we.STATUS, 1) = 1 ") + .append("AND NVL(we.IS_DELETED, 0) = 0 ") + .append("AND TO_CHAR(we.TM, 'YYYY') IN (#{map.startYear}, #{map.endYear}) "); + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("fishPageBaseId", baseId); + sql.append("AND section.BASE_ID = #{map.fishPageBaseId} "); + } + if (StrUtil.isNotBlank(hbrvcd)) { + paramMap.put("fishPageHbrvcd", hbrvcd); + sql.append("AND section.HBRVCD = #{map.fishPageHbrvcd} "); + } + if (StrUtil.isNotBlank(rstcd)) { + paramMap.put("fishPageRstcd", rstcd); + sql.append("AND section.RSTCD = #{map.fishPageRstcd} "); + } + sql.append("GROUP BY fish.FTP, section.HBRVCD, TO_CHAR(we.TM, 'YYYY') ") + .append(") fishAgg ") + .append("LEFT JOIN (") + .append("SELECT SUM(NVL(fish.FCNT, 0)) AS fcnt, TO_CHAR(we.TM, 'YYYY') AS yr ") + .append("FROM SD_WE_R we ") + .append("INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID ") + .append(" AND NVL(fish.IS_DELETED, 0) = 0 ") + .append("INNER JOIN SD_WE_B_H section ON section.STCD = we.STCD ") + .append("INNER JOIN V_SD_FISHDICTORY_B dictFilter ON dictFilter.FISH_ID = fish.FTP ") + .append(" AND (section.HBRVCD = dictFilter.RVCD OR dictFilter.RVCD = 'ZY') ") + .append("WHERE NVL(we.STATUS, 1) = 1 ") + .append("AND NVL(we.IS_DELETED, 0) = 0 ") + .append("AND TO_CHAR(we.TM, 'YYYY') IN (#{map.startYear}, #{map.endYear}) "); + if (StrUtil.isNotBlank(baseId)) { + sql.append("AND section.BASE_ID = #{map.fishPageBaseId} "); + } + if (StrUtil.isNotBlank(hbrvcd)) { + sql.append("AND section.HBRVCD = #{map.fishPageHbrvcd} "); + } + if (StrUtil.isNotBlank(rstcd)) { + sql.append("AND section.RSTCD = #{map.fishPageRstcd} "); + } + sql.append("GROUP BY TO_CHAR(we.TM, 'YYYY') ") + .append(") totalAgg ON totalAgg.yr = fishAgg.yr ") + .append(") temp ") + .append("GROUP BY ftp, hbrvcd ") + .append(") agg ") + .append("INNER JOIN V_SD_FISHDICTORY_B dict ON dict.FISH_ID = agg.ftp ") + .append(" AND (agg.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY')") + .append(") r WHERE 1 = 1 "); + if (StrUtil.isNotBlank(ftp)) { + paramMap.put("fishPageFtp", "%" + ftp.trim() + "%"); + sql.append("AND r.ftp LIKE #{map.fishPageFtp} "); + } + sql.append(buildWeFishPageOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page page = loadOptions == null ? null + : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql.toString(), + paramMap, + WeFishPageQgcVo.class + ); + long total = page != null ? page.getTotal() : list.size(); + + WeFishPageTableVo tableVo = new WeFishPageTableVo() + .setColumns(buildWeFishPageColumns(startYear, endYear)) + .setDataSource(list) + .setTotal(total); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(Collections.singletonList(tableVo)); + result.setTotal(total); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getEnvmAutoMonitorList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -1655,6 +1787,17 @@ public class WeFishServiceImpl implements WeFishService { return columns; } + private List buildWeFishPageColumns(String startYear, String endYear) { + List columns = new ArrayList<>(); + columns.add(new WeCompareBarHeadColumnVo("genus", "科属", true, "genus", true, new ArrayList<>())); + columns.add(new WeCompareBarHeadColumnVo("ftp", "鱼类名称", true, "ftp", false, new ArrayList<>())); + columns.add(new WeCompareBarHeadColumnVo("startFtpCnt", startYear + "鱼类总量(尾)", true, "startFtpCnt", false, new ArrayList<>())); + columns.add(new WeCompareBarHeadColumnVo("startYear", startYear + "占比(%)", true, "startYear", false, new ArrayList<>())); + columns.add(new WeCompareBarHeadColumnVo("endFtpCnt", endYear + "鱼类总量(尾)", true, "endFtpCnt", false, new ArrayList<>())); + columns.add(new WeCompareBarHeadColumnVo("endYear", endYear + "占比(%)", true, "endYear", false, new ArrayList<>())); + return columns; + } + private String firstNonBlankWeFishFilter(DataSourceRequest.FilterDescriptor filter, String... fields) { if (fields == null) { return null; @@ -3328,6 +3471,38 @@ public class WeFishServiceImpl implements WeFishService { return " ORDER BY " + String.join(", ", orderByParts); } + private String buildWeFishPageOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return " ORDER BY r.ftp ASC"; + } + Map columnMap = new LinkedHashMap<>(); + columnMap.put("ftp", "r.ftp"); + columnMap.put("genus", "r.genus"); + columnMap.put("startFtpCnt", "r.startFtpCnt"); + columnMap.put("startCnt", "r.startCnt"); + columnMap.put("startYear", "r.startYear"); + columnMap.put("endFtpCnt", "r.endFtpCnt"); + columnMap.put("endCnt", "r.endCnt"); + columnMap.put("endYear", "r.endYear"); + + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = columnMap.get(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction + " NULLS LAST"); + } + if (orderByParts.isEmpty()) { + return " ORDER BY r.ftp ASC"; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + private String buildWeStaticsSecondSelectSql(List selectFields) { Map columns = new LinkedHashMap<>(); columns.put("stcd", "r.stcd AS stcd");