From ab084c2f7ce73b9655f3b62a089b0799038cf4b7 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 9 Jul 2026 08:35:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=A7=86=E9=A2=91=E7=AB=99AI=E8=AE=BE?= =?UTF-8?q?=E6=96=BD=E9=94=9A=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vd/controller/VdMonitorController.java | 6 + .../qgc_env/vd/entity/vo/VdAiPointVo.java | 107 +++++++++++ .../qgc_env/vd/service/VdMonitorService.java | 3 + .../vd/service/impl/VdMonitorServiceImpl.java | 167 ++++++++++++++++++ 4 files changed, 283 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/vd/entity/vo/VdAiPointVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vd/controller/VdMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/vd/controller/VdMonitorController.java index 1c37e616..01866639 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vd/controller/VdMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vd/controller/VdMonitorController.java @@ -65,6 +65,12 @@ public class VdMonitorController { return ResponseResult.successData(vdMonitorService.getVdPointKendoListCust(dataSourceRequest)); } + @PostMapping("/aiPoint/GetKendoListCust") + @Operation(summary = "视频站AI设施锚点") + public ResponseResult getVdAiPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(vdMonitorService.getVdAiPointKendoListCust(dataSourceRequest)); + } + @PostMapping("/runData/GetKendoListCust") @Operation(summary = "查询视频监控运行数据") public ResponseResult getRunDataKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vd/entity/vo/VdAiPointVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/vd/entity/vo/VdAiPointVo.java new file mode 100644 index 00000000..714d7795 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vd/entity/vo/VdAiPointVo.java @@ -0,0 +1,107 @@ +package com.yfd.platform.qgc_env.vd.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@Schema(description = "视频站AI设施锚点信息") +public class VdAiPointVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "锚点状态") + private String anchoPointState; + + @Schema(description = "地图站类标识") + private String sttpMap; + + @Schema(description = "锚点站类") + private String sttp; + + @Schema(description = "视频站编码") + private String stcd; + + @Schema(description = "视频站名称") + private String stnm; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "行政区编码") + private String addvcd; + + @Schema(description = "流域名称") + private String rvnm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "所属电站编码") + private String rstcds; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "高程") + private BigDecimal dtmel; + + @Schema(description = "标题") + private String titleName; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "站类名称") + private String sttpName; + + @Schema(description = "站点排序") + private Integer siteStepSort; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "栖息地编码") + private String fhstcd; + + @Schema(description = "栖息地名称") + private String fhstnm; + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "基地流域名称") + private String hbrvcdName; + + @Schema(description = "播放地址") + private String url; + + @Schema(description = "站址") + private String stlc; + + @Schema(description = "AI是否启用") + private Integer aiEnabled; + + @Schema(description = "AI外部站码") + private String aiExtCode; + + @Schema(description = "AI外部站名") + private String aiExtName; + + @Schema(description = "AI频率") + private String aiFrequency; + + @Schema(description = "AI站类编码") + private String aiSttpCode; + + @Schema(description = "AI站类名称") + private String aiSttpName; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/VdMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/VdMonitorService.java index 490bd6b7..17424077 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/VdMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/VdMonitorService.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.vd.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.vd.entity.vo.VdAiPointVo; import com.yfd.platform.qgc_env.vd.entity.vo.VdTreeNodeVo; import com.yfd.platform.qgc_env.vd.entity.vo.VdRunDataVo; import com.yfd.platform.qgc_env.vd.entity.vo.VdVmsstbprptVo; @@ -20,5 +21,7 @@ public interface VdMonitorService { DataSourceResult getVdPointKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getVdAiPointKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getRunDataKendoListCust(DataSourceRequest dataSourceRequest); } 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 0a674c47..b403fe41 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 @@ -9,6 +9,7 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.qgc_env.vd.entity.vo.VdAiPointVo; import com.yfd.platform.qgc_env.vd.entity.vo.VdPointVo; import com.yfd.platform.qgc_env.vd.entity.vo.VdRunDataVo; import com.yfd.platform.qgc_env.vd.entity.vo.VdTreeNodeVo; @@ -229,6 +230,72 @@ public class VdMonitorServiceImpl implements VdMonitorService { return queryVdPointDetailList(dataSourceRequest, loadOptions); } + @Override + public DataSourceResult getVdAiPointKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + String baseId = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); + String rstcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd"); + String hbrvcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "hbrvcd"); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("t.stcd AS stcd, ") + .append("t.stnm AS stnm, ") + .append("t.anchoPointState AS anchoPointState, ") + .append("t.sttpMap AS sttpMap, ") + .append("t.sttp AS sttp, ") + .append("t.lgtd AS lgtd, ") + .append("t.lttd AS lttd, ") + .append("t.rvcd AS rvcd, ") + .append("t.addvcd AS addvcd, ") + .append("t.rvnm AS rvnm, ") + .append("t.baseId AS baseId, ") + .append("t.rstcds AS rstcds, ") + .append("t.rstcd AS rstcd, ") + .append("t.dtmel AS dtmel, ") + .append("t.titleName AS titleName, ") + .append("t.ennm AS ennm, ") + .append("t.sttpName AS sttpName, ") + .append("t.siteStepSort AS siteStepSort, ") + .append("t.sttpCode AS sttpCode, ") + .append("t.fhstcd AS fhstcd, ") + .append("t.fhstnm AS fhstnm, ") + .append("t.hbrvcd AS hbrvcd, ") + .append("t.hbrvcdName AS hbrvcdName, ") + .append("t.url AS url, ") + .append("t.stlc AS stlc, ") + .append("t.aiEnabled AS aiEnabled, ") + .append("t.aiExtCode AS aiExtCode, ") + .append("t.aiExtName AS aiExtName, ") + .append("t.aiFrequency AS aiFrequency, ") + .append("t.aiSttpCode AS aiSttpCode, ") + .append("t.aiSttpName AS aiSttpName ") + .append("FROM (") + .append(buildVdAiPointCoreSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("vdAiBaseId", baseId); + sql.append(" AND t.baseId = #{map.vdAiBaseId} "); + } + if (StrUtil.isNotBlank(hbrvcd)) { + paramMap.put("vdAiHbrvcd", hbrvcd); + sql.append(" AND t.hbrvcd = #{map.vdAiHbrvcd} "); + } + appendVdAiRstcdCondition(sql, paramMap, parseArrayLikeValues(rstcd)); + sql.append(" ORDER BY t.siteStepSort ASC NULLS LAST, t.stcd ASC"); + + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, sql.toString(), paramMap, VdAiPointVo.class); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getRunDataKendoListCust(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -703,6 +770,68 @@ public class VdMonitorServiceImpl implements VdMonitorService { " AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 "; } + private String buildVdAiPointCoreSql() { + return "SELECT " + + "src.STCD AS stcd, " + + "src.STNM AS stnm, " + + "'aispjk' AS anchoPointState, " + + "'AIVD' AS sttpMap, " + + "src.STTP AS sttp, " + + "src.LGTD AS lgtd, " + + "src.LTTD AS lttd, " + + "NVL(eng.RVCD, src.RVCD) AS rvcd, " + + "NVL(eng.ADDVCD, src.ADDVCD) AS addvcd, " + + "rv.RVNM AS rvnm, " + + "NVL(eng.BASE_ID, src.BASE_ID) AS baseId, " + + "src.RSTCD AS rstcds, " + + "src.RSTCD AS rstcd, " + + "src.ELEV AS dtmel, " + + "src.STNM AS titleName, " + + "eng.ENNM AS ennm, " + + "vdSttp.STTP_NAME AS sttpName, " + + "NVL(siteSort.SORT, 999999) AS siteStepSort, " + + "'AIVD' AS sttpCode, " + + "src.FHSTCD AS fhstcd, " + + "fh.STNM AS fhstnm, " + + "NVL(eng.HBRVCD, src.HBRVCD) AS hbrvcd, " + + "hbrv.HBRVNM AS hbrvcdName, " + + "src.URL AS url, " + + "src.STLC AS stlc, " + + "src.AI_ENABLED AS aiEnabled, " + + "src.AI_EXT_CODE AS aiExtCode, " + + "src.AI_EXT_NAME AS aiExtName, " + + "src.AI_FREQUENCY AS aiFrequency, " + + "(SELECT LISTAGG(ai.STTP, ',') WITHIN GROUP (ORDER BY ai.STTP) " + + " FROM SD_AIMONITOR_B_H ai " + + " WHERE NVL(ai.IS_DELETED, 0) = 0 " + + " AND ai.STTP LIKE 'AI_%' " + + " AND INSTR(',' || src.AI_EXT_CODE || ',', ',' || ai.STCD || ',') > 0) AS aiSttpCode, " + + "(SELECT LISTAGG(sttp.STTP_NAME, ',') WITHIN GROUP (ORDER BY ai.STTP) " + + " FROM SD_AIMONITOR_B_H ai " + + " LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = ai.STTP " + + " AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 " + + " WHERE NVL(ai.IS_DELETED, 0) = 0 " + + " AND ai.STTP LIKE 'AI_%' " + + " AND INSTR(',' || src.AI_EXT_CODE || ',', ',' || ai.STCD || ',') > 0) AS aiSttpName " + + "FROM SD_VDINFO_B src " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = src.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_FHBT_B_H fh ON fh.STCD = src.FHSTCD AND NVL(fh.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = NVL(eng.RVCD, src.RVCD) " + + "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = NVL(eng.HBRVCD, src.HBRVCD) " + + " AND hbrv.BASEID = NVL(eng.BASE_ID, src.BASE_ID) " + + " AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1 " + + "LEFT JOIN SD_STTP_B vdSttp ON vdSttp.STTP_CODE = src.STTP " + + " AND NVL(vdSttp.IS_DELETED, 0) = 0 AND NVL(vdSttp.ENABLE, 1) = 1 " + + "LEFT JOIN (SELECT det.SORT, cfg.RVCD, det.STCD FROM MS_ALONGDET_B det " + + "INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID " + + "WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common') siteSort " + + "ON siteSort.RVCD = NVL(eng.HBRVCD, src.HBRVCD) AND siteSort.STCD = src.STCD " + + "WHERE src.STTP LIKE 'VD%' " + + "AND src.AI_EXT_CODE IS NOT NULL " + + "AND src.LGTD IS NOT NULL " + + "AND src.LTTD IS NOT NULL "; + } + private String buildRunDataCoreSql() { return "SELECT " + "run.ID AS id, " + @@ -1183,6 +1312,44 @@ public class VdMonitorServiceImpl implements VdMonitorService { return values; } + private List parseArrayLikeValues(String value) { + List values = new ArrayList<>(); + if (StrUtil.isBlank(value)) { + return values; + } + String trimmed = value.trim(); + if (trimmed.startsWith("[") && trimmed.endsWith("]")) { + trimmed = trimmed.substring(1, trimmed.length() - 1); + } + if (StrUtil.isBlank(trimmed)) { + return values; + } + for (String item : trimmed.split(",")) { + String normalized = StrUtil.trim(item.replace("\"", "").replace("'", "")); + if (StrUtil.isNotBlank(normalized)) { + values.add(normalized); + } + } + return values; + } + + private void appendVdAiRstcdCondition(StringBuilder sql, + Map paramMap, + List rstcdList) { + if (CollUtil.isEmpty(rstcdList)) { + return; + } + List placeholders = new ArrayList<>(); + for (int i = 0; i < rstcdList.size(); i++) { + String key = "vdAiRstcd" + i; + paramMap.put(key, rstcdList.get(i)); + placeholders.add("#{map." + key + "}"); + } + sql.append(" AND t.rstcds IN (") + .append(String.join(", ", placeholders)) + .append(") "); + } + private void appendNormalizedValues(List values, Object value) { if (value == null) { return;