feat: 根据条件查询水文流量站基础数据

This commit is contained in:
tangwei 2026-05-29 09:21:40 +08:00
parent 0d1abdf94b
commit 0ad86754e7
4 changed files with 385 additions and 0 deletions

View File

@ -1,5 +1,6 @@
package com.yfd.platform.env.zq.controller; package com.yfd.platform.env.zq.controller;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.config.ResponseResult; import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.env.zq.service.ZqMonitorService; import com.yfd.platform.env.zq.service.ZqMonitorService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
@ -7,6 +8,8 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -20,6 +23,12 @@ public class ZqMonitorController {
@Resource @Resource
private ZqMonitorService zqMonitorService; private ZqMonitorService zqMonitorService;
@PostMapping("/msstbprpt/GetKendoList")
@Operation(summary = "根据条件查询水文流量站基础数据")
public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(zqMonitorService.getMsstbprptList(dataSourceRequest));
}
@GetMapping("/msstbprpt/getStcdInfo") @GetMapping("/msstbprpt/getStcdInfo")
@Operation(summary = "根据站码查询单条水文站基础数据") @Operation(summary = "根据站码查询单条水文站基础数据")
public ResponseResult getStcdInfo(@RequestParam String stcd) { public ResponseResult getStcdInfo(@RequestParam String stcd) {

View File

@ -21,6 +21,9 @@ public class ZqBaseInfoVo {
@Schema(description = "站类") @Schema(description = "站类")
private String sttp; private String sttp;
@Schema(description = "站类编码")
private String sttpCode;
@Schema(description = "经度") @Schema(description = "经度")
private Double lgtd; private Double lgtd;

View File

@ -1,8 +1,12 @@
package com.yfd.platform.env.zq.service; package com.yfd.platform.env.zq.service;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.env.zq.entity.vo.ZqBaseInfoVo; import com.yfd.platform.env.zq.entity.vo.ZqBaseInfoVo;
public interface ZqMonitorService { public interface ZqMonitorService {
DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest);
ZqBaseInfoVo getStcdInfo(String stcd); ZqBaseInfoVo getStcdInfo(String stcd);
} }

View File

@ -1,13 +1,21 @@
package com.yfd.platform.env.zq.service.impl; package com.yfd.platform.env.zq.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yfd.platform.common.DataSourceLoadOptionsBase;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.MicroservicDynamicSQLMapper;
import com.yfd.platform.common.exception.BizException; import com.yfd.platform.common.exception.BizException;
import com.yfd.platform.env.zq.entity.vo.ZqBaseInfoVo; import com.yfd.platform.env.zq.entity.vo.ZqBaseInfoVo;
import com.yfd.platform.env.zq.service.ZqMonitorService; import com.yfd.platform.env.zq.service.ZqMonitorService;
import com.yfd.platform.utils.QgcQueryWrapperUtil;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -18,6 +26,81 @@ public class ZqMonitorServiceImpl implements ZqMonitorService {
@Resource @Resource
private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; private MicroservicDynamicSQLMapper microservicDynamicSQLMapper;
@Override
public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
if (CollUtil.isEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append(buildMsstbprptDetailSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect()))
.append(" FROM SD_RIVER_B_H t ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD ")
.append(" AND hbrv.BASEID = eng.BASE_ID ")
.append(" AND NVL(hbrv.IS_DELETED, 0) = 0 ")
.append(" AND NVL(hbrv.ENABLED, 1) = 1 ")
.append("LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD ")
.append("LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD ")
.append("WHERE NVL(t.IS_DELETED, 0) = 0 ");
Map<String, Object> paramMap = new HashMap<>();
String filterSql = buildMsstbprptFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0});
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql).append(" ");
}
sql.append(buildMsstbprptDetailOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()));
Page<?> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
List<ZqBaseInfoVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, ZqBaseInfoVo.class);
DataSourceResult<ZqBaseInfoVo> result = new DataSourceResult<>();
result.setData(list);
result.setTotal(page != null ? page.getTotal() : list.size());
result.setAggregates(new HashMap<>());
return result;
}
String groupField = "dtinType";
String groupColumn = "t.DTIN_TYPE";
String groupDir = "ASC";
if (CollUtil.isNotEmpty(dataSourceRequest.getGroup())) {
DataSourceRequest.GroupDescriptor groupDescriptor = dataSourceRequest.getGroup().get(0);
if (groupDescriptor != null && StrUtil.isNotBlank(groupDescriptor.getField())) {
groupField = groupDescriptor.getField();
String mappedColumn = mapMsstbprptColumn(groupField);
if (StrUtil.isNotBlank(mappedColumn)) {
groupColumn = mappedColumn;
}
if ("desc".equalsIgnoreCase(groupDescriptor.getDir()) || "des".equalsIgnoreCase(groupDescriptor.getDir())) {
groupDir = "DESC";
}
}
}
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append(groupColumn).append(" AS ").append(groupField.toUpperCase()).append(", ")
.append("COUNT(*) AS COUNT_").append(groupField.toUpperCase()).append(" ")
.append("FROM SD_RIVER_B_H t ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ")
.append("WHERE NVL(t.IS_DELETED, 0) = 0 ");
Map<String, Object> paramMap = new HashMap<>();
String filterSql = buildMsstbprptFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0});
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql).append(" ");
}
sql.append("GROUP BY ").append(groupColumn).append(" ")
.append("ORDER BY ").append(groupColumn).append(" ").append(groupDir);
List<Map<String, Object>> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap);
DataSourceResult result = new DataSourceResult();
result.setData(toMsstbprptLegacyGroups(rows, groupField));
result.setTotal((long) rows.size());
result.setAggregates(new HashMap<>());
return result;
}
@Override @Override
public ZqBaseInfoVo getStcdInfo(String stcd) { public ZqBaseInfoVo getStcdInfo(String stcd) {
if (StrUtil.isBlank(stcd)) { if (StrUtil.isBlank(stcd)) {
@ -92,4 +175,290 @@ public class ZqMonitorServiceImpl implements ZqMonitorService {
} }
return list.get(0); return list.get(0);
} }
private String buildMsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
if (filter == null) {
return "";
}
if (StrUtil.isNotBlank(filter.getField())) {
return buildMsstbprptLeafCondition(filter, paramMap, indexHolder);
}
if (CollUtil.isEmpty(filter.getFilters())) {
return "";
}
List<String> conditions = new ArrayList<>();
for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
String childSql = buildMsstbprptFilterCondition(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 buildMsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
String column = mapMsstbprptColumn(filter.getField());
if (StrUtil.isBlank(column)) {
return "";
}
String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase();
Object value = filter.getValue();
if ("isnull".equals(operator)) {
return column + " IS NULL";
}
if ("isnotnull".equals(operator)) {
return column + " IS NOT NULL";
}
if ("in".equals(operator)) {
List<Object> values = normalizeMsstbprptValues(value);
if (values.isEmpty()) {
return "";
}
List<String> placeholders = new ArrayList<>();
for (Object item : values) {
String paramKey = "zqMsstP" + indexHolder[0]++;
paramMap.put(paramKey, item);
placeholders.add("#{map." + paramKey + "}");
}
return column + " IN (" + String.join(", ", placeholders) + ")";
}
String paramKey = "zqMsstP" + indexHolder[0]++;
switch (operator) {
case "eq":
paramMap.put(paramKey, value);
return column + " = #{map." + paramKey + "}";
case "neq":
paramMap.put(paramKey, value);
return column + " <> #{map." + paramKey + "}";
case "contains":
paramMap.put(paramKey, "%" + value + "%");
return column + " LIKE #{map." + paramKey + "}";
case "startswith":
paramMap.put(paramKey, value + "%");
return column + " LIKE #{map." + paramKey + "}";
case "endswith":
paramMap.put(paramKey, "%" + value);
return column + " LIKE #{map." + paramKey + "}";
case "gt":
paramMap.put(paramKey, value);
return column + " > #{map." + paramKey + "}";
case "gte":
paramMap.put(paramKey, value);
return column + " >= #{map." + paramKey + "}";
case "lt":
paramMap.put(paramKey, value);
return column + " < #{map." + paramKey + "}";
case "lte":
paramMap.put(paramKey, value);
return column + " <= #{map." + paramKey + "}";
default:
return "";
}
}
private List<Object> normalizeMsstbprptValues(Object value) {
if (value == null) {
return new ArrayList<>();
}
if (value instanceof List<?> list) {
return new ArrayList<>(list);
}
String text = String.valueOf(value).trim();
if (StrUtil.isBlank(text)) {
return new ArrayList<>();
}
if (text.startsWith("[") && text.endsWith("]")) {
text = text.substring(1, text.length() - 1);
}
List<Object> values = new ArrayList<>();
for (String item : text.split(",")) {
String trimmed = StrUtil.trim(item);
if (StrUtil.isNotBlank(trimmed)) {
values.add(StrUtil.removeAll(trimmed, "\""));
}
}
return values;
}
private String mapMsstbprptColumn(String field) {
if (StrUtil.isBlank(field)) {
return null;
}
return switch (field) {
case "isDeleted" -> "NVL(t.IS_DELETED, 0)";
case "sttpCode" -> "t.STTP";
case "mway" -> "t.MWAY";
case "dtinType" -> "t.DTIN_TYPE";
case "stcd" -> "t.STCD";
case "stnm" -> "t.STNM";
case "fhstcd" -> "t.FHSTCD";
case "baseId" -> "eng.BASE_ID";
case "dtin" -> "t.DTIN";
case "rstcd" -> "t.RSTCD";
default -> null;
};
}
private String buildMsstbprptDetailSelectSql(List<String> selectFields) {
Map<String, String> selectMap = new LinkedHashMap<>();
selectMap.put("stcd", "t.STCD AS stcd");
selectMap.put("stnm", "t.STNM AS stnm");
selectMap.put("tm", "t.TM AS tm");
selectMap.put("sttp", "t.STTP AS sttp");
selectMap.put("sttpCode", "t.STTP AS sttpCode");
selectMap.put("lgtd", "t.LGTD AS lgtd");
selectMap.put("lttd", "t.LTTD AS lttd");
selectMap.put("elev", "t.ELEV AS elev");
selectMap.put("stlc", "t.STLC AS stlc");
selectMap.put("jcdt", "t.JCDT AS jcdt");
selectMap.put("wddt", "t.WDDT AS wddt");
selectMap.put("bldsttCode", "t.BLDSTT_CODE AS bldsttCode");
selectMap.put("bldsttCcodeName", "CASE WHEN t.BLDSTT_CODE IN ('1', '10', '11') THEN '已建' WHEN t.BLDSTT_CODE IN ('2', '7', '8') THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName");
selectMap.put("introduce", "t.INTRODUCE AS introduce");
selectMap.put("logo", "t.LOGO AS logo");
selectMap.put("inffile", "t.INFFILE AS inffile");
selectMap.put("usfl", "t.USFL AS usfl");
selectMap.put("dtin", "t.DTIN AS dtin");
selectMap.put("dtinSrc", "t.DTIN_SRC AS dtinSrc");
selectMap.put("dtinType", "t.DTIN_TYPE AS dtinType");
selectMap.put("dtinTm", "t.DTIN_TM AS dtinTm");
selectMap.put("mway", "t.MWAY AS mway");
selectMap.put("mwayName", "CASE NVL(t.MWAY, 0) WHEN 1 THEN '人工' WHEN 2 THEN '自动' ELSE '未知' END AS mwayName");
selectMap.put("stindx", "t.STINDX AS stindx");
selectMap.put("orderIndex", "t.ORDER_INDEX AS orderIndex");
selectMap.put("dmstcd", "t.DMSTCD AS dmstcd");
selectMap.put("rstcd", "t.RSTCD AS rstcd");
selectMap.put("ennm", "eng.ENNM AS ennm");
selectMap.put("baseId", "eng.BASE_ID AS baseId");
selectMap.put("baseName", "hb.BASENAME AS baseName");
selectMap.put("hbrvcd", "eng.HBRVCD AS hbrvcd");
selectMap.put("hbrvcdName", "hbrv.HBRVNM AS hbrvcdName");
selectMap.put("rvcd", "eng.RVCD AS rvcd");
selectMap.put("rvcdName", "rv.RVNM AS rvcdName");
selectMap.put("addvcd", "eng.ADDVCD AS addvcd");
selectMap.put("addvcdName", "addv.ADDVNM AS addvcdName");
selectMap.put("fhstcd", "t.FHSTCD AS fhstcd");
selectMap.put("ispro", "t.ISPRO AS ispro");
selectMap.put("project", "t.PROJECT AS project");
selectMap.put("dtfrqcy", "t.DTFRQCY AS dtfrqcy");
selectMap.put("remark", "t.REMARK AS remark");
selectMap.put("vlsr", "t.VLSR AS vlsr");
selectMap.put("vlsrTm", "t.VLSR_TM AS vlsrTm");
selectMap.put("recordUser", "t.RECORD_USER AS recordUser");
selectMap.put("recordTime", "t.RECORD_TIME AS recordTime");
selectMap.put("modifyUser", "t.MODIFY_USER AS modifyUser");
selectMap.put("modifyTime", "t.MODIFY_TIME AS modifyTime");
selectMap.put("isDeleted", "t.IS_DELETED AS isDeleted");
selectMap.put("deleteUser", "t.DELETE_USER AS deleteUser");
selectMap.put("deleteTime", "t.DELETE_TIME AS deleteTime");
if (CollUtil.isEmpty(selectFields)) {
return String.join(", ", selectMap.values());
}
List<String> actualColumns = new ArrayList<>();
for (String selectField : selectFields) {
String column = selectMap.get(selectField);
if (StrUtil.isNotBlank(column)) {
actualColumns.add(column);
}
}
if (actualColumns.isEmpty()) {
actualColumns.addAll(selectMap.values());
}
return String.join(", ", actualColumns);
}
private List<Map<String, Object>> toMsstbprptLegacyGroups(List<Map<String, Object>> rows, String groupField) {
List<Map<String, Object>> result = new ArrayList<>();
if (rows == null) {
return result;
}
String upperField = groupField == null ? "DTINTYPE" : groupField.toUpperCase();
String countField = "COUNT_" + upperField;
String aggregateKey = "count_" + groupField;
for (Map<String, Object> row : rows) {
Object key = row.get(upperField);
if (key == null) {
key = row.get(groupField);
}
Object countValue = row.get(countField);
if (countValue == null) {
countValue = row.get("count_" + upperField);
}
long count = 0L;
if (countValue instanceof Number number) {
count = number.longValue();
} else if (countValue != null) {
count = Long.parseLong(String.valueOf(countValue));
}
Map<String, Object> item = new LinkedHashMap<>();
item.put("key", key);
item.put("keyName", null);
item.put("keyExt", new HashMap<>());
Map<String, Object> detail = new LinkedHashMap<>();
detail.put(upperField, key);
detail.put(countField, count);
item.put("items", List.of(detail));
item.put("count", count);
item.put("summary", new Object[0]);
Map<String, Object> aggregates = new LinkedHashMap<>();
aggregates.put(aggregateKey, count);
item.put("aggregates", aggregates);
result.add(item);
}
return result;
}
private String buildMsstbprptDetailOrderBySql(List<DataSourceRequest.SortDescriptor> sortList) {
if (CollUtil.isEmpty(sortList)) {
return " ORDER BY eng.BASE_ID ASC NULLS LAST, eng.HBRVCD ASC NULLS LAST, eng.ORDER_INDEX ASC NULLS LAST, t.ORDER_INDEX ASC NULLS LAST, t.STCD ASC ";
}
List<String> orderColumns = new ArrayList<>();
for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) {
if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) {
continue;
}
String column = switch (sortDescriptor.getField()) {
case "stcd" -> "t.STCD";
case "stnm" -> "t.STNM";
case "tm" -> "t.TM";
case "sttp", "sttpCode" -> "t.STTP";
case "jcdt" -> "t.JCDT";
case "rstcd" -> "t.RSTCD";
case "ennm" -> "eng.ENNM";
case "baseId" -> "eng.BASE_ID";
case "baseName" -> "hb.BASENAME";
case "hbrvcd" -> "eng.HBRVCD";
case "rvcd" -> "eng.RVCD";
case "fhstcd" -> "t.FHSTCD";
case "mway" -> "t.MWAY";
case "dtin" -> "t.DTIN";
case "dtinType" -> "t.DTIN_TYPE";
case "orderIndex" -> "t.ORDER_INDEX";
default -> null;
};
if (StrUtil.isBlank(column)) {
continue;
}
String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC";
orderColumns.add(column + " " + dir + " NULLS LAST");
}
if (orderColumns.isEmpty()) {
return " ORDER BY eng.BASE_ID ASC NULLS LAST, eng.HBRVCD ASC NULLS LAST, eng.ORDER_INDEX ASC NULLS LAST, t.ORDER_INDEX ASC NULLS LAST, t.STCD ASC ";
}
return " ORDER BY " + String.join(", ", orderColumns);
}
} }