fix: 优化逻辑

This commit is contained in:
tangwei 2026-07-07 11:20:44 +08:00
parent 5fa17e767a
commit 501d42ac2f
2 changed files with 214 additions and 17 deletions

View File

@ -4607,13 +4607,19 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
.append(" WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common' ") .append(" WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common' ")
.append(") siteSort ON siteSort.RVCD = eng.HBRVCD AND siteSort.STCD = t.STCD ") .append(") siteSort ON siteSort.RVCD = eng.HBRVCD AND siteSort.STCD = t.STCD ")
.append("WHERE NVL(t.IS_DELETED, 0) = 0 ") .append("WHERE NVL(t.IS_DELETED, 0) = 0 ")
.append("AND NVL(t.USFL, 1) = 1 ") .append("AND NVL(t.USFL, 1) = 1 ");
.append("AND t.LGTD IS NOT NULL ")
.append("AND t.LTTD IS NOT NULL "); Map<String, Object> paramMap = new HashMap<>();
String filterSql = buildWqPointFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0});
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql);
}
sql.append(buildWqPointOrderBySql(dataSourceRequest.getSort()));
DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest();
Page<?> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); Page<?> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
List<EnvWqAnchorPointVo> wqVoList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), new HashMap<>(), EnvWqAnchorPointVo.class); List<EnvWqAnchorPointVo> wqVoList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, EnvWqAnchorPointVo.class);
if (CollectionUtils.isNotEmpty(wqVoList)) { if (CollectionUtils.isNotEmpty(wqVoList)) {
List<String> stcdList = wqVoList.stream() List<String> stcdList = wqVoList.stream()
@ -4622,15 +4628,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
.distinct() .distinct()
.collect(Collectors.toList()); .collect(Collectors.toList());
String wqDataSql = "SELECT STCD, TM, WQGRD, SFDB, WTMP, PH, DOX, CODMN, CODCR, BOD5, NH3N, TP, TN, CU, ZN, F, SE, ARS, HG, CD, CR6, PB, CN, VLPH, OIL, LAS, S2, FCG, CL, SO4, NO3, THRD, COND, FE, MN, AL, CHLA, CLARITY, TU, CYANO, TOD " + List<EnvWqDataVo> wqDataList = queryWqDataByStcdBatch(stcdList);
"FROM ( " +
" SELECT t.*, ROW_NUMBER() OVER (PARTITION BY t.STCD ORDER BY t.TM DESC) AS rn " +
" FROM SD_WQ_R t " +
" WHERE t.STCD IN (" + String.join(",", stcdList.stream().map(s -> "'" + s + "'").collect(Collectors.toList())) + ") " +
" AND NVL(t.IS_DELETED, 0) = 0 " +
") WHERE rn = 1";
List<EnvWqDataVo> wqDataList = microservicDynamicSQLMapper.getAllListWithResultType(wqDataSql, new HashMap<>(), EnvWqDataVo.class);
Map<String, EnvWqDataVo> wqDataMap = wqDataList.stream() Map<String, EnvWqDataVo> wqDataMap = wqDataList.stream()
.collect(Collectors.toMap(EnvWqDataVo::getStcd, Function.identity(), (oldValue, newValue) -> newValue)); .collect(Collectors.toMap(EnvWqDataVo::getStcd, Function.identity(), (oldValue, newValue) -> newValue));
@ -4706,6 +4704,205 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
return dataSourceResult; return dataSourceResult;
} }
private List<EnvWqDataVo> queryWqDataByStcdBatch(List<String> stcdList) {
List<EnvWqDataVo> resultList = new ArrayList<>();
if (CollectionUtils.isEmpty(stcdList)) {
return resultList;
}
int batchSize = 500;
List<List<String>> batches = CollUtil.split(stcdList, batchSize);
for (List<String> batch : batches) {
String stcdParams = batch.stream()
.map(s -> "'" + s + "'")
.collect(Collectors.joining(","));
String wqDataSql = "SELECT STCD, TM, WQGRD, SFDB, WTMP, PH, DOX, CODMN, CODCR, BOD5, NH3N, TP, TN, CU, ZN, F, SE, ARS, HG, CD, CR6, PB, CN, VLPH, OIL, LAS, S2, FCG, CL, SO4, NO3, THRD, COND, FE, MN, AL, CHLA, CLARITY, TU, CYANO, TOD " +
"FROM ( " +
" SELECT t.*, ROW_NUMBER() OVER (PARTITION BY t.STCD ORDER BY t.TM DESC) AS rn " +
" FROM SD_WQ_R t " +
" WHERE t.STCD IN (" + stcdParams + ") " +
" AND NVL(t.IS_DELETED, 0) = 0 " +
") WHERE rn = 1";
List<EnvWqDataVo> batchList = microservicDynamicSQLMapper.getAllListWithResultType(wqDataSql, new HashMap<>(), EnvWqDataVo.class);
if (CollectionUtils.isNotEmpty(batchList)) {
resultList.addAll(batchList);
}
}
return resultList;
}
private String buildWqPointFilterCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
if (filter == null) {
return "";
}
if (CollUtil.isNotEmpty(filter.getFilters())) {
List<String> childConditions = new ArrayList<>();
for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
String childSql = buildWqPointFilterCondition(child, paramMap, indexHolder);
if (StrUtil.isNotBlank(childSql)) {
childConditions.add(childSql);
}
}
if (childConditions.isEmpty()) {
return "";
}
String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ";
return "(" + String.join(logic, childConditions) + ")";
}
String column = mapWqPointColumn(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 ("isempty".equals(operator)) {
return "(" + column + " IS NULL OR " + column + " = '')";
}
if ("isnotempty".equals(operator)) {
return "(" + column + " IS NOT NULL AND " + column + " <> '')";
}
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 = "wqPointParam" + indexHolder[0]++;
paramMap.put(key, item);
placeholders.add("#{map." + key + "}");
}
return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")";
}
if (value == null) {
return "";
}
String key = "wqPointParam" + indexHolder[0]++;
return switch (operator) {
case "eq" -> {
paramMap.put(key, value);
yield column + " = #{map." + key + "}";
}
case "neq" -> {
paramMap.put(key, value);
yield column + " <> #{map." + key + "}";
}
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 + " > #{map." + key + "}";
}
case "gte" -> {
paramMap.put(key, value);
yield column + " >= #{map." + key + "}";
}
case "lt" -> {
paramMap.put(key, value);
yield column + " < #{map." + key + "}";
}
case "lte" -> {
paramMap.put(key, value);
yield column + " <= #{map." + key + "}";
}
default -> "";
};
}
private String mapWqPointColumn(String field) {
if (StrUtil.isBlank(field)) {
return null;
}
return switch (field) {
case "stcd" -> "t.STCD";
case "stnm" -> "t.STNM";
case "sttp" -> "t.STTP";
case "sttpCode" -> "t.STTP";
case "lgtd" -> "t.LGTD";
case "lttd" -> "t.LTTD";
case "dtmel" -> "t.ELEV";
case "stlc" -> "t.STLC";
case "wwqtg" -> "t.WWQTG";
case "dtinType" -> "t.DTIN_TYPE";
case "rstcd" -> "t.RSTCD";
case "fhstcd" -> "t.FHSTCD";
case "orderIndex" -> "t.ORDER_INDEX";
case "ennm" -> "eng.ENNM";
case "baseName" -> "hb.BASENAME";
case "baseId" -> "hb.BASEID";
case "hbrvcd" -> "eng.HBRVCD";
case "hbrvcdName" -> "hbrv.HBRVNM";
case "rvcdName" -> "rvcd.RVNM";
case "addvcdName" -> "addvcd.ADDVNM";
case "rvcdStepSort" -> "rvcdStepSort";
case "rstcdStepSort" -> "rstcdStepSort";
case "siteStepSort" -> "siteStepSort";
case "baseStepSort" -> "baseStepSort";
default -> null;
};
}
private String buildWqPointOrderBySql(List<DataSourceRequest.SortDescriptor> sortList) {
if (CollUtil.isEmpty(sortList)) {
return " ORDER BY baseStepSort ASC, rvcdStepSort ASC, rstcdStepSort ASC, siteStepSort ASC, stnm ASC";
}
List<String> orderItems = new ArrayList<>();
for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) {
if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) {
continue;
}
String column = mapWqPointColumn(sortDescriptor.getField());
if (StrUtil.isBlank(column)) {
continue;
}
String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC";
orderItems.add(column + " " + dir);
}
if (orderItems.isEmpty()) {
return " ORDER BY baseStepSort ASC, rvcdStepSort ASC, rstcdStepSort ASC, siteStepSort ASC, stnm ASC";
}
return " ORDER BY " + String.join(", ", orderItems);
}
private List<Object> normalizeFilterValues(Object value) {
List<Object> values = new ArrayList<>();
if (value instanceof List) {
((List<?>) value).forEach(v -> {
if (v != null) {
values.add(v);
}
});
} else if (value != null) {
values.add(value);
}
return values;
}
private String getAnchorPoint(EnvWqAnchorPointVo anchorPointVo) { private String getAnchorPoint(EnvWqAnchorPointVo anchorPointVo) {
Integer dtinType = anchorPointVo.getDtinType(); Integer dtinType = anchorPointVo.getDtinType();
Integer sfdb = anchorPointVo.getSfdb(); Integer sfdb = anchorPointVo.getSfdb();

View File

@ -111,10 +111,10 @@ spring:
matching-strategy: ant_path_matcher matching-strategy: ant_path_matcher
data: data:
redis: redis:
host: ${REDIS_HOST:172.16.21.142} host: "${REDIS_HOST:172.16.21.142}"
port: ${REDIS_PORT:6379} port: "${REDIS_PORT:6379}"
password: ${REDIS_PASSWORD:zny5678} password: "${REDIS_PASSWORD:zny5678}"
database: ${REDIS_DATABASE:15} database: "${REDIS_DATABASE:15}"
timeout: 10000ms timeout: 10000ms
lettuce: lettuce:
pool: pool: