diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java index a4679fa7..d6bbd185 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java @@ -85,6 +85,12 @@ public class FbStationController { return ResponseResult.successData(fbStationService.getAggregateData(dataSourceRequest)); } + @PostMapping("/station/eng/GetKendoListCust") + @Operation(summary = "电站放流统计") + public ResponseResult getEngKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fbStationService.getEngKendoListCust(dataSourceRequest)); + } + @PostMapping("/msfbrdm/fbFlData/GetKendoListCust") @Operation(summary = "增殖站增殖情况(app)") public ResponseResult getFbFlData(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java index 35128a3d..fa4f612c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java @@ -73,4 +73,9 @@ public interface FbStationService { * 电站放流统计-返回有数据的年份 */ DataSourceResult getAggregateData(DataSourceRequest dataSourceRequest); + + /** + * 电站放流统计列表 + */ + DataSourceResult getEngKendoListCust(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java index 18105193..0d700f67 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java @@ -4907,6 +4907,125 @@ public class FbStationServiceImpl implements FbStationService { return sql.toString(); } + @Override + public DataSourceResult getEngKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String startTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime"); + String endTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime"); + List stcdList = resolveStcdList(dataSourceRequest, loadOptions); + + Map paramMap = new HashMap<>(); + String sql = buildEngKendoListCustSql(startTime, endTime, stcdList, paramMap); + + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + null, sql, paramMap, FbEngFishVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list.stream() + .filter(it -> StrUtil.isNotBlank(it.getStcd())) + .collect(Collectors.toList())); + result.setTotal(list.size()); + return result; + } + + /** + * 构建电站放流统计列表 SQL + *

+ * UNION 合并计划放流和实际放流数据,确保同时有两类数据的电站不遗漏。 + * 上半部分以计划表为主 LEFT JOIN 实际表,下半部分以实际表为主 LEFT JOIN 计划表。 + *

+ */ + private String buildEngKendoListCustSql(String startTime, String endTime, + List stcdList, Map paramMap) { + String planTable = "SD_ENGFRPLAN_B"; + String planDetTable = "SD_ENGFRPLANDET_B"; + String actualTable = "SD_ENGFR_R"; + String actualDetTable = "SD_RPIMNFISH_R"; + String viewTable = "V_MS_STBPRP_T"; + + StringBuilder sql = new StringBuilder(); + + sql.append("SELECT s.STCD, t.STNM AS ennm, s.fcntjh, s.fcntjc "); + sql.append("FROM ( "); + + // 上半部分:计划表为主 LEFT JOIN 实际表 + sql.append("SELECT jh.STCD, jh.fcntjh, jc.fcntjc FROM ( "); + sql.append("SELECT a.STCD, SUM(NVL(b.FCNT, 0)) AS fcntjh "); + sql.append("FROM ").append(planTable).append(" a "); + sql.append("LEFT JOIN ").append(planDetTable).append(" b ON a.ID = b.RPJH_ID "); + sql.append("WHERE NVL(a.IS_DELETED, 0) = 0 "); + if (StrUtil.isNotBlank(startTime)) { + paramMap.put("planStartTime1", DateUtil.parse(startTime)); + sql.append("AND a.PLANSD >= #{map.planStartTime1} "); + } + if (StrUtil.isNotBlank(endTime)) { + paramMap.put("planEndTime1", DateUtil.parse(endTime)); + sql.append("AND a.PLANED <= #{map.planEndTime1} "); + } + sql.append("GROUP BY a.STCD "); + sql.append(") jh "); + sql.append("LEFT JOIN ( "); + sql.append("SELECT a.STCD, SUM(NVL(b.FCNT, 0)) AS fcntjc "); + sql.append("FROM ").append(actualTable).append(" a "); + sql.append("LEFT JOIN ").append(actualDetTable).append(" b ON a.ID = b.RPIMN_ID AND NVL(b.IS_DELETED, 0) = 0 "); + sql.append("WHERE NVL(a.IS_DELETED, 0) = 0 "); +// sql.append("AND (a.TASK_STATUS = 'Approved' OR a.TASK_STATUS IS NULL) "); + if (StrUtil.isNotBlank(startTime)) { + paramMap.put("actStartTime1", DateUtil.parse(startTime)); + sql.append("AND a.TM >= #{map.actStartTime1} "); + } + if (StrUtil.isNotBlank(endTime)) { + paramMap.put("actEndTime1", DateUtil.parse(endTime)); + sql.append("AND a.TM <= #{map.actEndTime1} "); + } + sql.append("GROUP BY a.STCD "); + sql.append(") jc ON jh.STCD = jc.STCD "); + + sql.append("UNION "); + + // 下半部分:实际表为主 LEFT JOIN 计划表 + sql.append("SELECT jc.STCD, jh.fcntjh, jc.fcntjc FROM ( "); + sql.append("SELECT a.STCD, SUM(NVL(b.FCNT, 0)) AS fcntjc "); + sql.append("FROM ").append(actualTable).append(" a "); + sql.append("LEFT JOIN ").append(actualDetTable).append(" b ON a.ID = b.RPIMN_ID AND NVL(b.IS_DELETED, 0) = 0 "); + sql.append("WHERE NVL(a.IS_DELETED, 0) = 0 "); +// sql.append("AND (a.TASK_STATUS = 'Approved' OR a.TASK_STATUS IS NULL) "); + if (StrUtil.isNotBlank(startTime)) { + paramMap.put("actStartTime2", DateUtil.parse(startTime)); + sql.append("AND a.TM >= #{map.actStartTime2} "); + } + if (StrUtil.isNotBlank(endTime)) { + paramMap.put("actEndTime2", DateUtil.parse(endTime)); + sql.append("AND a.TM <= #{map.actEndTime2} "); + } + sql.append("GROUP BY a.STCD "); + sql.append(") jc "); + sql.append("LEFT JOIN ( "); + sql.append("SELECT a.STCD, SUM(NVL(b.FCNT, 0)) AS fcntjh "); + sql.append("FROM ").append(planTable).append(" a "); + sql.append("LEFT JOIN ").append(planDetTable).append(" b ON a.ID = b.RPJH_ID "); + sql.append("WHERE NVL(a.IS_DELETED, 0) = 0 "); + if (StrUtil.isNotBlank(startTime)) { + paramMap.put("planStartTime2", DateUtil.parse(startTime)); + sql.append("AND a.PLANSD >= #{map.planStartTime2} "); + } + if (StrUtil.isNotBlank(endTime)) { + paramMap.put("planEndTime2", DateUtil.parse(endTime)); + sql.append("AND a.PLANED <= #{map.planEndTime2} "); + } + sql.append("GROUP BY a.STCD "); + sql.append(") jh ON jc.STCD = jh.STCD "); + + sql.append(") s "); + sql.append("LEFT JOIN ").append(viewTable).append(" t ON s.STCD = t.STCD "); + sql.append("WHERE 1 = 1 "); + appendInCondition(sql, paramMap, "s.STCD", stcdList, "engStcd"); + sql.append("ORDER BY t.SITESTEPSORT "); + + return sql.toString(); + } + private static class FbPointCountVo { private String stcd; private Long fcnt;