feat: 环保部-水生生态调查二级页面

This commit is contained in:
tangwei 2026-06-30 15:48:31 +08:00
parent 11f45d65e0
commit 805dab9c10
5 changed files with 243 additions and 0 deletions

View File

@ -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) {

View File

@ -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;
}

View File

@ -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<WeCompareBarHeadColumnVo> columns;
@Schema(description = "表格数据")
private Object dataSource;
@Schema(description = "总数")
private Long total;
}

View File

@ -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<WeCompareBarTableVo> getWeCompareBarList(DataSourceRequest dataSourceRequest);
DataSourceResult<WeFishPageTableVo> getQgcWeFishPageList(DataSourceRequest dataSourceRequest);
DataSourceResult<WeEnvmAutoMonitorVo> getEnvmAutoMonitorList(DataSourceRequest dataSourceRequest);
DataSourceResult<Map<String, List<String>>> getQgcFishStaticsYearList(DataSourceRequest dataSourceRequest);

View File

@ -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<WeFishPageTableVo> 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<String, Object> 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<WeFishPageQgcVo> 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<WeFishPageTableVo> result = new DataSourceResult<>();
result.setData(Collections.singletonList(tableVo));
result.setTotal(total);
result.setAggregates(new HashMap<>());
return result;
}
@Override
public DataSourceResult<WeEnvmAutoMonitorVo> getEnvmAutoMonitorList(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
@ -1655,6 +1787,17 @@ public class WeFishServiceImpl implements WeFishService {
return columns;
}
private List<WeCompareBarHeadColumnVo> buildWeFishPageColumns(String startYear, String endYear) {
List<WeCompareBarHeadColumnVo> 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<DataSourceRequest.SortDescriptor> sorts) {
if (CollUtil.isEmpty(sorts)) {
return " ORDER BY r.ftp ASC";
}
Map<String, String> 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<String> 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<String> selectFields) {
Map<String, String> columns = new LinkedHashMap<>();
columns.put("stcd", "r.stcd AS stcd");