From 0ad86754e7cf604c7bf93e9eceed293e19cfeab5 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 29 May 2026 09:21:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=A0=B9=E6=8D=AE=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=B0=B4=E6=96=87=E6=B5=81=E9=87=8F=E7=AB=99?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zq/controller/ZqMonitorController.java | 9 + .../env/zq/entity/vo/ZqBaseInfoVo.java | 3 + .../env/zq/service/ZqMonitorService.java | 4 + .../zq/service/impl/ZqMonitorServiceImpl.java | 369 ++++++++++++++++++ 4 files changed, 385 insertions(+) diff --git a/backend/src/main/java/com/yfd/platform/env/zq/controller/ZqMonitorController.java b/backend/src/main/java/com/yfd/platform/env/zq/controller/ZqMonitorController.java index f877e37e..0b327e37 100644 --- a/backend/src/main/java/com/yfd/platform/env/zq/controller/ZqMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/env/zq/controller/ZqMonitorController.java @@ -1,5 +1,6 @@ package com.yfd.platform.env.zq.controller; +import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.env.zq.service.ZqMonitorService; import io.swagger.v3.oas.annotations.Operation; @@ -7,6 +8,8 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -20,6 +23,12 @@ public class ZqMonitorController { @Resource private ZqMonitorService zqMonitorService; + @PostMapping("/msstbprpt/GetKendoList") + @Operation(summary = "根据条件查询水文流量站基础数据") + public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(zqMonitorService.getMsstbprptList(dataSourceRequest)); + } + @GetMapping("/msstbprpt/getStcdInfo") @Operation(summary = "根据站码查询单条水文站基础数据") public ResponseResult getStcdInfo(@RequestParam String stcd) { diff --git a/backend/src/main/java/com/yfd/platform/env/zq/entity/vo/ZqBaseInfoVo.java b/backend/src/main/java/com/yfd/platform/env/zq/entity/vo/ZqBaseInfoVo.java index 4631ec7e..ff8e42bd 100644 --- a/backend/src/main/java/com/yfd/platform/env/zq/entity/vo/ZqBaseInfoVo.java +++ b/backend/src/main/java/com/yfd/platform/env/zq/entity/vo/ZqBaseInfoVo.java @@ -21,6 +21,9 @@ public class ZqBaseInfoVo { @Schema(description = "站类") private String sttp; + @Schema(description = "站类编码") + private String sttpCode; + @Schema(description = "经度") private Double lgtd; diff --git a/backend/src/main/java/com/yfd/platform/env/zq/service/ZqMonitorService.java b/backend/src/main/java/com/yfd/platform/env/zq/service/ZqMonitorService.java index 221745e0..30caf16b 100644 --- a/backend/src/main/java/com/yfd/platform/env/zq/service/ZqMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/env/zq/service/ZqMonitorService.java @@ -1,8 +1,12 @@ package com.yfd.platform.env.zq.service; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.env.zq.entity.vo.ZqBaseInfoVo; public interface ZqMonitorService { + DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); + ZqBaseInfoVo getStcdInfo(String stcd); } diff --git a/backend/src/main/java/com/yfd/platform/env/zq/service/impl/ZqMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/zq/service/impl/ZqMonitorServiceImpl.java index 59a43405..27033f5f 100644 --- a/backend/src/main/java/com/yfd/platform/env/zq/service/impl/ZqMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/zq/service/impl/ZqMonitorServiceImpl.java @@ -1,13 +1,21 @@ package com.yfd.platform.env.zq.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceLoadOptionsBase; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.exception.BizException; import com.yfd.platform.env.zq.entity.vo.ZqBaseInfoVo; import com.yfd.platform.env.zq.service.ZqMonitorService; +import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -18,6 +26,81 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Override + public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + if (CollUtil.isEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildMsstbprptDetailSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM SD_RIVER_B_H t ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD ") + .append(" AND hbrv.BASEID = eng.BASE_ID ") + .append(" AND NVL(hbrv.IS_DELETED, 0) = 0 ") + .append(" AND NVL(hbrv.ENABLED, 1) = 1 ") + .append("LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD ") + .append("LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD ") + .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildMsstbprptFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildMsstbprptDetailOrderBySql(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, ZqBaseInfoVo.class); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + String groupField = "dtinType"; + String groupColumn = "t.DTIN_TYPE"; + String groupDir = "ASC"; + if (CollUtil.isNotEmpty(dataSourceRequest.getGroup())) { + DataSourceRequest.GroupDescriptor groupDescriptor = dataSourceRequest.getGroup().get(0); + if (groupDescriptor != null && StrUtil.isNotBlank(groupDescriptor.getField())) { + groupField = groupDescriptor.getField(); + String mappedColumn = mapMsstbprptColumn(groupField); + if (StrUtil.isNotBlank(mappedColumn)) { + groupColumn = mappedColumn; + } + if ("desc".equalsIgnoreCase(groupDescriptor.getDir()) || "des".equalsIgnoreCase(groupDescriptor.getDir())) { + groupDir = "DESC"; + } + } + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(groupColumn).append(" AS ").append(groupField.toUpperCase()).append(", ") + .append("COUNT(*) AS COUNT_").append(groupField.toUpperCase()).append(" ") + .append("FROM SD_RIVER_B_H t ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildMsstbprptFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append("GROUP BY ").append(groupColumn).append(" ") + .append("ORDER BY ").append(groupColumn).append(" ").append(groupDir); + + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + DataSourceResult result = new DataSourceResult(); + result.setData(toMsstbprptLegacyGroups(rows, groupField)); + result.setTotal((long) rows.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public ZqBaseInfoVo getStcdInfo(String stcd) { if (StrUtil.isBlank(stcd)) { @@ -92,4 +175,290 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { } return list.get(0); } + + private String buildMsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildMsstbprptLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildMsstbprptFilterCondition(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 buildMsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapMsstbprptColumn(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"; + } + if ("in".equals(operator)) { + List values = normalizeMsstbprptValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "zqMsstP" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + + String paramKey = "zqMsstP" + indexHolder[0]++; + switch (operator) { + case "eq": + paramMap.put(paramKey, value); + return column + " = #{map." + paramKey + "}"; + case "neq": + paramMap.put(paramKey, value); + return column + " <> #{map." + paramKey + "}"; + 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 + " > #{map." + paramKey + "}"; + case "gte": + paramMap.put(paramKey, value); + return column + " >= #{map." + paramKey + "}"; + case "lt": + paramMap.put(paramKey, value); + return column + " < #{map." + paramKey + "}"; + case "lte": + paramMap.put(paramKey, value); + return column + " <= #{map." + paramKey + "}"; + default: + return ""; + } + } + + private List normalizeMsstbprptValues(Object value) { + if (value == null) { + return new ArrayList<>(); + } + if (value instanceof List list) { + return new ArrayList<>(list); + } + String text = String.valueOf(value).trim(); + if (StrUtil.isBlank(text)) { + return new ArrayList<>(); + } + if (text.startsWith("[") && text.endsWith("]")) { + text = text.substring(1, text.length() - 1); + } + List values = new ArrayList<>(); + for (String item : text.split(",")) { + String trimmed = StrUtil.trim(item); + if (StrUtil.isNotBlank(trimmed)) { + values.add(StrUtil.removeAll(trimmed, "\"")); + } + } + return values; + } + + private String mapMsstbprptColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "isDeleted" -> "NVL(t.IS_DELETED, 0)"; + case "sttpCode" -> "t.STTP"; + case "mway" -> "t.MWAY"; + case "dtinType" -> "t.DTIN_TYPE"; + case "stcd" -> "t.STCD"; + case "stnm" -> "t.STNM"; + case "fhstcd" -> "t.FHSTCD"; + case "baseId" -> "eng.BASE_ID"; + case "dtin" -> "t.DTIN"; + case "rstcd" -> "t.RSTCD"; + default -> null; + }; + } + + private String buildMsstbprptDetailSelectSql(List selectFields) { + Map selectMap = new LinkedHashMap<>(); + selectMap.put("stcd", "t.STCD AS stcd"); + selectMap.put("stnm", "t.STNM AS stnm"); + selectMap.put("tm", "t.TM AS tm"); + selectMap.put("sttp", "t.STTP AS sttp"); + selectMap.put("sttpCode", "t.STTP AS sttpCode"); + selectMap.put("lgtd", "t.LGTD AS lgtd"); + selectMap.put("lttd", "t.LTTD AS lttd"); + selectMap.put("elev", "t.ELEV AS elev"); + selectMap.put("stlc", "t.STLC AS stlc"); + selectMap.put("jcdt", "t.JCDT AS jcdt"); + selectMap.put("wddt", "t.WDDT AS wddt"); + selectMap.put("bldsttCode", "t.BLDSTT_CODE AS bldsttCode"); + selectMap.put("bldsttCcodeName", "CASE WHEN t.BLDSTT_CODE IN ('1', '10', '11') THEN '已建' WHEN t.BLDSTT_CODE IN ('2', '7', '8') THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName"); + selectMap.put("introduce", "t.INTRODUCE AS introduce"); + selectMap.put("logo", "t.LOGO AS logo"); + selectMap.put("inffile", "t.INFFILE AS inffile"); + selectMap.put("usfl", "t.USFL AS usfl"); + selectMap.put("dtin", "t.DTIN AS dtin"); + selectMap.put("dtinSrc", "t.DTIN_SRC AS dtinSrc"); + selectMap.put("dtinType", "t.DTIN_TYPE AS dtinType"); + selectMap.put("dtinTm", "t.DTIN_TM AS dtinTm"); + selectMap.put("mway", "t.MWAY AS mway"); + selectMap.put("mwayName", "CASE NVL(t.MWAY, 0) WHEN 1 THEN '人工' WHEN 2 THEN '自动' ELSE '未知' END AS mwayName"); + selectMap.put("stindx", "t.STINDX AS stindx"); + selectMap.put("orderIndex", "t.ORDER_INDEX AS orderIndex"); + selectMap.put("dmstcd", "t.DMSTCD AS dmstcd"); + selectMap.put("rstcd", "t.RSTCD AS rstcd"); + selectMap.put("ennm", "eng.ENNM AS ennm"); + selectMap.put("baseId", "eng.BASE_ID AS baseId"); + selectMap.put("baseName", "hb.BASENAME AS baseName"); + selectMap.put("hbrvcd", "eng.HBRVCD AS hbrvcd"); + selectMap.put("hbrvcdName", "hbrv.HBRVNM AS hbrvcdName"); + selectMap.put("rvcd", "eng.RVCD AS rvcd"); + selectMap.put("rvcdName", "rv.RVNM AS rvcdName"); + selectMap.put("addvcd", "eng.ADDVCD AS addvcd"); + selectMap.put("addvcdName", "addv.ADDVNM AS addvcdName"); + selectMap.put("fhstcd", "t.FHSTCD AS fhstcd"); + selectMap.put("ispro", "t.ISPRO AS ispro"); + selectMap.put("project", "t.PROJECT AS project"); + selectMap.put("dtfrqcy", "t.DTFRQCY AS dtfrqcy"); + selectMap.put("remark", "t.REMARK AS remark"); + selectMap.put("vlsr", "t.VLSR AS vlsr"); + selectMap.put("vlsrTm", "t.VLSR_TM AS vlsrTm"); + selectMap.put("recordUser", "t.RECORD_USER AS recordUser"); + selectMap.put("recordTime", "t.RECORD_TIME AS recordTime"); + selectMap.put("modifyUser", "t.MODIFY_USER AS modifyUser"); + selectMap.put("modifyTime", "t.MODIFY_TIME AS modifyTime"); + selectMap.put("isDeleted", "t.IS_DELETED AS isDeleted"); + selectMap.put("deleteUser", "t.DELETE_USER AS deleteUser"); + selectMap.put("deleteTime", "t.DELETE_TIME AS deleteTime"); + + if (CollUtil.isEmpty(selectFields)) { + return String.join(", ", selectMap.values()); + } + + List actualColumns = new ArrayList<>(); + for (String selectField : selectFields) { + String column = selectMap.get(selectField); + if (StrUtil.isNotBlank(column)) { + actualColumns.add(column); + } + } + if (actualColumns.isEmpty()) { + actualColumns.addAll(selectMap.values()); + } + return String.join(", ", actualColumns); + } + + private List> toMsstbprptLegacyGroups(List> rows, String groupField) { + List> result = new ArrayList<>(); + if (rows == null) { + return result; + } + String upperField = groupField == null ? "DTINTYPE" : groupField.toUpperCase(); + String countField = "COUNT_" + upperField; + String aggregateKey = "count_" + groupField; + for (Map row : rows) { + Object key = row.get(upperField); + if (key == null) { + key = row.get(groupField); + } + Object countValue = row.get(countField); + if (countValue == null) { + countValue = row.get("count_" + upperField); + } + long count = 0L; + if (countValue instanceof Number number) { + count = number.longValue(); + } else if (countValue != null) { + count = Long.parseLong(String.valueOf(countValue)); + } + + Map item = new LinkedHashMap<>(); + item.put("key", key); + item.put("keyName", null); + item.put("keyExt", new HashMap<>()); + + Map detail = new LinkedHashMap<>(); + detail.put(upperField, key); + detail.put(countField, count); + item.put("items", List.of(detail)); + item.put("count", count); + item.put("summary", new Object[0]); + + Map aggregates = new LinkedHashMap<>(); + aggregates.put(aggregateKey, count); + item.put("aggregates", aggregates); + result.add(item); + } + return result; + } + + private String buildMsstbprptDetailOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY eng.BASE_ID ASC NULLS LAST, eng.HBRVCD ASC NULLS LAST, eng.ORDER_INDEX ASC NULLS LAST, t.ORDER_INDEX ASC NULLS LAST, t.STCD ASC "; + } + List orderColumns = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = switch (sortDescriptor.getField()) { + case "stcd" -> "t.STCD"; + case "stnm" -> "t.STNM"; + case "tm" -> "t.TM"; + case "sttp", "sttpCode" -> "t.STTP"; + case "jcdt" -> "t.JCDT"; + case "rstcd" -> "t.RSTCD"; + case "ennm" -> "eng.ENNM"; + case "baseId" -> "eng.BASE_ID"; + case "baseName" -> "hb.BASENAME"; + case "hbrvcd" -> "eng.HBRVCD"; + case "rvcd" -> "eng.RVCD"; + case "fhstcd" -> "t.FHSTCD"; + case "mway" -> "t.MWAY"; + case "dtin" -> "t.DTIN"; + case "dtinType" -> "t.DTIN_TYPE"; + case "orderIndex" -> "t.ORDER_INDEX"; + default -> null; + }; + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderColumns.add(column + " " + dir + " NULLS LAST"); + } + if (orderColumns.isEmpty()) { + return " ORDER BY eng.BASE_ID ASC NULLS LAST, eng.HBRVCD ASC NULLS LAST, eng.ORDER_INDEX ASC NULLS LAST, t.ORDER_INDEX ASC NULLS LAST, t.STCD ASC "; + } + return " ORDER BY " + String.join(", ", orderColumns); + } }