From 501d42ac2f3d2fcab291cbafeb3516b112b3e35a Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 7 Jul 2026 11:20:44 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wq/service/impl/EnvWqDataServiceImpl.java | 223 +++++++++++++++++- .../src/main/resources/application-prod.yml | 8 +- 2 files changed, 214 insertions(+), 17 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java index 6ea50150..424620d3 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java @@ -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(") siteSort ON siteSort.RVCD = eng.HBRVCD AND siteSort.STCD = t.STCD ") .append("WHERE NVL(t.IS_DELETED, 0) = 0 ") - .append("AND NVL(t.USFL, 1) = 1 ") - .append("AND t.LGTD IS NOT NULL ") - .append("AND t.LTTD IS NOT NULL "); + .append("AND NVL(t.USFL, 1) = 1 "); + + Map 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(); Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); - List wqVoList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), new HashMap<>(), EnvWqAnchorPointVo.class); + List wqVoList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, EnvWqAnchorPointVo.class); if (CollectionUtils.isNotEmpty(wqVoList)) { List stcdList = wqVoList.stream() @@ -4622,15 +4628,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .distinct() .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 " + - "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 wqDataList = microservicDynamicSQLMapper.getAllListWithResultType(wqDataSql, new HashMap<>(), EnvWqDataVo.class); + List wqDataList = queryWqDataByStcdBatch(stcdList); Map wqDataMap = wqDataList.stream() .collect(Collectors.toMap(EnvWqDataVo::getStcd, Function.identity(), (oldValue, newValue) -> newValue)); @@ -4706,6 +4704,205 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return dataSourceResult; } + private List queryWqDataByStcdBatch(List stcdList) { + List resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(stcdList)) { + return resultList; + } + + int batchSize = 500; + List> batches = CollUtil.split(stcdList, batchSize); + + for (List 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 batchList = microservicDynamicSQLMapper.getAllListWithResultType(wqDataSql, new HashMap<>(), EnvWqDataVo.class); + if (CollectionUtils.isNotEmpty(batchList)) { + resultList.addAll(batchList); + } + } + return resultList; + } + + private String buildWqPointFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (CollUtil.isNotEmpty(filter.getFilters())) { + List 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 values = normalizeFilterValues(value); + if (values.isEmpty()) { + return ""; + } + List 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 sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY baseStepSort ASC, rvcdStepSort ASC, rstcdStepSort ASC, siteStepSort ASC, stnm ASC"; + } + List 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 normalizeFilterValues(Object value) { + List 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) { Integer dtinType = anchorPointVo.getDtinType(); Integer sfdb = anchorPointVo.getSfdb(); diff --git a/backend/src/main/resources/application-prod.yml b/backend/src/main/resources/application-prod.yml index 48e5a037..a08b5045 100644 --- a/backend/src/main/resources/application-prod.yml +++ b/backend/src/main/resources/application-prod.yml @@ -111,10 +111,10 @@ spring: matching-strategy: ant_path_matcher data: redis: - host: ${REDIS_HOST:172.16.21.142} - port: ${REDIS_PORT:6379} - password: ${REDIS_PASSWORD:zny5678} - database: ${REDIS_DATABASE:15} + host: "${REDIS_HOST:172.16.21.142}" + port: "${REDIS_PORT:6379}" + password: "${REDIS_PASSWORD:zny5678}" + database: "${REDIS_DATABASE:15}" timeout: 10000ms lettuce: pool: