diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java index 5819f58..f9ffeca 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java @@ -197,13 +197,10 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { @Override public DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); - String mway = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "mway"); - String sttpCode = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "sttpCode"); - String dtinType = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "dtinType"); - String rstcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd"); - String stnm = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stnm"); - String coenvwState = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "coenvwState"); - + String sttpCode = findFilterFieldValue(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), "sttpCode"); + if (StrUtil.isBlank(sttpCode)) { + sttpCode = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "sttpCode"); + } StringBuilder sql = new StringBuilder(); boolean queryEngDirectly = "ENG".equalsIgnoreCase(sttpCode); if (queryEngDirectly) { @@ -255,48 +252,17 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { } Map paramMap = new HashMap<>(); - if (!queryEngDirectly && StrUtil.isNotBlank(mway)) { - paramMap.put("mway", mway); - sql.append("AND wq.MWAY = #{map.mway} "); - } - if (!queryEngDirectly && StrUtil.isNotBlank(sttpCode)) { - paramMap.put("sttpCode", sttpCode); - sql.append("AND wq.STTP = #{map.sttpCode} "); - } - if (StrUtil.isNotBlank(dtinType)) { - paramMap.put("dtinType", dtinType); - if (queryEngDirectly) { - sql.append("AND NVL(eng.DTIN, 0) = #{map.dtinType} "); - } else { - sql.append("AND wq.DTIN_TYPE = #{map.dtinType} "); - } - } - if (StrUtil.isNotBlank(rstcd)) { - paramMap.put("rstcd", rstcd); - if (queryEngDirectly) { - sql.append("AND eng.STCD = #{map.rstcd} "); - } else { - sql.append("AND wq.RSTCD = #{map.rstcd} "); - } - } - if (StrUtil.isNotBlank(stnm)) { - paramMap.put("stnm", "%" + stnm + "%"); - if (queryEngDirectly) { - sql.append("AND eng.ENNM LIKE #{map.stnm} "); - } else { - sql.append("AND wq.STNM LIKE #{map.stnm} "); - } - } - if (StrUtil.isNotBlank(coenvwState)) { - paramMap.put("coenvwState", coenvwState); - if (queryEngDirectly) { - sql.append("AND CASE WHEN NVL(eng.DTIN, 0) = 1 THEN 1 ELSE 0 END = #{map.coenvwState} "); - } else { - sql.append("AND CASE WHEN recent.STCD IS NOT NULL THEN 1 ELSE 0 END = #{map.coenvwState} "); - } + String filterSql = buildVmsstbprptFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0}, + queryEngDirectly + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); } + sql.append(buildVmsstbprptOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort(), queryEngDirectly)); -// sql.append(buildEnvWqOrderBySql(dataSourceRequest.getSort())); PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions); Page page = pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WqVmsstbprptVo.class); @@ -308,6 +274,25 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return result; } + private String findFilterFieldValue(DataSourceRequest.FilterDescriptor filter, String field) { + if (filter == null || StrUtil.isBlank(field)) { + return null; + } + if (field.equalsIgnoreCase(filter.getField()) && filter.getValue() != null) { + return String.valueOf(filter.getValue()); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return null; + } + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String value = findFilterFieldValue(child, field); + if (StrUtil.isNotBlank(value)) { + return value; + } + } + return null; + } + @Override public WqBaseInfoVo getStcdInfo(String stcd) { if (StrUtil.isBlank(stcd)) { @@ -1217,6 +1202,166 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return result; } + private String buildVmsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder, + boolean queryEngDirectly) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildVmsstbprptLeafCondition(filter, paramMap, indexHolder, queryEngDirectly); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildVmsstbprptFilterCondition(child, paramMap, indexHolder, queryEngDirectly); + 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 buildVmsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder, + boolean queryEngDirectly) { + String column = mapVmsstbprptColumn(filter.getField(), queryEngDirectly); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + boolean dateField = "jcdt".equalsIgnoreCase(filter.getField()); + + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator)) { + List values = normalizeMsstbprptValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "vmsP" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + + String key = "vmsP" + indexHolder[0]++; + switch (operator) { + case "eq": + paramMap.put(key, value); + return dateField ? column + " = TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " = #{map." + key + "}"; + case "neq": + paramMap.put(key, value); + return dateField ? column + " <> TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " <> #{map." + key + "}"; + case "gt": + paramMap.put(key, value); + return dateField ? column + " > TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " > #{map." + key + "}"; + case "gte": + paramMap.put(key, value); + return dateField ? column + " >= TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " >= #{map." + key + "}"; + case "lt": + paramMap.put(key, value); + return dateField ? column + " < TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " < #{map." + key + "}"; + case "lte": + paramMap.put(key, value); + return dateField ? column + " <= TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " <= #{map." + key + "}"; + case "contains": + paramMap.put(key, "%" + value + "%"); + return column + " LIKE #{map." + key + "}"; + case "startswith": + paramMap.put(key, value + "%"); + return column + " LIKE #{map." + key + "}"; + case "endswith": + paramMap.put(key, "%" + value); + return column + " LIKE #{map." + key + "}"; + default: + return ""; + } + } + + private String mapVmsstbprptColumn(String field, boolean queryEngDirectly) { + if (StrUtil.isBlank(field)) { + return null; + } + if (queryEngDirectly) { + return switch (field) { + case "baseName" -> "hb.BASENAME"; + case "baseId" -> "hb.BASEID"; + case "stnm", "ennm" -> "eng.ENNM"; + case "jcdt" -> "eng.JCDT"; + case "stindx" -> "NULL"; + case "coenvwState", "dtin", "dtinType" -> "CASE WHEN NVL(eng.DTIN, 0) = 1 THEN 1 ELSE 0 END"; + case "sttpCode" -> "'ENG'"; + case "stcd", "rstcd" -> "eng.STCD"; + case "dvtp" -> "eng.DVTP"; + case "baseStepSort" -> "hb.ORDER_INDEX"; + case "hbrvcd" -> "eng.HBRVCD"; + case "rstcdStepSort", "siteStepSort" -> "eng.ORDER_INDEX"; + default -> null; + }; + } + return switch (field) { + case "baseName" -> "hb.BASENAME"; + case "baseId" -> "hb.BASEID"; + case "stnm" -> "wq.STNM"; + case "ennm" -> "eng.ENNM"; + case "jcdt" -> "wq.JCDT"; + case "stindx" -> "wq.STINDX"; + case "coenvwState" -> "CASE WHEN recent.STCD IS NOT NULL THEN 1 ELSE 0 END"; + case "sttpCode" -> "wq.STTP"; + case "stcd" -> "wq.STCD"; + case "rstcd" -> "wq.RSTCD"; + case "dvtp" -> "eng.DVTP"; + case "baseStepSort" -> "hb.ORDER_INDEX"; + case "hbrvcd" -> "eng.HBRVCD"; + case "rstcdStepSort" -> "eng.ORDER_INDEX"; + case "siteStepSort" -> "wq.ORDER_INDEX"; + case "mway" -> "wq.MWAY"; + case "dtinType" -> "wq.DTIN_TYPE"; + case "dtin" -> "wq.DTIN"; + case "isDeleted" -> "NVL(wq.IS_DELETED, 0)"; + default -> null; + }; + } + + private String buildVmsstbprptOrderBySql(List sortList, boolean queryEngDirectly) { + List orderColumns = new ArrayList<>(); + if (sortList != null) { + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapVmsstbprptColumn(sortDescriptor.getField(), queryEngDirectly); + if (StrUtil.isBlank(column) || "NULL".equalsIgnoreCase(column)) { + continue; + } + String dir = ("desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir())) ? "DESC" : "ASC"; + orderColumns.add(column + " " + dir); + } + } + if (orderColumns.isEmpty()) { + return " ORDER BY hb.ORDER_INDEX ASC NULLS LAST, eng.HBRVCD ASC NULLS LAST, eng.ORDER_INDEX ASC NULLS LAST" + + (queryEngDirectly ? ", eng.ORDER_INDEX ASC NULLS LAST" : ", wq.ORDER_INDEX ASC NULLS LAST"); + } + return " ORDER BY " + String.join(", ", orderColumns); + } + private String buildMsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) {