From 38a53ec7daaa6bd14e2da6ec63d36bb8a3db62dd Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 28 May 2026 15:39:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E6=A0=96=E6=81=AF?= =?UTF-8?q?=E5=9C=B0=E6=B5=81=E9=87=8F=E7=AB=99=E6=97=A5=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fh/controller/FhHabitatController.java | 6 + .../env/fh/entity/vo/FhSdriverdayVo.java | 38 ++++ .../env/fh/service/FhHabitatService.java | 2 + .../fh/service/impl/FhHabitatServiceImpl.java | 197 ++++++++++++++++++ 4 files changed, 243 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhSdriverdayVo.java diff --git a/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java b/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java index dcfac12..ddaa23a 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java @@ -46,6 +46,12 @@ public class FhHabitatController { return ResponseResult.successData(fhHabitatService.getSdrvwtsList(dataSourceRequest)); } + @PostMapping("/zq/sdriverdays/GetKendoList") + @Operation(summary = "查询栖息地流量站日统计数据") + public ResponseResult getSdriverdaysList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fhHabitatService.getSdriverdaysList(dataSourceRequest)); + } + @PostMapping("/msstbprpt/GetKendoList") @Operation(summary = "查询栖息地监测站点列表") public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhSdriverdayVo.java b/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhSdriverdayVo.java new file mode 100644 index 0000000..f81decd --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhSdriverdayVo.java @@ -0,0 +1,38 @@ +package com.yfd.platform.env.fh.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "栖息地流量站日统计数据") +public class FhSdriverdayVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "主键ID") + private String id; + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date dt; + + @Schema(description = "水位") + private BigDecimal z; + + @Schema(description = "流量") + private BigDecimal q; + + @Schema(description = "流速") + private BigDecimal v; + + @Schema(description = "测流方法") + private String msqmt; +} diff --git a/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java b/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java index d0d5d8d..92b600d 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java @@ -16,6 +16,8 @@ public interface FhHabitatService { DataSourceResult getSdrvwtsList(DataSourceRequest dataSourceRequest); + DataSourceResult getSdriverdaysList(DataSourceRequest dataSourceRequest); + DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java index af55291..752ca7d 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java @@ -16,6 +16,7 @@ import com.yfd.platform.env.fh.entity.ao.FhDefaultAo; import com.yfd.platform.env.fh.entity.vo.FhDefaultVo; import com.yfd.platform.env.fh.entity.vo.HabitatVo; import com.yfd.platform.env.fh.entity.vo.FhMsstbprptVo; +import com.yfd.platform.env.fh.entity.vo.FhSdriverdayVo; import com.yfd.platform.env.fh.entity.vo.FhSdrvwtsVo; import com.yfd.platform.env.fh.service.FhHabitatService; import com.yfd.platform.env.wq.entity.vo.StTbYsVo; @@ -210,6 +211,58 @@ public class FhHabitatServiceImpl implements FhHabitatService { return result; } + @Override + public DataSourceResult getSdriverdaysList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("t.ID AS id, ") + .append("t.STCD AS stcd, ") + .append("t.DT AS dt, ") + .append("t.Z AS z, ") + .append("t.Q AS q, ") + .append("t.V AS v, ") + .append("t.MSQMT AS msqmt ") + .append("FROM SD_RIVERDAY_S t ") + .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildSdriverdaysFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + GroupingInfo[] groups = loadOptions == null ? null : loadOptions.getGroup(); + if (groups != null && groups.length > 0) { + String groupSql = buildGroupSql(sql.toString(), groups); + List> groupRows = microservicDynamicSQLMapper.pageAllList(null, groupSql, paramMap); + DataSourceResult result = new DataSourceResult<>(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List) new GroupHelper().faltGroup(groupRows, Arrays.asList(groups))); + } else { + result.setData((List) (List) new GroupHelper().group(groupRows, Arrays.asList(groups))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + sql.append(buildSdriverdaysOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + PageInfo pageInfo = loadOptions == null ? null : QgcQueryWrapperUtil.getPageInfo(loadOptions); + Page page = pageInfo != null && pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, FhSdriverdayVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + private String buildDefaultFhListSql(FhDefaultAo fhDefaultAo) { String dateConditionWtrv = ""; String dateConditionZq = ""; @@ -1323,6 +1376,150 @@ public class FhHabitatServiceImpl implements FhHabitatService { return " ORDER BY " + String.join(", ", orders); } + private String buildSdriverdaysFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildSdriverdaysLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildSdriverdaysFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildSdriverdaysLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapSdriverdaysColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + boolean dateField = isSdriverdaysDateField(filter.getField()); + if ("in".equals(operator)) { + List values = normalizeFilterValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "fhRiverParam" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add(buildSdriverdaysValueExpr(paramKey, dateField, item)); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + + String paramKey = "fhRiverParam" + indexHolder[0]++; + String valueExpr = buildSdriverdaysValueExpr(paramKey, dateField, value); + switch (operator) { + case "eq": + paramMap.put(paramKey, value); + return column + " = " + valueExpr; + case "neq": + paramMap.put(paramKey, value); + return column + " <> " + valueExpr; + case "contains": + paramMap.put(paramKey, "%" + value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "startswith": + paramMap.put(paramKey, value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "endswith": + paramMap.put(paramKey, "%" + value); + return column + " LIKE #{map." + paramKey + "}"; + case "gt": + paramMap.put(paramKey, value); + return column + " > " + valueExpr; + case "gte": + paramMap.put(paramKey, value); + return column + " >= " + valueExpr; + case "lt": + paramMap.put(paramKey, value); + return column + " < " + valueExpr; + case "lte": + paramMap.put(paramKey, value); + return column + " <= " + valueExpr; + default: + return ""; + } + } + + private String mapSdriverdaysColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field.toLowerCase()) { + case "id" -> "t.ID"; + case "stcd" -> "t.STCD"; + case "dt" -> "t.DT"; + case "z" -> "t.Z"; + case "q" -> "t.Q"; + case "v" -> "t.V"; + case "msqmt" -> "t.MSQMT"; + default -> null; + }; + } + + private boolean isSdriverdaysDateField(String field) { + return "dt".equalsIgnoreCase(field); + } + + private String buildSdriverdaysValueExpr(String paramKey, boolean dateField, Object value) { + if (!dateField || value == null) { + return "#{map." + paramKey + "}"; + } + String text = String.valueOf(value).trim(); + if (text.length() <= 10) { + return "TO_DATE(#{map." + paramKey + "}, 'YYYY-MM-DD')"; + } + return "TO_DATE(#{map." + paramKey + "}, 'YYYY-MM-DD HH24:MI:SS')"; + } + + private String buildSdriverdaysOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY t.DT DESC, t.STCD ASC"; + } + List orders = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapSdriverdaysColumn(sortDescriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = ("desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir())) ? "DESC" : "ASC"; + orders.add(column + " " + dir); + } + if (orders.isEmpty()) { + return " ORDER BY t.DT DESC, t.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orders); + } + private String findFilterFieldValue(DataSourceRequest.FilterDescriptor filter, String field) { if (filter == null || StrUtil.isBlank(field)) { return null;