fix: 视频监控设备分页查询

This commit is contained in:
tangwei 2026-06-01 09:06:32 +08:00
parent 7d230273e8
commit f03bb3f3dd
2 changed files with 291 additions and 47 deletions

View File

@ -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;
}

View File

@ -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<VdVmsstbprptVo> 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<String, Object> 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<VdVmsstbprptVo> buildGroupedResult(DataSourceRequest dataSourceRequest,
GroupingInfo[] groups,
String filterSql,
Map<String, Object> 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<Map<String, Object>> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap);
DataSourceResult<VdVmsstbprptVo> result = new DataSourceResult<>();
if (groups != null && groups.length > 0) {
if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) {
result.setData((List<VdVmsstbprptVo>) (List<?>) new GroupHelper().faltGroup(rows, Arrays.asList(groups)));
result.setTotal((long) rows.size());
} else {
result.setData((List<VdVmsstbprptVo>) (List<?>) new GroupHelper().group(rows, Arrays.asList(groups)));
result.setTotal((long) rows.size());
}
if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) {
result.setData((List<VdVmsstbprptVo>) (List<?>) new GroupHelper().faltGroup(rows, Arrays.asList(groups)));
result.setTotal((long) rows.size());
} else {
List<VdVmsstbprptVo> data = new ArrayList<>();
for (Map<String, Object> 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<VdVmsstbprptVo>) (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<VdVmsstbprptVo> buildDetailResult(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions,
String filterSql,
Map<String, Object> 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<VdVmsstbprptVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(
page, sql.toString(), paramMap, VdVmsstbprptVo.class);
DataSourceResult<VdVmsstbprptVo> 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<DataSourceRequest.GroupDescriptor> groups) {
if (CollUtil.isEmpty(groups)) {
return " ORDER BY t.STTP_CODE ASC";
return " ORDER BY t.sttpCode ASC";
}
List<String> 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<DataSourceRequest.SortDescriptor> sortList) {
if (CollUtil.isEmpty(sortList)) {
return " ORDER BY t.baseStepSort ASC, t.rstcdStepSort ASC, t.siteStepSort ASC, t.stcd ASC";
}
List<String> 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);
}