feat: 电站通用实时监测数据查询

This commit is contained in:
tangwei 2026-06-29 13:47:11 +08:00
parent fae68975d4
commit fc09d69302
4 changed files with 396 additions and 9 deletions

View File

@ -93,6 +93,14 @@ public class SdEngInfoBHController {
return ResponseResult.successData(engInfoBHService.getVmsstbprptKendoList(dataSourceRequest)); return ResponseResult.successData(engInfoBHService.getVmsstbprptKendoList(dataSourceRequest));
} }
@PostMapping("/stbprpData/GetKendoListCust")
@Operation(summary = "电站通用实时监测数据查询")
public ResponseResult getStbprpDataKendoListCust(@RequestBody DataSourceRequest dataSourceRequest,
@RequestParam("tbCode") String tbCode,
@RequestParam(value = "ignorePageLimit", required = false) Boolean ignorePageLimit) {
return ResponseResult.successData(engInfoBHService.getStbprpDataKendoListCust(dataSourceRequest, tbCode, ignorePageLimit));
}
@Log(module = "电站管理", value = "新增电站") @Log(module = "电站管理", value = "新增电站")
@PostMapping("/add") @PostMapping("/add")
@Operation(summary = "新增电站") @Operation(summary = "新增电站")

View File

@ -0,0 +1,24 @@
package com.yfd.platform.qgc_base.domain.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Map;
@Schema(description = "电站通用监测数据动态行")
public class EngStbprpDataVo extends LinkedHashMap<String, Object> implements Serializable {
private static final long serialVersionUID = 1L;
public EngStbprpDataVo() {
super();
}
public EngStbprpDataVo(Map<String, Object> source) {
super();
if (source != null && !source.isEmpty()) {
putAll(source);
}
}
}

View File

@ -84,4 +84,6 @@ public interface ISdEngInfoBHService extends IService<SdEngInfoBH> {
DataSourceResult<EngVmsstbprptVo> getVmsstbprptKendoList(DataSourceRequest dataSourceRequest); DataSourceResult<EngVmsstbprptVo> getVmsstbprptKendoList(DataSourceRequest dataSourceRequest);
DataSourceResult<EngOperatVo> getOperatKendoList(DataSourceRequest dataSourceRequest); DataSourceResult<EngOperatVo> getOperatKendoList(DataSourceRequest dataSourceRequest);
DataSourceResult getStbprpDataKendoListCust(DataSourceRequest dataSourceRequest, String tbCode, Boolean ignorePageLimit);
} }

View File

@ -27,6 +27,7 @@ import com.yfd.platform.qgc_base.domain.SdEngInfoBHRequest;
import com.yfd.platform.qgc_base.domain.vo.EngBaseInfoVo; import com.yfd.platform.qgc_base.domain.vo.EngBaseInfoVo;
import com.yfd.platform.qgc_base.domain.vo.EngEiaapprovalVo; import com.yfd.platform.qgc_base.domain.vo.EngEiaapprovalVo;
import com.yfd.platform.qgc_base.domain.vo.EngOperatVo; import com.yfd.platform.qgc_base.domain.vo.EngOperatVo;
import com.yfd.platform.qgc_base.domain.vo.EngStbprpDataVo;
import com.yfd.platform.qgc_base.domain.vo.EngStBaseInfoVo; import com.yfd.platform.qgc_base.domain.vo.EngStBaseInfoVo;
import com.yfd.platform.qgc_base.domain.vo.EngStInfoResultVo; import com.yfd.platform.qgc_base.domain.vo.EngStInfoResultVo;
import com.yfd.platform.qgc_base.domain.vo.EngVmsstbprptVo; import com.yfd.platform.qgc_base.domain.vo.EngVmsstbprptVo;
@ -41,15 +42,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.*;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -709,6 +702,59 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
return queryOperatGroupList(dataSourceRequest, loadOptions); return queryOperatGroupList(dataSourceRequest, loadOptions);
} }
@Override
public DataSourceResult getStbprpDataKendoListCust(DataSourceRequest dataSourceRequest, String tbCode, Boolean ignorePageLimit) {
DataSourceResult<EngStbprpDataVo> result = new DataSourceResult<>();
result.setAggregates(new HashMap<>());
if (StrUtil.isBlank(tbCode)) {
result.setData(new ArrayList<>());
result.setTotal(0L);
return result;
}
DataSourceRequest request = dataSourceRequest == null ? new DataSourceRequest() : dataSourceRequest;
if (!Boolean.TRUE.equals(ignorePageLimit) && request.getTake() == 0) {
request.setTake(2000);
}
DataSourceLoadOptionsBase loadOptions = request.toDevRequest();
List<StbprpTableMeta> tableMetaList = queryStbprpTableMeta(tbCode);
if (CollUtil.isEmpty(tableMetaList)) {
return result;
}
String firstTableName = tableMetaList.getFirst().tableName();
String detailSql = buildStbprpDataDetailSql(request, tableMetaList);
Map<String, Object> paramMap = new HashMap<>();
String filterSql = buildStbprpDataFilterCondition(request.getFilter(), paramMap, new int[]{0}, tableMetaList);
if (StrUtil.isNotBlank(filterSql)) {
detailSql = detailSql + " AND " + filterSql;
}
if (CollUtil.isEmpty(request.getGroup())) {
String sql = detailSql + buildStbprpDataOrderBySql(request.getSort(), tableMetaList);
Page<?> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
List<Map<String, Object>> rows = microservicDynamicSQLMapper.pageAllList(page, sql, paramMap);
List<EngStbprpDataVo> list = new ArrayList<>();
for (Map<String, Object> row : rows) {
list.add(new EngStbprpDataVo(row));
}
result.setData(list);
result.setTotal(page == null ? list.size() : page.getTotal());
return result;
}
GroupingInfo[] groupInfos = loadOptions == null ? new GroupingInfo[0] : loadOptions.getGroup();
String groupSql = buildStbprpDataGroupSql(detailSql, request.getGroup(), tableMetaList);
List<Map<String, Object>> rows = microservicDynamicSQLMapper.pageAllList(null, groupSql, paramMap);
if (Boolean.TRUE.equals(request.getGroupResultFlat())) {
result.setData((List<EngStbprpDataVo>) (List<?>) new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos)));
} else {
result.setData((List<EngStbprpDataVo>) (List<?>) new GroupHelper().group(rows, Arrays.asList(groupInfos)));
}
result.setTotal((long) rows.size());
return result;
}
private DataSourceResult<EngOperatVo> queryOperatSummaryList(DataSourceRequest dataSourceRequest, private DataSourceResult<EngOperatVo> queryOperatSummaryList(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions) { DataSourceLoadOptionsBase loadOptions) {
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
@ -2303,4 +2349,311 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
default -> null; default -> null;
}; };
} }
private List<StbprpTableMeta> queryStbprpTableMeta(String tbCode) {
// 1. 解析参数
List<String> tbCodes = StrUtil.split(tbCode, ',')
.stream()
.map(StrUtil::trim)
.filter(StrUtil::isNotBlank)
.distinct()
.toList();
if (tbCodes.isEmpty()) {
return Collections.emptyList();
}
// 2. 构建 SQL 和参数
Map<String, Object> paramMap = new HashMap<>();
List<String> placeholders = new ArrayList<>();
for (int i = 0; i < tbCodes.size(); i++) {
String key = "tbCode" + i;
paramMap.put(key, tbCodes.get(i));
placeholders.add("#{map." + key + "}");
}
String sql = "SELECT ID, TB, TB_CODE, STCD_MAPPING, TM_MAPPING " +
"FROM ST_TB_B " +
"WHERE NVL(IS_DELETED, 0) = 0 " +
"AND TB_CODE IN (" + StrUtil.join(", ", placeholders) + ") " +
"ORDER BY TB_CODE";
// 3. 执行查询
List<Map<String, Object>> rows = microservicDynamicSQLMapper.pageAllList(null, sql, paramMap);
// 4. 转换结果
List<StbprpTableMeta> result = new ArrayList<>();
for (Map<String, Object> row : rows) {
result.add(new StbprpTableMeta(
asString(row.get("ID")),
asString(row.get("TB")),
asString(row.get("TB_CODE")),
StrUtil.blankToDefault(asString(row.get("STCD_MAPPING")), "STCD"),
StrUtil.blankToDefault(asString(row.get("TM_MAPPING")), "TM")
));
}
return result;
}
/**
* 安全转为字符串
*/
private String asString(Object obj) {
return obj == null ? null : obj.toString();
}
private String buildStbprpDataDetailSql(DataSourceRequest request, List<StbprpTableMeta> tableMetaList) {
List<String> selectItems = resolveStbprpSelectItems(request == null ? null : request.getSelect(), tableMetaList);
StringBuilder sql = new StringBuilder("SELECT ");
sql.append(String.join(", ", selectItems)).append(" FROM ");
for (int i = 0; i < tableMetaList.size(); i++) {
StbprpTableMeta meta = tableMetaList.get(i);
String alias = "t" + (i + 1);
if (i == 0) {
sql.append(meta.tableName()).append(" ").append(alias).append(" ");
} else {
StbprpTableMeta first = tableMetaList.getFirst();
sql.append(" LEFT JOIN ").append(meta.tableName()).append(" ").append(alias)
.append(" ON t1.").append(first.stcdMapping()).append(" = ").append(alias).append(".").append(meta.stcdMapping())
.append(" AND t1.").append(first.tmMapping()).append(" = ").append(alias).append(".").append(meta.tmMapping()).append(" ");
}
}
sql.append(" WHERE 1 = 1");
return sql.toString();
}
private List<String> resolveStbprpSelectItems(List<String> selectFields, List<StbprpTableMeta> tableMetaList) {
if (CollUtil.isEmpty(selectFields)) {
return List.of("t1.*");
}
List<String> items = new ArrayList<>();
for (String field : selectFields) {
if (StrUtil.isBlank(field)) {
continue;
}
String mapped = mapStbprpField(field, tableMetaList);
if (StrUtil.isNotBlank(mapped)) {
items.add(mapped + " AS \"" + field.trim() + "\"");
}
}
if (items.isEmpty()) {
items.add("t1.*");
}
return items;
}
private String buildStbprpDataFilterCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder,
List<StbprpTableMeta> tableMetaList) {
if (filter == null) {
return "";
}
if (StrUtil.isNotBlank(filter.getField())) {
return buildStbprpDataLeafCondition(filter, paramMap, indexHolder, tableMetaList);
}
if (CollUtil.isEmpty(filter.getFilters())) {
return "";
}
List<String> childConditions = new ArrayList<>();
for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
String childSql = buildStbprpDataFilterCondition(child, paramMap, indexHolder, tableMetaList);
if (StrUtil.isNotBlank(childSql)) {
childConditions.add("(" + childSql + ")");
}
}
if (childConditions.isEmpty()) {
return "";
}
String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ";
return String.join(logic, childConditions);
}
private String buildStbprpDataLeafCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder,
List<StbprpTableMeta> tableMetaList) {
String column = mapStbprpField(filter.getField(), tableMetaList);
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 ("isempty".equals(operator)) {
return "(" + column + " IS NULL OR " + column + " = '')";
}
if ("isnotempty".equals(operator)) {
return "(" + column + " IS NOT NULL AND " + column + " <> '')";
}
boolean dateField = isStbprpDateField(filter);
if ("in".equals(operator) || "ni".equals(operator)) {
List<Object> values = normalizeFilterValues(value);
if (values.isEmpty()) {
return "";
}
List<String> placeholders = new ArrayList<>();
for (Object item : values) {
String key = "stbprpParam" + indexHolder[0]++;
paramMap.put(key, item);
placeholders.add(buildStbprpDataValueExpr(key, dateField, item));
}
return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")";
}
if (value == null) {
return "";
}
String key = "stbprpParam" + indexHolder[0]++;
String expr = buildStbprpDataValueExpr(key, dateField, value);
return switch (operator) {
case "eq" -> {
paramMap.put(key, value);
yield column + " = " + expr;
}
case "neq" -> {
paramMap.put(key, value);
yield column + " <> " + expr;
}
case "contains" -> {
paramMap.put(key, "%" + value + "%");
yield column + " LIKE #{map." + key + "}";
}
case "doesnotcontain" -> {
paramMap.put(key, "%" + value + "%");
yield column + " NOT LIKE #{map." + key + "}";
}
case "startswith" -> {
paramMap.put(key, value + "%");
yield column + " LIKE #{map." + key + "}";
}
case "endswith" -> {
paramMap.put(key, "%" + value);
yield column + " LIKE #{map." + key + "}";
}
case "gt" -> {
paramMap.put(key, value);
yield column + " > " + expr;
}
case "gte" -> {
paramMap.put(key, value);
yield column + " >= " + expr;
}
case "lt" -> {
paramMap.put(key, value);
yield column + " < " + expr;
}
case "lte" -> {
paramMap.put(key, value);
yield column + " <= " + expr;
}
default -> "";
};
}
private String buildStbprpDataValueExpr(String paramKey, boolean dateField, Object value) {
if (!dateField || value == null) {
return "#{map." + paramKey + "}";
}
String text = String.valueOf(value).trim();
if (text.length() <= 10) {
return "TO_DATE(#{map." + paramKey + "}, 'YYYY-MM-DD')";
}
return "TO_DATE(#{map." + paramKey + "}, 'YYYY-MM-DD HH24:MI:SS')";
}
private boolean isStbprpDateField(DataSourceRequest.FilterDescriptor filter) {
if (filter == null) {
return false;
}
if ("date".equalsIgnoreCase(filter.getDataType())) {
return true;
}
String field = StrUtil.blankToDefault(filter.getField(), "").trim().toLowerCase();
if (field.contains(".")) {
field = field.substring(field.lastIndexOf('.') + 1);
}
return "tm".equals(field) || "dt".equals(field);
}
private String buildStbprpDataOrderBySql(List<DataSourceRequest.SortDescriptor> sortList, List<StbprpTableMeta> tableMetaList) {
if (CollUtil.isEmpty(sortList)) {
return "";
}
List<String> orderItems = new ArrayList<>();
for (DataSourceRequest.SortDescriptor sort : sortList) {
if (sort == null || StrUtil.isBlank(sort.getField())) {
continue;
}
String column = mapStbprpField(sort.getField(), tableMetaList);
if (StrUtil.isBlank(column)) {
continue;
}
String dir = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC";
orderItems.add(column + " " + dir);
}
if (orderItems.isEmpty()) {
return "";
}
return " ORDER BY " + String.join(", ", orderItems);
}
private String buildStbprpDataGroupSql(String detailSql,
List<DataSourceRequest.GroupDescriptor> groups,
List<StbprpTableMeta> tableMetaList) {
List<String> selectItems = new ArrayList<>();
List<String> groupItems = new ArrayList<>();
List<String> orderItems = new ArrayList<>();
for (DataSourceRequest.GroupDescriptor descriptor : groups) {
if (descriptor == null || StrUtil.isBlank(descriptor.getField())) {
continue;
}
String column = mapStbprpField(descriptor.getField(), tableMetaList);
if (StrUtil.isBlank(column)) {
continue;
}
String upperField = descriptor.getField().trim().toUpperCase();
selectItems.add(column + " AS " + upperField);
selectItems.add("COUNT(*) AS COUNT_" + upperField);
groupItems.add(column);
String dir = "desc".equalsIgnoreCase(descriptor.getDir()) || "des".equalsIgnoreCase(descriptor.getDir()) ? "DESC" : "ASC";
orderItems.add(column + " " + dir);
}
if (selectItems.isEmpty()) {
selectItems.add("t1.STCD AS STCD");
selectItems.add("COUNT(*) AS COUNT_STCD");
groupItems.add("t1.STCD");
orderItems.add("t1.STCD ASC");
}
return "SELECT " + String.join(", ", selectItems) +
" FROM (" + detailSql + ") t1 GROUP BY " + String.join(", ", groupItems) +
" ORDER BY " + String.join(", ", orderItems);
}
private String mapStbprpField(String field, List<StbprpTableMeta> tableMetaList) {
if (StrUtil.isBlank(field) || CollUtil.isEmpty(tableMetaList)) {
return null;
}
String normalized = field.trim();
if (!normalized.contains(".")) {
return "t1." + normalized.toUpperCase();
}
String[] parts = normalized.split("\\.", 2);
if (parts.length != 2) {
return null;
}
for (int i = 0; i < tableMetaList.size(); i++) {
if (StrUtil.equalsIgnoreCase(tableMetaList.get(i).tbCode(), parts[0])) {
return "t" + (i + 1) + "." + parts[1].toUpperCase();
}
}
return null;
}
private record StbprpTableMeta(String id, String tableName, String tbCode, String stcdMapping, String tmMapping) {
}
} }