feat: 电站放流统计-返回有数据的年份

This commit is contained in:
tangwei 2026-07-29 13:44:55 +08:00
parent dabcef7134
commit 3eb9fe4dbd
4 changed files with 132 additions and 0 deletions

View File

@ -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) {

View File

@ -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;
}

View File

@ -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<FbTracingPointVo> getFbPointKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<FbTracingPointVo> getFbBuiltPointKendoListCust(DataSourceRequest dataSourceRequest);
/**
* 电站放流统计-返回有数据的年份
*/
DataSourceResult<FbEngFishVo> getAggregateData(DataSourceRequest dataSourceRequest);
}

View File

@ -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<FbEngFishVo> getAggregateData(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
List<String> stcdList = resolveStcdList(dataSourceRequest, loadOptions);
Map<String, Object> paramMap = new HashMap<>();
String sql = buildAggregateDataSql(stcdList, paramMap);
List<FbEngFishVo> 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<FbEngFishVo> 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
* <p>
* 查询指定电站有放流数据计划或实际的最新一条年份记录
* 上半部分以计划表为主 LEFT JOIN 实际表下半部分以实际表为主 LEFT JOIN 计划表
* UNION 去重合并后按日期降序取第一条
* </p>
*/
private String buildAggregateDataSql(List<String> stcdList, Map<String, Object> 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;