fix: 电站业务结果数据查询

This commit is contained in:
tangwei 2026-08-12 10:36:23 +08:00
parent bd8472db2e
commit 7695bc0c12
4 changed files with 385 additions and 34 deletions

View File

@ -187,4 +187,10 @@ public class EngEqDataController {
public ResponseResult getEqdsKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(engEqDataService.getEqdsKendoListCust(dataSourceRequest));
}
@PostMapping("/GetKendoListCust")
@Operation(summary = "电站业务结果数据查询MS_ENG_T + V_MS_STBPRP_T")
public ResponseResult getMsEngKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(engEqDataService.getMsEngKendoList(dataSourceRequest));
}
}

View File

@ -2,26 +2,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;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqdsVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqHourIntervalVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqIntervalVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqLimitQueryVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqLimitVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqMsstbprptVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqRuleVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngQecAlongVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqRateCountVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqVmsstbprptVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.QgcQecStaticVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.SdEqMonitorCountVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.StBaseInfo;
import com.yfd.platform.qgc_eng.eq.entity.vo.StcdInfoVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.WbsbVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.*;
import java.util.List;
import java.util.Map;
@ -89,4 +70,10 @@ public interface EngEqDataService {
StcdInfoVo getStInfoByStcd(String stcd);
DataSourceResult<EngEqdsVo> getEqdsKendoListCust(DataSourceRequest dataSourceRequest);
/**
* 查询 MS_ENG_T 电站业务结果数据支持动态过滤排序分组
* <p>对应旧系统 EngEqController.getKendoListCust</p>
*/
DataSourceResult<EngEqDataVo> getMsEngKendoList(DataSourceRequest dataSourceRequest);
}

View File

@ -6337,4 +6337,338 @@ public class EngEqDataServiceImpl implements EngEqDataService {
.append(String.join(", ", placeholders))
.append(") ");
}
// ==================== MS_ENG_T 电站业务结果查询 ====================
@Override
public DataSourceResult<EngEqDataVo> getMsEngKendoList(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
if (CollUtil.isEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) {
return queryMsEngDetailList(dataSourceRequest, loadOptions);
}
return queryMsEngGroupList(dataSourceRequest, loadOptions);
}
private DataSourceResult<EngEqDataVo> queryMsEngDetailList(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append(buildMsEngDetailSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect()))
.append(" ")
.append(buildMsEngViewSql())
.append(" WHERE NVL(MET.IS_DELETED, 0) = 0 ");
Map<String, Object> paramMap = new HashMap<>();
String filterSql = buildMsEngFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0});
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql).append(" ");
}
sql.append(buildMsEngDetailOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()));
Page<?> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
List<EngEqDataVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, EngEqDataVo.class);
DataSourceResult<EngEqDataVo> result = new DataSourceResult<>();
result.setData(list);
result.setTotal(page != null ? page.getTotal() : list.size());
result.setAggregates(new HashMap<>());
return result;
}
private DataSourceResult<EngEqDataVo> queryMsEngGroupList(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 = mapMsEngColumn(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 = mapMsEngColumn(aggregate.getField());
if (StrUtil.isBlank(aggregateColumn) || StrUtil.isBlank(aggregate.getAggregate())) {
continue;
}
selectItems.add(buildMsEngAggregateSql(aggregate.getAggregate(), aggregateColumn, aggregate.getField()));
}
}
}
if (selectItems.isEmpty()) {
selectItems.add("MET.STCD AS STCD");
selectItems.add("COUNT(*) AS COUNT_STCD");
}
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append(String.join(", ", selectItems))
.append(" ")
.append(buildMsEngViewSql())
.append(" WHERE NVL(MET.IS_DELETED, 0) = 0 ");
Map<String, Object> paramMap = new HashMap<>();
String filterSql = buildMsEngFilterCondition(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 = mapMsEngColumn(descriptor.getField());
if (StrUtil.isNotBlank(column)) {
groupByColumns.add(column);
}
}
if (!groupByColumns.isEmpty()) {
sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)).append(" ");
}
sql.append(buildMsEngGroupOrderBySql(groups));
List<Map<String, Object>> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap);
DataSourceResult<EngEqDataVo> result = new DataSourceResult<>();
if (dataSourceRequest.getGroupResultFlat() != null && dataSourceRequest.getGroupResultFlat()) {
result.setData((List<EngEqDataVo>) (List<?>) new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos)));
} else {
result.setData((List<EngEqDataVo>) (List<?>) new GroupHelper().group(rows, Arrays.asList(groupInfos)));
}
result.setTotal(0L);
result.setAggregates(new HashMap<>());
return result;
}
/**
* MS_ENG_T + V_MS_STBPRP_T 联合查询的 FROM 子句
*/
private String buildMsEngViewSql() {
return "FROM MS_ENG_T MET " +
"LEFT JOIN MS_ENG_T MET1 ON MET1.STCD = MET.STCD " +
" AND MET1.TYPE = MET.TYPE " +
" AND ADD_MONTHS(MET1.TM, 12) = MET.TM " +
" AND NVL(MET1.IS_DELETED, 0) = 0 " +
"INNER JOIN V_MS_STBPRP_T MSB ON MSB.STCD = MET.STCD " +
" AND MSB.STTP_CODE = 'ENG' " +
" AND MSB.BLDSTT_CODE = 2 ";
}
private Map<String, String> msEngFieldColumns() {
Map<String, String> columns = new LinkedHashMap<>();
columns.put("id", "MET.ID AS id");
columns.put("stcd", "MET.STCD AS stcd");
columns.put("stnm", "MSB.STNM AS stnm");
columns.put("ennm", "MSB.ENNM AS ennm");
columns.put("tm", "MET.TM AS tm");
columns.put("qi", "MET.QI AS qi");
columns.put("qo", "MET.QO AS qo");
columns.put("qecLimit", "MET.QEC_LIMIT AS qecLimit");
columns.put("qec", "MET.QEC AS qec");
columns.put("mwrLimit", "MET.MWR_LIMIT AS mwrLimit");
columns.put("avqLimit", "MET.AVQ_LIMIT AS avqLimit");
columns.put("qecC", "MET.QEC_C AS qecC");
columns.put("mwrC", "MET.MWR_C AS mwrC");
columns.put("avqC", "MET.AVQ_C AS avqC");
columns.put("sfdb", "MET.QEC_SFDB AS sfdb");
columns.put("sfdbName", "CASE NVL(MET.QEC_SFDB, -1) WHEN 0 THEN '不达标' WHEN 1 THEN '达标' WHEN 2 THEN '无生态流量数据' WHEN 3 THEN '无生态流量限值要求' ELSE NULL END AS sfdbName");
columns.put("mwrSfdb", "MET.MWR_SFDB AS mwrSfdb");
columns.put("mwrSfdbName", "CASE NVL(MET.MWR_SFDB, -1) WHEN 0 THEN '不达标' WHEN 1 THEN '达标' WHEN 2 THEN '无生态流量数据' WHEN 3 THEN '无生态流量限值要求' ELSE NULL END AS mwrSfdbName");
columns.put("avqSfdb", "MET.AVQ_SFDB AS avqSfdb");
columns.put("avqSfdbName", "CASE NVL(MET.AVQ_SFDB, -1) WHEN 0 THEN '不达标' WHEN 1 THEN '达标' WHEN 2 THEN '无生态流量数据' WHEN 3 THEN '无生态流量限值要求' ELSE NULL END AS avqSfdbName");
columns.put("rz", "MET.RZ AS rz");
columns.put("dz", "MET.DDZ AS dz");
columns.put("baseName", "MSB.BASE_NAME AS baseName");
columns.put("rvcdName", "MSB.RVCD_NAME AS rvcdName");
columns.put("hbrvcdName", "MSB.HBRVCD_NAME AS hbrvcdName");
columns.put("addvcdName", "MSB.ADDVNM AS addvcdName");
columns.put("baseId", "MSB.BASE_ID AS baseId");
columns.put("hbrvcd", "MSB.HBRVCD AS hbrvcd");
columns.put("hycd", "MSB.HYCD AS hycd");
columns.put("rvcd", "MSB.RVCD AS rvcd");
columns.put("bldsttCcode", "MSB.BLDSTT_CODE AS bldsttCcode");
columns.put("beforeQec", "MET1.QEC AS beforeQec");
columns.put("baseStepSort", "NVL(MSB.BASESTEPSORT, 999999) AS baseStepSort");
columns.put("rvcdStepSort", "NVL(MSB.RVCDSTEPSORT, 999999) AS rvcdStepSort");
columns.put("rstcdStepSort", "NVL(MSB.RSTCDSTEPSORT, 999999) AS rstcdStepSort");
columns.put("siteStepSort", "NVL(MSB.SITESTEPSORT, 999999) AS siteStepSort");
return columns;
}
private String buildMsEngDetailSelectSql(List<String> selectFields) {
Map<String, String> columns = msEngFieldColumns();
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 String buildMsEngFilterCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
if (filter == null) {
return "";
}
if (StrUtil.isNotBlank(filter.getField())) {
return buildMsEngLeafCondition(filter, paramMap, indexHolder);
}
if (CollUtil.isEmpty(filter.getFilters())) {
return "";
}
List<String> conditions = new ArrayList<>();
for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
String childSql = buildMsEngFilterCondition(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 buildMsEngLeafCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
String column = mapMsEngColumn(filter.getField());
if (StrUtil.isBlank(column)) {
return "";
}
return buildGenericCondition(column, filter, paramMap, indexHolder, isMsEngDateField(filter.getField()));
}
private String buildMsEngDetailOrderBySql(List<DataSourceRequest.SortDescriptor> sortList) {
if (CollUtil.isEmpty(sortList)) {
return " ORDER BY baseStepSort ASC, rvcdStepSort ASC, rstcdStepSort ASC, siteStepSort ASC, MET.TM DESC";
}
List<String> orders = new ArrayList<>();
for (DataSourceRequest.SortDescriptor sort : sortList) {
if (sort == null || StrUtil.isBlank(sort.getField())) {
continue;
}
String column = mapMsEngOrderColumn(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 baseStepSort ASC, rvcdStepSort ASC, rstcdStepSort ASC, siteStepSort ASC, MET.TM DESC";
}
return " ORDER BY " + String.join(", ", orders);
}
private String buildMsEngGroupOrderBySql(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 = mapMsEngColumn(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 buildMsEngAggregateSql(String aggregate, String column, String field) {
if (StrUtil.isBlank(aggregate) || StrUtil.isBlank(column)) {
return null;
}
return switch (aggregate.toLowerCase()) {
case "sum" -> "SUM(" + column + ") AS SUM_" + field.toUpperCase();
case "avg" -> "AVG(" + column + ") AS AVG_" + field.toUpperCase();
case "min" -> "MIN(" + column + ") AS MIN_" + field.toUpperCase();
case "max" -> "MAX(" + column + ") AS MAX_" + field.toUpperCase();
default -> null;
};
}
private String mapMsEngColumn(String field) {
if (StrUtil.isBlank(field)) {
return null;
}
return switch (field) {
case "id" -> "MET.ID";
case "stcd" -> "MSB.STCD";
case "stnm" -> "MSB.STNM";
case "ennm" -> "MSB.ENNM";
case "tm" -> "MET.TM";
case "qi" -> "MET.QI";
case "qo" -> "MET.QO";
case "qecLimit" -> "MET.QEC_LIMIT";
case "qec" -> "MET.QEC";
case "mwrLimit" -> "MET.MWR_LIMIT";
case "avqLimit" -> "MET.AVQ_LIMIT";
case "qecC" -> "MET.QEC_C";
case "mwrC" -> "MET.MWR_C";
case "avqC" -> "MET.AVQ_C";
case "sfdb", "qecSfdb" -> "MET.QEC_SFDB";
case "mwrSfdb" -> "MET.MWR_SFDB";
case "avqSfdb" -> "MET.AVQ_SFDB";
case "rz" -> "MET.RZ";
case "dz" -> "MET.DDZ";
case "baseName" -> "MSB.BASE_NAME";
case "rvcdName" -> "MSB.RVCD_NAME";
case "hbrvcdName" -> "MSB.HBRVCD_NAME";
case "addvcdName" -> "MSB.ADDVNM";
case "baseId" -> "MSB.BASE_ID";
case "hbrvcd" -> "MSB.HBRVCD";
case "hycd" -> "MSB.HYCD";
case "rvcd" -> "MSB.RVCD";
case "bldsttCcode" -> "MSB.BLDSTT_CODE";
case "baseStepSort" -> "MSB.BASESTEPSORT";
case "rvcdStepSort" -> "MSB.RVCDSTEPSORT";
case "rstcdStepSort" -> "MSB.RSTCDSTEPSORT";
case "siteStepSort" -> "MSB.SITESTEPSORT";
default -> null;
};
}
private String mapMsEngOrderColumn(String field) {
if (StrUtil.isBlank(field)) {
return null;
}
return switch (field) {
case "id", "baseId", "hbrvcd", "hycd", "rvcd", "bldsttCcode",
"sfdbName", "mwrSfdb", "mwrSfdbName", "avqSfdb", "avqSfdbName",
"qecC", "mwrC", "avqC", "beforeQec",
"baseStepSort", "rvcdStepSort", "rstcdStepSort", "siteStepSort",
"stcd", "stnm", "ennm", "qi", "qo", "qec", "sfdb",
"rz", "dz", "qecLimit", "mwrLimit", "avqLimit", "baseName",
"rvcdName", "hbrvcdName", "addvcdName" -> field;
case "tm" -> "MET.TM";
default -> null;
};
}
private boolean isMsEngDateField(String field) {
return "tm".equalsIgnoreCase(field);
}
}

View File

@ -2741,23 +2741,33 @@ public class FpRunServiceImpl implements FpRunService {
public DataSourceResult<FpTreeStcdGroupVo> getTreeStcdList(DataSourceRequest dataSourceRequest) {
// 查询 SD_FPSSRL_R自动, MWAY=2 SD_FPSS_R人工, MWAY=1中有过鱼数据的测站
// 关联 V_MS_STBPRP_T 视图获取测站基础信息 ENNM 电站名称
String sql = "SELECT STCD, STNM, MWAY, LGTD, LTTD, BASE_ID, RSTCD, ENNM "
+ "FROM ("
+ " SELECT DISTINCT t2.STCD, t2.STNM, t2.BASE_ID, t2.RSTCD, t2.LGTD, t2.LTTD, t2.MWAY, t2.ENNM "
+ " FROM SD_FPSSRL_R t1 "
+ " INNER JOIN V_MS_STBPRP_T t2 ON t1.STCD = t2.STCD "
+ " WHERE NVL(t2.IS_DELETED, 0) = 0 AND t2.MWAY = 2 AND t1.FTP IS NOT NULL "
+ " UNION "
+ " SELECT DISTINCT t4.STCD, t4.STNM, t4.BASE_ID, t4.RSTCD, t4.LGTD, t4.LTTD, t4.MWAY, t4.ENNM "
+ " FROM SD_FPSS_R t3 "
+ " INNER JOIN V_MS_STBPRP_T t4 ON t3.STCD = t4.STCD "
+ " WHERE NVL(t4.IS_DELETED, 0) = 0 AND t4.MWAY = 1 AND t3.FTP IS NOT NULL "
+ " AND NVL(t3.IS_DELETED, 0) = 0"
+ ")";
StringBuilder sql = new StringBuilder();
sql.append("SELECT STCD, STNM, MWAY, LGTD, LTTD, BASE_ID, RSTCD, ENNM ")
.append("FROM (")
.append(" SELECT DISTINCT t2.STCD, t2.STNM, t2.BASE_ID, t2.RSTCD, t2.LGTD, t2.LTTD, t2.MWAY, t2.ENNM ")
.append(" FROM SD_FPSSRL_R t1 ")
.append(" INNER JOIN V_MS_STBPRP_T t2 ON t1.STCD = t2.STCD ")
.append(" WHERE NVL(t2.IS_DELETED, 0) = 0 AND t2.MWAY = 2 AND t1.FTP IS NOT NULL ")
.append(" UNION ")
.append(" SELECT DISTINCT t4.STCD, t4.STNM, t4.BASE_ID, t4.RSTCD, t4.LGTD, t4.LTTD, t4.MWAY, t4.ENNM ")
.append(" FROM SD_FPSS_R t3 ")
.append(" INNER JOIN V_MS_STBPRP_T t4 ON t3.STCD = t4.STCD ")
.append(" WHERE NVL(t4.IS_DELETED, 0) = 0 AND t4.MWAY = 1 AND t3.FTP IS NOT NULL ")
.append(" AND NVL(t3.IS_DELETED, 0) = 0")
.append(") t WHERE 1=1 ");
Map<String, Object> paramMap = new HashMap<>();
String filterSql = QgcQueryWrapperUtil.buildFilterCondition(
dataSourceRequest.getFilter(),
paramMap,
new int[]{0},
this::FpTree
);
if (StrUtil.isNotBlank(filterSql)) {
sql.append("AND ").append(filterSql).append(" ");
}
List<FpTreeStcdVo> allItems = microservicDynamicSQLMapper
.getAllListWithResultType(sql, paramMap, FpTreeStcdVo.class);
.getAllListWithResultType(sql.toString(), paramMap, FpTreeStcdVo.class);
if (CollUtil.isEmpty(allItems)) {
DataSourceResult<FpTreeStcdGroupVo> emptyResult = new DataSourceResult<>();
@ -2815,4 +2825,18 @@ public class FpRunServiceImpl implements FpRunService {
result.setAggregates(new HashMap<>());
return result;
}
private String FpTree(String field) {
if (StrUtil.isBlank(field)) {
return null;
}
return switch (field.toLowerCase()) {
case "rstcd" -> "t.RSTCD";
case "lgtd" -> "fp.LGTD";
case "lttd" -> "fp.LTTD";
default -> null;
};
}
}