feat: 全过程AI识别大坝运行
This commit is contained in:
parent
144e04e3b6
commit
1d8ff03d7d
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user