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

This commit is contained in:
tangwei 2026-06-03 14:48:53 +08:00
parent 312925b9bc
commit e7faf1e13c
4 changed files with 633 additions and 1 deletions

View File

@ -3,6 +3,7 @@ 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;
@ -39,6 +40,12 @@ public class EngEqDataController {
return ResponseResult.successData(engEqDataService.getIntervalKendoListCust(dataSourceRequest)); return ResponseResult.successData(engEqDataService.getIntervalKendoListCust(dataSourceRequest));
} }
@PostMapping("/interval/qgc/hour/GetKendoListCust")
@Operation(summary = "生态流量达标率小时统计(二级页面)")
public ResponseResult getQgcHourKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(engEqDataService.getQgcHourKendoListCust(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,137 @@
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 EngEqHourIntervalVo {
@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;
}

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.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;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqVmsstbprptVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqVmsstbprptVo;
@ -15,6 +16,8 @@ public interface EngEqDataService {
DataSourceResult<EngEqIntervalVo> getIntervalKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult<EngEqIntervalVo> getIntervalKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<EngEqHourIntervalVo> getQgcHourKendoListCust(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.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;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqStaticIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqStaticIntervalVo;
@ -61,6 +62,15 @@ public class EngEqDataServiceImpl implements EngEqDataService {
return queryIntervalGroupList(dataSourceRequest, loadOptions); return queryIntervalGroupList(dataSourceRequest, loadOptions);
} }
@Override
public DataSourceResult<EngEqHourIntervalVo> getQgcHourKendoListCust(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
if (CollUtil.isEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) {
return queryHourIntervalDetailList(dataSourceRequest, loadOptions);
}
return queryHourIntervalGroupList(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);
@ -248,6 +258,473 @@ public class EngEqDataServiceImpl implements EngEqDataService {
return result; return result;
} }
private DataSourceResult<EngEqHourIntervalVo> queryHourIntervalDetailList(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions) {
Map<String, Object> paramMap = new HashMap<>();
int[] indexHolder = new int[]{0};
String viewSql = buildHourIntervalViewSql(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 buildHourIntervalAggregateResult(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<EngEqHourIntervalVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, EngEqHourIntervalVo.class);
postProcessHourIntervalList(list);
DataSourceResult<EngEqHourIntervalVo> result = new DataSourceResult<>();
result.setData(list);
result.setTotal(page != null ? page.getTotal() : list.size());
result.setAggregates(new HashMap<>());
return result;
}
private DataSourceResult<EngEqHourIntervalVo> queryHourIntervalGroupList(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 = buildHourIntervalViewSql(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<EngEqHourIntervalVo> result = new DataSourceResult<>();
if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) {
result.setData((List<EngEqHourIntervalVo>) (List<?>) new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos)));
} else {
result.setData((List<EngEqHourIntervalVo>) (List<?>) new GroupHelper().group(rows, Arrays.asList(groupInfos)));
}
result.setTotal(0L);
result.setAggregates(new HashMap<>());
return result;
}
private DataSourceResult<EngEqHourIntervalVo> buildHourIntervalAggregateResult(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<EngEqHourIntervalVo> 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<EngEqHourIntervalVo> result = new DataSourceResult<>();
result.setData((List<EngEqHourIntervalVo>) (List<?>) list);
result.setTotal(0L);
result.setAggregates(new HashMap<>());
return result;
}
private void postProcessHourIntervalList(List<EngEqHourIntervalVo> list) {
if (CollUtil.isEmpty(list)) {
return;
}
for (EngEqHourIntervalVo 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 buildHourIntervalViewSql(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
boolean hasDtinFilter = CollUtil.isNotEmpty(findFilterValues(filter, "dtin"));
String validTimeFilter = buildIntervalTmFilterCondition(filter, "valid.TM", paramMap, indexHolder, 0);
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.QEC_RATE", "met.QR", "qecNoRule.STCD", false) + " AS qecInterval, " +
buildStaticIntervalSql("met.MWR_RATE", "met.MQR", "mwrNoRule.STCD", false) + " AS mwrInterval, " +
buildStaticIntervalSql("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 (" + buildHourMetricSourceSql(filter, paramMap, indexHolder, 0) + ") met ON met.STCD = eng.STCD " +
"LEFT JOIN (" + buildHourRunSourceSql(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 EXISTS (SELECT 1 FROM SD_QEC_R valid WHERE valid.STCD = eng.STCD AND NVL(valid.IS_DELETED, 0) = 0" +
(StrUtil.isNotBlank(validTimeFilter) ? " AND " + validTimeFilter : "") +
")";
}
private String buildHourMetricSourceSql(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder,
int yearOffset) {
return buildStaticAggregateSql("hour", filter, paramMap, indexHolder, yearOffset);
}
private String buildHourRunSourceSql(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder,
int yearOffset) {
String timeFilter = buildIntervalTmFilterCondition(filter, "run.TM", paramMap, indexHolder, yearOffset);
return "SELECT run.STCD, " +
"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, " +
"SUM(run.QO) AS QO_SUM " +
"FROM SD_HYDROPW_R run " +
"WHERE NVL(run.IS_DELETED, 0) = 0 " +
(StrUtil.isNotBlank(timeFilter) ? " AND " + timeFilter : "") +
" GROUP BY run.STCD";
}
private String buildHourPointStateSql(String rateColumn) {
return "CASE " +
"WHEN " + rateColumn + " IS NULL AND eng.PRSC = 1 THEN 'eef_1_none' " +
"WHEN " + rateColumn + " >= 95 AND eng.PRSC = 1 THEN 'eef_1_1' " +
"WHEN " + rateColumn + " >= 90 AND " + rateColumn + " < 95 AND eng.PRSC = 1 THEN 'eef_1_2' " +
"WHEN " + rateColumn + " >= 80 AND " + rateColumn + " < 90 AND eng.PRSC = 1 THEN 'eef_1_3' " +
"WHEN " + rateColumn + " < 80 AND eng.PRSC = 1 THEN 'eef_1_4' " +
"WHEN " + rateColumn + " IS NULL AND eng.PRSC IN (2, 3) THEN 'eef_2_none' " +
"WHEN " + rateColumn + " >= 95 AND eng.PRSC IN (2, 3) THEN 'eef_2_1' " +
"WHEN " + rateColumn + " >= 90 AND " + rateColumn + " < 95 AND eng.PRSC IN (2, 3) THEN 'eef_2_2' " +
"WHEN " + rateColumn + " >= 80 AND " + rateColumn + " < 90 AND eng.PRSC IN (2, 3) THEN 'eef_2_3' " +
"WHEN " + rateColumn + " < 80 AND eng.PRSC IN (2, 3) THEN 'eef_2_4' " +
"END";
}
private String buildHourDetailSelectSql(List<String> selectFields) {
Map<String, String> columns = hourFieldColumns();
List<String> selected = new ArrayList<>();
if (CollUtil.isEmpty(selectFields)) {
selected.addAll(columns.values());
} else {
for (String field : selectFields) {
String column = columns.get(field);
if (StrUtil.isNotBlank(column)) {
selected.add(column);
}
}
if (selected.isEmpty()) {
selected.addAll(columns.values());
}
}
return String.join(", ", selected);
}
private Map<String, String> hourFieldColumns() {
Map<String, String> columns = new LinkedHashMap<>();
columns.put("stcd", "t.stcd AS stcd");
columns.put("stnm", "t.stnm AS stnm");
columns.put("ennm", "t.ennm AS ennm");
columns.put("sttp", "t.sttp AS sttp");
columns.put("sttpCode", "t.sttpCode AS sttpCode");
columns.put("baseId", "t.baseId AS baseId");
columns.put("baseName", "t.baseName AS baseName");
columns.put("hbrvcd", "t.hbrvcd AS hbrvcd");
columns.put("hbrvcdName", "t.hbrvcdName AS hbrvcdName");
columns.put("addvcdName", "t.addvcdName AS addvcdName");
columns.put("lgtd", "t.lgtd AS lgtd");
columns.put("lttd", "t.lttd AS lttd");
columns.put("dtmel", "t.dtmel AS dtmel");
columns.put("ttpwr", "t.ttpwr AS ttpwr");
columns.put("normz", "t.normz AS normz");
columns.put("avq", "t.avq AS avq");
columns.put("dtin", "t.dtin AS dtin");
columns.put("dtinEnv", "t.dtinEnv AS dtinEnv");
columns.put("prsc", "t.prsc AS prsc");
columns.put("bldsttCcode", "t.bldsttCcode AS bldsttCcode");
columns.put("qi", "t.qi AS qi");
columns.put("qo", "t.qo AS qo");
columns.put("qec", "t.qec AS qec");
columns.put("rz", "t.rz AS rz");
columns.put("qecRate", "t.qecRate AS qecRate");
columns.put("mwrRate", "t.mwrRate AS mwrRate");
columns.put("avqRate", "t.avqRate AS avqRate");
columns.put("qecInterval", "t.qecInterval AS qecInterval");
columns.put("mwrInterval", "t.mwrInterval AS mwrInterval");
columns.put("avqInterval", "t.avqInterval AS avqInterval");
columns.put("anchoPointState", "t.anchoPointState AS anchoPointState");
columns.put("mwrPointState", "t.mwrPointState AS mwrPointState");
columns.put("avqPointState", "t.avqPointState AS avqPointState");
columns.put("qiSum", "t.qiSum AS qiSum");
columns.put("qoSum", "t.qoSum AS qoSum");
columns.put("fillWater", "t.fillWater AS fillWater");
columns.put("titleName", "t.titleName AS titleName");
columns.put("eqtp", "t.eqtp AS eqtp");
columns.put("baseStepSort", "t.baseStepSort AS baseStepSort");
columns.put("rvcdStepSort", "t.rvcdStepSort AS rvcdStepSort");
columns.put("rstcdStepSort", "t.rstcdStepSort AS rstcdStepSort");
columns.put("siteStepSort", "t.siteStepSort AS siteStepSort");
return columns;
}
private String buildHourFilterCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
if (filter == null) {
return "";
}
if (StrUtil.isNotBlank(filter.getField())) {
if ("tm".equalsIgnoreCase(filter.getField())) {
return "";
}
return buildHourLeafCondition(filter, paramMap, indexHolder);
}
if (CollUtil.isEmpty(filter.getFilters())) {
return "";
}
List<String> conditions = new ArrayList<>();
for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
String childSql = buildHourFilterCondition(child, paramMap, indexHolder);
if (StrUtil.isNotBlank(childSql)) {
conditions.add("(" + childSql + ")");
}
}
if (conditions.isEmpty()) {
return "";
}
String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ";
return String.join(logic, conditions);
}
private String buildHourLeafCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
String column = mapHourColumn(filter.getField());
if (StrUtil.isBlank(column)) {
return "";
}
return buildGenericCondition(column, filter, paramMap, indexHolder, false);
}
private String buildHourDetailOrderBySql(List<DataSourceRequest.SortDescriptor> sortList) {
if (CollUtil.isEmpty(sortList)) {
return " ORDER BY baseStepSort ASC, rvcdStepSort ASC, rstcdStepSort ASC, siteStepSort ASC, stcd ASC";
}
List<String> orders = new ArrayList<>();
for (DataSourceRequest.SortDescriptor sort : sortList) {
if (sort == null || StrUtil.isBlank(sort.getField())) {
continue;
}
String column = mapHourColumn(sort.getField());
if (StrUtil.isBlank(column)) {
continue;
}
String dir = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC";
orders.add(column + " " + dir);
}
if (orders.isEmpty()) {
return " ORDER BY baseStepSort ASC, rvcdStepSort ASC, rstcdStepSort ASC, siteStepSort ASC, stcd ASC";
}
return " ORDER BY " + String.join(", ", orders);
}
private String buildHourGroupOrderBySql(List<DataSourceRequest.GroupDescriptor> groups) {
if (CollUtil.isEmpty(groups)) {
return "";
}
List<String> orders = 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;
}
String dir = "desc".equalsIgnoreCase(descriptor.getDir()) || "des".equalsIgnoreCase(descriptor.getDir()) ? "DESC" : "ASC";
orders.add(column + " " + dir);
}
return orders.isEmpty() ? "" : " ORDER BY " + String.join(", ", orders);
}
private String mapHourColumn(String field) {
if (StrUtil.isBlank(field)) {
return null;
}
return switch (field) {
case "stcd" -> "t.stcd";
case "stnm", "ennm", "titleName" -> "t.ennm";
case "sttp", "sttpCode" -> "t.sttpCode";
case "baseId" -> "t.baseId";
case "baseName" -> "t.baseName";
case "hbrvcd" -> "t.hbrvcd";
case "hbrvcdName" -> "t.hbrvcdName";
case "addvcdName" -> "t.addvcdName";
case "lgtd" -> "t.lgtd";
case "lttd" -> "t.lttd";
case "dtmel" -> "t.dtmel";
case "ttpwr" -> "t.ttpwr";
case "normz" -> "t.normz";
case "avq" -> "t.avq";
case "dtin" -> "t.dtin";
case "dtinEnv" -> "t.dtinEnv";
case "prsc" -> "t.prsc";
case "bldsttCcode", "bldstt" -> "t.bldsttCcode";
case "qi" -> "t.qi";
case "qo" -> "t.qo";
case "qec" -> "t.qec";
case "rz" -> "t.rz";
case "qecRate" -> "t.qecRate";
case "mwrRate" -> "t.mwrRate";
case "avqRate" -> "t.avqRate";
case "qecInterval" -> "t.qecInterval";
case "mwrInterval" -> "t.mwrInterval";
case "avqInterval" -> "t.avqInterval";
case "anchoPointState" -> "t.anchoPointState";
case "mwrPointState" -> "t.mwrPointState";
case "avqPointState" -> "t.avqPointState";
case "qiSum" -> "t.qiSum";
case "qoSum" -> "t.qoSum";
case "fillWater" -> "(t.qoSum - t.qiSum)";
case "eqtp" -> "t.eqtp";
case "baseStepSort" -> "NVL(t.baseStepSort, 999999)";
case "rvcdStepSort" -> "NVL(t.rvcdStepSort, 999999)";
case "rstcdStepSort" -> "NVL(t.rstcdStepSort, 999999)";
case "siteStepSort" -> "NVL(t.siteStepSort, 999999)";
default -> null;
};
}
private DataSourceResult<EngEqDataVo> queryDetailList(DataSourceRequest dataSourceRequest, private DataSourceResult<EngEqDataVo> queryDetailList(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions) { DataSourceLoadOptionsBase loadOptions) {
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
@ -1360,9 +1837,17 @@ public class EngEqDataServiceImpl implements EngEqDataService {
DataSourceRequest.FilterDescriptor filter, DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap, Map<String, Object> paramMap,
int[] indexHolder) { int[] indexHolder) {
return buildStaticAggregateSql(type, filter, paramMap, indexHolder, 0);
}
private String buildStaticAggregateSql(String type,
DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder,
int yearOffset) {
String tableName = "day".equalsIgnoreCase(type) ? "SD_QECDAY_S" : "SD_QEC_R"; String tableName = "day".equalsIgnoreCase(type) ? "SD_QECDAY_S" : "SD_QEC_R";
String timeColumn = "day".equalsIgnoreCase(type) ? "data.DT" : "data.TM"; String timeColumn = "day".equalsIgnoreCase(type) ? "data.DT" : "data.TM";
String timeFilter = buildStaticTimeFilterCondition(filter, paramMap, indexHolder, timeColumn); String timeFilter = buildIntervalTmFilterCondition(filter, timeColumn, paramMap, indexHolder, yearOffset);
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
sql.append("SELECT data.STCD, ") sql.append("SELECT data.STCD, ")
.append("(CASE WHEN SUM(CASE WHEN data.SFDB IN (0, 1) THEN 1 ELSE 0 END) = 0 THEN NULL ") .append("(CASE WHEN SUM(CASE WHEN data.SFDB IN (0, 1) THEN 1 ELSE 0 END) = 0 THEN NULL ")