feat: 视频站AI设施锚点

This commit is contained in:
tangwei 2026-07-09 08:35:30 +08:00
parent 0c875782d0
commit ab084c2f7c
4 changed files with 283 additions and 0 deletions

View File

@ -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) {

View File

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

View File

@ -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<VdAiPointVo> getVdAiPointKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<VdRunDataVo> getRunDataKendoListCust(DataSourceRequest dataSourceRequest);
}

View File

@ -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<VdAiPointVo> 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<String, Object> 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<VdAiPointVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(
page, sql.toString(), paramMap, VdAiPointVo.class);
DataSourceResult<VdAiPointVo> result = new DataSourceResult<>();
result.setData(list);
result.setTotal(page != null ? page.getTotal() : list.size());
result.setAggregates(new HashMap<>());
return result;
}
@Override
public DataSourceResult<VdRunDataVo> 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<String> parseArrayLikeValues(String value) {
List<String> 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<String, Object> paramMap,
List<String> rstcdList) {
if (CollUtil.isEmpty(rstcdList)) {
return;
}
List<String> 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<Object> values, Object value) {
if (value == null) {
return;