From 64ef59380df0ad30cdd31709b4e4fa91ec036a29 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 23 Jun 2026 14:47:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E6=AE=96=E7=AB=99=E9=B1=BC?= =?UTF-8?q?=E7=A7=8D=E5=AE=8C=E6=88=90=E6=83=85=E5=86=B5=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 + .../fb/entity/vo/FbFishTypeFinishVo.java | 13 ++ .../qgc_env/fb/service/FbStationService.java | 3 + .../fb/service/impl/FbStationServiceImpl.java | 153 ++++++++++++++++++ 4 files changed, 175 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbFishTypeFinishVo.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 365c2b13..ff227fa1 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.getFbFlDataKendoListCust(dataSourceRequest)); } + @PostMapping("/fishType/GetKendoListCust") + @Operation(summary = "增殖站鱼种完成情况统计") + public ResponseResult getFishTypeKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fbStationService.getFishTypeKendoListCust(dataSourceRequest)); + } + @PostMapping("/msfbrdm/GetKendoListCust") @Operation(summary = "鱼类增殖站运行情况统计列表") public ResponseResult getMsfbrdmKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbFishTypeFinishVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbFishTypeFinishVo.java new file mode 100644 index 00000000..d930219e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbFishTypeFinishVo.java @@ -0,0 +1,13 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import lombok.Data; + +@Data +public class FbFishTypeFinishVo { + + private String stcd; + + private Integer finished; + + private Integer unfinished; +} 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 5b5976c0..1737b5fe 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 @@ -5,6 +5,7 @@ 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.FbFlDataVo; +import com.yfd.platform.qgc_env.fb.entity.vo.FbFishTypeFinishVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbRelatedYrVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbMsfbrdmQgcVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbResearchVo; @@ -26,6 +27,8 @@ public interface FbStationService { DataSourceResult getFbFlDataKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getFishTypeKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getMsfbrdmKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult getQgcMsfbrdmKendoListCust(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 d9291274..e4404592 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 @@ -15,6 +15,7 @@ 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; import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRFishTableVo; +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.FbFlDataVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbMsfbrdmQgcVo; @@ -83,6 +84,38 @@ public class FbStationServiceImpl implements FbStationService { return queryFbFlDataDetailList(dataSourceRequest, loadOptions); } + @Override + public DataSourceResult getFishTypeKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String rstcdFilter = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd"); + String stcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); + String startTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime"); + String endTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime"); + + Map paramMap = new HashMap<>(); + String sql = buildFishTypeFinishSql( + stcd, + parseFishTypeFilterValues(rstcdFilter), + parseFishTypeDate(startTime), + parseFishTypeDate(endTime), + paramMap + ) + buildFishTypeOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()); + + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql, + paramMap, + FbFishTypeFinishVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult> getMsstbprptList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -807,6 +840,126 @@ public class FbStationServiceImpl implements FbStationService { return null; } + private String buildFishTypeFinishSql(String stcd, + List rstcdList, + Date startTime, + Date endTime, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT temp.stcd AS stcd, ") + .append("SUM(CASE WHEN temp.bftp IS NOT NULL THEN 1 ELSE 0 END) AS finished, ") + .append("SUM(CASE WHEN temp.aftp IS NOT NULL THEN 1 ELSE 0 END) AS unfinished ") + .append("FROM ( ") + .append("SELECT a.RSTCD AS stcd, a.FTP AS aftp, b.FTP AS bftp ") + .append("FROM ( ") + .append("SELECT jhr.RSTCD, jhrs.FTP ") + .append("FROM SD_ENGFRPLAN_B jhr ") + .append("JOIN SD_ENGFRPLANDET_B jhrs ON jhr.ID = jhrs.RPJH_ID ") + .append("WHERE NVL(jhr.IS_DELETED, 0) = 0 AND NVL(jhrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "jhr", stcd, rstcdList, startTime, endTime, true, paramMap); + sql.append("GROUP BY jhr.RSTCD, jhrs.FTP ") + .append(") a ") + .append("LEFT JOIN ( ") + .append("SELECT imnr.RSTCD, imnrs.FTP ") + .append("FROM SD_ENGFR_R imnr ") + .append("JOIN SD_RPIMNFISH_R imnrs ON imnr.ID = imnrs.RPIMN_ID ") + .append("WHERE NVL(imnr.IS_DELETED, 0) = 0 AND NVL(imnrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "imnr", stcd, rstcdList, startTime, endTime, false, paramMap); + sql.append("GROUP BY imnr.RSTCD, imnrs.FTP ") + .append(") b ON a.RSTCD = b.RSTCD AND a.FTP = b.FTP ") + .append(") temp ") + .append("GROUP BY temp.stcd"); + return sql.toString(); + } + + private void appendFishTypeFilterSql(StringBuilder sql, + String alias, + String stcd, + List rstcdList, + Date startTime, + Date endTime, + boolean planSide, + Map paramMap) { + if (StrUtil.isNotBlank(stcd)) { + String key = "fishType" + alias + "Stcd"; + paramMap.put(key, stcd.trim()); + sql.append(" AND ").append(alias).append(".RSTCD = #{map.").append(key).append("} "); + } + if (CollUtil.isNotEmpty(rstcdList)) { + List placeholders = new ArrayList<>(); + for (int i = 0; i < rstcdList.size(); i++) { + String key = "fishType" + alias + "Rstcd" + i; + paramMap.put(key, rstcdList.get(i)); + placeholders.add("#{map." + key + "}"); + } + sql.append(" AND ").append(alias).append(".STCD IN (").append(String.join(", ", placeholders)).append(") "); + } + if (startTime != null) { + String key = "fishType" + alias + "StartTime"; + paramMap.put(key, startTime); + sql.append(" AND ").append(alias).append(planSide ? ".PLANSD" : ".TM") + .append(" >= #{map.").append(key).append("} "); + } + if (endTime != null) { + String key = "fishType" + alias + "EndTime"; + paramMap.put(key, endTime); + sql.append(" AND ").append(alias).append(planSide ? ".PLANED" : ".TM") + .append(" <= #{map.").append(key).append("} "); + } + } + + private String buildFishTypeOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return " ORDER BY stcd ASC"; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = switch (sort.getField()) { + case "stcd" -> "stcd"; + case "finished" -> "finished"; + case "unfinished" -> "unfinished"; + default -> null; + }; + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction); + } + if (orderByParts.isEmpty()) { + return " ORDER BY stcd ASC"; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + + private List parseFishTypeFilterValues(String rawValue) { + if (StrUtil.isBlank(rawValue)) { + return Collections.emptyList(); + } + return Arrays.stream(rawValue.replace("[", "") + .replace("]", "") + .replace("\"", "") + .split(",")) + .map(String::trim) + .filter(StrUtil::isNotBlank) + .distinct() + .toList(); + } + + private Date parseFishTypeDate(String value) { + if (StrUtil.isBlank(value)) { + return null; + } + try { + return DateUtil.parse(value.trim()); + } catch (Exception ex) { + return null; + } + } + private String buildOverviewStationListSql(String baseId, List stcdList, Map paramMap) {