From 6f81e82002c0652a0eb07d51a999cd8f35c211f5 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 18:16:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=85=A8=E6=B5=81=E5=9F=9F=E5=A2=9E?= =?UTF-8?q?=E6=AE=96=E7=AB=99=E6=A6=82=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fb/controller/FbStationController.java | 6 + .../qgc_env/fb/service/FbStationService.java | 2 + .../fb/service/impl/FbStationServiceImpl.java | 217 +++++++++++++++++- 3 files changed, 223 insertions(+), 2 deletions(-) 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 35b63bab..07c15ee3 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 @@ -32,4 +32,10 @@ public class FbStationController { public ResponseResult getOverviewSecond(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(fbStationService.getOverviewSecond(dataSourceRequest)); } + + @PostMapping("/overview/GetKendoListCust") + @Operation(summary = "全流域增殖站概况") + public ResponseResult getOverviewKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fbStationService.getOverviewKendoListCust(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 d32a7561..6385c327 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 @@ -6,6 +6,8 @@ import com.yfd.platform.qgc_env.fb.entity.vo.FbStationOverviewSecondVo; public interface FbStationService { + DataSourceResult getOverviewKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getOverviewSecond(DataSourceRequest dataSourceRequest); DataSourceResult getQgcOverviewSecond(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 361fbdf7..86c280cc 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 @@ -1,5 +1,6 @@ package com.yfd.platform.qgc_env.fb.service.impl; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.yfd.platform.common.DataSourceLoadOptionsBase; @@ -13,11 +14,15 @@ import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Collections; @Service public class FbStationServiceImpl implements FbStationService { @@ -25,6 +30,72 @@ public class FbStationServiceImpl implements FbStationService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Override + public DataSourceResult getOverviewKendoListCust(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"); + String baseId = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); + List stcdList = resolveStcdList(dataSourceRequest, loadOptions); + + DataSourceResult result = new DataSourceResult<>(); + FbStationOverviewSecondVo vo = new FbStationOverviewSecondVo(); + + Date startDate = StrUtil.isBlank(startTime) ? null : DateUtil.parse(startTime); + Date endDate = StrUtil.isBlank(endTime) ? null : DateUtil.parse(endTime); + + Map stationParamMap = new HashMap<>(); + String stationSql = buildOverviewStationListSql(baseId, stcdList, stationParamMap); + List stationList = microservicDynamicSQLMapper.pageAllListWithResultType( + null, stationSql, stationParamMap, FbStationOverviewSecondVo.class + ); + + if (CollUtil.isEmpty(stationList)) { + result.setData(Collections.emptyList()); + result.setTotal(0); + result.setAggregates(new HashMap<>()); + return result; + } + + List rstcdList = stationList.stream() + .map(FbStationOverviewSecondVo::getStcd) + .filter(StrUtil::isNotBlank) + .distinct() + .toList(); + vo.setCount(stationList.size()); + BigDecimal inv = BigDecimal.ZERO; + for (FbStationOverviewSecondVo station : stationList) { + if (station.getTotalInv() != null) { + inv = inv.add(station.getTotalInv()); + } + } + vo.setTotalInv(inv.divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP)); + + if (startDate != null && endDate != null) { + vo.setYear(startTime.substring(0, 4)); + } else { + String latestYear = queryLatestOverviewYear(rstcdList); + if (StrUtil.isBlank(latestYear)) { + result.setData(Collections.emptyList()); + result.setTotal(0); + result.setAggregates(new HashMap<>()); + return result; + } + vo.setYear(latestYear); + startDate = DateUtil.parse(latestYear + "-01-01"); + endDate = DateUtil.parse(latestYear + "-12-31"); + } + + fillPlanOverviewStat(vo, rstcdList, stcdList, startDate, endDate); + fillActualOverviewStat(vo, rstcdList, stcdList, startDate, endDate); + vo.setTotalFtpCount(queryAccumulateCount(rstcdList, stcdList, endDate)); + + result.setData(Collections.singletonList(vo)); + result.setTotal(1); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getOverviewSecond(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -46,6 +117,148 @@ public class FbStationServiceImpl implements FbStationService { return result; } + private String buildOverviewStationListSql(String baseId, + List stcdList, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT fb.STCD AS stcd, fb.STNM AS stnm, fb.INV AS totalInv ") + .append("FROM SD_FBRD_B_H fb WHERE 1 = 1 "); + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("stationBaseId", baseId.trim()); + sql.append("AND fb.BASE_ID = #{map.stationBaseId} "); + } + appendLikeAnyCondition(sql, paramMap, "fb.RSTCD", stcdList, "stationStcdFilter"); + return sql.toString(); + } + + private String queryLatestOverviewYear(List rstcdList) { + if (CollUtil.isEmpty(rstcdList)) { + return null; + } + Map paramMap = new HashMap<>(); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT yr FROM (") + .append("SELECT yr FROM (") + .append("SELECT plan.RSTCD, TO_CHAR(plan.PLANSD, 'YYYY') AS yr, plan.PLANSD AS sortTm ") + .append("FROM SD_ENGFRPLAN_B plan ") + .append("LEFT JOIN SD_ENGFRPLANDET_B det ON plan.ID = det.RPJH_ID ") + .append("WHERE NVL(plan.IS_DELETED, 0) = 0 AND NVL(det.IS_DELETED, 0) = 0 ") + .append("UNION ALL ") + .append("SELECT run.RSTCD, TO_CHAR(run.TM, 'YYYY') AS yr, run.TM AS sortTm ") + .append("FROM SD_ENGFR_R run ") + .append("LEFT JOIN SD_RPIMNFISH_R det ON run.ID = det.RPIMN_ID ") + .append("WHERE NVL(run.IS_DELETED, 0) = 0 AND NVL(det.IS_DELETED, 0) = 0 ") + .append(") src WHERE 1 = 1 "); + appendInCondition(sql, paramMap, "src.RSTCD", rstcdList, "latestRstcd"); + sql.append("AND yr IS NOT NULL ORDER BY sortTm DESC) WHERE ROWNUM = 1"); + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + if (CollUtil.isEmpty(rows) || rows.get(0) == null || rows.get(0).get("YR") == null) { + return null; + } + return String.valueOf(rows.get(0).get("YR")); + } + + private void fillPlanOverviewStat(FbStationOverviewSecondVo vo, + List rstcdList, + List stcdList, + Date startDate, + Date endDate) { + Map paramMap = new HashMap<>(); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT det.FTP AS ftp, SUM(det.FCNT) AS fcntjh ") + .append("FROM SD_ENGFRPLAN_B plan ") + .append("LEFT JOIN SD_ENGFRPLANDET_B det ON plan.ID = det.RPJH_ID ") + .append("WHERE det.FTP IS NOT NULL ") + .append("AND NVL(plan.IS_DELETED, 0) = 0 AND NVL(det.IS_DELETED, 0) = 0 "); + appendInCondition(sql, paramMap, "plan.RSTCD", rstcdList, "planOverviewRstcd"); + appendInCondition(sql, paramMap, "plan.STCD", stcdList, "planOverviewStcd"); + if (startDate != null) { + paramMap.put("planOverviewStartDate", startDate); + sql.append("AND plan.PLANSD >= #{map.planOverviewStartDate} "); + } + if (endDate != null) { + paramMap.put("planOverviewEndDate", endDate); + sql.append("AND plan.PLANED <= #{map.planOverviewEndDate} "); + } + sql.append("GROUP BY det.FTP"); + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + if (CollUtil.isEmpty(rows)) { + return; + } + vo.setFtpCount(rows.size()); + BigDecimal sum = BigDecimal.ZERO; + for (Map row : rows) { + sum = sum.add(toBigDecimal(row.get("FCNTJH"))); + } + vo.setFcntjh(sum); + } + + private void fillActualOverviewStat(FbStationOverviewSecondVo vo, + List rstcdList, + List stcdList, + Date startDate, + Date endDate) { + Map paramMap = new HashMap<>(); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT det.FTP AS ftp, SUM(det.FCNT) AS fcntjc ") + .append("FROM SD_ENGFR_R run ") + .append("LEFT JOIN SD_RPIMNFISH_R det ON run.ID = det.RPIMN_ID ") + .append("WHERE det.FTP IS NOT NULL ") + .append("AND NVL(run.IS_DELETED, 0) = 0 AND NVL(det.IS_DELETED, 0) = 0 "); + appendInCondition(sql, paramMap, "run.STCD", stcdList, "actualOverviewStcd"); + appendInCondition(sql, paramMap, "run.RSTCD", rstcdList, "actualOverviewRstcd"); + if (startDate != null) { + paramMap.put("actualOverviewStartDate", startDate); + sql.append("AND run.TM >= #{map.actualOverviewStartDate} "); + } + if (endDate != null) { + paramMap.put("actualOverviewEndDate", endDate); + sql.append("AND run.TM <= #{map.actualOverviewEndDate} "); + } + sql.append("GROUP BY det.FTP"); + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + if (CollUtil.isEmpty(rows)) { + return; + } + vo.setRealftpCount(rows.size()); + BigDecimal sum = BigDecimal.ZERO; + for (Map row : rows) { + sum = sum.add(toBigDecimal(row.get("FCNTJC"))); + } + vo.setRealfcnt(sum); + } + + private Long queryAccumulateCount(List rstcdList, List stcdList, Date endDate) { + Map paramMap = new HashMap<>(); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT SUM(det.FCNT) AS fcnt ") + .append("FROM SD_ENGFR_R run ") + .append("LEFT JOIN SD_RPIMNFISH_R det ON run.ID = det.RPIMN_ID ") + .append("WHERE det.FTP IS NOT NULL ") + .append("AND NVL(run.IS_DELETED, 0) = 0 AND NVL(det.IS_DELETED, 0) = 0 "); + appendInCondition(sql, paramMap, "run.RSTCD", rstcdList, "accRstcd"); + appendInCondition(sql, paramMap, "run.STCD", stcdList, "accStcd"); + if (endDate != null) { + paramMap.put("accEndDate", endDate); + sql.append("AND run.TM <= #{map.accEndDate} "); + } + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + if (CollUtil.isEmpty(rows) || rows.get(0) == null || rows.get(0).get("FCNT") == null) { + return null; + } + return toBigDecimal(rows.get(0).get("FCNT")).longValue(); + } + + private BigDecimal toBigDecimal(Object value) { + if (value == null) { + return BigDecimal.ZERO; + } + if (value instanceof BigDecimal bigDecimal) { + return bigDecimal; + } + return new BigDecimal(String.valueOf(value)); + } + @Override public DataSourceResult getQgcOverviewSecond(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -100,7 +313,7 @@ public class FbStationServiceImpl implements FbStationService { paramMap.put("overviewBaseId", baseId.trim()); sql.append("AND fb.BASE_ID = #{map.overviewBaseId} "); } - appendLikeAnyCondition(sql, paramMap, "NVL(fb.RENGCD, fb.RSTCD)", stcdList, "overviewStationFilter"); + appendLikeAnyCondition(sql, paramMap, "fb.RSTCD", stcdList, "overviewStationFilter"); sql.append("GROUP BY fb.STCD, fb.STNM, eng.ENNM, t.YEAR, fb.INV ") .append("ORDER BY fb.STCD ASC"); @@ -143,7 +356,7 @@ public class FbStationServiceImpl implements FbStationService { paramMap.put("hbrvcd", hbrvcd.trim()); sql.append("AND fb.HBRVCD = #{map.hbrvcd} "); } - appendLikeAnyCondition(sql, paramMap, "NVL(fb.RENGCD, fb.RSTCD)", stcdList, "stationFilter"); + appendLikeAnyCondition(sql, paramMap, "fb.RSTCD", stcdList, "stationFilter"); sql.append("GROUP BY fb.STCD, fb.STNM, eng.ENNM, t.YEAR, fb.INV ") .append("ORDER BY fb.STCD ASC");