feat: 查询基地/基地流域树数据

This commit is contained in:
tangwei 2026-06-01 14:49:07 +08:00
parent b8163ce312
commit 95b6e1f341
4 changed files with 443 additions and 0 deletions

View File

@ -41,4 +41,10 @@ public class EngEqDataController {
QgcQecStaticVo result = engEqDataService.getQgcStaticData(dataSourceRequest, type);
return result == null ? ResponseResult.success() : ResponseResult.successData(result);
}
@PostMapping("/wbsb/GetKendoList")
@Operation(summary = "查询基地/基地流域树数据")
public ResponseResult getWbsbList(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(engEqDataService.getWbsbList(dataSourceRequest));
}
}

View File

@ -0,0 +1,60 @@
package com.yfd.platform.qgc_eng.eq.entity.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
@Schema(description = "基地/基地流域树节点")
public class WbsbVo implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String recordUser;
private Date recordTime;
private Date modifyTime;
private String displayRecordUser;
private String isolateType;
private String wbsType;
private String wbsCode;
private String wbsName;
private String wbsSname;
private String wbsNameEn;
private String wbsSnameEn;
private Integer enable;
private String description;
private String parentId;
private String parentCode;
private Integer treeLevel;
private Integer hasChildren;
private String objId;
private String topWbsType;
private String fullPath;
private Integer internal;
private BigDecimal lgtd;
private BigDecimal lttd;
private BigDecimal area;
private BigDecimal perimeter;
private String synopsis;
private String introduce;
private String logo;
private String inffile;
private Integer orderIndex;
private String filterContent;
private String departmentId;
private String systemId;
private String platformId;
private String reachWwqtg;
private BigDecimal maxElev;
private BigDecimal minElev;
private String datTp;
private String rvAg;
private Integer ifInnRv;
private String showControl;
private String stcd;
private String displayDepartment;
}

View File

@ -3,10 +3,13 @@ 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.QgcQecStaticVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.WbsbVo;
public interface EngEqDataService {
DataSourceResult getKendoListCust(DataSourceRequest dataSourceRequest);
QgcQecStaticVo getQgcStaticData(DataSourceRequest dataSourceRequest, String type);
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.EngEqStaticIntervalVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.QgcQecStaticVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.QgcQecVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.WbsbVo;
import com.yfd.platform.qgc_eng.eq.service.EngEqDataService;
import com.yfd.platform.utils.QgcQueryWrapperUtil;
import jakarta.annotation.Resource;
@ -108,6 +109,15 @@ public class EngEqDataServiceImpl implements EngEqDataService {
.setList(list);
}
@Override
public DataSourceResult<WbsbVo> getWbsbList(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
if (CollUtil.isEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) {
return queryWbsbDetailList(dataSourceRequest, loadOptions);
}
return queryWbsbGroupList(dataSourceRequest, loadOptions);
}
private DataSourceResult<EngEqDataVo> queryDetailList(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions) {
StringBuilder sql = new StringBuilder();
@ -134,6 +144,101 @@ public class EngEqDataServiceImpl implements EngEqDataService {
return result;
}
private DataSourceResult<WbsbVo> queryWbsbDetailList(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append(buildWbsbDetailSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect()))
.append(" FROM (")
.append(buildWbsbViewSql())
.append(") t WHERE 1 = 1 ");
Map<String, Object> paramMap = new HashMap<>();
String filterSql = buildWbsbFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0});
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql).append(" ");
}
sql.append(buildWbsbDetailOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()));
Page<?> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
List<WbsbVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WbsbVo.class);
DataSourceResult<WbsbVo> result = new DataSourceResult<>();
result.setData(list);
result.setTotal(page != null ? page.getTotal() : list.size());
result.setAggregates(new HashMap<>());
return result;
}
private DataSourceResult<WbsbVo> queryWbsbGroupList(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions) {
List<DataSourceRequest.GroupDescriptor> groups = dataSourceRequest.getGroup();
GroupingInfo[] groupInfos = loadOptions == null ? new GroupingInfo[0] : loadOptions.getGroup();
List<String> selectItems = new ArrayList<>();
for (DataSourceRequest.GroupDescriptor descriptor : groups) {
if (descriptor == null || StrUtil.isBlank(descriptor.getField())) {
continue;
}
String column = mapWbsbColumn(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 = mapWbsbColumn(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.WBSCODE AS WBSCODE");
selectItems.add("COUNT(*) AS COUNT_WBSCODE");
}
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append(String.join(", ", selectItems))
.append(" FROM (")
.append(buildWbsbViewSql())
.append(") t WHERE 1 = 1 ");
Map<String, Object> paramMap = new HashMap<>();
String filterSql = buildWbsbFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0});
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 = mapWbsbColumn(descriptor.getField());
if (StrUtil.isNotBlank(column)) {
groupByColumns.add(column);
}
}
if (!groupByColumns.isEmpty()) {
sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)).append(" ");
}
sql.append(buildWbsbGroupOrderBySql(groups));
List<Map<String, Object>> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap);
DataSourceResult<WbsbVo> result = new DataSourceResult<>();
if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) {
result.setData((List<WbsbVo>) (List<?>) new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos)));
} else {
result.setData((List<WbsbVo>) (List<?>) new GroupHelper().group(rows, Arrays.asList(groupInfos)));
}
result.setTotal((long) rows.size());
result.setAggregates(new HashMap<>());
return result;
}
private List<EngEqStaticIntervalVo> queryStaticIntervals(DataSourceRequest dataSourceRequest, String type) {
StringBuilder sql = new StringBuilder();
Map<String, Object> paramMap = new HashMap<>();
@ -459,6 +564,247 @@ public class EngEqDataServiceImpl implements EngEqDataService {
"END";
}
private String buildWbsbViewSql() {
return "SELECT " +
"t.BASEID AS id, " +
"t.RECORD_USER AS recordUser, " +
"t.RECORD_TIME AS recordTime, " +
"t.MODIFY_TIME AS modifyTime, " +
"CAST(NULL AS VARCHAR2(36)) AS displayRecordUser, " +
"CAST(NULL AS VARCHAR2(36)) AS isolateType, " +
"'PSB' AS wbsType, " +
"t.BASEID AS wbsCode, " +
"t.BASENAME AS wbsName, " +
"t.SHORTNAME AS wbsSname, " +
"CAST(NULL AS VARCHAR2(255)) AS wbsNameEn, " +
"CAST(NULL AS VARCHAR2(255)) AS wbsSnameEn, " +
"t.ENABLED AS enable, " +
"t.RMK AS description, " +
"CASE WHEN t.PBASEID = '0' THEN NULL ELSE t.PBASEID END AS parentId, " +
"CASE WHEN t.PBASEID = '0' THEN NULL ELSE t.PBASEID END AS parentCode, " +
"t.GRD AS treeLevel, " +
"CASE WHEN EXISTS (SELECT 1 FROM SD_HYDROBASE c WHERE c.PBASEID = t.BASEID AND NVL(c.IS_DELETED, 0) = 0) THEN 1 ELSE 0 END AS hasChildren, " +
"CAST(NULL AS VARCHAR2(36)) AS objId, " +
"CAST(NULL AS VARCHAR2(20)) AS topWbsType, " +
"t.PATH AS fullPath, " +
"1 AS internal, " +
"CAST(NULL AS NUMBER(10,6)) AS lgtd, " +
"CAST(NULL AS NUMBER(10,6)) AS lttd, " +
"CAST(NULL AS NUMBER(18,6)) AS area, " +
"CAST(NULL AS NUMBER(18,6)) AS perimeter, " +
"CAST(NULL AS VARCHAR2(4000)) AS synopsis, " +
"t.DES AS introduce, " +
"CAST(NULL AS VARCHAR2(255)) AS logo, " +
"CAST(NULL AS VARCHAR2(255)) AS inffile, " +
"t.ORDER_INDEX AS orderIndex, " +
"CAST(NULL AS VARCHAR2(255)) AS filterContent, " +
"CAST(NULL AS VARCHAR2(36)) AS departmentId, " +
"CAST(NULL AS VARCHAR2(36)) AS systemId, " +
"CAST(NULL AS VARCHAR2(36)) AS platformId, " +
"CAST(NULL AS VARCHAR2(50)) AS reachWwqtg, " +
"CAST(NULL AS NUMBER(10,6)) AS maxElev, " +
"CAST(NULL AS NUMBER(10,6)) AS minElev, " +
"CAST(NULL AS VARCHAR2(50)) AS datTp, " +
"CAST(NULL AS VARCHAR2(50)) AS rvAg, " +
"CAST(NULL AS NUMBER(1,0)) AS ifInnRv, " +
"CAST(NULL AS VARCHAR2(2000)) AS showControl, " +
"CAST(NULL AS VARCHAR2(36)) AS stcd, " +
"CAST(NULL AS VARCHAR2(255)) AS displayDepartment " +
"FROM SD_HYDROBASE t WHERE NVL(t.IS_DELETED, 0) = 0 " +
"UNION ALL " +
"SELECT " +
"t.HBRVCD || '_' || t.BASEID AS id, " +
"t.RECORD_USER AS recordUser, " +
"t.RECORD_TIME AS recordTime, " +
"t.MODIFY_TIME AS modifyTime, " +
"CAST(NULL AS VARCHAR2(36)) AS displayRecordUser, " +
"CAST(NULL AS VARCHAR2(36)) AS isolateType, " +
"'PSB_RVCD' AS wbsType, " +
"t.HBRVCD AS wbsCode, " +
"t.HBRVNM AS wbsName, " +
"CAST(NULL AS VARCHAR2(255)) AS wbsSname, " +
"CAST(NULL AS VARCHAR2(255)) AS wbsNameEn, " +
"CAST(NULL AS VARCHAR2(255)) AS wbsSnameEn, " +
"t.ENABLED AS enable, " +
"t.REMARK AS description, " +
"CASE WHEN t.PHBRVCD IS NULL OR t.PHBRVCD = '0' THEN NULL ELSE t.PHBRVCD || '_' || t.BASEID END AS parentId, " +
"CASE WHEN t.PHBRVCD IS NULL OR t.PHBRVCD = '0' THEN NULL ELSE t.PHBRVCD END AS parentCode, " +
"t.GRD AS treeLevel, " +
"CASE WHEN EXISTS (SELECT 1 FROM SD_HBRV_DIC c WHERE c.PHBRVCD = t.HBRVCD AND c.BASEID = t.BASEID AND NVL(c.IS_DELETED, 0) = 0) THEN 1 ELSE 0 END AS hasChildren, " +
"t.BASEID AS objId, " +
"'PSB' AS topWbsType, " +
"t.PATH AS fullPath, " +
"1 AS internal, " +
"CAST(NULL AS NUMBER(10,6)) AS lgtd, " +
"CAST(NULL AS NUMBER(10,6)) AS lttd, " +
"CAST(NULL AS NUMBER(18,6)) AS area, " +
"CAST(NULL AS NUMBER(18,6)) AS perimeter, " +
"CAST(NULL AS VARCHAR2(4000)) AS synopsis, " +
"CAST(NULL AS VARCHAR2(4000)) AS introduce, " +
"CAST(NULL AS VARCHAR2(255)) AS logo, " +
"CAST(NULL AS VARCHAR2(255)) AS inffile, " +
"t.ORDER_INDEX AS orderIndex, " +
"CAST(NULL AS VARCHAR2(255)) AS filterContent, " +
"CAST(NULL AS VARCHAR2(36)) AS departmentId, " +
"CAST(NULL AS VARCHAR2(36)) AS systemId, " +
"CAST(NULL AS VARCHAR2(36)) AS platformId, " +
"CAST(NULL AS VARCHAR2(50)) AS reachWwqtg, " +
"CAST(NULL AS NUMBER(10,6)) AS maxElev, " +
"CAST(NULL AS NUMBER(10,6)) AS minElev, " +
"CAST(NULL AS VARCHAR2(50)) AS datTp, " +
"CAST(NULL AS VARCHAR2(50)) AS rvAg, " +
"CAST(NULL AS NUMBER(1,0)) AS ifInnRv, " +
"CAST(NULL AS VARCHAR2(2000)) AS showControl, " +
"CAST(NULL AS VARCHAR2(36)) AS stcd, " +
"CAST(NULL AS VARCHAR2(255)) AS displayDepartment " +
"FROM SD_HBRV_DIC t WHERE NVL(t.IS_DELETED, 0) = 0 AND t.ORDER_INDEX IS NOT NULL";
}
private String buildWbsbDetailSelectSql(List<String> selectFields) {
Map<String, String> columns = wbsbFieldColumns();
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> wbsbFieldColumns() {
Map<String, String> columns = new LinkedHashMap<>();
columns.put("id", "t.id AS id");
columns.put("recordUser", "t.recordUser AS recordUser");
columns.put("recordTime", "t.recordTime AS recordTime");
columns.put("modifyTime", "t.modifyTime AS modifyTime");
columns.put("displayRecordUser", "t.displayRecordUser AS displayRecordUser");
columns.put("isolateType", "t.isolateType AS isolateType");
columns.put("wbsType", "t.wbsType AS wbsType");
columns.put("wbsCode", "t.wbsCode AS wbsCode");
columns.put("wbsName", "t.wbsName AS wbsName");
columns.put("wbsSname", "t.wbsSname AS wbsSname");
columns.put("wbsNameEn", "t.wbsNameEn AS wbsNameEn");
columns.put("wbsSnameEn", "t.wbsSnameEn AS wbsSnameEn");
columns.put("enable", "t.enable AS enable");
columns.put("description", "t.description AS description");
columns.put("parentId", "t.parentId AS parentId");
columns.put("parentCode", "t.parentCode AS parentCode");
columns.put("treeLevel", "t.treeLevel AS treeLevel");
columns.put("hasChildren", "t.hasChildren AS hasChildren");
columns.put("objId", "t.objId AS objId");
columns.put("topWbsType", "t.topWbsType AS topWbsType");
columns.put("fullPath", "t.fullPath AS fullPath");
columns.put("internal", "t.internal AS internal");
columns.put("lgtd", "t.lgtd AS lgtd");
columns.put("lttd", "t.lttd AS lttd");
columns.put("area", "t.area AS area");
columns.put("perimeter", "t.perimeter AS perimeter");
columns.put("synopsis", "t.synopsis AS synopsis");
columns.put("introduce", "t.introduce AS introduce");
columns.put("logo", "t.logo AS logo");
columns.put("inffile", "t.inffile AS inffile");
columns.put("orderIndex", "t.orderIndex AS orderIndex");
columns.put("filterContent", "t.filterContent AS filterContent");
columns.put("departmentId", "t.departmentId AS departmentId");
columns.put("systemId", "t.systemId AS systemId");
columns.put("platformId", "t.platformId AS platformId");
columns.put("reachWwqtg", "t.reachWwqtg AS reachWwqtg");
columns.put("maxElev", "t.maxElev AS maxElev");
columns.put("minElev", "t.minElev AS minElev");
columns.put("datTp", "t.datTp AS datTp");
columns.put("rvAg", "t.rvAg AS rvAg");
columns.put("ifInnRv", "t.ifInnRv AS ifInnRv");
columns.put("showControl", "t.showControl AS showControl");
columns.put("stcd", "t.stcd AS stcd");
columns.put("displayDepartment", "t.displayDepartment AS displayDepartment");
return columns;
}
private String buildWbsbFilterCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
if (filter == null) {
return "";
}
if (StrUtil.isNotBlank(filter.getField())) {
return buildWbsbLeafCondition(filter, paramMap, indexHolder);
}
if (CollUtil.isEmpty(filter.getFilters())) {
return "";
}
List<String> conditions = new ArrayList<>();
for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
String childSql = buildWbsbFilterCondition(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 buildWbsbLeafCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
String column = mapWbsbColumn(filter.getField());
if (StrUtil.isBlank(column)) {
return "";
}
return buildGenericCondition(column, filter, paramMap, indexHolder, false);
}
private String buildWbsbDetailOrderBySql(List<DataSourceRequest.SortDescriptor> sortList) {
if (CollUtil.isEmpty(sortList)) {
return " ORDER BY NVL(t.orderIndex, 999999) ASC, t.wbsCode ASC";
}
List<String> orders = new ArrayList<>();
for (DataSourceRequest.SortDescriptor sort : sortList) {
if (sort == null || StrUtil.isBlank(sort.getField())) {
continue;
}
String column = mapWbsbColumn(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.orderIndex, 999999) ASC, t.wbsCode ASC";
}
return " ORDER BY " + String.join(", ", orders);
}
private String buildWbsbGroupOrderBySql(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 = mapWbsbColumn(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 buildFilterCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
@ -747,6 +1093,34 @@ public class EngEqDataServiceImpl implements EngEqDataService {
};
}
private String mapWbsbColumn(String field) {
if (StrUtil.isBlank(field)) {
return null;
}
return switch (field) {
case "id" -> "t.id";
case "wbsType" -> "t.wbsType";
case "wbsCode" -> "t.wbsCode";
case "wbsName" -> "t.wbsName";
case "wbsSname" -> "t.wbsSname";
case "enable" -> "t.enable";
case "description" -> "t.description";
case "parentId" -> "t.parentId";
case "parentCode" -> "t.parentCode";
case "treeLevel" -> "t.treeLevel";
case "hasChildren" -> "t.hasChildren";
case "objId", "objid" -> "t.objId";
case "topWbsType" -> "t.topWbsType";
case "fullPath" -> "t.fullPath";
case "internal" -> "t.internal";
case "introduce" -> "t.introduce";
case "orderIndex" -> "NVL(t.orderIndex, 999999)";
case "recordTime" -> "t.recordTime";
case "modifyTime" -> "t.modifyTime";
default -> null;
};
}
private String mapEqColumn(String field) {
if (StrUtil.isBlank(field)) {
return null;