feat: 全过程AI识别动植物保护

This commit is contained in:
tangwei 2026-06-23 16:59:50 +08:00
parent 99dbc6502f
commit 5f6038db51
5 changed files with 212 additions and 11 deletions

View File

@ -64,14 +64,14 @@ public class SwaggerConfig {
@Bean
public GroupedOpenApi groupEnvWTApi() {
return GroupedOpenApi.builder()
.group("3.1 全过程-生态环保数据服务-水温监测")
.group("3.1 全过程-生态环保数据服务-水温监测(wt)")
.packagesToScan("com.yfd.platform.qgc_env.wt.controller")
.build();
}
@Bean
public GroupedOpenApi groupEnvWQApi() {
return GroupedOpenApi.builder()
.group("3.2 全过程-生态环保数据服务-水质监测")
.group("3.2 全过程-生态环保数据服务-水质监测(wq)")
.packagesToScan("com.yfd.platform.qgc_env.wq.controller")
.build();
}
@ -79,7 +79,7 @@ public class SwaggerConfig {
@Bean
public GroupedOpenApi groupEnvFPApi() {
return GroupedOpenApi.builder()
.group("3.3 全过程-生态环保数据服务-过鱼设施")
.group("3.3 全过程-生态环保数据服务-过鱼设施(fp)")
.packagesToScan("com.yfd.platform.qgc_env.fp.controller")
.build();
}
@ -87,7 +87,7 @@ public class SwaggerConfig {
@Bean
public GroupedOpenApi groupEnvVDApi() {
return GroupedOpenApi.builder()
.group("3.3.1 全过程-生态环保数据服务-过鱼设施-过鱼监测(VD视频模块)")
.group("3.3.1 全过程-生态环保数据服务-过鱼设施-过鱼监测(vd视频模块)")
.packagesToScan("com.yfd.platform.qgc_env.vd.controller")
.build();
}
@ -97,7 +97,7 @@ public class SwaggerConfig {
@Bean
public GroupedOpenApi groupEnvFHApi() {
return GroupedOpenApi.builder()
.group("3.4 全过程-生态环保数据服务-栖息地")
.group("3.4 全过程-生态环保数据服务-栖息地(fh)")
.packagesToScan("com.yfd.platform.qgc_env.fh.controller")
.build();
}
@ -105,7 +105,7 @@ public class SwaggerConfig {
@Bean
public GroupedOpenApi groupEnvZQApi() {
return GroupedOpenApi.builder()
.group("3.4.1 全过程-生态环保数据服务-栖息地-水文模块")
.group("3.4.1 全过程-生态环保数据服务-栖息地-水文模块(zq)")
.packagesToScan("com.yfd.platform.qgc_env.zq.controller")
.build();
}
@ -114,7 +114,7 @@ public class SwaggerConfig {
@Bean
public GroupedOpenApi groupEnvVapApi() {
return GroupedOpenApi.builder()
.group("3.5 全过程-生态环保数据服务-珍稀动植物")
.group("3.5 全过程-生态环保数据服务-珍稀动植物(vap)")
.packagesToScan("com.yfd.platform.qgc_env.vap.controller")
.build();
}
@ -122,7 +122,7 @@ public class SwaggerConfig {
@Bean
public GroupedOpenApi groupEnvFprApi() {
return GroupedOpenApi.builder()
.group("3.6 全过程-生态环保数据服务-鱼类调查")
.group("3.6 全过程-生态环保数据服务-鱼类调查(fpr)")
.packagesToScan("com.yfd.platform.qgc_env.fpr.controller")
.build();
}
@ -130,7 +130,7 @@ public class SwaggerConfig {
@Bean
public GroupedOpenApi groupEnvFbApi() {
return GroupedOpenApi.builder()
.group("3.7 全过程-生态环保数据服务-增殖放流")
.group("3.7 全过程-生态环保数据服务-增殖放流(fb)")
.packagesToScan("com.yfd.platform.qgc_env.fb.controller")
.build();
}
@ -138,7 +138,7 @@ public class SwaggerConfig {
@Bean
public GroupedOpenApi groupEnvWarnApi() {
return GroupedOpenApi.builder()
.group("3.8 全过程-生态环保数据服务-智能告警")
.group("3.8 全过程-生态环保数据服务-智能告警(warn)")
.packagesToScan("com.yfd.platform.qgc_env.warn.controller")
.build();
}
@ -160,7 +160,7 @@ public class SwaggerConfig {
@Bean
public GroupedOpenApi groupEngEqApi() {
return GroupedOpenApi.builder()
.group("4.1. 全过程-常规水电数据服务-生态流量")
.group("4.1. 全过程-常规水电数据服务-生态流量(eq)")
.packagesToScan("com.yfd.platform.qgc_eng.eq.controller")
.build();
}

View File

@ -33,6 +33,12 @@ public class WarnDataController {
return ResponseResult.successData(warnDataService.getAiDmRunCount(dataSourceRequest));
}
@PostMapping("/ai/com/qgcProtect/GetKendoListCust")
@Operation(summary = "全过程AI识别动植物保护")
public ResponseResult getAiProtectCount(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(warnDataService.getAiProtectCount(dataSourceRequest));
}
@PostMapping("/ai/com/GetKendoListCust")
@Operation(summary = "AI常规业务列表")
public ResponseResult getAiComKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {

View File

@ -0,0 +1,30 @@
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 AiProtectVo {
@Schema(description = "运鱼船进出港次数")
private Integer fpYycCnt;
@Schema(description = "赶鱼栅运行次数")
private Integer fpGysCnt;
@Schema(description = "升鱼机运行次数")
private Integer fpSyjCnt;
@Schema(description = "AGV小车次数")
private Integer fpAgvCnt;
@Schema(description = "运鱼车运行次数")
private Integer fpYychCnt;
@Schema(description = "鱼道放流次数")
private Integer fpYdhCnt;
@Schema(description = "植物园养护次数")
private Integer vpYhCnt;
}

View File

@ -2,6 +2,7 @@ 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.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.EngWarnCountVo;
@ -12,5 +13,7 @@ public interface WarnDataService {
AiDmRunVo getAiDmRunCount(DataSourceRequest dataSourceRequest);
AiProtectVo getAiProtectCount(DataSourceRequest dataSourceRequest);
DataSourceResult<AiComListVo> getAiComKendoListCust(DataSourceRequest dataSourceRequest);
}

View File

@ -12,6 +12,7 @@ import com.yfd.platform.common.GroupingInfo;
import com.yfd.platform.common.MicroservicDynamicSQLMapper;
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.AiProtectVo;
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;
@ -95,6 +96,46 @@ public class WarnDataServiceImpl implements WarnDataService {
return vo;
}
@Override
public AiProtectVo getAiProtectCount(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 = buildAiProtectSql(baseId, parseAiTime(startTime), parseAiTime(endTime), parseAiCodes(rstcd), stnm, paramMap);
Map<String, Object> row = microservicDynamicSQLMapper.getOneBySql(sql, paramMap);
AiProtectVo vo = buildAiProtectVo(row);
if (vo == null) {
vo = new AiProtectVo();
}
if (vo.getFpYycCnt() == null) {
vo.setFpYycCnt(0);
}
if (vo.getFpGysCnt() == null) {
vo.setFpGysCnt(0);
}
if (vo.getFpSyjCnt() == null) {
vo.setFpSyjCnt(0);
}
if (vo.getFpAgvCnt() == null) {
vo.setFpAgvCnt(0);
}
if (vo.getFpYychCnt() == null) {
vo.setFpYychCnt(0);
}
if (vo.getFpYdhCnt() == null) {
vo.setFpYdhCnt(0);
}
if (vo.getVpYhCnt() == null) {
vo.setVpYhCnt(0);
}
return vo;
}
@Override
public DataSourceResult<AiComListVo> getAiComKendoListCust(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
@ -170,6 +211,21 @@ public class WarnDataServiceImpl implements WarnDataService {
return vo;
}
private AiProtectVo buildAiProtectVo(Map<String, Object> row) {
if (row == null || row.isEmpty()) {
return null;
}
AiProtectVo vo = new AiProtectVo();
vo.setFpYycCnt(toIntegerValue(firstPresentValue(row, "FPYYCCNT", "fpYycCnt")));
vo.setFpGysCnt(toIntegerValue(firstPresentValue(row, "FPGYSCNT", "fpGysCnt")));
vo.setFpSyjCnt(toIntegerValue(firstPresentValue(row, "FPSYJCNT", "fpSyjCnt")));
vo.setFpAgvCnt(toIntegerValue(firstPresentValue(row, "FPAGVCNT", "fpAgvCnt")));
vo.setFpYychCnt(toIntegerValue(firstPresentValue(row, "FPYYCHCNT", "fpYychCnt")));
vo.setFpYdhCnt(toIntegerValue(firstPresentValue(row, "FPYDHCNT", "fpYdhCnt")));
vo.setVpYhCnt(toIntegerValue(firstPresentValue(row, "VPYHCNT", "vpYhCnt")));
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' " +
@ -250,6 +306,112 @@ public class WarnDataServiceImpl implements WarnDataService {
return sql.toString();
}
private String buildAiProtectSql(String baseId,
Date startTime,
Date endTime,
List<String> rstcdList,
String stnm,
Map<String, Object> paramMap) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append("aiStat.fpYycCnt AS fpYycCnt, ")
.append("aiStat.fpGysCnt AS fpGysCnt, ")
.append("aiStat.fpSyjCnt AS fpSyjCnt, ")
.append("aiStat.fpAgvCnt AS fpAgvCnt, ")
.append("aiStat.fpYychCnt AS fpYychCnt, ")
.append("aiStat.fpYdhCnt AS fpYdhCnt, ")
.append("vpStat.vpYhCnt AS vpYhCnt ")
.append("FROM (")
.append("SELECT ")
.append("NVL(SUM(CASE WHEN rec.TYPE = 'AI_5003' THEN 1 ELSE 0 END), 0) AS fpYycCnt, ")
.append("NVL(SUM(CASE WHEN rec.TYPE = 'AI_5006' THEN 1 ELSE 0 END), 0) AS fpGysCnt, ")
.append("NVL(SUM(CASE WHEN rec.TYPE = 'AI_5007' THEN 1 ELSE 0 END), 0) AS fpSyjCnt, ")
.append("NVL(SUM(CASE WHEN rec.TYPE = 'AI_5008' THEN 1 ELSE 0 END), 0) AS fpAgvCnt, ")
.append("NVL(SUM(CASE WHEN rec.TYPE = 'AI_5002' THEN 1 ELSE 0 END), 0) AS fpYychCnt, ")
.append("NVL(SUM(CASE WHEN rec.TYPE = 'AI_5012' THEN 1 ELSE 0 END), 0) AS fpYdhCnt ")
.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_5003', 'AI_5006', 'AI_5007', 'AI_5008', 'AI_5002', 'AI_5012') ");
appendAiProtectCommonFilterSql(sql, baseId, startTime, endTime, rstcdList, stnm, paramMap);
sql.append(") aiStat, (")
.append("SELECT COUNT(1) AS vpYhCnt ")
.append("FROM SD_AIMONITOR_B_H vpAi ")
.append("INNER JOIN SD_AIVPWATER_R vpRec ON vpAi.STCD = vpRec.STCD ")
.append("WHERE NVL(vpAi.IS_DELETED, 0) = 0 ")
.append("AND NVL(vpRec.IS_DELETED, 0) = 0 ")
.append("AND vpAi.STTP = 'AI_VP_WATER' ");
appendAiProtectVpFilterSql(sql, baseId, startTime, endTime, rstcdList, paramMap);
sql.append(") vpStat");
return sql.toString();
}
private void appendAiProtectCommonFilterSql(StringBuilder sql,
String baseId,
Date startTime,
Date endTime,
List<String> rstcdList,
String stnm,
Map<String, Object> paramMap) {
if (StrUtil.isNotBlank(baseId)) {
paramMap.put("aiProtectBaseId", baseId.trim());
sql.append("AND ai.BASE_ID = #{map.aiProtectBaseId} ");
}
if (startTime != null) {
paramMap.put("aiProtectStartTime", startTime);
sql.append("AND rec.TM >= #{map.aiProtectStartTime} ");
}
if (endTime != null) {
paramMap.put("aiProtectEndTime", endTime);
sql.append("AND rec.TM <= #{map.aiProtectEndTime} ");
}
if (CollUtil.isNotEmpty(rstcdList)) {
List<String> placeholders = new ArrayList<>();
for (int i = 0; i < rstcdList.size(); i++) {
String key = "aiProtectRstcd" + 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("aiProtectEnnm", "%" + stnm.trim() + "%");
sql.append("AND eng.ENNM LIKE #{map.aiProtectEnnm} ");
}
}
private void appendAiProtectVpFilterSql(StringBuilder sql,
String baseId,
Date startTime,
Date endTime,
List<String> rstcdList,
Map<String, Object> paramMap) {
if (StrUtil.isNotBlank(baseId)) {
paramMap.put("aiProtectVpBaseId", baseId.trim());
sql.append("AND vpAi.BASE_ID = #{map.aiProtectVpBaseId} ");
}
if (startTime != null) {
paramMap.put("aiProtectVpStartTime", startTime);
sql.append("AND vpRec.TM >= #{map.aiProtectVpStartTime} ");
}
if (endTime != null) {
paramMap.put("aiProtectVpEndTime", endTime);
sql.append("AND vpRec.TM <= #{map.aiProtectVpEndTime} ");
}
if (CollUtil.isNotEmpty(rstcdList)) {
List<String> placeholders = new ArrayList<>();
for (int i = 0; i < rstcdList.size(); i++) {
String key = "aiProtectVpRstcd" + i;
paramMap.put(key, rstcdList.get(i));
placeholders.add("#{map." + key + "}");
}
sql.append("AND vpAi.RSTCD IN (").append(String.join(", ", placeholders)).append(") ");
}
}
private String buildAiComGroupSql(String detailSql, GroupingInfo[] groupInfos) {
if (groupInfos == null || groupInfos.length == 0) {
return detailSql;