diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/controller/EngEqDataController.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/controller/EngEqDataController.java index 840d1d97..0de58b54 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/controller/EngEqDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/controller/EngEqDataController.java @@ -51,6 +51,12 @@ public class EngEqDataController { return ResponseResult.successData(engEqDataService.getQgcDayKendoListCust(dataSourceRequest)); } + @PostMapping("/engalong/statistics/qgcHourV/GetKendoListCust") + @Operation(summary = "沿程生态流量变化(环保部小时数据)") + public ResponseResult getQgcHourVAlongKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(engEqDataService.getQgcHourVAlongKendoListCust(dataSourceRequest)); + } + @PostMapping("/interval/qgc/getQgcStaticData") @Operation(summary = "生态流量达标率区间范围统计(一级页面)") public ResponseResult getQgcStaticData(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngQecAlongVo.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngQecAlongVo.java new file mode 100644 index 00000000..36e3dae4 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngQecAlongVo.java @@ -0,0 +1,51 @@ +package com.yfd.platform.qgc_eng.eq.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "沿程生态流量变化(环保部小时最新)") +public class EngQecAlongVo { + + @Schema(description = "类型") + private String sttp; + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "入库流量") + private BigDecimal qi; + + @Schema(description = "出库流量") + private BigDecimal qo; + + @Schema(description = "生态流量") + private BigDecimal qec; + + @Schema(description = "流域排序") + private Integer rvcdSort; + + @Schema(description = "生态流量限值") + private BigDecimal qecLimit; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "最新时间") + private Date tm; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "结果集中的最小非空时间") + private Date minTm; + + @Schema(description = "站点排序") + private Integer stcdSort; +} 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 a3d3944f..ae4673b1 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 @@ -5,6 +5,7 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqHourIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqIntervalVo; +import com.yfd.platform.qgc_eng.eq.entity.vo.EngQecAlongVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqRateCountVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqVmsstbprptVo; import com.yfd.platform.qgc_eng.eq.entity.vo.QgcQecStaticVo; @@ -21,6 +22,8 @@ public interface EngEqDataService { DataSourceResult getQgcDayKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getQgcHourVAlongKendoListCust(DataSourceRequest dataSourceRequest); + 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 259c55c0..74b88fa6 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 @@ -15,6 +15,7 @@ import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqHourIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqIntervalVo; +import com.yfd.platform.qgc_eng.eq.entity.vo.EngQecAlongVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqRateCountVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqStaticIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqVmsstbprptVo; @@ -34,6 +35,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Date; import java.math.RoundingMode; import java.time.LocalDate; import java.time.LocalDateTime; @@ -81,6 +83,52 @@ public class EngEqDataServiceImpl implements EngEqDataService { return queryDayIntervalGroupList(dataSourceRequest, loadOptions); } + @Override + public DataSourceResult getQgcHourVAlongKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String[] tmRange = resolveAlongTmRange(dataSourceRequest, loadOptions); + if (tmRange == null) { + throw new IllegalArgumentException("请选择开始日期和结束日期"); + } + String baseId = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); + String rvcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rvcd"); + + Map paramMap = new HashMap<>(); + paramMap.put("startTm", tmRange[0]); + paramMap.put("endTm", tmRange[1]); + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("baseId", baseId); + } + if (StrUtil.isNotBlank(rvcd)) { + paramMap.put("rvcd", rvcd); + } + + List list = microservicDynamicSQLMapper.getAllListWithResultType( + buildQgcHourVAlongSql(baseId, rvcd), paramMap, EngQecAlongVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setAggregates(new HashMap<>()); + if (CollUtil.isEmpty(list)) { + result.setTotal(0L); + result.setData(null); + return result; + } + + Date first = list.stream() + .map(EngQecAlongVo::getTm) + .filter(Objects::nonNull) + .findFirst() + .orElse(null); + for (EngQecAlongVo item : list) { + item.setMinTm(first); + item.setTm(first); + } + + result.setTotal((long) list.size()); + result.setData(list); + return result; + } + @Override public QgcQecStaticVo getQgcStaticData(DataSourceRequest dataSourceRequest, String type) { List intervalList = queryStaticIntervals(dataSourceRequest, type); @@ -682,6 +730,51 @@ public class EngEqDataServiceImpl implements EngEqDataService { "GROUP BY dayRun.STCD"; } + private String buildQgcHourVAlongSql(String baseId, String rvcd) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT along.RVCD AS rvcd, det.STCD AS stcd, eng.ENNM AS stnm, det.STTP AS sttp, ") + .append("along.ORDER_INDEX AS rvcdSort, det.SORT AS stcdSort, ") + .append("met.QEC AS qec, met.QI AS qi, met.QO AS qo, met.TM AS tm, met.QEC_LIMIT AS qecLimit ") + .append("FROM MS_ALONG_B along ") + .append("INNER JOIN MS_ALONGDET_B det ON along.ID = det.ALONG_ID ") + .append("INNER JOIN SD_ENGINFO_B_H eng ON eng.STCD = det.STCD ") + .append("LEFT JOIN (") + .append(" SELECT qec.STCD, run.QI AS QI, qec.QEC AS QEC, run.QO AS QO, qec.TM AS TM, qec.QEC_LIMIT AS QEC_LIMIT ") + .append(" FROM SD_QEC_R qec ") + .append(" LEFT JOIN SD_HYDROPW_R run ON qec.STCD = run.STCD AND qec.TM = run.TM AND NVL(run.IS_DELETED, 0) = 0 ") + .append(" WHERE NVL(qec.IS_DELETED, 0) = 0 ") + .append(" AND qec.TM BETWEEN TO_DATE(#{map.startTm}, 'YYYY-MM-DD HH24:MI:SS') ") + .append(" AND TO_DATE(#{map.endTm}, 'YYYY-MM-DD HH24:MI:SS') ") + .append(" AND qec.TM = (") + .append(" SELECT MAX(qec2.TM) ") + .append(" FROM SD_QEC_R qec2 ") + .append(" WHERE qec2.STCD = qec.STCD ") + .append(" AND NVL(qec2.IS_DELETED, 0) = 0 ") + .append(" AND qec2.TM BETWEEN TO_DATE(#{map.startTm}, 'YYYY-MM-DD HH24:MI:SS') ") + .append(" AND TO_DATE(#{map.endTm}, 'YYYY-MM-DD HH24:MI:SS')") + .append(" )") + .append(") met ON met.STCD = det.STCD ") + .append("WHERE det.STTP = 'ENG' ") + .append(" AND NVL(eng.IS_DELETED, 0) = 0 ") + .append(" AND NVL(eng.BLDSTT_CODE, 0) = 2 ") + .append(" AND along.CODE = 'common' ") + .append(" AND NVL(along.IS_DELETED, 0) = 0 ") + .append(" AND NVL(det.IS_DELETED, 0) = 0 "); + if (StrUtil.isNotBlank(baseId)) { + sql.append(" AND along.RVCD IN (") + .append("SELECT dic.HBRVCD FROM SD_HBRV_DIC dic ") + .append("WHERE dic.BASEID = #{map.baseId} ") + .append(" AND NVL(dic.IS_DELETED, 0) = 0 ") + .append(" AND NVL(dic.ENABLED, 1) = 1") + .append(") "); + } + if (StrUtil.isNotBlank(rvcd)) { + sql.append(" AND along.RVCD = #{map.rvcd} "); + } + sql.append("ORDER BY along.ORDER_INDEX, det.SORT"); + return sql.toString(); + } + private String buildHourIntervalViewSql(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { @@ -2861,6 +2954,52 @@ public class EngEqDataServiceImpl implements EngEqDataService { return values; } + private String[] resolveAlongTmRange(DataSourceRequest dataSourceRequest, DataSourceLoadOptionsBase loadOptions) { + String tmValue = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "tm"); + if (StrUtil.isNotBlank(tmValue) && tmValue.contains(",")) { + String[] arr = tmValue.split(","); + if (arr.length == 2 && StrUtil.isNotBlank(arr[0]) && StrUtil.isNotBlank(arr[1])) { + return new String[]{arr[0].trim(), arr[1].trim()}; + } + } + String[] range = new String[2]; + collectAlongTmRange(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), range); + if (StrUtil.isNotBlank(range[0]) && StrUtil.isNotBlank(range[1])) { + return range; + } + return null; + } + + private void collectAlongTmRange(DataSourceRequest.FilterDescriptor filter, String[] range) { + if (filter == null || range == null) { + return; + } + if (StrUtil.isNotBlank(filter.getField())) { + if (!"tm".equalsIgnoreCase(filter.getField()) || filter.getValue() == null) { + return; + } + String value = String.valueOf(filter.getValue()); + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + switch (operator) { + case "gt", "gte" -> range[0] = value; + case "lt", "lte" -> range[1] = value; + case "eq" -> { + range[0] = value; + range[1] = value; + } + default -> { + } + } + return; + } + if (CollUtil.isEmpty(filter.getFilters())) { + return; + } + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + collectAlongTmRange(child, range); + } + } + private void collectFilterValues(DataSourceRequest.FilterDescriptor filter, String field, List values) { if (filter == null) { return;