From 2fbdb0cdef90fe1f93d5f4852dce87d145674f6d Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 23 Jun 2026 17:54:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=85=A8=E8=BF=87=E7=A8=8BAI=E8=AF=86?= =?UTF-8?q?=E5=88=AB=E6=9C=89=E6=95=B0=E6=8D=AE=E7=9A=84=E7=94=B5=E7=AB=99?= =?UTF-8?q?=E4=B8=8B=E6=8B=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../warn/controller/WarnDataController.java | 6 ++ .../qgc_env/warn/entity/vo/AiRstcdVo.java | 15 +++ .../qgc_env/warn/service/WarnDataService.java | 3 + .../service/impl/WarnDataServiceImpl.java | 102 ++++++++++++++++++ 4 files changed, 126 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/vo/AiRstcdVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java index b1f22d02..223aa53d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java @@ -44,4 +44,10 @@ public class WarnDataController { public ResponseResult getAiComKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(warnDataService.getAiComKendoListCust(dataSourceRequest)); } + + @PostMapping("/ai/com/qgc/aiRstcd/GetKendoListCust") + @Operation(summary = "全过程AI识别有数据的电站下拉") + public ResponseResult getAiRstcdListKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(warnDataService.getAiRstcdListKendoListCust(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/vo/AiRstcdVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/vo/AiRstcdVo.java new file mode 100644 index 00000000..46c0ca88 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/vo/AiRstcdVo.java @@ -0,0 +1,15 @@ +package com.yfd.platform.qgc_env.warn.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "全过程AI识别电站下拉") +public class AiRstcdVo { + + @Schema(description = "电站编码") + private String stcd; + + @Schema(description = "电站名称") + private String stnm; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java index e6a5e4b7..fd640f6f 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java @@ -5,6 +5,7 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.warn.entity.vo.AiProtectVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiDmRunVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiComListVo; +import com.yfd.platform.qgc_env.warn.entity.vo.AiRstcdVo; import com.yfd.platform.qgc_env.warn.entity.vo.EngWarnCountVo; public interface WarnDataService { @@ -16,4 +17,6 @@ public interface WarnDataService { AiProtectVo getAiProtectCount(DataSourceRequest dataSourceRequest); DataSourceResult getAiComKendoListCust(DataSourceRequest dataSourceRequest); + + DataSourceResult getAiRstcdListKendoListCust(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java index 47ecb5be..d454814d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java @@ -13,6 +13,8 @@ import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.qgc_env.warn.entity.vo.AiComListVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiDmRunVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiProtectVo; +import com.yfd.platform.qgc_env.warn.entity.vo.AiProtectVo; +import com.yfd.platform.qgc_env.warn.entity.vo.AiRstcdVo; import com.yfd.platform.qgc_env.warn.entity.vo.EngWarnCountVo; import com.yfd.platform.qgc_env.warn.service.WarnDataService; import com.yfd.platform.utils.QgcQueryWrapperUtil; @@ -200,6 +202,25 @@ public class WarnDataServiceImpl implements WarnDataService { return result; } + @Override + public DataSourceResult getAiRstcdListKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String baseId = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); + String startTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime"); + String endTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime"); + String type = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "type"); + + Map paramMap = new HashMap<>(); + String sql = buildAiRstcdListSql(baseId, parseAiTime(startTime), parseAiTime(endTime), type, paramMap); + List list = microservicDynamicSQLMapper.getAllListWithResultType(sql, paramMap, AiRstcdVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + private AiDmRunVo buildAiDmRunVo(Map row) { if (row == null || row.isEmpty()) { return null; @@ -211,6 +232,87 @@ public class WarnDataServiceImpl implements WarnDataService { return vo; } + private String buildAiRstcdListSql(String baseId, + Date startTime, + Date endTime, + String type, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT DISTINCT t.stcd AS stcd, t.stnm AS stnm FROM ("); + sql.append("SELECT ai.RSTCD AS stcd, eng.ENNM AS stnm ") + .append("FROM SD_AIMONITOR_B_H ai ") + .append("INNER JOIN SD_AICOM_R rec ON ai.STCD = rec.STCD ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = ai.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(ai.IS_DELETED, 0) = 0 ") + .append("AND NVL(rec.IS_DELETED, 0) = 0 ") + .append("AND ai.STTP LIKE 'AI_%' ") + .append("AND ai.RSTCD IS NOT NULL "); + appendAiRstcdCommonFilterSql(sql, "aiRstcdAicom", "ai", "rec", baseId, startTime, endTime, paramMap); + appendAiRstcdTypeFilterSql(sql, "aiRstcdType", "rec.TYPE", type, paramMap); + sql.append(" UNION "); + sql.append("SELECT ai.RSTCD AS stcd, eng.ENNM AS stnm ") + .append("FROM SD_AIMONITOR_B_H ai ") + .append("INNER JOIN SD_AIHEARTBEAT_R hb ON ai.STCD = hb.STCD ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = ai.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(ai.IS_DELETED, 0) = 0 ") + .append("AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("AND ai.STTP LIKE 'AI_%' ") + .append("AND ai.RSTCD IS NOT NULL "); + appendAiRstcdCommonFilterSql(sql, "aiRstcdHeartbeat", "ai", "hb", baseId, startTime, endTime, paramMap); + appendAiRstcdHeartbeatTypeFilterSql(sql, type, paramMap); + sql.append(") t ORDER BY t.stnm, t.stcd"); + return sql.toString(); + } + + private void appendAiRstcdCommonFilterSql(StringBuilder sql, + String keyPrefix, + String aiAlias, + String recordAlias, + String baseId, + Date startTime, + Date endTime, + Map paramMap) { + if (StrUtil.isNotBlank(baseId)) { + paramMap.put(keyPrefix + "BaseId", baseId.trim()); + sql.append("AND ").append(aiAlias).append(".BASE_ID = #{map.").append(keyPrefix).append("BaseId} "); + } + if (startTime != null) { + paramMap.put(keyPrefix + "StartTime", startTime); + sql.append("AND ").append(recordAlias).append(".TM >= #{map.").append(keyPrefix).append("StartTime} "); + } + if (endTime != null) { + paramMap.put(keyPrefix + "EndTime", endTime); + sql.append("AND ").append(recordAlias).append(".TM <= #{map.").append(keyPrefix).append("EndTime} "); + } + } + + private void appendAiRstcdTypeFilterSql(StringBuilder sql, + String keyPrefix, + String typeColumn, + String type, + Map paramMap) { + if (StrUtil.isBlank(type)) { + return; + } + paramMap.put(keyPrefix, type.trim()); + sql.append("AND ").append(typeColumn).append(" = #{map.").append(keyPrefix).append("} "); + } + + private void appendAiRstcdHeartbeatTypeFilterSql(StringBuilder sql, + String type, + Map paramMap) { + if (StrUtil.isBlank(type)) { + return; + } + String normalizedType = type.trim(); + if ("AI_5011".equalsIgnoreCase(normalizedType)) { + paramMap.put("aiRstcdHeartbeatType", "AI_5001"); + } else { + paramMap.put("aiRstcdHeartbeatType", normalizedType); + } + sql.append("AND ai.STTP = #{map.aiRstcdHeartbeatType} "); + } + private AiProtectVo buildAiProtectVo(Map row) { if (row == null || row.isEmpty()) { return null;