diff --git a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java index 73f92660..2b33fea4 100644 --- a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java @@ -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(); } 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 493d28d1..b1f22d02 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 @@ -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) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/vo/AiProtectVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/vo/AiProtectVo.java new file mode 100644 index 00000000..3a81096e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/vo/AiProtectVo.java @@ -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; +} 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 f371d4bb..e6a5e4b7 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,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 getAiComKendoListCust(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 7616b699..47ecb5be 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 @@ -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 paramMap = new HashMap<>(); + String sql = buildAiProtectSql(baseId, parseAiTime(startTime), parseAiTime(endTime), parseAiCodes(rstcd), stnm, paramMap); + Map 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 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 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 rstcdList, + String stnm, + Map 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 rstcdList, + String stnm, + Map 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 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 rstcdList, + Map 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 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;