feat: 生态流量达标率日统计(二级页面)

This commit is contained in:
tangwei 2026-06-03 18:03:52 +08:00
parent 1abc8aa43a
commit ac21220e8f
4 changed files with 418 additions and 1 deletions

View File

@ -3,7 +3,6 @@ package com.yfd.platform.qgc_eng.eq.controller;
import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceLoadOptionsBase;
import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.config.ResponseResult; import com.yfd.platform.config.ResponseResult;
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.EngEqVmsstbprptVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqVmsstbprptVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqRateCountVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqRateCountVo;
@ -46,6 +45,12 @@ public class EngEqDataController {
return ResponseResult.successData(engEqDataService.getQgcHourKendoListCust(dataSourceRequest)); return ResponseResult.successData(engEqDataService.getQgcHourKendoListCust(dataSourceRequest));
} }
@PostMapping("/interval/qgc/day/GetKendoListCust")
@Operation(summary = "生态流量达标率日统计(二级页面)")
public ResponseResult getQgcDayKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(engEqDataService.getQgcDayKendoListCust(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,140 @@
package com.yfd.platform.qgc_eng.eq.entity.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Data
@Schema(description = "生态流量达标率日统计")
public class EngEqDayIntervalVo {
@Schema(description = "电站编码")
private String stcd;
@Schema(description = "电站名称")
private String stnm;
@Schema(description = "工程名称")
private String ennm;
@Schema(description = "站类")
private String sttp;
@Schema(description = "站类编码")
private String sttpCode;
@Schema(description = "基地编码")
private String baseId;
@Schema(description = "基地名称")
private String baseName;
@Schema(description = "基地流域编码")
private String hbrvcd;
@Schema(description = "基地流域名称")
private String hbrvcdName;
@Schema(description = "行政区名称")
private String addvcdName;
@Schema(description = "经度")
private BigDecimal lgtd;
@Schema(description = "纬度")
private BigDecimal lttd;
@Schema(description = "高程")
private BigDecimal dtmel;
@Schema(description = "装机容量")
private BigDecimal ttpwr;
@Schema(description = "正常蓄水位")
private BigDecimal normz;
@Schema(description = "多年平均流量")
private BigDecimal avq;
@Schema(description = "是否接入")
private Integer dtin;
@Schema(description = "环保数据接入状态")
private Integer dtinEnv;
@Schema(description = "工程规模")
private Integer prsc;
@Schema(description = "建设状态分类")
private Integer bldsttCcode;
@Schema(description = "入库流量")
private BigDecimal qi;
@Schema(description = "出库流量")
private BigDecimal qo;
@Schema(description = "生态流量")
private BigDecimal qec;
@Schema(description = "坝上水位")
private BigDecimal rz;
@Schema(description = "生态流量达标率")
private BigDecimal qecRate;
@Schema(description = "水利部生态流量达标率")
private BigDecimal mwrRate;
@Schema(description = "多年平均生态流量达标率")
private BigDecimal avqRate;
@Schema(description = "环保部区间")
private String qecInterval;
@Schema(description = "水利部区间")
private String mwrInterval;
@Schema(description = "多年平均区间")
private String avqInterval;
@Schema(description = "环保部锚点状态")
private String anchoPointState;
@Schema(description = "水利部锚点状态")
private String mwrPointState;
@Schema(description = "多年平均锚点状态")
private String avqPointState;
@Schema(description = "入库流量合计")
private BigDecimal qiSum;
@Schema(description = "出库流量合计")
private BigDecimal qoSum;
@Schema(description = "补水总量")
private BigDecimal fillWater;
@Schema(description = "标题名称")
private String titleName;
@Schema(description = "生态类型")
private String eqtp;
@Schema(description = "基地排序")
private Integer baseStepSort;
@Schema(description = "流域排序")
private Integer rvcdStepSort;
@Schema(description = "电站排序")
private Integer rstcdStepSort;
@Schema(description = "站点排序")
private Integer siteStepSort;
@Schema(description = "最新时间的一条数据")
private LastTmEngEqDataVo lastTmEngEqDataVo;
}

View File

@ -2,6 +2,7 @@ package com.yfd.platform.qgc_eng.eq.service;
import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult; 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.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.EngEqRateCountVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqRateCountVo;
@ -18,6 +19,8 @@ public interface EngEqDataService {
DataSourceResult<EngEqHourIntervalVo> getQgcHourKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult<EngEqHourIntervalVo> getQgcHourKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<EngEqDayIntervalVo> getQgcDayKendoListCust(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

@ -12,6 +12,7 @@ import com.yfd.platform.common.MicroservicDynamicSQLMapper;
import com.yfd.platform.common.enums.QecIntervalEnum; import com.yfd.platform.common.enums.QecIntervalEnum;
import com.yfd.platform.common.enums.ShowEnum; import com.yfd.platform.common.enums.ShowEnum;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDataVo; 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.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.EngEqRateCountVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqRateCountVo;
@ -71,6 +72,15 @@ public class EngEqDataServiceImpl implements EngEqDataService {
return queryHourIntervalGroupList(dataSourceRequest, loadOptions); return queryHourIntervalGroupList(dataSourceRequest, loadOptions);
} }
@Override
public DataSourceResult<EngEqDayIntervalVo> getQgcDayKendoListCust(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
if (CollUtil.isEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) {
return queryDayIntervalDetailList(dataSourceRequest, loadOptions);
}
return queryDayIntervalGroupList(dataSourceRequest, loadOptions);
}
@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);
@ -413,6 +423,265 @@ public class EngEqDataServiceImpl implements EngEqDataService {
} }
} }
private DataSourceResult<EngEqDayIntervalVo> queryDayIntervalDetailList(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions) {
Map<String, Object> paramMap = new HashMap<>();
int[] indexHolder = new int[]{0};
String viewSql = buildDayIntervalViewSql(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, indexHolder);
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append(buildHourDetailSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect()))
.append(" FROM (")
.append(viewSql)
.append(") t WHERE 1 = 1 ");
String filterSql = buildHourFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, indexHolder);
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql).append(" ");
}
if (CollUtil.isNotEmpty(dataSourceRequest == null ? null : dataSourceRequest.getAggregate())
&& "average".equalsIgnoreCase(dataSourceRequest.getAggregate().get(0).getAggregate())) {
return buildDayIntervalAggregateResult(dataSourceRequest, sql.toString(), paramMap);
}
sql.append(buildHourDetailOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()));
Page<?> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
List<EngEqDayIntervalVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, EngEqDayIntervalVo.class);
postProcessDayIntervalList(list);
DataSourceResult<EngEqDayIntervalVo> result = new DataSourceResult<>();
result.setData(list);
result.setTotal(page != null ? page.getTotal() : list.size());
result.setAggregates(new HashMap<>());
return result;
}
private DataSourceResult<EngEqDayIntervalVo> queryDayIntervalGroupList(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions) {
List<DataSourceRequest.GroupDescriptor> groups = dataSourceRequest.getGroup();
GroupingInfo[] groupInfos = loadOptions == null ? new GroupingInfo[0] : loadOptions.getGroup();
Map<String, Object> paramMap = new HashMap<>();
int[] indexHolder = new int[]{0};
String viewSql = buildDayIntervalViewSql(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, indexHolder);
List<String> selectItems = new ArrayList<>();
for (DataSourceRequest.GroupDescriptor descriptor : groups) {
if (descriptor == null || StrUtil.isBlank(descriptor.getField())) {
continue;
}
String column = mapHourColumn(descriptor.getField());
if (StrUtil.isBlank(column)) {
continue;
}
selectItems.add(column + " AS " + descriptor.getField().toUpperCase());
selectItems.add("COUNT(*) AS COUNT_" + descriptor.getField().toUpperCase());
if (CollUtil.isNotEmpty(descriptor.getAggregates())) {
for (DataSourceRequest.AggregateDescriptor aggregate : descriptor.getAggregates()) {
String aggregateColumn = mapHourColumn(aggregate.getField());
if (StrUtil.isBlank(aggregateColumn) || StrUtil.isBlank(aggregate.getAggregate())) {
continue;
}
selectItems.add(buildAggregateSql(aggregate.getAggregate(), aggregateColumn, aggregate.getField()));
}
}
}
if (selectItems.isEmpty()) {
selectItems.add("t.STCD AS STCD");
selectItems.add("COUNT(*) AS COUNT_STCD");
}
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append(String.join(", ", selectItems))
.append(" FROM (")
.append(viewSql)
.append(") t WHERE 1 = 1 ");
String filterSql = buildHourFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, indexHolder);
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql).append(" ");
}
List<String> groupByColumns = new ArrayList<>();
for (DataSourceRequest.GroupDescriptor descriptor : groups) {
if (descriptor == null || StrUtil.isBlank(descriptor.getField())) {
continue;
}
String column = mapHourColumn(descriptor.getField());
if (StrUtil.isNotBlank(column)) {
groupByColumns.add(column);
}
}
if (!groupByColumns.isEmpty()) {
sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)).append(" ");
}
sql.append(buildHourGroupOrderBySql(groups));
List<Map<String, Object>> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap);
DataSourceResult<EngEqDayIntervalVo> result = new DataSourceResult<>();
if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) {
result.setData((List<EngEqDayIntervalVo>) (List<?>) new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos)));
} else {
result.setData((List<EngEqDayIntervalVo>) (List<?>) new GroupHelper().group(rows, Arrays.asList(groupInfos)));
}
result.setTotal(0L);
result.setAggregates(new HashMap<>());
return result;
}
private DataSourceResult<EngEqDayIntervalVo> buildDayIntervalAggregateResult(DataSourceRequest dataSourceRequest,
String sourceSql,
Map<String, Object> paramMap) {
List<String> aggregateItems = new ArrayList<>();
for (DataSourceRequest.AggregateDescriptor item : dataSourceRequest.getAggregate()) {
if (item == null || !"average".equalsIgnoreCase(item.getAggregate())) {
continue;
}
String column = mapHourColumn(item.getField());
if (StrUtil.isBlank(column)) {
continue;
}
aggregateItems.add("AVG(" + column + ") AS " + item.getField());
}
if (aggregateItems.isEmpty()) {
DataSourceResult<EngEqDayIntervalVo> emptyResult = new DataSourceResult<>();
emptyResult.setData(new ArrayList<>());
emptyResult.setTotal(0L);
emptyResult.setAggregates(new HashMap<>());
return emptyResult;
}
String sql = "SELECT " + String.join(", ", aggregateItems) + " FROM (" + sourceSql + ")";
List<Map<String, Object>> list = microservicDynamicSQLMapper.pageAllList(null, sql, paramMap);
DataSourceResult<EngEqDayIntervalVo> result = new DataSourceResult<>();
result.setData((List<EngEqDayIntervalVo>) (List<?>) list);
result.setTotal(0L);
result.setAggregates(new HashMap<>());
return result;
}
private void postProcessDayIntervalList(List<EngEqDayIntervalVo> list) {
if (CollUtil.isEmpty(list)) {
return;
}
for (EngEqDayIntervalVo item : list) {
if (item == null) {
continue;
}
if (item.getQiSum() != null && item.getQoSum() != null) {
item.setFillWater(item.getQoSum().subtract(item.getQiSum()));
}
item.setTitleName(item.getEnnm());
item.setEqtp("QEC");
}
}
private String buildDayIntervalViewSql(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
boolean hasDtinFilter = CollUtil.isNotEmpty(findFilterValues(filter, "dtin"));
return "SELECT " +
"eng.STCD AS stcd, " +
"eng.ENNM AS stnm, " +
"eng.ENNM AS ennm, " +
"'ENG' AS sttp, " +
"'ENG' AS sttpCode, " +
"eng.BASE_ID AS baseId, " +
"hb.BASENAME AS baseName, " +
"eng.HBRVCD AS hbrvcd, " +
"hbrv.HBRVNM AS hbrvcdName, " +
"addv.ADDVNM AS addvcdName, " +
"eng.LGTD AS lgtd, " +
"eng.LTTD AS lttd, " +
"eng.ELEV AS dtmel, " +
"CAST(NULL AS NUMBER(18,6)) AS ttpwr, " +
"CAST(NULL AS NUMBER(18,6)) AS normz, " +
"eng.AVQ AS avq, " +
"eng.DTIN AS dtin, " +
"eng.DTIN_ENV AS dtinEnv, " +
"eng.PRSC AS prsc, " +
"eng.BLDSTT_CODE AS bldsttCcode, " +
"runAgg.QI AS qi, " +
"runAgg.QO AS qo, " +
"runAgg.QEC AS qec, " +
"runAgg.RZ AS rz, " +
buildIntervalRateDisplaySql("met.QEC_RATE") + " AS qecRate, " +
buildIntervalRateDisplaySql("met.MWR_RATE") + " AS mwrRate, " +
buildIntervalRateDisplaySql("met.AVQ_RATE") + " AS avqRate, " +
buildStaticIntervalSql("met.STCD", "met.QEC_RATE", "met.QR", "qecNoRule.STCD", false) + " AS qecInterval, " +
buildStaticIntervalSql("met.STCD", "met.MWR_RATE", "met.MQR", "mwrNoRule.STCD", false) + " AS mwrInterval, " +
buildStaticIntervalSql("met.STCD", "met.AVQ_RATE", "met.AQR", "eng.AVQ", true) + " AS avqInterval, " +
buildHourPointStateSql("met.QEC_RATE") + " AS anchoPointState, " +
buildHourPointStateSql("met.MWR_RATE") + " AS mwrPointState, " +
buildHourPointStateSql("met.AVQ_RATE") + " AS avqPointState, " +
"runAgg.QI_SUM AS qiSum, " +
"runAgg.QO_SUM AS qoSum, " +
"CAST(NULL AS NUMBER(18,6)) AS fillWater, " +
"CAST(NULL AS VARCHAR2(255)) AS titleName, " +
"CAST(NULL AS VARCHAR2(20)) AS eqtp, " +
"NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " +
"NVL(along.ORDER_INDEX, 999999) AS rvcdStepSort, " +
"NVL(rstSort.SORT, 999999) AS rstcdStepSort, " +
"NVL(siteSort.SORT, 999999) AS siteStepSort " +
"FROM SD_ENGINFO_B_H eng " +
"LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " +
"LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD AND hbrv.BASEID = eng.BASE_ID " +
" AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1 " +
"LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD " +
"LEFT JOIN MS_ALONG_B along ON along.RVCD = eng.HBRVCD AND along.CODE = 'common' AND NVL(along.IS_DELETED, 0) = 0 " +
"LEFT JOIN ( " +
" SELECT det.SORT, cfg.RVCD, det.STCD " +
" FROM MS_ALONGDET_B det " +
" INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID " +
" WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common' " +
") rstSort ON rstSort.RVCD = eng.HBRVCD AND rstSort.STCD = eng.STCD " +
"LEFT JOIN ( " +
" SELECT det.SORT, cfg.RVCD, det.STCD " +
" FROM MS_ALONGDET_B det " +
" INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID " +
" WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common' " +
") siteSort ON siteSort.RVCD = eng.HBRVCD AND siteSort.STCD = eng.STCD " +
"LEFT JOIN (" + buildDayMetricSourceSql(filter, paramMap, indexHolder, 0) + ") met ON met.STCD = eng.STCD " +
"LEFT JOIN (" + buildDayRunSourceSql(filter, paramMap, indexHolder, 0) + ") runAgg ON runAgg.STCD = eng.STCD " +
"LEFT JOIN (" + buildStaticRuleSql("EQMN") + ") qecNoRule ON qecNoRule.STCD = eng.STCD " +
"LEFT JOIN (" + buildStaticRuleSql("EQMNMWR") + ") mwrNoRule ON mwrNoRule.STCD = eng.STCD " +
"WHERE NVL(eng.IS_DELETED, 0) = 0 " +
" AND NVL(eng.BLDSTT_CODE, 0) = 2 " +
(hasDtinFilter ? "" : " AND NVL(eng.DTIN, 0) = 1 ") +
" AND NVL(eng.RUN_STATE, 0) = 4";
}
private String buildDayMetricSourceSql(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder,
int yearOffset) {
return buildStaticAggregateSql("day", filter, paramMap, indexHolder, yearOffset);
}
private String buildDayRunSourceSql(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder,
int yearOffset) {
String timeFilter = buildIntervalTmFilterCondition(filter, "run.TM", paramMap, indexHolder, yearOffset);
return "SELECT dayRun.STCD, " +
"AVG(dayRun.QI) AS QI, " +
"AVG(dayRun.QO) AS QO, " +
"AVG(dayRun.QEC) AS QEC, " +
"AVG(dayRun.RZ) AS RZ, " +
"SUM(dayRun.QI_SUM_DAY) AS QI_SUM, " +
"SUM(dayRun.QO_SUM_DAY) AS QO_SUM " +
"FROM (SELECT run.STCD, TRUNC(run.TM) AS DT, " +
"AVG(run.QI) AS QI, AVG(run.QO) AS QO, AVG(run.QEC) AS QEC, AVG(run.RZ) AS RZ, " +
"SUM(run.QI) AS QI_SUM_DAY, SUM(run.QO) AS QO_SUM_DAY " +
"FROM SD_HYDROPW_R run " +
"WHERE NVL(run.IS_DELETED, 0) = 0 " +
(StrUtil.isNotBlank(timeFilter) ? " AND " + timeFilter : "") +
" GROUP BY run.STCD, TRUNC(run.TM)) dayRun " +
"GROUP BY dayRun.STCD";
}
private String buildHourIntervalViewSql(DataSourceRequest.FilterDescriptor filter, private String buildHourIntervalViewSql(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap, Map<String, Object> paramMap,
int[] indexHolder) { int[] indexHolder) {