From 94fde50aade07f6e192f01aa633366afd5256f5f Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 6 Aug 2026 13:46:22 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E7=BB=BC=E5=90=88?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E9=99=90=E5=80=BC=E5=92=8C=E5=A4=87=E6=B3=A8?= =?UTF-8?q?=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/config/SecurityConfig.java | 2 +- .../qgc_eng/eq/service/EngEqDataService.java | 21 +++ .../eq/service/impl/EngEqDataServiceImpl.java | 140 ++++++++++++++++++ .../service/impl/QgcExportServiceImpl.java | 21 ++- 4 files changed, 177 insertions(+), 7 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java index f8e9fd41..cc93de85 100644 --- a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java @@ -71,7 +71,7 @@ public class SecurityConfig { // .requestMatchers("/system/**").permitAll() .requestMatchers("/qgcExport/**").permitAll() // .requestMatchers("/eng/**").permitAll() -// .requestMatchers("/eq/**").permitAll() + .requestMatchers("/eq/**").permitAll() // .requestMatchers("/env/**").permitAll() // .requestMatchers("/warn/**").permitAll() // .requestMatchers("/threedroamb/**").permitAll() diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/EngEqDataService.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/EngEqDataService.java index 260c2bba..6dbcc43f 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/EngEqDataService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/EngEqDataService.java @@ -24,6 +24,7 @@ import com.yfd.platform.qgc_eng.eq.entity.vo.StcdInfoVo; import com.yfd.platform.qgc_eng.eq.entity.vo.WbsbVo; import java.util.List; +import java.util.Map; public interface EngEqDataService { @@ -53,6 +54,26 @@ public interface EngEqDataService { EngEqRuleVo getEngLimit(DataSourceRequest dataSourceRequest); + /** + * 根据测站编码和时间范围查询生态流量限值及来源 + * + * @param stcd 测站编码 + * @param startTime 开始时间 yyyy-MM-dd HH:mm:ss + * @param endTime 结束时间 yyyy-MM-dd HH:mm:ss + * @return 生态流量限值信息(含环保部/水利部限值及来源、多年平均流量及来源) + */ + EngEqRuleVo getEngLimitByTime(String stcd, String startTime, String endTime); + + /** + * 批量查询生态流量限值及来源 + * + * @param stcdList 测站编码列表 + * @param startTime 开始时间 yyyy-MM-dd HH:mm:ss + * @param endTime 结束时间 yyyy-MM-dd HH:mm:ss + * @return STCD → 生态流量限值信息 + */ + Map getEngLimitByTimeBatch(List stcdList, String startTime, String endTime); + QgcQecStaticVo getQgcStaticData(DataSourceRequest dataSourceRequest, String type); DataSourceResult getWbsbList(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java index c0a8d4e5..6f7d0543 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java @@ -47,9 +47,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.Date; import java.math.BigDecimal; import java.math.RoundingMode; @@ -57,6 +59,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; +import java.util.stream.Collectors; @Service public class EngEqDataServiceImpl implements EngEqDataService { @@ -978,6 +981,143 @@ public class EngEqDataServiceImpl implements EngEqDataService { return vo; } + @Override + public EngEqRuleVo getEngLimitByTime(String stcd, String startTime, String endTime) { + EngEqRuleVo vo = new EngEqRuleVo().setStcd(stcd); + + // 1. 查询电站信息(多年平均流量) + Map stationParamMap = new HashMap<>(); + stationParamMap.put("stcd", stcd); + List> stationList = microservicDynamicSQLMapper.pageAllList( + null, + "SELECT STCD, ENNM AS STNM, AVQ, AVQ_SRC FROM SD_ENGINFO_B_H " + + "WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0", + stationParamMap + ); + if (CollUtil.isNotEmpty(stationList)) { + Map station = stationList.get(0); + vo.setStnm(asString(station.get("STNM"))); + BigDecimal avq = toBigDecimal(station.get("AVQ")); + if (avq != null) { + vo.setAvqStr(stripTrailingZeros(avq)); + } + String avqSrc = asString(station.get("AVQ_SRC")); + if (StrUtil.isNotBlank(avqSrc)) { + vo.setAvqVlsr(avqSrc); + } + } + + // 2. 查询环保部限值规则 + List> eqmnList = queryEngLimitRuleDetails(stcd, startTime, endTime, "EQMN"); + vo.setEqmnStr(buildEngLimitValue(eqmnList)); + vo.setVlsr(buildEngLimitVlsr(eqmnList)); + + // 3. 查询水利部限值规则 + List> eqmnMwrList = queryEngLimitRuleDetails(stcd, startTime, endTime, "EQMNMWR"); + vo.setEqmnmwrStr(buildEngLimitValue(eqmnMwrList)); + vo.setMwrVlsr(buildEngLimitVlsr(eqmnMwrList)); + + return vo; + } + + @Override + public Map getEngLimitByTimeBatch(List stcdList, String startTime, String endTime) { + Map result = new LinkedHashMap<>(); + if (CollUtil.isEmpty(stcdList)) { + return result; + } + + // 把列表转为 ('A','B','C') 格式的字符串 + String stcdStr = stcdList.stream() + .map(s -> "'" + s + "'") // 手动加单引号 + .collect(Collectors.joining(",")); + + String sql = "SELECT STCD, ENNM AS STNM, AVQ, AVQ_SRC FROM SD_ENGINFO_B_H " + + "WHERE STCD IN (" + stcdStr + ") " + + "AND NVL(IS_DELETED, 0) = 0"; + +// 此时 paramMap 甚至可以传空,因为值已经写死在 SQL 里了 + List> stationList = microservicDynamicSQLMapper.pageAllList(null, sql, new HashMap<>()); + Map> stationMap = new LinkedHashMap<>(); + if (CollUtil.isNotEmpty(stationList)) { + for (Map row : stationList) { + stationMap.put(asString(row.get("STCD")), row); + } + } + + // 2. 逐个查询限值规则并组装结果 + for (String stcd : stcdList) { + EngEqRuleVo vo = new EngEqRuleVo().setStcd(stcd); + + Map station = stationMap.get(stcd); + if (station != null) { + vo.setStnm(asString(station.get("STNM"))); + BigDecimal avq = toBigDecimal(station.get("AVQ")); + if (avq != null) { + vo.setAvqStr(stripTrailingZeros(avq)); + } + String avqSrc = asString(station.get("AVQ_SRC")); + if (StrUtil.isNotBlank(avqSrc)) { + vo.setAvqVlsr(avqSrc); + } + } + + List> eqmnList = queryEngLimitRuleDetails(stcd, startTime, endTime, "EQMN"); + vo.setEqmnStr(buildEngLimitValue(eqmnList)); + vo.setVlsr(buildEngLimitVlsr(eqmnList)); + + List> eqmnMwrList = queryEngLimitRuleDetails(stcd, startTime, endTime, "EQMNMWR"); + vo.setEqmnmwrStr(buildEngLimitValue(eqmnMwrList)); + vo.setMwrVlsr(buildEngLimitVlsr(eqmnMwrList)); + + result.put(stcd, vo); + } + return result; + } + + /** + * 构建生态流量限值展示(不含前缀,仅时间段和限值) + */ + private String buildEngLimitValue(List> detailList) { + if (CollUtil.isEmpty(detailList)) { + return "无限值要求"; + } + List parts = new ArrayList<>(); + for (Map row : detailList) { + String beginTime = asString(row.get("BEGIN_TIME")); + String endTime = asString(row.get("END_TIME")); + BigDecimal minVal = toBigDecimal(row.get("MIN_VAL")); + if (StrUtil.length(beginTime) != 4 || StrUtil.length(endTime) != 4 || minVal == null) { + continue; + } + parts.add(String.format("%s月%s日~%s月%s日限值为:%s", + beginTime.substring(0, 2), beginTime.substring(2, 4), + endTime.substring(0, 2), endTime.substring(2, 4), + stripTrailingZeros(minVal))); + } + if (parts.isEmpty()) { + return "无限值要求"; + } + return String.join(";", parts); + } + + /** + * 提取限值来源(VLSR),去重后用逗号拼接 + */ + private String buildEngLimitVlsr(List> detailList) { + if (CollUtil.isEmpty(detailList)) { + return ""; + } + Set vlsrSet = new LinkedHashSet<>(); + for (Map row : detailList) { + String vlsr = asString(row.get("VLSR")); + if (StrUtil.isNotBlank(vlsr)) { + vlsrSet.add(vlsr); + } + } + return vlsrSet.isEmpty() ? "" : String.join(",", vlsrSet); + } + @Override public DataSourceResult getFidKendoListCust(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); diff --git a/backend/src/main/java/com/yfd/platform/qgc_export/service/impl/QgcExportServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_export/service/impl/QgcExportServiceImpl.java index bffd473d..9fb70f3e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_export/service/impl/QgcExportServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_export/service/impl/QgcExportServiceImpl.java @@ -15,6 +15,8 @@ import com.yfd.platform.qgc_export.mapper.SdQecdaySMapper; import com.yfd.platform.qgc_export.mapper.StationMappingMapper; import com.yfd.platform.qgc_export.processor.*; import com.yfd.platform.qgc_export.service.IQgcExportService; +import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqRuleVo; +import com.yfd.platform.qgc_eng.eq.service.EngEqDataService; import com.yfd.platform.utils.ExportZipUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -137,6 +139,9 @@ public class QgcExportServiceImpl implements IQgcExportService { @Resource private QecProcessor qecProcessor; + @Resource + private EngEqDataService engEqDataService; + private static final SimpleDateFormat SDF_TIME = new SimpleDateFormat("dd日 HH时"); private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @@ -418,34 +423,38 @@ public class QgcExportServiceImpl implements IQgcExportService { List> rows = new ArrayList<>(); rows.add(subRow); // 子标题作为第一行 + // 批量查询各测站的生态流量限值 + Map limitMap = engEqDataService.getEngLimitByTimeBatch(uniqueStcds, startStr, endStr); + for (String rstcd : stationOrder) { String stcd = rstcdToStcd.get(rstcd); String displayName = stationRes.getDisplayName(rstcd, sttp); String baseName = stationRes.getBaseName(rstcd, sttp); ComplianceStats s = stcd != null ? statsByStcd.get(stcd) : null; + EngEqRuleVo rule = stcd != null ? limitMap.get(stcd) : null; List row = new ArrayList<>(); // 环保部 row.add(displayName != null ? displayName : rstcd); row.add(baseName); - row.add(""); // 生态流量限值(暂空) + row.add(rule != null && rule.getEqmnStr() != null ? rule.getEqmnStr() : ""); row.add(s != null ? s.dailyHb : ""); row.add(s != null ? s.hourlyHb : ""); - row.add(""); // 备注(暂空) + row.add(rule != null && rule.getVlsr() != null ? rule.getVlsr() : ""); // 水利部 row.add(displayName != null ? displayName : rstcd); row.add(baseName); - row.add(""); + row.add(rule != null && rule.getEqmnmwrStr() != null ? rule.getEqmnmwrStr() : ""); row.add(s != null ? s.dailySl : ""); row.add(s != null ? s.hourlySl : ""); - row.add(""); + row.add(rule != null && rule.getMwrVlsr() != null ? rule.getMwrVlsr() : ""); // 多年平均 row.add(displayName != null ? displayName : rstcd); row.add(baseName); - row.add(""); + row.add(rule != null && rule.getAvqStr() != null ? rule.getAvqStr() : ""); row.add(s != null ? s.dailyDn : ""); row.add(s != null ? s.hourlyDn : ""); - row.add(""); + row.add(rule != null && rule.getAvqVlsr() != null ? rule.getAvqVlsr() : ""); rows.add(row); }