From 2e69b3e73cf3a76dc31bc4e90872d12a5308ee4b Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 24 Jun 2026 08:51:54 +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=E7=9B=91=E6=B5=8B=E6=97=A5=E5=8E=86=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../warn/controller/WarnDataController.java | 6 + .../qgc_env/warn/service/WarnDataService.java | 2 + .../service/impl/WarnDataServiceImpl.java | 118 ++++++++++++++++++ 3 files changed, 126 insertions(+) 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 ce2ebc7d..9d29dd2e 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 @@ -57,6 +57,12 @@ public class WarnDataController { return ResponseResult.successData(warnDataService.getAiPfwRecordKendoListCust(dataSourceRequest)); } + @PostMapping("/ai/com/qgc/aiRecord/GetKendoListCust") + @Operation(summary = "全过程AI识别监测日历表") + public ResponseResult getAiRecordKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(warnDataService.getAiRecordKendoListCust(dataSourceRequest)); + } + @PostMapping("/alarmPoint/GetKendoListCust") @Operation(summary = "电站告警描点列表") public ResponseResult getAlarmPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { 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 4572615c..acc3b40b 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 @@ -26,5 +26,7 @@ public interface WarnDataService { List getAiPfwRecordKendoListCust(DataSourceRequest dataSourceRequest); + List getAiRecordKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getAlarmPointKendoListCust(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 75e9c8aa..8f5e190f 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 @@ -238,6 +238,23 @@ public class WarnDataServiceImpl implements WarnDataService { return list; } + @Override + public List getAiRecordKendoListCust(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 rstcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd"); + String stcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); + String type = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "type"); + + Map paramMap = new HashMap<>(); + String sql = buildAiRecordSql(baseId, parseAiTime(startTime), parseAiTime(endTime), parseAiCodes(rstcd), stcd, type, paramMap); + List list = microservicDynamicSQLMapper.getAllListWithResultType(sql, paramMap, AiRecordVo.class); + fillAiRecordStatus(list); + return list; + } + @Override public DataSourceResult getAlarmPointKendoListCust(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -370,6 +387,48 @@ public class WarnDataServiceImpl implements WarnDataService { return sql.toString(); } + private String buildAiRecordSql(String baseId, + Date startTime, + Date endTime, + List rstcdList, + String stcd, + String type, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT a.dt AS dt, b.cnt AS cnt ") + .append("FROM (") + .append("SELECT TO_CHAR(hb.TM, 'yyyy-MM-dd') AS dt ") + .append("FROM SD_AIHEARTBEAT_R hb ") + .append("INNER JOIN SD_AIMONITOR_B_H ai ON ai.STCD = hb.STCD ") + .append("WHERE NVL(hb.IS_DELETED, 0) = 0 ") + .append("AND NVL(ai.IS_DELETED, 0) = 0 ") + .append("AND ai.STTP LIKE 'AI_%' "); + appendAiRecordFilterSql(sql, "aiRecordHeartbeat", "ai", "hb", baseId, startTime, endTime, rstcdList, stcd, type, paramMap); + sql.append("GROUP BY TO_CHAR(hb.TM, 'yyyy-MM-dd') ") + .append("UNION ") + .append("SELECT TO_CHAR(rec.TM, 'yyyy-MM-dd') AS dt ") + .append("FROM SD_AICOM_R rec ") + .append("INNER JOIN SD_AIMONITOR_B_H ai ON ai.STCD = rec.STCD ") + .append("WHERE NVL(rec.IS_DELETED, 0) = 0 ") + .append("AND NVL(ai.IS_DELETED, 0) = 0 ") + .append("AND ai.STTP LIKE 'AI_%' "); + appendAiRecordFilterSql(sql, "aiRecordAicomDate", "ai", "rec", baseId, startTime, endTime, rstcdList, stcd, type, paramMap); + sql.append("GROUP BY TO_CHAR(rec.TM, 'yyyy-MM-dd') ") + .append(") a ") + .append("LEFT JOIN (") + .append("SELECT TO_CHAR(rec.TM, 'yyyy-MM-dd') AS dt, COUNT(1) AS cnt ") + .append("FROM SD_AICOM_R rec ") + .append("INNER JOIN SD_AIMONITOR_B_H ai ON ai.STCD = rec.STCD ") + .append("WHERE NVL(rec.IS_DELETED, 0) = 0 ") + .append("AND NVL(ai.IS_DELETED, 0) = 0 ") + .append("AND ai.STTP LIKE 'AI_%' "); + appendAiRecordFilterSql(sql, "aiRecordAicomCnt", "ai", "rec", baseId, startTime, endTime, rstcdList, stcd, type, paramMap); + sql.append("GROUP BY TO_CHAR(rec.TM, 'yyyy-MM-dd') ") + .append(") b ON a.dt = b.dt ") + .append("ORDER BY a.dt"); + return sql.toString(); + } + private String buildAlarmPointBaseSql() { return "SELECT " + "eng.STCD AS stcd, " + @@ -533,6 +592,48 @@ public class WarnDataServiceImpl implements WarnDataService { } } + private void appendAiRecordFilterSql(StringBuilder sql, + String keyPrefix, + String aiAlias, + String recordAlias, + String baseId, + Date startTime, + Date endTime, + List rstcdList, + String stcd, + String type, + 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 (StrUtil.isNotBlank(stcd)) { + paramMap.put(keyPrefix + "Stcd", stcd.trim()); + sql.append("AND ").append(aiAlias).append(".STCD = #{map.").append(keyPrefix).append("Stcd} "); + } + if (StrUtil.isNotBlank(type)) { + paramMap.put(keyPrefix + "Type", type.trim()); + sql.append("AND ").append(aiAlias).append(".STTP = #{map.").append(keyPrefix).append("Type} "); + } + if (CollUtil.isNotEmpty(rstcdList)) { + List placeholders = new ArrayList<>(); + for (int i = 0; i < rstcdList.size(); i++) { + String key = keyPrefix + "Rstcd" + i; + paramMap.put(key, rstcdList.get(i)); + placeholders.add("#{map." + key + "}"); + } + sql.append("AND ").append(aiAlias).append(".RSTCD IN (").append(String.join(", ", placeholders)).append(") "); + } + 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 Map buildAlarmPointYearRange(String yearText) { Date endTime = new Date(); String currentYear = String.valueOf(DateUtil.year(endTime)); @@ -720,6 +821,23 @@ public class WarnDataServiceImpl implements WarnDataService { } } + private void fillAiRecordStatus(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + for (AiRecordVo item : list) { + if (item == null) { + continue; + } + if (item.getCnt() != null) { + item.setStatus(3); + } else { + item.setStatus(4); + } + item.setStatusName(resolveAiStatusName(item.getStatus())); + } + } + private String resolveAiStatusName(Integer status) { if (status == null) { return null;