feat: 电站通用实时监测数据查询
This commit is contained in:
parent
fae68975d4
commit
fc09d69302
@ -93,6 +93,14 @@ public class SdEngInfoBHController {
|
||||
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 = "新增电站")
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增电站")
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -84,4 +84,6 @@ public interface ISdEngInfoBHService extends IService<SdEngInfoBH> {
|
||||
DataSourceResult<EngVmsstbprptVo> getVmsstbprptKendoList(DataSourceRequest dataSourceRequest);
|
||||
|
||||
DataSourceResult<EngOperatVo> getOperatKendoList(DataSourceRequest dataSourceRequest);
|
||||
|
||||
DataSourceResult getStbprpDataKendoListCust(DataSourceRequest dataSourceRequest, String tbCode, Boolean ignorePageLimit);
|
||||
}
|
||||
|
||||
@ -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.EngEiaapprovalVo;
|
||||
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.EngStInfoResultVo;
|
||||
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 java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
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.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
@ -709,6 +702,59 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
|
||||
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,
|
||||
DataSourceLoadOptionsBase loadOptions) {
|
||||
StringBuilder sql = new StringBuilder();
|
||||
@ -2303,4 +2349,311 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
|
||||
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) {
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user