From f03bb3f3dd3a2b8b6d42612d1ece9de72ce0ff9c Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 1 Jun 2026 09:06:32 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=86=E9=A2=91=E7=9B=91=E6=8E=A7?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=88=86=E9=A1=B5=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_env/vd/entity/vo/VdVmsstbprptVo.java | 107 ++++++++ .../vd/service/impl/VdMonitorServiceImpl.java | 231 ++++++++++++++---- 2 files changed, 291 insertions(+), 47 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vd/entity/vo/VdVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/vd/entity/vo/VdVmsstbprptVo.java index 70783d4a..620e7996 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vd/entity/vo/VdVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vd/entity/vo/VdVmsstbprptVo.java @@ -4,6 +4,8 @@ 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 = "视频监控设备分组统计") @@ -22,4 +24,109 @@ public class VdVmsstbprptVo implements Serializable { @Schema(description = "站类数量") private Integer countSttpCode; + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "监控类型") + private String mntp; + + @Schema(description = "站类名称") + private String sttpName; + + @Schema(description = "站类全路径") + private String sttpFullPath; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "行政区编码") + private String addvcd; + + @Schema(description = "站址") + private String stlc; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "高程") + private BigDecimal elev; + + @Schema(description = "建成日期") + private Date jcdt; + + @Schema(description = "撤站日期") + private Date wddt; + + @Schema(description = "数据是否接入") + private Integer dtin; + + @Schema(description = "数据是否接入中文") + private String dtinName; + + @Schema(description = "是否启用") + private Integer usfl; + + @Schema(description = "建设状态分类") + private Integer bldsttCcode; + + @Schema(description = "建设状态中文") + private String bldsttCcodeName; + + @Schema(description = "监测指标") + private String stindx; + + @Schema(description = "简介") + private String introduce; + + @Schema(description = "LOGO") + private String logo; + + @Schema(description = "介绍附件") + private String inffile; + + @Schema(description = "监测频次") + private Integer dtfrqcy; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "数据来源") + private String vlsr; + + @Schema(description = "数据来源时间") + private Date vlsrTm; + + @Schema(description = "基地排序") + private Integer baseStepSort; + + @Schema(description = "电站排序") + private Integer rstcdStepSort; + + @Schema(description = "站点排序") + private Integer siteStepSort; + + @Schema(description = "来源表") + private String sourceTable; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java index eafc9041..f92db482 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.vd.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; @@ -10,6 +11,7 @@ import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.qgc_env.vd.entity.vo.VdVmsstbprptVo; import com.yfd.platform.qgc_env.vd.service.VdMonitorService; +import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; @@ -29,64 +31,165 @@ public class VdMonitorServiceImpl implements VdMonitorService { public DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); GroupingInfo[] groups = loadOptions == null ? null : loadOptions.getGroup(); - - StringBuilder sql = new StringBuilder(); - sql.append("SELECT t.STTP_CODE AS sttpCode, COUNT(1) AS COUNT_STTPCODE ") - .append("FROM (") - .append(buildUnionBaseSql()) - .append(") t ") - .append("WHERE 1 = 1 "); - Map paramMap = new HashMap<>(); String filterSql = buildFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); + + if (groups != null && groups.length > 0) { + return buildGroupedResult(dataSourceRequest, groups, filterSql, paramMap); + } + + return buildDetailResult(dataSourceRequest, loadOptions, filterSql, paramMap); + } + + private DataSourceResult buildGroupedResult(DataSourceRequest dataSourceRequest, + GroupingInfo[] groups, + String filterSql, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT t.sttpCode AS sttpCode, COUNT(1) AS count_sttpCode ") + .append("FROM (") + .append(buildVmsstbprptViewSql()) + .append(") t ") + .append("WHERE 1 = 1 "); if (StrUtil.isNotBlank(filterSql)) { sql.append(" AND ").append(filterSql).append(" "); } - sql.append(" GROUP BY t.STTP_CODE "); + sql.append(" GROUP BY t.sttpCode "); sql.append(buildOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getGroup())); List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); DataSourceResult result = new DataSourceResult<>(); - if (groups != null && groups.length > 0) { - if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { - result.setData((List) (List) new GroupHelper().faltGroup(rows, Arrays.asList(groups))); - result.setTotal((long) rows.size()); - } else { - result.setData((List) (List) new GroupHelper().group(rows, Arrays.asList(groups))); - result.setTotal((long) rows.size()); - } + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List) new GroupHelper().faltGroup(rows, Arrays.asList(groups))); + result.setTotal((long) rows.size()); } else { - List data = new ArrayList<>(); - for (Map row : rows) { - VdVmsstbprptVo vo = new VdVmsstbprptVo(); - Object sttpCode = row.get("STTPCODE"); - Object count = row.get("COUNT_STTPCODE"); - vo.setSttpCode(sttpCode == null ? null : sttpCode.toString()); - vo.setSttpCodeValue(sttpCode == null ? null : sttpCode.toString()); - vo.setSttpCodeExt(null); - vo.setCountSttpCode(count == null ? 0 : Integer.parseInt(count.toString())); - data.add(vo); - } - result.setData(data); - result.setTotal((long) data.size()); + result.setData((List) (List) new GroupHelper().group(rows, Arrays.asList(groups))); + result.setTotal((long) rows.size()); } result.setAggregates(new HashMap<>()); return result; } - private String buildUnionBaseSql() { - return "SELECT vd.STCD, vd.STTP AS STTP_CODE, sttp.STTP_NAME, sttp.FULL_PATH " + - "FROM SD_VDINFO_B vd " + - "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = vd.STTP " + - " AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 " + - "WHERE NVL(vd.USFL, 1) = 1 AND vd.STTP = 'VD_FP' " + + private DataSourceResult buildDetailResult(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions, + String filterSql, + Map paramMap) { + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("t.stcd AS stcd, ") + .append("t.stnm AS stnm, ") + .append("t.mntp AS mntp, ") + .append("t.sttpCode AS sttpCode, ") + .append("t.sttpName AS sttpName, ") + .append("t.sttpFullPath AS sttpFullPath, ") + .append("t.rstcd AS rstcd, ") + .append("t.ennm AS ennm, ") + .append("t.baseId AS baseId, ") + .append("t.baseName AS baseName, ") + .append("t.hbrvcd AS hbrvcd, ") + .append("t.rvcd AS rvcd, ") + .append("t.addvcd AS addvcd, ") + .append("t.stlc AS stlc, ") + .append("t.lgtd AS lgtd, ") + .append("t.lttd AS lttd, ") + .append("t.elev AS elev, ") + .append("t.jcdt AS jcdt, ") + .append("t.wddt AS wddt, ") + .append("t.dtin AS dtin, ") + .append("CASE WHEN NVL(t.dtin, 0) = 1 THEN '已接入' ELSE '未接入' END AS dtinName, ") + .append("t.usfl AS usfl, ") + .append("t.bldsttCcode AS bldsttCcode, ") + .append("CASE ") + .append("WHEN t.bldsttCcode IN (1, 10, 11) THEN '已建' ") + .append("WHEN t.bldsttCcode IN (2, 7, 8) THEN '在建' ") + .append("ELSE '未建/规划' END AS bldsttCcodeName, ") + .append("t.stindx AS stindx, ") + .append("t.introduce AS introduce, ") + .append("t.logo AS logo, ") + .append("t.inffile AS inffile, ") + .append("t.dtfrqcy AS dtfrqcy, ") + .append("t.remark AS remark, ") + .append("t.vlsr AS vlsr, ") + .append("t.vlsrTm AS vlsrTm, ") + .append("t.baseStepSort AS baseStepSort, ") + .append("t.rstcdStepSort AS rstcdStepSort, ") + .append("t.siteStepSort AS siteStepSort, ") + .append("t.sourceTable AS sourceTable ") + .append("FROM (") + .append(buildVmsstbprptViewSql()) + .append(") t WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildDetailOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, sql.toString(), paramMap, VdVmsstbprptVo.class); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildVmsstbprptViewSql() { + return "SELECT " + + "src.STCD AS stcd, " + + "src.STNM AS stnm, " + + "src.MNTP AS mntp, " + + "src.STTP AS sttpCode, " + + "sttp.STTP_NAME AS sttpName, " + + "sttp.FULL_PATH AS sttpFullPath, " + + "src.RSTCD AS rstcd, " + + "eng.ENNM AS ennm, " + + "NVL(eng.BASE_ID, src.BASE_ID) AS baseId, " + + "hb.BASENAME AS baseName, " + + "NVL(eng.HBRVCD, src.HBRVCD) AS hbrvcd, " + + "NVL(eng.RVCD, src.RVCD) AS rvcd, " + + "NVL(eng.ADDVCD, src.ADDVCD) AS addvcd, " + + "src.STLC AS stlc, " + + "src.LGTD AS lgtd, " + + "src.LTTD AS lttd, " + + "src.ELEV AS elev, " + + "src.JCDT AS jcdt, " + + "src.WDDT AS wddt, " + + "src.DTIN AS dtin, " + + "src.USFL AS usfl, " + + "src.BLDSTT_CODE AS bldsttCcode, " + + "src.STINDX AS stindx, " + + "src.INTRODUCE AS introduce, " + + "src.LOGO AS logo, " + + "src.INFFILE AS inffile, " + + "src.DTFRQCY AS dtfrqcy, " + + "src.REMARK AS remark, " + + "src.VLSR AS vlsr, " + + "src.VLSR_TM AS vlsrTm, " + + "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " + + "NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, " + + "NVL(src.ORDER_INDEX, 999999) AS siteStepSort, " + + "src.SOURCE_TABLE AS sourceTable " + + "FROM (" + + "SELECT vd.STCD, vd.STNM, vd.MNTP, vd.STTP, vd.LGTD, vd.LTTD, vd.ELEV, vd.STLC, " + + " vd.JCDT, vd.WDDT, vd.BLDSTT_CODE, vd.USFL, vd.DTIN, vd.STINDX, vd.RSTCD, vd.BASE_ID, " + + " vd.HBRVCD, vd.RVCD, vd.ADDVCD, CAST(NULL AS VARCHAR2(3000)) AS INTRODUCE, " + + " CAST(NULL AS VARCHAR2(255)) AS LOGO, CAST(NULL AS VARCHAR2(1000)) AS INFFILE, " + + " vd.DTFRQCY, vd.REMARK, vd.VLSR, vd.VLSR_TM, CAST(NULL AS NUMBER(8,0)) AS ORDER_INDEX, " + + " 'SD_VDINFO_B' AS SOURCE_TABLE " + + "FROM SD_VDINFO_B vd WHERE vd.STTP = 'VD_FP' " + "UNION ALL " + - "SELECT sonar.STCD, sonar.STTP AS STTP_CODE, sttp.STTP_NAME, sttp.FULL_PATH " + - "FROM SD_SONAR_B_H sonar " + - "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = sonar.STTP " + - " AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 " + - "WHERE NVL(sonar.IS_DELETED, 0) = 0 AND sonar.STTP IN ('VD_WVD', 'VD_SN') "; + "SELECT sonar.STCD, sonar.STNM, sonar.MNTP, sonar.STTP, sonar.LGTD, sonar.LTTD, sonar.ELEV, sonar.STLC, " + + " sonar.JCDT, sonar.WDDT, sonar.BLDSTT_CODE, sonar.USFL, sonar.DTIN, sonar.STINDX, sonar.RSTCD, sonar.BASE_ID, " + + " sonar.HBRVCD, sonar.RVCD, sonar.ADDVCD, sonar.INTRODUCE, sonar.LOGO, sonar.INFFILE, " + + " sonar.DTFRQCY, sonar.REMARK, sonar.VLSR, sonar.VLSR_TM, sonar.ORDER_INDEX, " + + " 'SD_SONAR_B_H' AS SOURCE_TABLE " + + "FROM SD_SONAR_B_H sonar WHERE NVL(sonar.IS_DELETED, 0) = 0 AND sonar.STTP IN ('VD_WVD', 'VD_SN') " + + ") src " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = src.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = src.STTP " + + " AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 "; } private String buildFilterCondition(DataSourceRequest.FilterDescriptor filter, @@ -201,17 +304,29 @@ public class VdMonitorServiceImpl implements VdMonitorService { return null; } return switch (field) { - case "sttpCode" -> "t.STTP_CODE"; - case "sttpName" -> "t.STTP_NAME"; - case "sttpFullPath" -> "t.FULL_PATH"; - case "stcd" -> "t.STCD"; + case "sttpCode" -> "t.sttpCode"; + case "sttpName" -> "t.sttpName"; + case "sttpFullPath" -> "t.sttpFullPath"; + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "rstcd" -> "t.rstcd"; + case "ennm" -> "t.ennm"; + case "baseId" -> "t.baseId"; + case "baseName" -> "t.baseName"; + case "hbrvcd" -> "t.hbrvcd"; + case "rvcd" -> "t.rvcd"; + case "addvcd" -> "t.addvcd"; + case "dtin" -> "t.dtin"; + case "usfl" -> "t.usfl"; + case "bldsttCcode" -> "t.bldsttCcode"; + case "sourceTable" -> "t.sourceTable"; default -> null; }; } private String buildOrderBySql(List groups) { if (CollUtil.isEmpty(groups)) { - return " ORDER BY t.STTP_CODE ASC"; + return " ORDER BY t.sttpCode ASC"; } List orderItems = new ArrayList<>(); for (DataSourceRequest.GroupDescriptor group : groups) { @@ -226,7 +341,29 @@ public class VdMonitorServiceImpl implements VdMonitorService { orderItems.add(column + " " + direction); } if (orderItems.isEmpty()) { - return " ORDER BY t.STTP_CODE ASC"; + return " ORDER BY t.sttpCode ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + + private String buildDetailOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY t.baseStepSort ASC, t.rstcdStepSort ASC, t.siteStepSort ASC, t.stcd ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sortList) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction); + } + if (orderItems.isEmpty()) { + return " ORDER BY t.baseStepSort ASC, t.rstcdStepSort ASC, t.siteStepSort ASC, t.stcd ASC"; } return " ORDER BY " + String.join(", ", orderItems); }