From 95e6a5271b8d7f8ddfb402fa0d809b947aa2fb84 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 17:41:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E6=AE=96=E7=AB=99=E6=A6=82?= =?UTF-8?q?=E5=86=B5=E4=BA=8C=E7=BA=A7=E9=A1=B5=E9=9D=A2?= 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 | 143 ++++++++++++++++++ 3 files changed, 151 insertions(+) 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 5ffb0de6..35b63bab 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 @@ -26,4 +26,10 @@ public class FbStationController { public ResponseResult getQgcOverviewSecond(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(fbStationService.getQgcOverviewSecond(dataSourceRequest)); } + + @PostMapping("/overview/getOverviewSecond") + @Operation(summary = "增殖站概况二级页面") + public ResponseResult getOverviewSecond(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fbStationService.getOverviewSecond(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 600f6664..d32a7561 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,5 +6,7 @@ import com.yfd.platform.qgc_env.fb.entity.vo.FbStationOverviewSecondVo; public interface FbStationService { + 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 ee43e15e..361fbdf7 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 @@ -25,6 +25,27 @@ public class FbStationServiceImpl implements FbStationService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Override + public DataSourceResult getOverviewSecond(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String year = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "year"); + String baseId = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); + String stnm = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stnm"); + List stcdList = resolveStcdList(dataSourceRequest, loadOptions); + + Map paramMap = new HashMap<>(); + String sql = buildOverviewSecondSql(year, baseId, stnm, stcdList, paramMap); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + null, sql, paramMap, FbStationOverviewSecondVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getQgcOverviewSecond(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -47,6 +68,45 @@ public class FbStationServiceImpl implements FbStationService { return result; } + private String buildOverviewSecondSql(String year, + String baseId, + String stnm, + List stcdList, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT fb.STCD AS stcd, ") + .append("fb.STNM AS stnm, ") + .append("eng.ENNM AS ennm, ") + .append("fb.INV AS totalInv, ") + .append("t.YEAR AS year, ") + .append("MAX(t.planFtp) AS planFtp, ") + .append("SUM(t.fcntjh) AS fcntjh, ") + .append("MAX(t.realftp) AS realftp, ") + .append("SUM(t.realfcnt) AS realfcnt, ") + .append("TO_CHAR(SUM(t.realfcnt)) AS realfcntStr ") + .append("FROM SD_FBRD_B_H fb ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fb.RSTCD ") + .append(" AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN (") + .append(buildOverviewPlanUnionActualSql(year, stcdList, paramMap)) + .append(") t ON fb.STCD = t.rstcd ") + .append("WHERE 1 = 1 "); + + if (StrUtil.isNotBlank(stnm)) { + paramMap.put("overviewStnm", "%" + stnm.trim() + "%"); + sql.append("AND fb.STNM LIKE #{map.overviewStnm} "); + } + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("overviewBaseId", baseId.trim()); + sql.append("AND fb.BASE_ID = #{map.overviewBaseId} "); + } + appendLikeAnyCondition(sql, paramMap, "NVL(fb.RENGCD, fb.RSTCD)", stcdList, "overviewStationFilter"); + + sql.append("GROUP BY fb.STCD, fb.STNM, eng.ENNM, t.YEAR, fb.INV ") + .append("ORDER BY fb.STCD ASC"); + return sql.toString(); + } + private String buildQgcOverviewSecondSql(String year, String baseId, String hbrvcd, @@ -94,6 +154,78 @@ public class FbStationServiceImpl implements FbStationService { return buildPlanSql(year, stcdList, paramMap) + " UNION ALL " + buildActualSql(year, stcdList, paramMap); } + private String buildOverviewPlanUnionActualSql(String year, List stcdList, Map paramMap) { + return buildOverviewPlanSql(year, stcdList, paramMap) + " UNION ALL " + + buildOverviewActualSql(year, stcdList, paramMap); + } + + private String buildOverviewPlanSql(String year, List stcdList, Map paramMap) { + String fishNameExpr = buildFishViewNameExpr("det.FTP"); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT planFish.RSTCD AS rstcd, ") + .append("LISTAGG(planFish.NAME, ', ') WITHIN GROUP (ORDER BY planFish.NAME) AS planFtp, ") + .append("SUM(planFish.FCNT) AS fcntjh, ") + .append("CAST(NULL AS VARCHAR2(4000)) AS realftp, ") + .append("CAST(NULL AS NUMBER(18, 2)) AS realfcnt, ") + .append("TO_CHAR(planFish.PLANSD, 'YYYY') AS year ") + .append("FROM ( ") + .append(" SELECT plan.RSTCD AS RSTCD, plan.PLANSD AS PLANSD, ") + .append(" ").append(fishNameExpr).append(" AS NAME, ") + .append(" SUM(det.FCNT) AS FCNT ") + .append(" FROM SD_ENGFRPLAN_B plan ") + .append(" LEFT JOIN SD_ENGFRPLANDET_B det ON plan.ID = det.RPJH_ID ") + .append(" INNER JOIN SD_FBRD_B_H fbPlan ON fbPlan.STCD = plan.RSTCD ") + .append(buildFishViewJoinSql("det.FTP", "fbPlan.HBRVCD")) + .append(" WHERE NVL(plan.IS_DELETED, 0) = 0 ") + .append(" AND NVL(det.IS_DELETED, 0) = 0 ") + .append(" AND det.FTP IS NOT NULL "); + + if (StrUtil.isNotBlank(year)) { + paramMap.put("overviewPlanYear", year.trim()); + sql.append("AND TO_CHAR(plan.PLANSD, 'YYYY') = #{map.overviewPlanYear} "); + } + appendInCondition(sql, paramMap, "plan.STCD", stcdList, "overviewPlanStcd"); + + sql.append(" GROUP BY plan.RSTCD, plan.PLANSD, ").append(fishNameExpr).append(" ") + .append(") planFish ") + .append("GROUP BY planFish.RSTCD, TO_CHAR(planFish.PLANSD, 'YYYY') "); + return sql.toString(); + } + + private String buildOverviewActualSql(String year, List stcdList, Map paramMap) { + String fishNameExpr = buildFishViewNameExpr("det.FTP"); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT actualFish.RSTCD AS rstcd, ") + .append("CAST(NULL AS VARCHAR2(4000)) AS planFtp, ") + .append("CAST(NULL AS NUMBER(18, 2)) AS fcntjh, ") + .append("LISTAGG(actualFish.NAME, ', ') WITHIN GROUP (ORDER BY actualFish.NAME) AS realftp, ") + .append("SUM(actualFish.FCNT) AS realfcnt, ") + .append("actualFish.YR AS year ") + .append("FROM ( ") + .append(" SELECT run.RSTCD AS RSTCD, ") + .append(" TO_CHAR(run.TM, 'YYYY') AS YR, ") + .append(" ").append(fishNameExpr).append(" AS NAME, ") + .append(" 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(" AND NVL(det.IS_DELETED, 0) = 0 ") + .append(" AND det.FTP IS NOT NULL ") + .append(" INNER JOIN SD_FBRD_B_H fbRun ON fbRun.STCD = run.RSTCD ") + .append(buildFishViewJoinSql("det.FTP", "fbRun.HBRVCD")) + .append(" WHERE NVL(run.IS_DELETED, 0) = 0 "); + + if (StrUtil.isNotBlank(year)) { + paramMap.put("overviewActualYear", year.trim()); + sql.append("AND TO_CHAR(run.TM, 'YYYY') = #{map.overviewActualYear} "); + } + appendInCondition(sql, paramMap, "run.STCD", stcdList, "overviewActualStcd"); + + sql.append(" GROUP BY run.RSTCD, TO_CHAR(run.TM, 'YYYY'), ").append(fishNameExpr).append(" ") + .append(") actualFish ") + .append("GROUP BY actualFish.RSTCD, actualFish.YR "); + return sql.toString(); + } + private String buildPlanSql(String year, List stcdList, Map paramMap) { String fishNameExpr = buildFishNameExpr("det.FTP"); StringBuilder sql = new StringBuilder(); @@ -185,6 +317,17 @@ public class FbStationServiceImpl implements FbStationService { return "COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, " + fishFieldExpr + ")"; } + private String buildFishViewJoinSql(String fishFieldExpr, String hbrvcdFieldExpr) { + return " LEFT JOIN V_SD_FISHDICTORY_B fishViewRv ON fishViewRv.FISH_ID = " + fishFieldExpr + + " AND fishViewRv.RVCD = " + hbrvcdFieldExpr + + " LEFT JOIN V_SD_FISHDICTORY_B fishViewZy ON fishViewZy.FISH_ID = " + fishFieldExpr + + " AND fishViewZy.RVCD = 'ZY' "; + } + + private String buildFishViewNameExpr(String fishFieldExpr) { + return "COALESCE(fishViewRv.NAME, fishViewZy.NAME, " + fishFieldExpr + ")"; + } + private void appendInCondition(StringBuilder sql, Map paramMap, String column,