feat: 全过程AI识别监测日历表(文件)

This commit is contained in:
tangwei 2026-07-01 12:55:56 +08:00
parent 5a3fc371a6
commit 9ce9f273ea
4 changed files with 301 additions and 0 deletions

View File

@ -74,4 +74,10 @@ public class WarnDataController {
public ResponseResult getWarnStcdKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(warnDataService.getWarnStcdKendoListCust(dataSourceRequest));
}
@PostMapping("/ai/com/qgc/aiFile/GetKendoListCust")
@Operation(summary = "全过程AI识别监测日历表(文件)")
public ResponseResult getAiFileKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(warnDataService.getAiFileKendoListCust(dataSourceRequest));
}
}

View File

@ -0,0 +1,43 @@
package com.yfd.platform.qgc_env.warn.entity.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
/**
* AI文件列表VO - 全过程AI识别监测日历表(文件)
*
* @author Generated
* @since 2025-07-01
*/
@Data
public class AiFileVo {
private String stcd;
private String stnm;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date tm;
private String fid;
private String rstcd;
private String ennm;
private String stCode;
private String stName;
private Integer baseStepSort;
private Integer rvcdStepSort;
private Integer rstcdStepSort;
private Integer siteStepSort;
private Integer dataType;
}

View File

@ -8,6 +8,7 @@ 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.AiFileVo;
import com.yfd.platform.qgc_env.warn.entity.vo.EngWarnCountVo;
import com.yfd.platform.qgc_env.warn.entity.vo.StcdWarnStateVo;
@ -32,4 +33,6 @@ public interface WarnDataService {
DataSourceResult<AlarmPointVo> getAlarmPointKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<StcdWarnStateVo> getWarnStcdKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<AiFileVo> getAiFileKendoListCust(DataSourceRequest dataSourceRequest);
}

View File

@ -13,6 +13,7 @@ import com.yfd.platform.common.MicroservicDynamicSQLMapper;
import com.yfd.platform.qgc_env.warn.entity.vo.AlarmPointVo;
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.AiFileVo;
import com.yfd.platform.qgc_env.warn.entity.vo.AiProtectVo;
import com.yfd.platform.qgc_env.warn.entity.vo.AiRecordVo;
import com.yfd.platform.qgc_env.warn.entity.vo.AiRstcdVo;
@ -356,6 +357,254 @@ public class WarnDataServiceImpl implements WarnDataService {
return result;
}
@Override
public DataSourceResult<AiFileVo> getAiFileKendoListCust(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
String baseId = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId");
String tm = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "tm");
String rstcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd");
String stcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd");
String type = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "type");
String dataType = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "dataType");
Date startTime = null, endTime = null;
if (StrUtil.isNotBlank(tm)) {
String[] ll = tm.split(",");
if (ll.length == 2) {
startTime = DateUtil.parse(ll[0]);
endTime = DateUtil.parse(ll[1]);
if (startTime.after(endTime)) {
Date tmp = startTime;
startTime = endTime;
endTime = tmp;
}
}
}
if (StrUtil.isNotBlank(rstcd)) {
rstcd = rstcd.replace("[", "").replace("]", "").replaceAll("\"", "'");
}
Map<String, Object> paramMap = new HashMap<>();
StringBuilder sql = new StringBuilder();
sql.append("SELECT * FROM (");
sql.append(buildAiFileHeartbeatSql(baseId, type, rstcd, stcd, startTime, endTime, paramMap, "hb"));
sql.append(" UNION ");
sql.append(buildAiFileComSql(baseId, type, rstcd, stcd, startTime, endTime, paramMap, "ac"));
sql.append(") WHERE 1=1 ");
if (StrUtil.isNotBlank(dataType)) {
paramMap.put("dataType", Integer.parseInt(dataType));
sql.append("AND DATA_TYPE = #{map.dataType} ");
}
sql.append(buildAiFileOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()));
Page<?> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
List<AiFileVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(
page,
sql.toString(),
paramMap,
AiFileVo.class
);
DataSourceResult<AiFileVo> result = new DataSourceResult<>();
result.setData(list);
result.setTotal(page == null ? list.size() : page.getTotal());
result.setAggregates(new HashMap<>());
return result;
}
private String buildAiFileHeartbeatSql(String baseId, String type, String rstcd, String stcd,
Date startTime, Date endTime, Map<String, Object> paramMap, String keyPrefix) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append("a.STCD AS STCD, ")
.append("b.RSTCD AS RSTCD, ")
.append("eng.ENNM AS ENNM, ")
.append("b.STCD AS STCODE, ")
.append("b.STNM AS STNAME, ")
.append("hb.ORDER_INDEX AS BASESTEPSORT, ")
.append("along.ORDER_INDEX AS RVCDSTEPSORT, ")
.append("rstSort.SORT AS RSTCDSTEPSORT, ")
.append("siteSort.SORT AS SITESTEPSORT, ")
.append("b.STNM AS STNM, ")
.append("a.TM AS TM, ");
if (StrUtil.isNotBlank(type)) {
if ("AI_5001".equals(type) || "AI_50011".equals(type)) {
sql.append("3 AS DATA_TYPE, ");
} else {
sql.append("1 AS DATA_TYPE, ");
}
} else {
sql.append("1 AS DATA_TYPE, ");
}
sql.append("REGEXP_SUBSTR(a.FID, '[^,]+', 1, LEVEL) AS FID ");
sql.append("FROM SD_AIHEARTBEAT_R a ");
sql.append("INNER JOIN SD_AIMONITOR_B_H b ON a.STCD = b.STCD AND NVL(b.IS_DELETED, 0) = 0 AND b.STTP LIKE 'AI_%' ");
sql.append("LEFT JOIN SD_ENGINFO_B_H eng ON b.RSTCD = eng.STCD AND NVL(eng.IS_DELETED, 0) = 0 ");
sql.append("LEFT JOIN SD_HYDROBASE hb ON b.BASE_ID = hb.BASEID AND NVL(hb.IS_DELETED, 0) = 0 ");
sql.append("LEFT JOIN MS_ALONG_B along ON b.HBRVCD = along.RVCD AND along.CODE = 'common' AND NVL(along.IS_DELETED, 0) = 0 ");
sql.append("LEFT JOIN (SELECT det.SORT, cfg.RVCD, det.STCD FROM MS_ALONGDET_B det INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common') rstSort ON rstSort.RVCD = b.HBRVCD AND rstSort.STCD = b.RSTCD ");
sql.append("LEFT JOIN (SELECT det.SORT, cfg.RVCD, det.STCD FROM MS_ALONGDET_B det INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common') siteSort ON siteSort.RVCD = b.HBRVCD AND siteSort.STCD = b.STCD ");
sql.append("WHERE NVL(a.IS_DELETED, 0) = 0 ");
sql.append("AND a.FID NOT LIKE '%ORA-%' AND a.FID NOT LIKE '%Out%' ");
if (StrUtil.isNotBlank(type)) {
if ("AI_50011".equals(type)) {
sql.append("AND b.STTP = 'AI_5001' ");
} else {
sql.append("AND b.STTP = '").append(type).append("' ");
}
}
if (StrUtil.isNotBlank(baseId)) {
paramMap.put(keyPrefix + "BaseId", baseId);
sql.append("AND b.BASE_ID = #{map.").append(keyPrefix).append("BaseId} ");
}
if (StrUtil.isNotBlank(stcd)) {
paramMap.put(keyPrefix + "Stcd", stcd);
sql.append("AND b.STCD = #{map.").append(keyPrefix).append("Stcd} ");
}
if (StrUtil.isNotBlank(rstcd)) {
sql.append("AND b.RSTCD IN (").append(rstcd).append(") ");
}
if (startTime != null) {
paramMap.put(keyPrefix + "StartTime", startTime);
sql.append("AND a.TM >= #{map.").append(keyPrefix).append("StartTime} ");
}
if (endTime != null) {
paramMap.put(keyPrefix + "EndTime", endTime);
sql.append("AND a.TM <= #{map.").append(keyPrefix).append("EndTime} ");
}
sql.append("CONNECT BY REGEXP_SUBSTR(a.FID, '[^,]+', 1, LEVEL) IS NOT NULL ");
sql.append("AND PRIOR a.ID = a.ID ");
sql.append("AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL");
return sql.toString();
}
private String buildAiFileComSql(String baseId, String type, String rstcd, String stcd,
Date startTime, Date endTime, Map<String, Object> paramMap, String keyPrefix) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append("a.STCD AS STCD, ")
.append("b.RSTCD AS RSTCD, ")
.append("eng.ENNM AS ENNM, ")
.append("b.STCD AS STCODE, ")
.append("b.STNM AS STNAME, ")
.append("hb.ORDER_INDEX AS BASESTEPSORT, ")
.append("along.ORDER_INDEX AS RVCDSTEPSORT, ")
.append("rstSort.SORT AS RSTCDSTEPSORT, ")
.append("siteSort.SORT AS SITESTEPSORT, ")
.append("b.STNM AS STNM, ")
.append("a.TM AS TM, ");
if (StrUtil.isNotBlank(type)) {
if ("AI_5001".equals(type) || "AI_50011".equals(type)) {
sql.append("(CASE WHEN a.TYPE = 'AI_5001' AND (a.IS_BIG_DEBRIS_AREA IS NULL OR a.IS_BIG_DEBRIS_AREA = 0) THEN 4 WHEN a.TYPE = 'AI_5001' AND a.IS_BIG_DEBRIS_AREA > 0 THEN 5 END) AS DATA_TYPE, ");
} else {
sql.append("2 AS DATA_TYPE, ");
}
} else {
sql.append("2 AS DATA_TYPE, ");
}
sql.append("REGEXP_SUBSTR(a.FID, '[^,]+', 1, LEVEL) AS FID ");
sql.append("FROM SD_AICOM_R a ");
sql.append("INNER JOIN SD_AIMONITOR_B_H b ON a.STCD = b.STCD AND NVL(b.IS_DELETED, 0) = 0 AND b.STTP LIKE 'AI_%' ");
sql.append("LEFT JOIN SD_ENGINFO_B_H eng ON b.RSTCD = eng.STCD AND NVL(eng.IS_DELETED, 0) = 0 ");
sql.append("LEFT JOIN SD_HYDROBASE hb ON b.BASE_ID = hb.BASEID AND NVL(hb.IS_DELETED, 0) = 0 ");
sql.append("LEFT JOIN MS_ALONG_B along ON b.HBRVCD = along.RVCD AND along.CODE = 'common' AND NVL(along.IS_DELETED, 0) = 0 ");
sql.append("LEFT JOIN (SELECT det.SORT, cfg.RVCD, det.STCD FROM MS_ALONGDET_B det INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common') rstSort ON rstSort.RVCD = b.HBRVCD AND rstSort.STCD = b.RSTCD ");
sql.append("LEFT JOIN (SELECT det.SORT, cfg.RVCD, det.STCD FROM MS_ALONGDET_B det INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common') siteSort ON siteSort.RVCD = b.HBRVCD AND siteSort.STCD = b.STCD ");
sql.append("WHERE NVL(a.IS_DELETED, 0) = 0 ");
sql.append("AND (a.TASK_STATUS IS NULL OR a.TASK_STATUS = 'Approved') ");
sql.append("AND a.FID NOT LIKE '%ORA-%' AND a.FID NOT LIKE '%Out%' ");
if (StrUtil.isNotBlank(type)) {
if ("AI_50011".equals(type)) {
paramMap.put(keyPrefix + "Type", "AI_5001");
sql.append("AND a.TYPE = #{map.").append(keyPrefix).append("Type} ");
} else {
paramMap.put(keyPrefix + "Type", type);
sql.append("AND a.TYPE = #{map.").append(keyPrefix).append("Type} ");
}
}
if (StrUtil.isNotBlank(baseId)) {
paramMap.put(keyPrefix + "BaseId", baseId);
sql.append("AND b.BASE_ID = #{map.").append(keyPrefix).append("BaseId} ");
}
if (StrUtil.isNotBlank(stcd)) {
paramMap.put(keyPrefix + "Stcd", stcd);
sql.append("AND b.STCD = #{map.").append(keyPrefix).append("Stcd} ");
}
if (StrUtil.isNotBlank(rstcd)) {
sql.append("AND b.RSTCD IN (").append(rstcd).append(") ");
}
if (startTime != null) {
paramMap.put(keyPrefix + "StartTime", startTime);
sql.append("AND a.TM >= #{map.").append(keyPrefix).append("StartTime} ");
}
if (endTime != null) {
paramMap.put(keyPrefix + "EndTime", endTime);
sql.append("AND a.TM <= #{map.").append(keyPrefix).append("EndTime} ");
}
sql.append("CONNECT BY REGEXP_SUBSTR(a.FID, '[^,]+', 1, LEVEL) IS NOT NULL ");
sql.append("AND PRIOR a.ID = a.ID ");
sql.append("AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL");
return sql.toString();
}
private String buildAiFileOrderBySql(List<DataSourceRequest.SortDescriptor> sortList) {
if (CollUtil.isEmpty(sortList)) {
return " ORDER BY STCD, TM DESC ";
}
List<String> orderItems = new ArrayList<>();
for (DataSourceRequest.SortDescriptor item : sortList) {
if (item == null || StrUtil.isBlank(item.getField())) {
continue;
}
String column = mapAiFileColumn(item.getField());
if (StrUtil.isBlank(column)) {
continue;
}
String dir = "desc".equalsIgnoreCase(item.getDir()) ? "DESC" : "ASC";
orderItems.add(column + " " + dir);
}
if (orderItems.isEmpty()) {
return " ORDER BY STCD, TM DESC ";
}
return " ORDER BY " + String.join(", ", orderItems);
}
private String mapAiFileColumn(String field) {
if (StrUtil.isBlank(field)) {
return null;
}
return switch (field) {
case "stcd" -> "STCD";
case "stnm" -> "STNM";
case "tm" -> "TM";
case "fid" -> "FID";
case "rstcd" -> "RSTCD";
case "ennm" -> "ENNM";
case "stCode" -> "STCODE";
case "stName" -> "STNAME";
case "baseStepSort" -> "BASESTEPSORT";
case "rvcdStepSort" -> "RVCDSTEPSORT";
case "rstcdStepSort" -> "RSTCDSTEPSORT";
case "siteStepSort" -> "SITESTEPSORT";
case "dataType" -> "DATA_TYPE";
default -> null;
};
}
private AiDmRunVo buildAiDmRunVo(Map<String, Object> row) {
if (row == null || row.isEmpty()) {
return null;