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> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + DataSourceResult result = new DataSourceResult<>(); + if (dataSourceRequest.getGroupResultFlat() != null && dataSourceRequest.getGroupResultFlat()) { + result.setData((List) (List) new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos))); + } else { + result.setData((List) (List) new GroupHelper().group(rows, Arrays.asList(groupInfos))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + /** + * 过鱼设施自动数据周旬月年统计表核心 SQL:单表 SD_FPSSRLDRTP_S + */ + private String buildFpssrlQdrtpSCoreSql() { + return "SELECT t.ID, t.STCD, t.TM, t.DRTP, t.YEAR, t.MONTH, t.DR, t.FTP, t.FCNT, " + + "t.TEMPERATURE, t.WATERLEVEL, t.SPEED, t.Q, t.DOX, t.TU " + + "FROM SD_FPSSRLDRTP_S t " + + "WHERE NVL(t.IS_DELETED, 0) = 0 "; + } + + private String buildFpssrlQdrtpSSelectSql(List selectFields) { + Map columns = new LinkedHashMap<>(); + columns.put("id", "t.ID AS id"); + columns.put("stcd", "t.STCD AS stcd"); + columns.put("tm", "t.TM AS tm"); + columns.put("drtp", "t.DRTP AS drtp"); + columns.put("year", "t.YEAR AS year"); + columns.put("month", "t.MONTH AS month"); + columns.put("dr", "t.DR AS dr"); + columns.put("ftp", "t.FTP AS ftp"); + columns.put("fcnt", "t.FCNT AS fcnt"); + columns.put("temperature", "t.TEMPERATURE AS temperature"); + columns.put("waterlevel", "t.WATERLEVEL AS waterlevel"); + columns.put("speed", "t.SPEED AS speed"); + columns.put("q", "t.Q AS q"); + columns.put("dox", "t.DOX AS dox"); + columns.put("tu", "t.TU AS tu"); + + List selected = new ArrayList<>(); + if (CollUtil.isEmpty(selectFields)) { + selected.addAll(columns.values()); + } else { + for (String field : selectFields) { + String column = columns.get(field); + if (StrUtil.isNotBlank(column)) { + selected.add(column); + } + } + if (selected.isEmpty()) { + selected.addAll(columns.values()); + } + } + return String.join(", ", selected); + } + + private String mapFpssrlQdrtpSColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field.toLowerCase()) { + case "id" -> "t.ID"; + case "stcd" -> "t.STCD"; + case "tm" -> "t.TM"; + case "drtp" -> "t.DRTP"; + case "year" -> "t.YEAR"; + case "month" -> "t.MONTH"; + case "dr" -> "t.DR"; + case "ftp" -> "t.FTP"; + case "fcnt" -> "t.FCNT"; + case "temperature" -> "t.TEMPERATURE"; + case "waterlevel" -> "t.WATERLEVEL"; + case "speed" -> "t.SPEED"; + case "q" -> "t.Q"; + case "dox" -> "t.DOX"; + case "tu" -> "t.TU"; + default -> null; + }; + } + + private String buildFpssrlQdrtpSOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY t.YEAR DESC, t.MONTH DESC, t.DR DESC"; + } + List orders = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sortList) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapFpssrlQdrtpSColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orders.add(column + " " + dir); + } + return orders.isEmpty() ? " ORDER BY t.YEAR DESC, t.MONTH DESC, t.DR DESC" : " ORDER BY " + String.join(", ", orders); + } + }