diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java
index 68e67d3b..b22e2219 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java
@@ -1389,10 +1389,15 @@ public class FishImportServiceImpl implements IFishImportService {
boolean isUp = lowerName.contains("上行") && !isUpReturn; // 排除上行折返
boolean isDown = lowerName.contains("下行") && !isDownReturn; // 排除下行折返
+
// 判断 direction 是否为字典编码
boolean isDictCode = "0".equals(direction) || "1".equals(direction) ||
"2".equals(direction) || "3".equals(direction);
-
+ if (importRow.getWarnings().contains("stcd")) {
+ importRow.getWarnings().add("direction");
+ // 如果是字典编码,返回对应的中文;否则返回原始数据
+ return isDictCode ? getDirectionChinese(direction) : direction;
+ }
// 如果 direction 本身是字典编码(0/1/2/3),直接识别
if ("0".equals(direction)) {
isUp = true;
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 763a2697..7a6e245f 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
@@ -148,4 +148,10 @@ public class FishPassageController {
public ResponseResult getQgcFpssrlQdaySKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fpRunService.processQgcFpssrlQdaySKendoList(dataSourceRequest));
}
+
+ @PostMapping("/fpssrlQdrtps/GetKendoListCust")
+ @Operation(summary = "过鱼设施自动数据周旬月年统计表(SD_FPSSRLDRTP_S)")
+ public ResponseResult getQgcFpssrlQdrtpSKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
+ return ResponseResult.successData(fpRunService.processQgcFpssrlQdrtpSKendoList(dataSourceRequest));
+ }
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFpssrlQdrtpSVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFpssrlQdrtpSVo.java
new file mode 100644
index 00000000..5e8ea9e7
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFpssrlQdrtpSVo.java
@@ -0,0 +1,65 @@
+package com.yfd.platform.qgc_env.fp.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ *
+ * 过鱼设施自动数据(带水温,流速)周旬月年统计表 VO
+ *
+ * 对应新表 SD_FPSSRLDRTP_S(旧系统 SD_FPSSRLQDRTP_S)
+ */
+@Data
+@Schema(description = "过鱼设施自动数据周旬月年统计表")
+public class FpFpssrlQdrtpSVo {
+
+ @Schema(description = "主键ID")
+ private String id;
+
+ @Schema(description = "过鱼设施编码")
+ private String stcd;
+
+ @Schema(description = "数据时间")
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date tm;
+
+ @Schema(description = "维度类型:WEEK=周 TEN=旬 MON=月 QUA=季 YEAR=年")
+ private String drtp;
+
+ @Schema(description = "年:YYYY")
+ private Long year;
+
+ @Schema(description = "月")
+ private Long month;
+
+ @Schema(description = "时段类型")
+ private Long dr;
+
+ @Schema(description = "鱼类")
+ private String ftp;
+
+ @Schema(description = "自动过鱼设施过鱼数量")
+ private Long fcnt;
+
+ @Schema(description = "水温,单位:℃")
+ private BigDecimal temperature;
+
+ @Schema(description = "水位,单位:m")
+ private BigDecimal waterlevel;
+
+ @Schema(description = "流速,单位:m/s")
+ private BigDecimal speed;
+
+ @Schema(description = "流量,单位:m3/s")
+ private BigDecimal q;
+
+ @Schema(description = "溶氧,单位:mg/L")
+ private BigDecimal dox;
+
+ @Schema(description = "浊度,单位:NTU")
+ private BigDecimal tu;
+}
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 833178df..2e5fe4ef 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
@@ -12,6 +12,7 @@ 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.FpFpssrlQdaySVo;
+import com.yfd.platform.qgc_env.fp.entity.vo.FpFpssrlQdrtpSVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpRunPlanVo;
import java.util.List;
@@ -41,4 +42,6 @@ public interface FpRunService {
DataSourceResult processQgcOverfishTotalKendoList(DataSourceRequest dataSourceRequest);
DataSourceResult processQgcFpssrlQdaySKendoList(DataSourceRequest dataSourceRequest);
+
+ DataSourceResult processQgcFpssrlQdrtpSKendoList(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 2991a0a9..ac2c73dc 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.FpFpssrlQdaySVo;
+import com.yfd.platform.qgc_env.fp.entity.vo.FpFpssrlQdrtpSVo;
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;
@@ -3312,4 +3313,210 @@ public class FpRunServiceImpl implements FpRunService {
return orders.isEmpty() ? " ORDER BY t.DT DESC" : " ORDER BY " + String.join(", ", orders);
}
+ // ==================== 过鱼设施自动数据周旬月年统计表 ====================
+
+ @Override
+ public DataSourceResult processQgcFpssrlQdrtpSKendoList(DataSourceRequest dataSourceRequest) {
+ DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
+ if (CollUtil.isEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) {
+ return queryFpssrlQdrtpSDetailList(dataSourceRequest, loadOptions);
+ }
+ return queryFpssrlQdrtpSGroupList(dataSourceRequest, loadOptions);
+ }
+
+ private DataSourceResult queryFpssrlQdrtpSDetailList(DataSourceRequest dataSourceRequest,
+ DataSourceLoadOptionsBase loadOptions) {
+ StringBuilder sql = new StringBuilder();
+ sql.append("SELECT ")
+ .append(buildFpssrlQdrtpSSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect()))
+ .append(" FROM (")
+ .append(buildFpssrlQdrtpSCoreSql())
+ .append(") t WHERE 1 = 1 ");
+
+ Map paramMap = new HashMap<>();
+ String filterSql = QgcQueryWrapperUtil.buildFilterCondition(
+ dataSourceRequest == null ? null : dataSourceRequest.getFilter(),
+ paramMap,
+ new int[]{0},
+ this::mapFpssrlQdrtpSColumn
+ );
+ if (StrUtil.isNotBlank(filterSql)) {
+ sql.append(" AND ").append(filterSql).append(" ");
+ }
+ sql.append(buildFpssrlQdrtpSOrderBySql(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, FpFpssrlQdrtpSVo.class
+ );
+ DataSourceResult result = new DataSourceResult<>();
+ result.setData(list);
+ result.setTotal(page != null ? page.getTotal() : list.size());
+ result.setAggregates(new HashMap<>());
+ return result;
+ }
+
+ private DataSourceResult queryFpssrlQdrtpSGroupList(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 = mapFpssrlQdrtpSColumn(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 = mapFpssrlQdrtpSColumn(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(buildFpssrlQdrtpSCoreSql())
+ .append(") t WHERE 1 = 1 ");
+
+ Map paramMap = new HashMap<>();
+ String filterSql = QgcQueryWrapperUtil.buildFilterCondition(
+ dataSourceRequest == null ? null : dataSourceRequest.getFilter(),
+ paramMap,
+ new int[]{0},
+ this::mapFpssrlQdrtpSColumn
+ );
+ 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 = mapFpssrlQdrtpSColumn(descriptor.getField());
+ if (StrUtil.isNotBlank(column)) {
+ groupByColumns.add(column);
+ }
+ }
+ if (!groupByColumns.isEmpty()) {
+ sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)).append(" ");
+ }
+ sql.append(buildFpssrlQdrtpSOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()));
+
+ List