feat: 沿程生态流量变化(环保部小时数据)

This commit is contained in:
tangwei 2026-06-03 18:40:19 +08:00
parent ac21220e8f
commit 33e63d12a4
4 changed files with 199 additions and 0 deletions

View File

@ -51,6 +51,12 @@ public class EngEqDataController {
return ResponseResult.successData(engEqDataService.getQgcDayKendoListCust(dataSourceRequest)); 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") @PostMapping("/interval/qgc/getQgcStaticData")
@Operation(summary = "生态流量达标率区间范围统计(一级页面)") @Operation(summary = "生态流量达标率区间范围统计(一级页面)")
public ResponseResult getQgcStaticData(@RequestBody DataSourceRequest dataSourceRequest) { public ResponseResult getQgcStaticData(@RequestBody DataSourceRequest dataSourceRequest) {

View File

@ -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;
}

View File

@ -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.EngEqDayIntervalVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqHourIntervalVo; 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.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.EngEqRateCountVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqVmsstbprptVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqVmsstbprptVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.QgcQecStaticVo; import com.yfd.platform.qgc_eng.eq.entity.vo.QgcQecStaticVo;
@ -21,6 +22,8 @@ public interface EngEqDataService {
DataSourceResult<EngEqDayIntervalVo> getQgcDayKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult<EngEqDayIntervalVo> getQgcDayKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<EngQecAlongVo> getQgcHourVAlongKendoListCust(DataSourceRequest dataSourceRequest);
QgcQecStaticVo getQgcStaticData(DataSourceRequest dataSourceRequest, String type); QgcQecStaticVo getQgcStaticData(DataSourceRequest dataSourceRequest, String type);
DataSourceResult<WbsbVo> getWbsbList(DataSourceRequest dataSourceRequest); DataSourceResult<WbsbVo> getWbsbList(DataSourceRequest dataSourceRequest);

View File

@ -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.EngEqDayIntervalVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqHourIntervalVo; 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.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.EngEqRateCountVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqStaticIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqStaticIntervalVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqVmsstbprptVo; 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.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Date;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -81,6 +83,52 @@ public class EngEqDataServiceImpl implements EngEqDataService {
return queryDayIntervalGroupList(dataSourceRequest, loadOptions); return queryDayIntervalGroupList(dataSourceRequest, loadOptions);
} }
@Override
public DataSourceResult<EngQecAlongVo> 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<String, Object> 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<EngQecAlongVo> list = microservicDynamicSQLMapper.getAllListWithResultType(
buildQgcHourVAlongSql(baseId, rvcd), paramMap, EngQecAlongVo.class);
DataSourceResult<EngQecAlongVo> 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 @Override
public QgcQecStaticVo getQgcStaticData(DataSourceRequest dataSourceRequest, String type) { public QgcQecStaticVo getQgcStaticData(DataSourceRequest dataSourceRequest, String type) {
List<EngEqStaticIntervalVo> intervalList = queryStaticIntervals(dataSourceRequest, type); List<EngEqStaticIntervalVo> intervalList = queryStaticIntervals(dataSourceRequest, type);
@ -682,6 +730,51 @@ public class EngEqDataServiceImpl implements EngEqDataService {
"GROUP BY dayRun.STCD"; "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, private String buildHourIntervalViewSql(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap, Map<String, Object> paramMap,
int[] indexHolder) { int[] indexHolder) {
@ -2861,6 +2954,52 @@ public class EngEqDataServiceImpl implements EngEqDataService {
return values; 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<String> values) { private void collectFilterValues(DataSourceRequest.FilterDescriptor filter, String field, List<String> values) {
if (filter == null) { if (filter == null) {
return; return;