diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java
index e5f1f215..aeaeca8d 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java
@@ -136,4 +136,10 @@ public class FishPassageController {
public ResponseResult getTreeStcdList(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fpRunService.getTreeStcdList(dataSourceRequest));
}
+
+ @PostMapping("/query/qgc/getOverfishTotal")
+ @Operation(summary = "环保部-过鱼总量-二级弹窗列表(SD_FPSSRL_R + SD_FPSS_R 合并)")
+ public ResponseResult getQgcOverfishTotal(@RequestBody DataSourceRequest dataSourceRequest) {
+ return ResponseResult.successData(fpRunService.processQgcOverfishTotalKendoList(dataSourceRequest));
+ }
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpOverfishTotalVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpOverfishTotalVo.java
new file mode 100644
index 00000000..49d32290
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpOverfishTotalVo.java
@@ -0,0 +1,84 @@
+package com.yfd.platform.qgc_env.fp.entity.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ *
+ * 环保部-过鱼总量-二级弹窗列表 VO
+ *
+ * 对应旧系统 FpssrlRQueryVo.getQgcOverfishTotal,查询 SD_FPSSRL_R + SD_FPSS_R 合并数据
+ */
+@Data
+public class FpOverfishTotalVo {
+
+ /** 过鱼设施编码 */
+ private String stcd;
+
+ /** 设施名称 */
+ private String stnm;
+
+ /** 基地编码 */
+ private String baseId;
+
+ /** 基地名称 */
+ private String baseName;
+
+ /** 电站编码 */
+ private String rstcd;
+
+ /** 电站名称 */
+ private String ennm;
+
+ /** 时间 */
+ private Date tm;
+
+ /** 过鱼年份 */
+ private String yr;
+
+ /** 鱼类名称 */
+ private String ftp;
+
+ /** 鱼类编码 */
+ private String fishId;
+
+ /** 大小 */
+ private String fsz;
+
+ /** 鱼宽度 */
+ private String width;
+
+ /** 鱼速度 */
+ private String fishspeed;
+
+ /** 游向:0=上行 1=下行 */
+ private String direction;
+
+ /** 水温 */
+ private String temperature;
+
+ /** 流速 */
+ private String speed;
+
+ /** 过鱼通道 */
+ private String channelno;
+
+ /** 数量 */
+ private String fcnt;
+
+ /** 图片URL */
+ private String firstimgurl;
+
+ /** 视频URL */
+ private String videourl;
+
+ /** 监测方式:1=人工 2=自动 */
+ private Integer mway;
+
+ /** 人工过鱼 开始日期 */
+ private Date strdt;
+
+ /** 人工过鱼 结束日期 */
+ private Date enddt;
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java
index 14e24b26..c6eea469 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java
@@ -10,6 +10,7 @@ import com.yfd.platform.qgc_env.fp.entity.vo.FpSdfpssrVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpTableVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpTreeStcdGroupVo;
import com.yfd.platform.qgc_env.fp.entity.vo.YearFpStatisticsVo;
+import com.yfd.platform.qgc_env.fp.entity.vo.FpOverfishTotalVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpRunPlanVo;
import java.util.List;
@@ -35,4 +36,6 @@ public interface FpRunService {
List getYearFpStatic(String year,String stcd);
DataSourceResult getTreeStcdList(DataSourceRequest dataSourceRequest);
+
+ DataSourceResult processQgcOverfishTotalKendoList(DataSourceRequest dataSourceRequest);
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java
index 8baf1fd0..9c753d0a 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java
@@ -17,6 +17,7 @@ import com.yfd.platform.qgc_env.fp.entity.vo.FbFishRunVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpFishSelectVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpFpssrlQueryVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpFtpStatisticsVo;
+import com.yfd.platform.qgc_env.fp.entity.vo.FpOverfishTotalVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpRunAnalysisHeadColumnVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpRunAnalysisTableVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpRunAnalysisVo;
@@ -2838,5 +2839,257 @@ public class FpRunServiceImpl implements FpRunService {
};
}
+ // ==================== 环保部-过鱼总量-二级弹窗列表 ====================
+
+ @Override
+ public DataSourceResult processQgcOverfishTotalKendoList(DataSourceRequest dataSourceRequest) {
+ DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
+ if (CollUtil.isEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) {
+ return queryOverfishTotalDetailList(dataSourceRequest, loadOptions);
+ }
+ return queryOverfishTotalGroupList(dataSourceRequest, loadOptions);
+ }
+
+ private DataSourceResult queryOverfishTotalDetailList(DataSourceRequest dataSourceRequest,
+ DataSourceLoadOptionsBase loadOptions) {
+ StringBuilder sql = new StringBuilder();
+ sql.append("SELECT ")
+ .append(buildOverfishTotalSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect()))
+ .append(" FROM (")
+ .append(buildOverfishTotalCoreSql())
+ .append(") t WHERE 1 = 1 ");
+
+ Map paramMap = new HashMap<>();
+ String filterSql = QgcQueryWrapperUtil.buildFilterCondition(
+ dataSourceRequest == null ? null : dataSourceRequest.getFilter(),
+ paramMap,
+ new int[]{0},
+ this::mapOverfishTotalColumn
+ );
+ if (StrUtil.isNotBlank(filterSql)) {
+ sql.append(" AND ").append(filterSql).append(" ");
+ }
+ sql.append(buildOverfishTotalOrderBySql(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, FpOverfishTotalVo.class
+ );
+ DataSourceResult result = new DataSourceResult<>();
+ result.setData(list);
+ result.setTotal(page != null ? page.getTotal() : list.size());
+ result.setAggregates(new HashMap<>());
+ return result;
+ }
+
+ private DataSourceResult queryOverfishTotalGroupList(DataSourceRequest dataSourceRequest,
+ DataSourceLoadOptionsBase loadOptions) {
+ List groups = dataSourceRequest.getGroup();
+ GroupingInfo[] groupInfos = loadOptions == null ? new GroupingInfo[0] : loadOptions.getGroup();
+
+ List selectItems = new ArrayList<>();
+ for (DataSourceRequest.GroupDescriptor descriptor : groups) {
+ if (descriptor == null || StrUtil.isBlank(descriptor.getField())) {
+ continue;
+ }
+ String column = mapOverfishTotalColumn(descriptor.getField());
+ if (StrUtil.isBlank(column)) {
+ continue;
+ }
+ selectItems.add(column + " AS " + descriptor.getField().toUpperCase());
+ selectItems.add("COUNT(*) AS COUNT_" + descriptor.getField().toUpperCase());
+ if (CollUtil.isNotEmpty(descriptor.getAggregates())) {
+ for (DataSourceRequest.AggregateDescriptor aggregate : descriptor.getAggregates()) {
+ String aggregateColumn = mapOverfishTotalColumn(aggregate.getField());
+ if (StrUtil.isBlank(aggregateColumn) || StrUtil.isBlank(aggregate.getAggregate())) {
+ continue;
+ }
+ selectItems.add(buildAggregateSql(aggregate.getAggregate(), aggregateColumn, aggregate.getField()));
+ }
+ }
+ }
+ if (selectItems.isEmpty()) {
+ selectItems.add("t.STCD AS STCD");
+ selectItems.add("COUNT(*) AS COUNT_STCD");
+ }
+
+ StringBuilder sql = new StringBuilder("SELECT ");
+ sql.append(String.join(", ", selectItems))
+ .append(" FROM (")
+ .append(buildOverfishTotalCoreSql())
+ .append(") t WHERE 1 = 1 ");
+
+ Map paramMap = new HashMap<>();
+ String filterSql = QgcQueryWrapperUtil.buildFilterCondition(
+ dataSourceRequest == null ? null : dataSourceRequest.getFilter(),
+ paramMap,
+ new int[]{0},
+ this::mapOverfishTotalColumn
+ );
+ if (StrUtil.isNotBlank(filterSql)) {
+ sql.append(" AND ").append(filterSql).append(" ");
+ }
+
+ List groupByColumns = new ArrayList<>();
+ for (DataSourceRequest.GroupDescriptor descriptor : groups) {
+ if (descriptor == null || StrUtil.isBlank(descriptor.getField())) {
+ continue;
+ }
+ String column = mapOverfishTotalColumn(descriptor.getField());
+ if (StrUtil.isNotBlank(column)) {
+ groupByColumns.add(column);
+ }
+ }
+ if (!groupByColumns.isEmpty()) {
+ sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)).append(" ");
+ }
+
+ List