From 3eb9fe4dbd4ad93b80a03d14da89cc8e33bc0c21 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 29 Jul 2026 13:44:55 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=E7=94=B5=E7=AB=99=E6=94=BE?= =?UTF-8?q?=E6=B5=81=E7=BB=9F=E8=AE=A1-=E8=BF=94=E5=9B=9E=E6=9C=89?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=9A=84=E5=B9=B4=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fb/controller/FbStationController.java | 6 ++ .../qgc_env/fb/entity/vo/FbEngFishVo.java | 22 +++++ .../qgc_env/fb/service/FbStationService.java | 6 ++ .../fb/service/impl/FbStationServiceImpl.java | 98 +++++++++++++++++++ 4 files changed, 132 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbEngFishVo.java 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; From 64c97585a23f80f15a646e2431f7e81b989bbca6 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 29 Jul 2026 14:01:33 +0800 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20=E7=94=B5=E7=AB=99=E6=94=BE?= =?UTF-8?q?=E6=B5=81=E7=BB=9F=E8=AE=A1?= 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 | 5 + .../fb/service/impl/FbStationServiceImpl.java | 119 ++++++++++++++++++ 3 files changed, 130 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 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; From 7502e63cef80d9cc3acd201b6da98d1bf57fcb90 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 29 Jul 2026 14:29:16 +0800 Subject: [PATCH 3/5] =?UTF-8?q?feat:=20=E6=9D=A1=E4=BB=B6=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E6=95=B0=E6=8D=AE=E5=88=97=E8=A1=A8=E5=AE=9A=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fb/controller/FbStationController.java | 25 ++++++++ .../qgc_env/fb/entity/vo/BreedStageVO.java | 30 +++++++++ .../qgc_env/fb/service/FbStationService.java | 6 ++ .../fb/service/impl/FbStationServiceImpl.java | 64 +++++++++++++++++++ 4 files changed, 125 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/BreedStageVO.java 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 d6bbd185..19d7887c 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 @@ -1,12 +1,15 @@ package com.yfd.platform.qgc_env.fb.controller; import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.fb.entity.vo.BreedStageVO; import com.yfd.platform.qgc_env.fb.service.FbStationService; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import cn.hutool.core.util.StrUtil; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -15,6 +18,8 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequestMapping("/fb") @Tag(name = "鱼类增殖站模块") @@ -91,6 +96,26 @@ public class FbStationController { return ResponseResult.successData(fbStationService.getEngKendoListCust(dataSourceRequest)); } + @PostMapping("/breedStage/GetKendoListCust") + @Operation(summary = "条件过滤数据列表定制") + public ResponseResult getBreedStageKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + String stcd = null; + List filters = dataSourceRequest.getFilter().getFilters(); + for (DataSourceRequest.FilterDescriptor filter : filters) { + if ("stcd".equals(filter.getField())) { + stcd = (String) filter.getValue(); + } + } + if (StrUtil.isEmpty(stcd)) { + return ResponseResult.error("增殖站stcd不能为空!"); + } + List breedStageList = fbStationService.getBreedStageList(stcd); + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setData(breedStageList); + dataSourceResult.setTotal(breedStageList.size()); + return ResponseResult.successData(dataSourceResult); + } + @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/BreedStageVO.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/BreedStageVO.java new file mode 100644 index 00000000..96e50ad1 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/BreedStageVO.java @@ -0,0 +1,30 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 鱼类增殖阶段 + */ +@Data +@Accessors(chain = true) +public class BreedStageVO { + + /** 增殖站编码 */ + private String stcd; + + /** 阶段名称 */ + private String key; + + /** 阶段状态:1=有数据 2=无数据 */ + private String value; + + /** 是否为最新数据 */ + private Boolean newest; + + /** 最新表 */ + private String newSurface; + + /** 主菜单 */ + private String firstGrade; +} 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 fa4f612c..5e94e2de 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 @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.fb.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.fb.entity.vo.BreedStageVO; 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; @@ -78,4 +79,9 @@ public interface FbStationService { * 电站放流统计列表 */ DataSourceResult getEngKendoListCust(DataSourceRequest dataSourceRequest); + + /** + * 获取增殖站各阶段数据状态(选配/繁殖/培育/防治) + */ + List getBreedStageList(String stcd); } 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 0d700f67..635edcef 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 @@ -11,6 +11,7 @@ import com.yfd.platform.common.Group; import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.qgc_env.fb.entity.vo.BreedStageVO; import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRQgcVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRFishHeadColumnVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRFishSummaryVo; @@ -5026,6 +5027,69 @@ public class FbStationServiceImpl implements FbStationService { return sql.toString(); } + @Override + public List getBreedStageList(String stcd) { + List stageVOList = new ArrayList<>(); + + // 阶段1:选配 --- SD_FBBSMF_R(亲鱼档案管理记录表)+ SD_FBBSDEATH_R(亲鱼死亡记录表) + boolean bsmfExists = existsDataInTable("SD_FBBSMF_R", stcd); + boolean bsdeathExists = existsDataInTable("SD_FBBSDEATH_R", stcd); + BreedStageVO stage1 = new BreedStageVO(); + stage1.setKey("选配"); + stage1.setValue((bsmfExists || bsdeathExists) ? "1" : "2"); + stageVOList.add(stage1); + + // 阶段2:繁殖 --- SD_FBFISHARTINL_R(鱼类人工催产记录) + boolean fishArtinlExists = existsDataInTable("SD_FBFISHARTINL_R", stcd); + BreedStageVO stage2 = new BreedStageVO(); + stage2.setKey("繁殖"); + stage2.setValue(fishArtinlExists ? "1" : "2"); + stageVOList.add(stage2); + + // 阶段3:培育 --- SD_FBFISHBREED_R(鱼苗和鱼种培育记录)+ SD_FBSCWEM_R(苗种培育水环境监测记录表) + boolean fishbreedExists = existsDataInTable("SD_FBFISHBREED_R", stcd); + boolean scwemExists = existsDataInTable("SD_FBSCWEM_R", stcd); + BreedStageVO stage3 = new BreedStageVO(); + stage3.setKey("培育"); + stage3.setValue((fishbreedExists || scwemExists) ? "1" : "2"); + stageVOList.add(stage3); + + // 阶段4:防治 --- SD_FBFISHDPAC_R(鱼病防治记录表) + boolean fishDpacExists = existsDataInTable("SD_FBFISHDPAC_R", stcd); + BreedStageVO stage4 = new BreedStageVO(); + stage4.setKey("防治"); + stage4.setValue(fishDpacExists ? "1" : "2"); + stageVOList.add(stage4); + + return stageVOList; + } + + /** + * 检查指定表在指定 stcd 下是否存在未删除的数据 + */ + private boolean existsDataInTable(String tableName, String stcd) { + Map paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT 1 AS existFlag FROM ").append(tableName); + sql.append(" WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0 AND ROWNUM = 1"); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + null, sql.toString(), paramMap, DataExistsVo.class); + return CollUtil.isNotEmpty(list); + } + + private static class DataExistsVo { + private Integer existFlag; + + public Integer getExistFlag() { + return existFlag; + } + + public void setExistFlag(Integer existFlag) { + this.existFlag = existFlag; + } + } + private static class FbPointCountVo { private String stcd; private Long fcnt; From 3819262ee6ee12969397f5e778050f5772c8f6c4 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 29 Jul 2026 15:21:29 +0800 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E7=94=B5=E7=AB=99?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/qgc_base/domain/SdEngInfoBH.java | 36 +++++++++++++++ .../service/impl/SdEngInfoBHServiceImpl.java | 45 ++++++++++++++++--- 2 files changed, 75 insertions(+), 6 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBH.java index aaf8da45..b1704513 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBH.java @@ -60,6 +60,10 @@ public class SdEngInfoBH implements Serializable { @FieldChinese("是否启用") private Integer usfl; + /** 是否启用名称 */ + @TableField(exist = false) + private String usflName; + /** 水能利用数据是否接入 */ @FieldChinese("水能利用数据是否接入") private Integer dtin; @@ -219,11 +223,23 @@ public class SdEngInfoBH implements Serializable { @FieldChinese("建设状态") private String bldstt; + /** 站类 */ + @FieldChinese("站类") + private String sttp; + + /** 站类名称 */ + @TableField(exist = false) + private String sttpName; + /** 建设状态分类 */ @TableField("BLDSTT_CODE") @FieldChinese("建设状态分类") private Integer bldsttCode; + /** 建设状态分类名称 */ + @TableField(exist = false) + private String bldsttCodeName; + /** 工程类别 */ @FieldChinese("工程类别") private Integer engtp; @@ -236,6 +252,10 @@ public class SdEngInfoBH implements Serializable { @FieldChinese("工程规模(水库库容)") private Integer scrsc; + /** 工程规模(水库库容)名称 */ + @TableField(exist = false) + private String scrscName; + /** 工程等别 */ @FieldChinese("工程等别") private String prgr; @@ -1037,18 +1057,34 @@ public class SdEngInfoBH implements Serializable { @FieldChinese("环境监测数据接入情况") private Integer dtinEnv; + /** 环境监测数据接入情况描述 */ + @TableField(exist = false) + private String dtinEnvName; + /** 最新运行状态:1=运行中 2=未运行 */ @FieldChinese("最新运行状态") private Integer runState; + /** 最新运行状态描述 */ + @TableField(exist = false) + private String runStateName; + /** 告警状态 */ @FieldChinese("告警状态") private String warnState; + /** 告警状态描述 */ + @TableField(exist = false) + private String warnStateName; + /** 开展环保自动检测工作状态:0=暂无数据 1=正常 */ @FieldChinese("开展环保自动检测工作状态") private Integer coenvwState; + /** 开展环保自动检测工作状态描述 */ + @TableField(exist = false) + private String coenvwStateName; + /** 在线地址 */ @FieldChinese("在线地址") private String url; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java index 1db399ec..805891fd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.annotation.FieldChinese; import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; @@ -45,9 +46,7 @@ import com.yfd.platform.qgc_base.service.IMsOperationLogService; import com.yfd.platform.qgc_base.service.ISdEngInfoBHService; import com.yfd.platform.qgc_eng.eq.entity.vo.LastTmEngEqDataVo; import com.yfd.platform.system.service.IAdminAuthService; -import com.yfd.platform.utils.QgcQueryWrapperUtil; -import com.yfd.platform.utils.RedisCacheUtil; -import com.yfd.platform.utils.SecurityUtils; +import com.yfd.platform.utils.*; import jakarta.annotation.Resource; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; @@ -66,13 +65,46 @@ import java.util.stream.Collectors; */ @Service public class SdEngInfoBHServiceImpl extends ServiceImpl implements ISdEngInfoBHService { - + private static final String TABLE_NAME = "SD_FISHDICTORY_B"; private static final Map ENG_CODE_NAME_FIELD_MAP = new LinkedHashMap<>(); @Resource private RedisCacheUtil redisCacheUtil; @Resource private IDataScopeFilterService dataScopeFilterService; + @Resource + private DictCodeToNameConverter dictCodeToNameConverter; + + /** + * 代码转名称元数据配置列表(静态初始化) + *

+ * 每个模块的 ServiceImpl 中可按需定义自己的 codeToNameMetadataBoList, + * 在查询方法返回前调用 dictCodeToNameConverter.convertCodeToName(voList, codeToNameMetadataBoList) + * 即可自动将 code 字段转为对应的 name 字段。 + *

+ * + *
+     * 使用示例:
+     * // 在查询方法末尾调用:
+     * dictCodeToNameConverter.convertCodeToName(voList, CODE_TO_NAME_META_LIST);
+     * 
+ */ + private static final List CODE_TO_NAME_META_LIST = new ArrayList<>(); + + static { + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtin").modifyProperty("dtinName").dictType("STATIC").dictSource("DTIN").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("mway").modifyProperty("mwayName").dictType("STATIC").dictSource("MWAY").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinEnv").modifyProperty("dtinEnvName").dictType("STATIC").dictSource("DTIN_ENV").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("usfl").modifyProperty("usflName").dictType("STATIC").dictSource("USFL").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("runState").modifyProperty("runStateName").dictType("STATIC").dictSource("RUN_STATE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("warnState").modifyProperty("warnStateName").dictType("STATIC").dictSource("WARN_STATE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("coenvwState").modifyProperty("coenvwStateName").dictType("STATIC").dictSource("COENVW_STATE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("scrsc").modifyProperty("scrscStateName").dictType("STATIC").dictSource("SCRSC").build()); + } + + static { ENG_CODE_NAME_FIELD_MAP.put("baseId", "baseName"); ENG_CODE_NAME_FIELD_MAP.put("hbrvcd", "hbrvcdName"); @@ -252,10 +284,11 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl Date: Wed, 29 Jul 2026 16:50:53 +0800 Subject: [PATCH 5/5] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E7=94=B5=E7=AB=99?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/qgc_base/domain/SdEngInfoBH.java | 55 +++++++++++++++++++ .../service/impl/SdEngInfoBHServiceImpl.java | 29 ++++++++-- 2 files changed, 80 insertions(+), 4 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBH.java index b1704513..cec92071 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBH.java @@ -244,6 +244,10 @@ public class SdEngInfoBH implements Serializable { @FieldChinese("工程类别") private Integer engtp; + /** 工程类别名称 */ + @TableField(exist = false) + private String engtpName; + /** 工程规模 */ @FieldChinese("工程规模") private Integer prsc; @@ -260,10 +264,18 @@ public class SdEngInfoBH implements Serializable { @FieldChinese("工程等别") private String prgr; + /** 工程等别名称 */ + @TableField(exist = false) + private String prgrName; + /** 电站-主要功能 */ @FieldChinese("电站-主要功能") private String fn; + /** 电站-主要功能名称 */ + @TableField(exist = false) + private String fnName; + /** 地震基本烈度 */ @FieldChinese("地震基本烈度") private String bsssin; @@ -276,31 +288,58 @@ public class SdEngInfoBH implements Serializable { @FieldChinese("是否调节水库") private Integer adjustEng; + /** 是否调节水库名称 */ + @TableField(exist = false) + private String adjustEngName; + /** 有无拦河坝 */ @TableField("ISHVBRRG") @FieldChinese("有无拦河坝") private String ishvrgrg; + /** 有无拦河坝名称 */ + @TableField(exist = false) + private String ishvrgrgName; + /** 水库调节性能 */ @FieldChinese("水库调节性能") private String rgcp; + @TableField(exist = false) + private String rgcpName; + /** 坝体材质 */ @FieldChinese("坝体材质") private Integer dmat; + /** 坝体材质名称 */ + @TableField(exist = false) + private String dmatName; + /** 坝体类型 */ @FieldChinese("坝体类型") private String dmtp; + /** 坝体类型名称 */ + @TableField(exist = false) + private String dmtpName; + /** 开发方式 */ @FieldChinese("开发方式") private String dvtp; + /** 开发方式名称 */ + @TableField(exist = false) + private String dvtpName; + /** 建设类型 */ @FieldChinese("建设类型") private String cntp; + /** 建设类型名称 */ + @TableField(exist = false) + private String cntpName; + /** 管理单位 */ @FieldChinese("管理单位") private String mnun; @@ -313,6 +352,10 @@ public class SdEngInfoBH implements Serializable { @FieldChinese("归属部门") private String blsys; + /** 归属部门名称 */ + @TableField(exist = false) + private String blsysName; + /** 绕经度方向旋转矩阵值 */ @FieldChinese("绕经度方向旋转矩阵值") private Double roll; @@ -333,6 +376,10 @@ public class SdEngInfoBH implements Serializable { @FieldChinese("是否受下游顶托") private String impdstrz; + /** 是否受下游顶托名称 */ + @TableField(exist = false) + private String impdstrzName; + /** 工程概况 */ @FieldChinese("工程概况") private String prov; @@ -851,6 +898,10 @@ public class SdEngInfoBH implements Serializable { @FieldChinese("航道级别") private String chngrd; + /** 渠道级别名称 */ + @TableField(exist = false) + private String chngrdName; + /** 渠化航道里程 */ @FieldChinese("渠化航道里程") private Double chnlnth; @@ -988,6 +1039,10 @@ public class SdEngInfoBH implements Serializable { @FieldChinese("是否主要流域电站") private Integer chiefbasineng; + /** 是否主要流域电站名称 */ + @TableField(exist = false) + private String chiefbasinengName; + /** 蓄水开始时间 */ @FieldChinese("蓄水开始时间") private String swsdt; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java index 805891fd..1b275306 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java @@ -102,6 +102,21 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl