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 5fce9628..bb9adeb2 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 @@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/warn/stcd") +@RequestMapping("/warn") @Tag(name = "告警状态模块") @Validated public class WarnDataController { @@ -21,9 +21,15 @@ public class WarnDataController { @Resource private WarnDataService warnDataService; - @PostMapping("/eng/GetKendoListCust") + @PostMapping("/stcd/eng/GetKendoListCust") @Operation(summary = "电站水位、生态流量告警状态统计") public ResponseResult getEngWarnCount(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(warnDataService.getEngWarnCount(dataSourceRequest)); } + + @PostMapping("/ai/com/qgcDmRun/GetKendoListCust") + @Operation(summary = "全过程AI识别大坝运行") + public ResponseResult getAiDmRunCount(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(warnDataService.getAiDmRunCount(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/vo/AiDmRunVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/vo/AiDmRunVo.java new file mode 100644 index 00000000..ac5671e7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/vo/AiDmRunVo.java @@ -0,0 +1,18 @@ +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 AiDmRunVo { + + @Schema(description = "漂浮物监测次数") + private Integer pfwCnt; + + @Schema(description = "漂浮物清理次数") + private Integer pfwqlCnt; + + @Schema(description = "叠梁门运行次数") + private Integer dlmCnt; +} 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 b809eaf6..3c1a3a10 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 @@ -2,9 +2,12 @@ package com.yfd.platform.qgc_env.warn.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.warn.entity.vo.AiDmRunVo; import com.yfd.platform.qgc_env.warn.entity.vo.EngWarnCountVo; public interface WarnDataService { DataSourceResult getEngWarnCount(DataSourceRequest dataSourceRequest); + + AiDmRunVo getAiDmRunCount(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 e5f94b32..30227e9d 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 @@ -1,12 +1,14 @@ package com.yfd.platform.qgc_env.warn.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; 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; import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.qgc_env.warn.entity.vo.AiDmRunVo; 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; @@ -14,6 +16,7 @@ import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -60,6 +63,45 @@ public class WarnDataServiceImpl implements WarnDataService { return result; } + @Override + public AiDmRunVo getAiDmRunCount(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 stnm = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stnm"); + + Map paramMap = new HashMap<>(); + String sql = buildAiDmRunSql(baseId, parseAiTime(startTime), parseAiTime(endTime), parseAiCodes(rstcd), stnm, paramMap); + Map row = microservicDynamicSQLMapper.getOneBySql(sql, paramMap); + AiDmRunVo vo = buildAiDmRunVo(row); + if (vo == null) { + vo = new AiDmRunVo(); + } + if (vo.getPfwCnt() == null) { + vo.setPfwCnt(0); + } + if (vo.getPfwqlCnt() == null) { + vo.setPfwqlCnt(0); + } + if (vo.getDlmCnt() == null) { + vo.setDlmCnt(0); + } + return vo; + } + + private AiDmRunVo buildAiDmRunVo(Map row) { + if (row == null || row.isEmpty()) { + return null; + } + AiDmRunVo vo = new AiDmRunVo(); + vo.setPfwCnt(toIntegerValue(firstPresentValue(row, "PFWCNT", "pfwCnt"))); + vo.setPfwqlCnt(toIntegerValue(firstPresentValue(row, "PFWQLCNT", "pfwqlCnt"))); + vo.setDlmCnt(toIntegerValue(firstPresentValue(row, "DLMCNT", "dlmCnt"))); + return vo; + } + private String buildEngWarnCountSql(String filterSql) { String normalizedWarnStateExpr = "CASE " + "WHEN t.WARN_STATE = '0' OR t.WARN_STATE IS NULL OR t.WARN_STATE = '' THEN '00' " + @@ -94,6 +136,52 @@ public class WarnDataServiceImpl implements WarnDataService { return sql.toString(); } + private String buildAiDmRunSql(String baseId, + Date startTime, + Date endTime, + List rstcdList, + String stnm, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("NVL(SUM(CASE WHEN rec.TYPE = 'AI_5001' THEN 1 ELSE 0 END), 0) AS pfwCnt, ") + .append("NVL(SUM(CASE WHEN rec.TYPE = 'AI_5011' THEN 1 ELSE 0 END), 0) AS pfwqlCnt, ") + .append("NVL(SUM(CASE WHEN rec.TYPE = 'AI_5005' THEN 1 ELSE 0 END), 0) AS dlmCnt ") + .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 rec.TYPE IN ('AI_5001', 'AI_5011', 'AI_5005') "); + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("aiBaseId", baseId.trim()); + sql.append("AND ai.BASE_ID = #{map.aiBaseId} "); + } + if (startTime != null) { + paramMap.put("aiStartTime", startTime); + sql.append("AND rec.TM >= #{map.aiStartTime} "); + } + if (endTime != null) { + paramMap.put("aiEndTime", endTime); + sql.append("AND rec.TM <= #{map.aiEndTime} "); + } + if (CollUtil.isNotEmpty(rstcdList)) { + List placeholders = new ArrayList<>(); + for (int i = 0; i < rstcdList.size(); i++) { + String key = "aiRstcd" + i; + paramMap.put(key, rstcdList.get(i)); + placeholders.add("#{map." + key + "}"); + } + sql.append("AND ai.RSTCD IN (").append(String.join(", ", placeholders)).append(") "); + } + if (StrUtil.isNotBlank(stnm)) { + paramMap.put("aiEnnm", "%" + stnm.trim() + "%"); + sql.append("AND eng.ENNM LIKE #{map.aiEnnm} "); + } + return sql.toString(); + } + private void fillWarnNames(List list) { if (CollUtil.isEmpty(list)) { return; @@ -129,6 +217,72 @@ public class WarnDataServiceImpl implements WarnDataService { return null; } + private Date parseAiTime(String timeText) { + if (StrUtil.isBlank(timeText)) { + return null; + } + String value = timeText.trim(); + if (value.length() <= 10) { + return DateUtil.parse(value, "yyyy-MM-dd"); + } + return DateUtil.parse(value, "yyyy-MM-dd HH:mm:ss"); + } + + private List parseAiCodes(String codeText) { + if (StrUtil.isBlank(codeText)) { + return new ArrayList<>(); + } + String normalized = codeText.replace("[", "") + .replace("]", "") + .replace("\"", "") + .trim(); + if (StrUtil.isBlank(normalized)) { + return new ArrayList<>(); + } + List result = new ArrayList<>(); + for (String item : normalized.split(",")) { + String code = StrUtil.trim(item); + if (StrUtil.isNotBlank(code)) { + result.add(code); + } + } + return result; + } + + private Object firstPresentValue(Map row, String... keys) { + if (row == null || keys == null) { + return null; + } + for (String key : keys) { + if (row.containsKey(key)) { + return row.get(key); + } + } + return null; + } + + private Integer toIntegerValue(Object value) { + if (value == null) { + return null; + } + if (value instanceof Number number) { + return number.intValue(); + } + String text = String.valueOf(value).trim(); + if (StrUtil.isBlank(text)) { + return null; + } + try { + return Integer.parseInt(text); + } catch (NumberFormatException ex) { + try { + return Double.valueOf(text).intValue(); + } catch (NumberFormatException ignore) { + return null; + } + } + } + private String buildSourceFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) {