feat: 全过程AI识别大坝运行

This commit is contained in:
tangwei 2026-06-23 16:18:21 +08:00
parent 144e04e3b6
commit 1d8ff03d7d
4 changed files with 183 additions and 2 deletions

View File

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

View File

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

View File

@ -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<EngWarnCountVo> getEngWarnCount(DataSourceRequest dataSourceRequest);
AiDmRunVo getAiDmRunCount(DataSourceRequest dataSourceRequest);
}

View File

@ -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<String, Object> paramMap = new HashMap<>();
String sql = buildAiDmRunSql(baseId, parseAiTime(startTime), parseAiTime(endTime), parseAiCodes(rstcd), stnm, paramMap);
Map<String, Object> 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<String, Object> 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<String> rstcdList,
String stnm,
Map<String, Object> 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<String> 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<EngWarnCountVo> 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<String> 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<String> 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<String, Object> 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<String, Object> paramMap,
int[] indexHolder) {