From 1fe6607dbf33bcb4772b570568e75ff69f702d92 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 29 Jun 2026 18:59:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=8E=AF=E4=BF=9D=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E7=9B=91=E6=B5=8B=E5=BC=80=E5=B1=95=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wte/controller/WeFishController.java | 6 + .../wte/entity/vo/WeEnvmAutoMonitorVo.java | 27 + .../qgc_env/wte/service/WeFishService.java | 3 + .../wte/service/impl/WeFishServiceImpl.java | 620 ++++++++++++++++++ 4 files changed, 656 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeEnvmAutoMonitorVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index 45dc5d14..716ffbc5 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -75,6 +75,12 @@ public class WeFishController { return ResponseResult.successData(weFishService.getWeCompareBarList(dataSourceRequest)); } + @PostMapping("/base/evnmAutoMonitor/GetKendoListCust") + @Operation(summary = "环保自动监测开展情况") + public ResponseResult getEnvmAutoMonitorList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getEnvmAutoMonitorList(dataSourceRequest)); + } + @PostMapping("/we/fisht/year/qgc/GetKendoListCust") @Operation(summary = "全过程沿程鱼类变化情况有数据的流域和年份") public ResponseResult getQgcFishStaticsYearList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeEnvmAutoMonitorVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeEnvmAutoMonitorVo.java new file mode 100644 index 00000000..e84210c8 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeEnvmAutoMonitorVo.java @@ -0,0 +1,27 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "环保自动监测开展情况") +public class WeEnvmAutoMonitorVo { + + @Schema(description = "数量") + private Integer cnt; + + @Schema(description = "功能序号") + private Integer orderInx; + + @Schema(description = "功能序号名称") + private String orderInxName; + + @Schema(description = "类型路径") + private String sttpFullPath; + + @Schema(description = "站点类型") + private String sttpCode; + + @Schema(description = "站点类型名称") + private String sttpName; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index 0b2d6114..45baa4e9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -5,6 +5,7 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishListQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishListStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeCompareBarTableVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeEnvmAutoMonitorVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishDetailVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeMsstbprptVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishPointQgcVo; @@ -41,6 +42,8 @@ public interface WeFishService { DataSourceResult getWeCompareBarList(DataSourceRequest dataSourceRequest); + DataSourceResult getEnvmAutoMonitorList(DataSourceRequest dataSourceRequest); + DataSourceResult>> getQgcFishStaticsYearList(DataSourceRequest dataSourceRequest); DataSourceResult getQgcWeFishStatics(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java index 2ecc469c..f316b217 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java @@ -13,6 +13,7 @@ import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.qgc_env.wte.entity.vo.WeCompareBarHeadColumnVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeCompareBarTableVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeCompareBarVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeEnvmAutoMonitorVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishListQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishListStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishDetailVo; @@ -478,6 +479,135 @@ public class WeFishServiceImpl implements WeFishService { return result; } + @Override + public DataSourceResult getEnvmAutoMonitorList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + DataSourceRequest.FilterDescriptor filter = dataSourceRequest == null ? null : dataSourceRequest.getFilter(); + + String baseId = resolveWeFishStringFilterValue(dataSourceRequest, loadOptions, "baseId"); + Date startTime = toDateValue(resolveWeFishStringFilterValue(dataSourceRequest, loadOptions, "startTime")); + Date endTime = toDateValue(resolveWeFishStringFilterValue(dataSourceRequest, loadOptions, "endTime")); + if (startTime == null || endTime == null) { + startTime = null; + endTime = null; + } + + List rstcds = getWeFishFilterTexts(filter, "rstcd"); + List hbrvcds = getWeFishFilterTexts(filter, "hbrvcd"); + List rvcds = getWeFishFilterTexts(filter, "rvcd"); + List showIds = getWeFishFilterTexts(filter, "showIds"); + boolean ignoreFhRstcd = shouldIgnoreWeEnvmFhRstcd(rstcds); + + List rows = new ArrayList<>(); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmWtSql(baseId, rstcds)), + 1, null, "ENV,ENVM,WT,", "水温监测" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmGjWqSql(baseId, hbrvcds, rvcds)), + 2, "WQ", "ENV,ENVM,WQ,", "国家水质站" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmZjWqSql(baseId, rstcds)), + 3, "WQ", "ENV,ENVM,WQ,", "水质监测" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmStGjSql(baseId)), + 5, null, "ST,ZQ-ST,ZZ", "国家水文站" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmStZjSql(baseId, rstcds)), + 6, null, "ST,ZQ-ST,ZZ", "水文监测" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmEngQecSql(baseId, rstcds)), + 7, "ENG", "ENG", "生态流量" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmVdSql(baseId, rstcds)), + 8, null, "VD,VD", "视频监控" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmRiverWqSql(baseId, rstcds)), + 9, "WQ", "ENV,ENVM,WQ,", "河道水质监测" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmFbWqSql(baseId, rstcds)), + 10, "WQFB", "ENV,ENVM,WQFB,", "增殖站水质站" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmFhSql(baseId, rstcds, ignoreFhRstcd)), + 11, "FH", "ENV,ENVP,FH,", "栖息地" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmFhWqSql(baseId, rstcds, ignoreFhRstcd)), + 12, "WQ", "ENV,ENVM,WQ,", "栖息地水质监测" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmFhWtSql(baseId, rstcds, ignoreFhRstcd)), + 13, "WTRV", "ENV,ENVM,WT,WTRV,", "栖息地水温监测" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmFhStSql(baseId, rstcds, ignoreFhRstcd)), + 14, null, "ST,ZQ-ST,ZZ", "水文监测" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmWeSql(baseId, rstcds)), + 15, "WE", "ENV,ENVM,WE,", "水生态调查断面" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmWvaSql(baseId, rstcds, hbrvcds)), + 16, "WVA", "ENV,ENVM,WVA,", "野生动物监测" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmVdEqsSql(baseId, rstcds)), + 17, "VD_EQS", "VD,VD_EQS,", "生态流量视频站" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmRareFishSql(baseId, rstcds, startTime, endTime)), + 18, null, "WE_FISH", "土著珍稀鱼类" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmTeAnimalsSql()), + 20, "TE_ANIMALS", "TE_ANIMALS", "重点陆生动物" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmRgWqSql(baseId, rstcds)), + 21, "WQ", "ENV,ENVM,WQ,", "人工水质监测" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmWeFishStaticsSql(baseId, rstcds, startTime, endTime)), + 22, "WE", "WE_FISH_ST", "调查鱼类统计" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmFpStaticsSql(baseId, rstcds)), + 23, "FP", "ENV,ENVP,FP,", "过鱼设施" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmVdYljSql(baseId, rstcds)), + 24, null, "VD,VD", "视频监控" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmAiSql(baseId, rstcds, hbrvcds)), + 25, "AI", "AI,AI_", "AI盒子" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmWtrvSql(baseId, rstcds)), + 26, null, "ENV,ENVM,WT,", "表层水温监测" + )); + rows.add(buildWeEnvmAutoMonitorVo( + queryWeEnvmAutoMonitorCount(buildWeEnvmWtvtSql(baseId, rstcds)), + 27, null, "ENV,ENVM,WT,", "垂向水温监测" + )); + + List finalRows = reorderWeEnvmAutoMonitorRows(rows, showIds); + DataSourceResult result = new DataSourceResult<>(); + result.setData(finalRows); + result.setTotal((long) finalRows.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult>> getQgcFishStaticsYearList(DataSourceRequest dataSourceRequest) { Map paramMap = new HashMap<>(); @@ -3695,6 +3825,496 @@ public class WeFishServiceImpl implements WeFishService { } } + private WeEnvmAutoMonitorVo buildWeEnvmAutoMonitorVo(Integer cnt, + Integer orderInx, + String sttpCode, + String sttpFullPath, + String sttpName) { + WeEnvmAutoMonitorVo vo = new WeEnvmAutoMonitorVo(); + vo.setCnt(cnt == null ? 0 : cnt); + vo.setOrderInx(orderInx); + vo.setOrderInxName(sttpName); + vo.setSttpCode(sttpCode); + vo.setSttpFullPath(sttpFullPath); + vo.setSttpName(sttpName); + return vo; + } + + private List reorderWeEnvmAutoMonitorRows(List rows, List showIds) { + if (CollUtil.isEmpty(rows)) { + return new ArrayList<>(); + } + LinkedHashMap rowMap = new LinkedHashMap<>(); + for (WeEnvmAutoMonitorVo row : rows) { + if (row != null && row.getOrderInx() != null) { + rowMap.put(String.valueOf(row.getOrderInx()), row); + } + } + List result = new ArrayList<>(); + if (CollUtil.isNotEmpty(showIds)) { + for (String showId : showIds) { + WeEnvmAutoMonitorVo row = rowMap.get(showId); + if (row != null) { + result.add(row); + } + } + return result; + } + result.addAll(rowMap.values()); + result.sort((a, b) -> Integer.compare( + a == null || a.getOrderInx() == null ? Integer.MAX_VALUE : a.getOrderInx(), + b == null || b.getOrderInx() == null ? Integer.MAX_VALUE : b.getOrderInx() + )); + return result; + } + + private Integer queryWeEnvmAutoMonitorCount(SqlAndParams sqlAndParams) { + if (sqlAndParams == null || StrUtil.isBlank(sqlAndParams.sql())) { + return 0; + } + Map row = microservicDynamicSQLMapper.getOneBySql(sqlAndParams.sql(), sqlAndParams.params()); + return toWeFishIntegerValue(firstPresentWeFishValue(row, "CNT", "cnt")); + } + + private boolean shouldIgnoreWeEnvmFhRstcd(List rstcds) { + if (CollUtil.isEmpty(rstcds)) { + return false; + } + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(DISTINCT eng.STCD) AS cnt ") + .append("FROM SD_ENGINFO_B_H eng ") + .append("WHERE NVL(eng.IS_DELETED, 0) = 0 ") + .append("AND eng.HYCD = '10304' ") + .append("AND NVL(eng.BLDSTT_CODE, 0) IN (1, 2) "); + appendWeEnvmExactInCondition(sql, paramMap, "eng.STCD", "rstcd", rstcds); + Integer cnt = queryWeEnvmAutoMonitorCount(new SqlAndParams(sql.toString(), paramMap)); + return cnt != null && cnt == rstcds.size(); + } + + private SqlAndParams buildWeEnvmWtSql(String baseId, List rstcds) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt ") + .append("FROM SD_WT_B_H wt ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(wt.IS_DELETED, 0) = 0 ") + .append("AND wt.STTP IN ('WTRV', 'WTVT') ") + .append("AND NVL(wt.MWAY, 0) = 2 "); + appendWeEnvmBaseIdCondition(sql, paramMap, "eng.BASE_ID", baseId); + appendWeEnvmLikeCondition(sql, paramMap, "wt.RSTCD", "rstcd", rstcds); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmGjWqSql(String baseId, List hbrvcds, List rvcds) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt ") + .append("FROM SD_WQ_B_H wq ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wq.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(wq.IS_DELETED, 0) = 0 ") + .append("AND wq.STTP = 'WQ' ") + .append("AND NVL(wq.MWAY, 0) = 2 ") + .append("AND NVL(wq.DTIN_TYPE, 0) = 1 "); + appendWeEnvmBaseIdCondition(sql, paramMap, "eng.BASE_ID", baseId); + appendWeEnvmExactInCondition(sql, paramMap, "eng.HBRVCD", "hbrvcd", hbrvcds); + appendWeEnvmExactInCondition(sql, paramMap, "eng.RVCD", "rvcd", rvcds); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmZjWqSql(String baseId, List rstcds) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_WQ_B_H wq ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wq.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(wq.IS_DELETED, 0) = 0 ") + .append("AND wq.STTP IN ('WQ', 'WQFB') ") + .append("AND NVL(wq.MWAY, 0) = 2 ") + .append("AND NVL(wq.DTIN_TYPE, 0) = 0 "); + appendWeEnvmBaseIdCondition(sql, paramMap, "eng.BASE_ID", baseId); + appendWeEnvmLikeCondition(sql, paramMap, "wq.RSTCD", "rstcd", rstcds); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmStGjSql(String baseId) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_RIVER_B_H river ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = river.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(river.IS_DELETED, 0) = 0 ") + .append("AND river.STTP IN ('ZQ', 'ZZ') ") + .append("AND NVL(river.MWAY, 0) = 2 ") + .append("AND NVL(river.DTIN_TYPE, 0) = 1 "); + appendWeEnvmBaseIdCondition(sql, paramMap, "eng.BASE_ID", baseId); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmStZjSql(String baseId, List rstcds) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_RIVER_B_H river ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = river.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(river.IS_DELETED, 0) = 0 ") + .append("AND river.STTP IN ('ZQ', 'ZZ') ") + .append("AND NVL(river.MWAY, 0) = 2 ") + .append("AND NVL(river.DTIN_TYPE, 0) = 0 "); + appendWeEnvmBaseIdCondition(sql, paramMap, "eng.BASE_ID", baseId); + appendWeEnvmLikeCondition(sql, paramMap, "river.RSTCD", "rstcd", rstcds); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmEngQecSql(String baseId, List rstcds) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_ENGINFO_B_H eng ") + .append("WHERE NVL(eng.IS_DELETED, 0) = 0 ") + .append("AND NVL(eng.DTIN, 0) = 1 ") + .append("AND NVL(eng.BLDSTT_CODE, 0) = 2 "); + if (CollUtil.isEmpty(rstcds)) { + sql.append("AND NVL(eng.RUN_STATE, 0) = 4 "); + } else { + sql.append("AND NVL(eng.PRSC, 0) IN (1, 2, 3) ") + .append("AND NVL(eng.COENVW_STATE, 0) = 1 "); + } + appendWeEnvmBaseIdCondition(sql, paramMap, "eng.BASE_ID", baseId); + appendWeEnvmExactInCondition(sql, paramMap, "eng.STCD", "rstcd", rstcds); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmVdSql(String baseId, List rstcds) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_VDINFO_B vd ") + .append("WHERE 1=1 ") + .append("AND vd.STTP LIKE 'VD%' ") + .append("AND NVL(vd.DTIN, 0) = 1 "); + appendWeEnvmBaseIdCondition(sql, paramMap, "vd.BASE_ID", baseId); + appendWeEnvmLikeCondition(sql, paramMap, "vd.RSTCD", "rstcd", rstcds); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmRiverWqSql(String baseId, List rstcds) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_WQ_B_H wq ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wq.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(wq.IS_DELETED, 0) = 0 ") + .append("AND wq.STTP = 'WQ' ") + .append("AND NVL(wq.MWAY, 0) = 2 ") + .append("AND NVL(wq.DTIN_TYPE, 0) = 0 "); + appendWeEnvmBaseIdCondition(sql, paramMap, "eng.BASE_ID", baseId); + appendWeEnvmLikeCondition(sql, paramMap, "wq.RSTCD", "rstcd", rstcds); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmFbWqSql(String baseId, List rstcds) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_WQ_B_H wq ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wq.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(wq.IS_DELETED, 0) = 0 ") + .append("AND wq.STTP = 'WQFB' ") + .append("AND NVL(wq.MWAY, 0) = 2 ") + .append("AND NVL(wq.DTIN_TYPE, 0) = 0 "); + appendWeEnvmBaseIdCondition(sql, paramMap, "eng.BASE_ID", baseId); + appendWeEnvmLikeCondition(sql, paramMap, "wq.RSTCD", "rstcd", rstcds); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmFhSql(String baseId, List rstcds, boolean ignoreRstcd) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_FHBT_B_H fh ") + .append("WHERE NVL(fh.IS_DELETED, 0) = 0 "); + appendWeEnvmBaseIdCondition(sql, paramMap, "fh.BASE_ID", baseId); + if (!ignoreRstcd) { + appendWeEnvmLikeCondition(sql, paramMap, "fh.RSTCD", "rstcd", rstcds); + } + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmFhWqSql(String baseId, List rstcds, boolean ignoreRstcd) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_WQ_B_H wq ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wq.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(wq.IS_DELETED, 0) = 0 ") + .append("AND wq.STTP = 'WQ' "); + appendWeEnvmBaseIdCondition(sql, paramMap, "eng.BASE_ID", baseId); + if (!ignoreRstcd) { + appendWeEnvmLikeCondition(sql, paramMap, "wq.RSTCD", "rstcd", rstcds); + appendWeEnvmFhByRstcdCondition(sql, paramMap, "wq.FHSTCD", "fh_rstcd", rstcds); + } + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmFhWtSql(String baseId, List rstcds, boolean ignoreRstcd) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_WT_B_H wt ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(wt.IS_DELETED, 0) = 0 ") + .append("AND wt.STTP = 'WTRV' ") + .append("AND NVL(wt.DTIN_TYPE, 0) = 0 "); + appendWeEnvmBaseIdCondition(sql, paramMap, "eng.BASE_ID", baseId); + if (!ignoreRstcd) { + appendWeEnvmLikeCondition(sql, paramMap, "wt.RSTCD", "rstcd", rstcds); + appendWeEnvmFhByRstcdCondition(sql, paramMap, "wt.FHSTCD", "fh_rstcd", rstcds); + } + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmFhStSql(String baseId, List rstcds, boolean ignoreRstcd) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_RIVER_B_H river ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = river.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(river.IS_DELETED, 0) = 0 ") + .append("AND river.STTP IN ('ZQ', 'ZZ') ") + .append("AND NVL(river.DTIN_TYPE, 0) = 0 "); + appendWeEnvmBaseIdCondition(sql, paramMap, "eng.BASE_ID", baseId); + if (!ignoreRstcd) { + appendWeEnvmLikeCondition(sql, paramMap, "river.RSTCD", "rstcd", rstcds); + appendWeEnvmFhByRstcdCondition(sql, paramMap, "river.FHSTCD", "fh_rstcd", rstcds); + } + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmWeSql(String baseId, List rstcds) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_WE_B_H weB ") + .append("WHERE NVL(weB.IS_DELETED, 0) = 0 ") + .append("AND EXISTS (SELECT 1 FROM SD_WE_R we ") + .append("WHERE we.STCD = weB.STCD AND NVL(we.IS_DELETED, 0) = 0 AND NVL(we.STATUS, 1) = 1) "); + appendWeEnvmBaseIdCondition(sql, paramMap, "weB.BASE_ID", baseId); + appendWeEnvmLikeCondition(sql, paramMap, "weB.RSTCD", "rstcd", rstcds); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmWvaSql(String baseId, List rstcds, List hbrvcds) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_AIMONITOR_B_H ai ") + .append("WHERE NVL(ai.IS_DELETED, 0) = 0 ") + .append("AND ai.STTP = 'WVA' "); + appendWeEnvmBaseIdCondition(sql, paramMap, "ai.BASE_ID", baseId); + appendWeEnvmLikeCondition(sql, paramMap, "ai.RSTCD", "rstcd", rstcds); + appendWeEnvmExactInCondition(sql, paramMap, "ai.HBRVCD", "hbrvcd", hbrvcds); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmVdEqsSql(String baseId, List rstcds) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_VDINFO_B vd ") + .append("WHERE 1=1 ") + .append("AND vd.STTP = 'VD_EQS' "); + appendWeEnvmBaseIdCondition(sql, paramMap, "vd.BASE_ID", baseId); + appendWeEnvmLikeCondition(sql, paramMap, "vd.RSTCD", "rstcd", rstcds); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmRareFishSql(String baseId, List rstcds, Date startTime, Date endTime) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(DISTINCT fish.FTP) AS cnt ") + .append("FROM SD_WE_R we ") + .append("INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID AND NVL(fish.IS_DELETED, 0) = 0 ") + .append("INNER JOIN SD_FISHDICTORY_B dict ON dict.ID = fish.FTP AND NVL(dict.IS_DELETED, 0) = 0 ") + .append("INNER JOIN SD_WE_B_H weB ON weB.STCD = we.STCD AND NVL(weB.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(we.IS_DELETED, 0) = 0 ") + .append("AND NVL(we.STATUS, 1) = 1 ") + .append("AND NVL(dict.RARE, 0) = 1 ") + .append("AND NVL(dict.SPEC_ORIGIN, 0) = 1 "); + appendWeEnvmBaseIdCondition(sql, paramMap, "weB.BASE_ID", baseId); + appendWeEnvmLikeCondition(sql, paramMap, "weB.RSTCD", "rstcd", rstcds); + appendWeEnvmDateRangeCondition(sql, paramMap, "we.TM", startTime, endTime); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmTeAnimalsSql() { + String sql = "SELECT COUNT(1) AS cnt FROM (" + + "SELECT b.ID FROM MS_SPECANIMALS_B a " + + "INNER JOIN SD_VABASIC_B b ON a.ANIMAL_ID = b.ID " + + "WHERE NVL(a.IS_DELETED, 0) = 0 AND NVL(b.IS_DELETED, 0) = 0 AND NVL(b.ENABLE, 1) = 1 " + + "GROUP BY b.ID" + + ")"; + return new SqlAndParams(sql, new HashMap<>()); + } + + private SqlAndParams buildWeEnvmRgWqSql(String baseId, List rstcds) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_WQ_B_H wq ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wq.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(wq.IS_DELETED, 0) = 0 ") + .append("AND wq.STTP = 'WQ' ") + .append("AND NVL(wq.MWAY, 0) = 1 ") + .append("AND NVL(wq.DTIN_TYPE, 0) = 2 "); + appendWeEnvmBaseIdCondition(sql, paramMap, "eng.BASE_ID", baseId); + appendWeEnvmLikeCondition(sql, paramMap, "wq.RSTCD", "rstcd", rstcds); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmWeFishStaticsSql(String baseId, List rstcds, Date startTime, Date endTime) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(DISTINCT fish.FTP) AS cnt ") + .append("FROM SD_WE_R we ") + .append("INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID AND NVL(fish.IS_DELETED, 0) = 0 ") + .append("INNER JOIN SD_WE_B_H weB ON weB.STCD = we.STCD AND NVL(weB.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(we.IS_DELETED, 0) = 0 ") + .append("AND NVL(we.STATUS, 1) = 1 "); + appendWeEnvmBaseIdCondition(sql, paramMap, "weB.BASE_ID", baseId); + appendWeEnvmLikeCondition(sql, paramMap, "weB.RSTCD", "rstcd", rstcds); + appendWeEnvmDateRangeCondition(sql, paramMap, "we.TM", startTime, endTime); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmFpStaticsSql(String baseId, List rstcds) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_FPSS_B_H fp ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(fp.IS_DELETED, 0) = 0 ") + .append("AND fp.LGTD IS NOT NULL "); + appendWeEnvmBaseIdCondition(sql, paramMap, "eng.BASE_ID", baseId); + appendWeEnvmExactInCondition(sql, paramMap, "fp.RSTCD", "rstcd", rstcds); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmVdYljSql(String baseId, List rstcds) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_VDINFO_B vd ") + .append("WHERE 1=1 ") + .append("AND vd.STTP LIKE 'VD%' ") + .append("AND vd.STTP <> 'VD_FH' ") + .append("AND NVL(vd.DTIN, 0) = 1 "); + appendWeEnvmBaseIdCondition(sql, paramMap, "vd.BASE_ID", baseId); + appendWeEnvmLikeCondition(sql, paramMap, "vd.RSTCD", "rstcd", rstcds); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmAiSql(String baseId, List rstcds, List hbrvcds) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_AIMONITOR_B_H ai ") + .append("WHERE NVL(ai.IS_DELETED, 0) = 0 ") + .append("AND ai.STTP LIKE 'AI%' ") + .append("AND ai.STCD = ai.DTIN_SRC "); + appendWeEnvmBaseIdCondition(sql, paramMap, "ai.BASE_ID", baseId); + appendWeEnvmLikeCondition(sql, paramMap, "ai.RSTCD", "rstcd", rstcds); + appendWeEnvmExactInCondition(sql, paramMap, "ai.HBRVCD", "hbrvcd", hbrvcds); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmWtrvSql(String baseId, List rstcds) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_WT_B_H wt ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(wt.IS_DELETED, 0) = 0 ") + .append("AND wt.STTP = 'WTRV' ") + .append("AND NVL(wt.MWAY, 0) = 2 "); + appendWeEnvmBaseIdCondition(sql, paramMap, "eng.BASE_ID", baseId); + appendWeEnvmLikeCondition(sql, paramMap, "wt.RSTCD", "rstcd", rstcds); + return new SqlAndParams(sql.toString(), paramMap); + } + + private SqlAndParams buildWeEnvmWtvtSql(String baseId, List rstcds) { + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt FROM SD_WT_B_H wt ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(wt.IS_DELETED, 0) = 0 ") + .append("AND wt.STTP = 'WTVT' ") + .append("AND NVL(wt.MWAY, 0) = 2 "); + appendWeEnvmBaseIdCondition(sql, paramMap, "eng.BASE_ID", baseId); + appendWeEnvmLikeCondition(sql, paramMap, "wt.RSTCD", "rstcd", rstcds); + return new SqlAndParams(sql.toString(), paramMap); + } + + private void appendWeEnvmBaseIdCondition(StringBuilder sql, Map paramMap, String column, String baseId) { + if (StrUtil.isBlank(baseId)) { + return; + } + sql.append("AND ").append(column).append(" = #{map.baseId} "); + paramMap.put("baseId", baseId); + } + + private void appendWeEnvmExactInCondition(StringBuilder sql, + Map paramMap, + String column, + String prefix, + List values) { + if (CollUtil.isEmpty(values)) { + return; + } + sql.append("AND ").append(column).append(" IN ("); + for (int i = 0; i < values.size(); i++) { + String key = prefix + i; + if (i > 0) { + sql.append(", "); + } + sql.append("#{map.").append(key).append("}"); + paramMap.put(key, values.get(i)); + } + sql.append(") "); + } + + private void appendWeEnvmLikeCondition(StringBuilder sql, + Map paramMap, + String column, + String prefix, + List values) { + if (CollUtil.isEmpty(values)) { + return; + } + sql.append("AND ("); + for (int i = 0; i < values.size(); i++) { + String key = prefix + i; + if (i > 0) { + sql.append(" OR "); + } + sql.append(column).append(" LIKE '%' || #{map.").append(key).append("} || '%'"); + paramMap.put(key, values.get(i)); + } + sql.append(") "); + } + + private void appendWeEnvmDateRangeCondition(StringBuilder sql, + Map paramMap, + String column, + Date startTime, + Date endTime) { + if (startTime == null || endTime == null) { + return; + } + sql.append("AND ").append(column).append(" BETWEEN #{map.startTime} AND #{map.endTime} "); + paramMap.put("startTime", startTime); + paramMap.put("endTime", endTime); + } + + private void appendWeEnvmFhByRstcdCondition(StringBuilder sql, + Map paramMap, + String column, + String prefix, + List rstcds) { + if (CollUtil.isEmpty(rstcds)) { + return; + } + sql.append("AND ").append(column).append(" IN (") + .append("SELECT fh.STCD FROM SD_FHBT_B_H fh ") + .append("WHERE NVL(fh.IS_DELETED, 0) = 0 "); + appendWeEnvmLikeCondition(sql, paramMap, "fh.RSTCD", prefix, rstcds); + sql.append(") "); + } + + private record SqlAndParams(String sql, Map params) { + } + private void fillWeFishDerivedFields(List list) { if (CollUtil.isEmpty(list)) { return;