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 abff7d48..66190642 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 @@ -5,6 +5,7 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqBaseMsstbprptVo; +import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqBaseVmsstbprptVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDrtpDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqLimitQueryVo; @@ -81,6 +82,13 @@ public class EngEqDataController { return ResponseResult.successData(result); } + @PostMapping("/base/vmsstbprpt/GetKendoList") + @Operation(summary = "生态流量泄放设施统计查询") + public ResponseResult getBaseVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + DataSourceResult result = engEqDataService.getBaseVmsstbprptList(dataSourceRequest); + return ResponseResult.successData(result); + } + @PostMapping("/interval/qgc/hour/GetKendoListCust") @Operation(summary = "生态流量达标率小时统计(二级页面)") public ResponseResult getQgcHourKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqBaseVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqBaseVmsstbprptVo.java new file mode 100644 index 00000000..4b14d507 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqBaseVmsstbprptVo.java @@ -0,0 +1,61 @@ +package com.yfd.platform.qgc_eng.eq.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +@Data +@Schema(description = "生态流量泄放设施统计查询") +public class EngEqBaseVmsstbprptVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "设施类型编码") + private String sttpCode; + + @Schema(description = "设施类型名称") + private String sttpName; + + @Schema(description = "设施编码") + private String stcd; + + @Schema(description = "设施名称") + private String stnm; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String rstcdName; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "基地流域名称") + private String hbrvcdName; + + @Schema(description = "数据接入状态") + private Integer dtin; + + @Schema(description = "建设状态分类") + private Integer bldsttCode; + + @Schema(description = "基地排序") + private Integer baseStepSort; + + @Schema(description = "流域排序") + private Integer rvcdStepSort; + + @Schema(description = "所属电站排序") + private Integer rstcdStepSort; + + @Schema(description = "设施排序") + private Integer siteStepSort; +} 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 e1541b32..7f0a0bf8 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 @@ -3,6 +3,7 @@ package com.yfd.platform.qgc_eng.eq.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqBaseMsstbprptVo; +import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqBaseVmsstbprptVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDrtpDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayIntervalVo; @@ -35,6 +36,8 @@ public interface EngEqDataService { DataSourceResult getBaseMsstbprptList(DataSourceRequest dataSourceRequest); + DataSourceResult getBaseVmsstbprptList(DataSourceRequest dataSourceRequest); + DataSourceResult getQgcHourKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult getQgcDayKendoListCust(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 bb83777e..701cec27 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 @@ -13,6 +13,7 @@ import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.enums.QecIntervalEnum; import com.yfd.platform.common.enums.ShowEnum; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqBaseMsstbprptVo; +import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqBaseVmsstbprptVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDrtpDataVo; @@ -112,6 +113,15 @@ public class EngEqDataServiceImpl implements EngEqDataService { return queryBaseMsstbprptGroupList(dataSourceRequest, loadOptions); } + @Override + public DataSourceResult getBaseVmsstbprptList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + if (CollUtil.isEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) { + return queryBaseVmsstbprptDetailList(dataSourceRequest, loadOptions); + } + return queryBaseVmsstbprptGroupList(dataSourceRequest, loadOptions); + } + private DataSourceResult queryBaseMsstbprptDetailList(DataSourceRequest dataSourceRequest, DataSourceLoadOptionsBase loadOptions) { StringBuilder sql = new StringBuilder(); @@ -202,6 +212,9 @@ public class EngEqDataServiceImpl implements EngEqDataService { } else { result.setData((List) (List) new GroupHelper().group(rows, Arrays.asList(groupInfos))); } + if (CollUtil.isNotEmpty((List) result.getData()) && ((List) result.getData()).get(0) instanceof Group) { + populateBaseMsstbprptGroupKeyNames((List) (List) result.getData()); + } result.setTotal((long) rows.size()); result.setAggregates(new HashMap<>()); return result; @@ -212,14 +225,7 @@ public class EngEqDataServiceImpl implements EngEqDataService { "eq.STCD AS stcd, " + "eq.STNM AS stnm, " + "eq.STTP AS sttpCode, " + - "CASE eq.STTP " + - " WHEN 'EQ_1' THEN '生态放流孔' " + - " WHEN 'EQ_2' THEN '生态放流闸' " + - " WHEN 'EQ_3' THEN '生态放流洞' " + - " WHEN 'EQ_4' THEN '生态放流管' " + - " WHEN 'EQ_5' THEN '基荷发电' " + - " WHEN 'EQ_6' THEN '生态机组' " + - " ELSE eq.STTP END AS sttpName, " + + "NVL(sttp.STTP_NAME, eq.STTP) AS sttpName, " + "eq.RSTCD AS rstcd, " + "eng.ENNM AS rstcdName, " + "eq.BASE_ID AS baseId, " + @@ -238,6 +244,8 @@ public class EngEqDataServiceImpl implements EngEqDataService { "eq.TM AS tm, " + "eq.ORDER_INDEX AS orderIndex " + "FROM SD_EQ_B_H eq " + + "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = eq.STTP " + + " AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 " + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = eq.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eq.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " + "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eq.HBRVCD AND hbrv.BASEID = eq.BASE_ID " + @@ -291,6 +299,170 @@ public class EngEqDataServiceImpl implements EngEqDataService { return columns; } + private DataSourceResult queryBaseVmsstbprptDetailList(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildBaseVmsstbprptDetailSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildBaseVmsstbprptViewSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildBaseVmsstbprptFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildBaseVmsstbprptDetailOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, EngEqBaseVmsstbprptVo.class); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private DataSourceResult queryBaseVmsstbprptGroupList(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions) { + List groups = dataSourceRequest.getGroup(); + GroupingInfo[] groupInfos = loadOptions == null ? new GroupingInfo[0] : loadOptions.getGroup(); + List selectItems = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapBaseVmsstbprptColumn(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 = mapBaseVmsstbprptColumn(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(buildBaseVmsstbprptViewSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildBaseVmsstbprptFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + List groupByColumns = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapBaseVmsstbprptColumn(descriptor.getField()); + if (StrUtil.isNotBlank(column)) { + groupByColumns.add(column); + } + } + if (!groupByColumns.isEmpty()) { + sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)).append(" "); + } + sql.append(buildBaseVmsstbprptGroupOrderBySql(groups)); + + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + DataSourceResult result = new DataSourceResult<>(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List) new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos))); + } else { + result.setData((List) (List) new GroupHelper().group(rows, Arrays.asList(groupInfos))); + } + result.setTotal((long) rows.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildBaseVmsstbprptViewSql() { + return "SELECT " + + "eq.STTP AS sttpCode, " + + "NVL(sttp.STTP_NAME, eq.STTP) AS sttpName, " + + "eq.STCD AS stcd, " + + "eq.STNM AS stnm, " + + "eq.RSTCD AS rstcd, " + + "eng.ENNM AS rstcdName, " + + "eq.BASE_ID AS baseId, " + + "hb.BASENAME AS baseName, " + + "eq.HBRVCD AS hbrvcd, " + + "hbrv.HBRVNM AS hbrvcdName, " + + "eq.DTIN AS dtin, " + + "eq.BLDSTT_CODE AS bldsttCode, " + + "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " + + "NVL(along.ORDER_INDEX, 999999) AS rvcdStepSort, " + + "NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, " + + "NVL(eq.ORDER_INDEX, 999999) AS siteStepSort " + + "FROM SD_EQ_B_H eq " + + "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = eq.STTP " + + " AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLED, 1) = 1 " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = eq.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eq.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eq.HBRVCD AND hbrv.BASEID = eq.BASE_ID " + + " AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1 " + + "LEFT JOIN MS_ALONG_B along ON along.RVCD = eq.HBRVCD AND along.CODE = 'common' AND NVL(along.IS_DELETED, 0) = 0 " + + "WHERE NVL(eq.IS_DELETED, 0) = 0"; + } + + private String buildBaseVmsstbprptDetailSelectSql(List selectFields) { + Map columns = baseVmsstbprptFieldColumns(); + List 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 baseVmsstbprptFieldColumns() { + Map columns = new LinkedHashMap<>(); + columns.put("sttpCode", "t.sttpCode AS sttpCode"); + columns.put("sttpName", "t.sttpName AS sttpName"); + columns.put("stcd", "t.stcd AS stcd"); + columns.put("stnm", "t.stnm AS stnm"); + columns.put("rstcd", "t.rstcd AS rstcd"); + columns.put("rstcdName", "t.rstcdName AS rstcdName"); + 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("dtin", "t.dtin AS dtin"); + columns.put("bldsttCode", "t.bldsttCode AS bldsttCode"); + 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 DataSourceResult queryMsstbprptDetailList(DataSourceRequest dataSourceRequest, DataSourceLoadOptionsBase loadOptions) { StringBuilder sql = new StringBuilder(); @@ -1217,6 +1389,58 @@ public class EngEqDataServiceImpl implements EngEqDataService { populateHourDayGroupKeyNames(groups, baseNameCache, hbrvNameCache); } + private void populateBaseMsstbprptGroupKeyNames(List groups) { + if (CollUtil.isEmpty(groups)) { + return; + } + Map sttpNameCache = new HashMap<>(); + Map baseNameCache = new HashMap<>(); + Map hbrvNameCache = new HashMap<>(); + populateBaseMsstbprptGroupKeyNames(groups, sttpNameCache, baseNameCache, hbrvNameCache); + } + + private void populateBaseMsstbprptGroupKeyNames(List groups, + Map sttpNameCache, + Map baseNameCache, + Map hbrvNameCache) { + for (Group group : groups) { + if (group == null) { + continue; + } + if (StrUtil.isBlank(group.getKeyName())) { + group.setKeyName(resolveBaseMsstbprptGroupKeyName(group.getField(), group.getKey(), + sttpNameCache, baseNameCache, hbrvNameCache)); + } + if (CollUtil.isNotEmpty(group.getItems()) && group.getItems().get(0) instanceof Group) { + populateBaseMsstbprptGroupKeyNames((List) group.getItems(), sttpNameCache, baseNameCache, hbrvNameCache); + } + } + } + + private String resolveBaseMsstbprptGroupKeyName(Object field, + Object key, + Map sttpNameCache, + Map baseNameCache, + Map hbrvNameCache) { + if (field == null || key == null) { + return null; + } + String fieldName = String.valueOf(field); + String keyValue = String.valueOf(key); + if (StrUtil.isBlank(keyValue)) { + return null; + } + return switch (fieldName) { + case "sttpName", "stnm", "rstcdName", "baseName", "hbrvcdName", "bldsttCodeName", "dtinName" -> keyValue; + case "sttp", "sttpCode" -> StrUtil.blankToDefault(resolveSttpName(keyValue, sttpNameCache), keyValue); + case "baseId" -> StrUtil.blankToDefault(resolveBaseName(keyValue, baseNameCache), keyValue); + case "hbrvcd" -> StrUtil.blankToDefault(resolveHbrvName(keyValue, hbrvNameCache), keyValue); + case "dtin" -> resolveDtinName(keyValue); + case "bldsttCode" -> resolveBldsttName(keyValue); + default -> keyValue; + }; + } + private void populateHourDayGroupKeyNames(List groups, Map baseNameCache, Map hbrvNameCache) { @@ -1307,6 +1531,38 @@ public class EngEqDataServiceImpl implements EngEqDataService { return name == null ? null : String.valueOf(name); } + private String resolveSttpName(String sttpCode, Map cache) { + if (StrUtil.isBlank(sttpCode)) { + return null; + } + if (cache.containsKey(sttpCode)) { + return cache.get(sttpCode); + } + Map paramMap = new HashMap<>(); + paramMap.put("code", sttpCode); + List> rows = microservicDynamicSQLMapper.pageAllList(null, + "SELECT sttp.STTP_NAME AS name FROM SD_STTP_B sttp " + + "WHERE sttp.STTP_CODE = #{map.code} " + + "AND NVL(sttp.IS_DELETED, 0) = 0 " + + "AND NVL(sttp.ENABLE, 1) = 1 " + + "AND ROWNUM = 1", + paramMap); + String name = extractName(rows); + if (StrUtil.isBlank(name)) { + name = switch (sttpCode) { + case "EQ_1" -> "生态放流孔"; + case "EQ_2" -> "生态放流闸"; + case "EQ_3" -> "生态放流洞"; + case "EQ_4" -> "生态放流管"; + case "EQ_5" -> "基荷发电"; + case "EQ_6" -> "生态机组"; + default -> null; + }; + } + cache.put(sttpCode, name); + return name; + } + private String resolveDtinName(String keyValue) { return switch (keyValue) { case "1" -> "是"; @@ -2827,6 +3083,79 @@ public class EngEqDataServiceImpl implements EngEqDataService { return result; } + private String buildBaseVmsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + String column = mapBaseVmsstbprptColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + return buildGenericCondition(column, filter, paramMap, indexHolder, false); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildBaseVmsstbprptFilterCondition(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 buildBaseVmsstbprptDetailOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY NVL(t.baseStepSort, 999999) ASC, NVL(t.rvcdStepSort, 999999) ASC, " + + "NVL(t.rstcdStepSort, 999999) ASC, NVL(t.siteStepSort, 999999) ASC, t.stcd ASC"; + } + List orders = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sortList) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapBaseVmsstbprptColumn(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 NVL(t.baseStepSort, 999999) ASC, NVL(t.rvcdStepSort, 999999) ASC, " + + "NVL(t.rstcdStepSort, 999999) ASC, NVL(t.siteStepSort, 999999) ASC, t.stcd ASC"; + } + return " ORDER BY " + String.join(", ", orders); + } + + private String buildBaseVmsstbprptGroupOrderBySql(List groups) { + if (CollUtil.isEmpty(groups)) { + return ""; + } + List orders = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapBaseVmsstbprptColumn(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 DataSourceResult queryWbsbDetailList(DataSourceRequest dataSourceRequest, DataSourceLoadOptionsBase loadOptions) { StringBuilder sql = new StringBuilder(); @@ -5074,6 +5403,31 @@ public class EngEqDataServiceImpl implements EngEqDataService { }; } + private String mapBaseVmsstbprptColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "sttpCode" -> "t.sttpCode"; + case "sttpName" -> "t.sttpName"; + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "rstcd" -> "t.rstcd"; + case "rstcdName" -> "t.rstcdName"; + case "baseId" -> "t.baseId"; + case "baseName" -> "t.baseName"; + case "hbrvcd" -> "t.hbrvcd"; + case "hbrvcdName" -> "t.hbrvcdName"; + case "dtin" -> "t.dtin"; + case "bldsttCode" -> "t.bldsttCode"; + 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 String mapWbsbColumn(String field) { if (StrUtil.isBlank(field)) { return null;