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 e68e22f5..a4679fa7 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 @@ -79,6 +79,12 @@ public class FbStationController { return ResponseResult.successData(fbStationService.getFbRelatedYrByStcd(stcd)); } + @PostMapping("/station/eng/GetAggregateData") + @Operation(summary = "电站放流统计-返回有数据的年份") + public ResponseResult getAggregateData(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fbStationService.getAggregateData(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/entity/vo/FbEngFishVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbEngFishVo.java new file mode 100644 index 00000000..581f109b --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbEngFishVo.java @@ -0,0 +1,22 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 电站放流统计-有数据的年份 + */ +@Data +public class FbEngFishVo { + /** 电站编码 */ + private String stcd; + /** 电站名称 */ + private String ennm; + /** 计划放流尾数 */ + private BigDecimal fcntjh; + /** 实际放流尾数 */ + private BigDecimal fcntjc; + /** 计划放流日期(年份) */ + private String plansd; +} 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 66578ed0..35128a3d 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 @@ -4,6 +4,7 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRQgcVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRFishTableVo; +import com.yfd.platform.qgc_env.fb.entity.vo.FbEngFishVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbFlDataVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbFishCountFinishVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbFishRunQgcVo; @@ -67,4 +68,9 @@ public interface FbStationService { DataSourceResult getFbPointKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult getFbBuiltPointKendoListCust(DataSourceRequest dataSourceRequest); + + /** + * 电站放流统计-返回有数据的年份 + */ + DataSourceResult getAggregateData(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 ee2f4b67..18105193 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 @@ -20,6 +20,7 @@ import com.yfd.platform.qgc_env.fb.entity.vo.FbFishRunQgcVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbFishTypeStcdVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbFishTypeFinishVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbFtpStatisticsVo; +import com.yfd.platform.qgc_env.fb.entity.vo.FbEngFishVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbFlDataVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbMsfbrdmQgcVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbRelatedYrVo; @@ -4809,6 +4810,103 @@ public class FbStationServiceImpl implements FbStationService { return voList; } + @Override + public DataSourceResult getAggregateData(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + List stcdList = resolveStcdList(dataSourceRequest, loadOptions); + + Map paramMap = new HashMap<>(); + String sql = buildAggregateDataSql(stcdList, paramMap); + + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + null, sql, paramMap, FbEngFishVo.class + ); + + if (CollUtil.isNotEmpty(list)) { + FbEngFishVo first = list.get(0); + if (StrUtil.isNotBlank(first.getPlansd()) && first.getPlansd().length() >= 4) { + first.setPlansd(first.getPlansd().substring(0, 4)); + } + } + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list.stream() + .filter(it -> StrUtil.isNotBlank(it.getStcd())) + .sorted(Comparator.comparing(FbEngFishVo::getStcd)) + .collect(Collectors.toList())); + result.setTotal(list.size()); + return result; + } + + /** + * 构建电站放流统计-年份聚合数据 SQL + *

+ * 查询指定电站有放流数据(计划或实际)的最新一条年份记录。 + * 上半部分以计划表为主 LEFT JOIN 实际表,下半部分以实际表为主 LEFT JOIN 计划表, + * UNION 去重合并后按日期降序取第一条。 + *

+ */ + private String buildAggregateDataSql(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 engInfoTable = "SD_ENGINFO_B_H"; + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT STCD, ennm, fcntjh, fcntjc, PLANSD FROM ( "); + sql.append("SELECT s.STCD, e.ENNM AS ennm, s.fcntjh, s.fcntjc, s.PLANSD "); + sql.append("FROM ( "); + + // 上半部分:计划表为主 LEFT JOIN 实际表 + sql.append("SELECT jh.STCD, jh.PLANSD, jh.fcntjh, jc.fcntjc FROM ( "); + sql.append("SELECT a.STCD, a.PLANSD, 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 AND NVL(b.IS_DELETED, 0) = 0 "); + sql.append("WHERE NVL(a.IS_DELETED, 0) = 0 "); + appendInCondition(sql, paramMap, "a.STCD", stcdList, "aggPlanStcd"); + sql.append("GROUP BY a.STCD, a.PLANSD "); + 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 "); + appendInCondition(sql, paramMap, "a.STCD", stcdList, "aggActStcd1"); + sql.append("GROUP BY a.STCD "); + sql.append(") jc ON jh.STCD = jc.STCD "); + sql.append("WHERE (jh.fcntjh IS NOT NULL OR jc.fcntjc IS NOT NULL) "); + + sql.append("UNION "); + + // 下半部分:实际表为主 LEFT JOIN 计划表 + sql.append("SELECT jc.STCD, jc.PLANSD, jh.fcntjh, jc.fcntjc FROM ( "); + sql.append("SELECT a.STCD, a.TM AS PLANSD, 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 "); + appendInCondition(sql, paramMap, "a.STCD", stcdList, "aggActStcd2"); + sql.append("GROUP BY a.STCD, a.TM "); + 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 AND NVL(b.IS_DELETED, 0) = 0 "); + sql.append("WHERE NVL(a.IS_DELETED, 0) = 0 "); + appendInCondition(sql, paramMap, "a.STCD", stcdList, "aggPlanStcd2"); + sql.append("GROUP BY a.STCD "); + sql.append(") jh ON jc.STCD = jh.STCD "); + sql.append("WHERE (jh.fcntjh IS NOT NULL OR jc.fcntjc IS NOT NULL) "); + + sql.append(") s "); + sql.append("LEFT JOIN ").append(engInfoTable).append(" e ON s.STCD = e.STCD AND NVL(e.IS_DELETED, 0) = 0 "); + sql.append("WHERE (s.fcntjh IS NOT NULL OR s.fcntjc IS NOT NULL) "); + sql.append("ORDER BY s.PLANSD DESC "); + sql.append(") WHERE ROWNUM = 1"); + + return sql.toString(); + } + private static class FbPointCountVo { private String stcd; private Long fcnt;