From 757efd4d627ae43b4be5257cd16c5fd88b852c4f Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 16 Jul 2026 09:36:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E7=AB=99=E7=B1=BB?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=88=97=E8=A1=A8=EF=BC=88=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=A8=A1=E7=B3=8A=E6=90=9C=E7=B4=A2=E5=92=8CSTTP=5FCODE?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SdWtMonitorServiceImpl.java | 2 +- .../along/controller/MsAlongBController.java | 8 ++ .../qgc_lygk/along/domain/SttpDto.java | 32 +++++ .../along/service/IMsAlongBService.java | 9 ++ .../service/impl/MsAlongBServiceImpl.java | 122 ++++++++++++++++++ 5 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/SttpDto.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java index c2c3f8fe..f50e5292 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -2959,7 +2959,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } @Override -// @Cacheable(cacheNames = "wtCache#3600", keyGenerator = "cacheKeyByUserGenerator") + @Cacheable(cacheNames = "wtCache#3600", keyGenerator = "cacheKeyByUserGenerator") public DataSourceResult getEngTempPointListKendoListCust(DataSourceRequest dataSourceRequest) { DataSourceResult dataSourceResult = new DataSourceResult<>(); dataSourceResult.setAggregates(new HashMap<>()); diff --git a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/controller/MsAlongBController.java b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/controller/MsAlongBController.java index 6ea3a3e6..5c663e81 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/controller/MsAlongBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/controller/MsAlongBController.java @@ -11,6 +11,7 @@ import com.yfd.platform.qgc_base.service.ISdHbrvDicService; import com.yfd.platform.qgc_env.wt.service.SdWtMonitorService; import com.yfd.platform.qgc_lygk.along.domain.MsAlongB; import com.yfd.platform.qgc_lygk.along.domain.PowerDto; +import com.yfd.platform.qgc_lygk.along.domain.SttpDto; import com.yfd.platform.qgc_lygk.along.service.IMsAlongBService; import com.yfd.platform.qgc_sys.mapcfg.service.IMapmoduleBService; import com.yfd.platform.utils.DataSourceRequestUtil; @@ -99,4 +100,11 @@ public class MsAlongBController { DataSourceResult result = msAlongBService.getKendoPage(dataSourceRequest); return ResponseResult.successData(result); } + + @PostMapping("/sttp/GetKendoList") + @Operation(summary = "查询站类信息列表(支持模糊搜索和STTP_CODE过滤)") + public ResponseResult getSttpList(@RequestBody DataSourceRequest dataSourceRequest) { + DataSourceResult result = msAlongBService.getSttpList(dataSourceRequest); + return ResponseResult.successData(result); + } } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/SttpDto.java b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/SttpDto.java new file mode 100644 index 00000000..6731281b --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/SttpDto.java @@ -0,0 +1,32 @@ +package com.yfd.platform.qgc_lygk.along.domain; + +import lombok.Data; + +import java.util.Date; + +/** + * 站类信息查询结果 DTO + */ +@Data +public class SttpDto { + + private String id; + private String sttpCode; + private String sttpName; + private String sttpSname; + private String description; + private Integer enabled; + private String parentId; + private String fullPath; + private Integer treeLevel; + private Integer hasChildren; + private String introduce; + private String logo; + private String inffile; + private Integer internal; + private Integer orderIndex; + private String recordUser; + private Date recordTime; + private String modifyUser; + private Date modifyTime; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/IMsAlongBService.java b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/IMsAlongBService.java index 3847dfe2..b75e2694 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/IMsAlongBService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/IMsAlongBService.java @@ -5,6 +5,7 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_lygk.along.domain.MsAlongB; import com.yfd.platform.qgc_lygk.along.domain.PowerDto; +import com.yfd.platform.qgc_lygk.along.domain.SttpDto; import java.util.List; @@ -28,6 +29,14 @@ public interface IMsAlongBService extends IService { DataSourceResult getKendoPage(DataSourceRequest dataSourceRequest); + /** + * 查询站类信息列表(支持模糊搜索和STTP_CODE过滤) + * + * @param dataSourceRequest 数据源请求 + * @return 数据源结果 + */ + DataSourceResult getSttpList(DataSourceRequest dataSourceRequest); + // /** // * 保存或更新沿程配置 // * diff --git a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/impl/MsAlongBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/impl/MsAlongBServiceImpl.java index a2cc47fc..64647c88 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/impl/MsAlongBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/impl/MsAlongBServiceImpl.java @@ -13,6 +13,7 @@ import com.yfd.platform.qgc_base.domain.SdRvcdDic; import com.yfd.platform.qgc_base.mapper.SdRvcdDicMapper; import com.yfd.platform.qgc_lygk.along.domain.MsAlongB; import com.yfd.platform.qgc_lygk.along.domain.PowerDto; +import com.yfd.platform.qgc_lygk.along.domain.SttpDto; import com.yfd.platform.qgc_lygk.along.mapper.MsAlongBMapper; import com.yfd.platform.qgc_lygk.along.service.IMsAlongBService; import com.yfd.platform.utils.CodeToNameMetadataBo; @@ -154,6 +155,127 @@ public class MsAlongBServiceImpl extends ServiceImpl i return result; } + @Override + public DataSourceResult getSttpList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + + StringBuilder sql = new StringBuilder("SELECT * FROM SD_STTP_B WHERE NVL(IS_DELETED, 0) = 0"); + Map paramMap = new HashMap<>(); + + // 解析过滤条件 + if (dataSourceRequest != null && dataSourceRequest.getFilter() != null) { + String filterSql = parseSttpFilter(dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql); + } + } + + // 解析排序 + if (dataSourceRequest != null && CollUtil.isNotEmpty(dataSourceRequest.getSort())) { + List orderList = new ArrayList<>(); + for (SortDescriptor sort : dataSourceRequest.getSort()) { + String field = sort.getField(); + if (StrUtil.isBlank(field) || !isSafeSttpField(field)) continue; + String direction = "asc".equalsIgnoreCase(sort.getDir()) ? "ASC" : "DESC"; + orderList.add(field + " " + direction); + } + if (!orderList.isEmpty()) { + sql.append(" ORDER BY ").append(String.join(", ", orderList)); + } + } else { + sql.append(" ORDER BY ORDER_INDEX ASC, STTP_CODE ASC"); + } + + // 执行分页查询 + Page page = loadOptions == null ? null : + QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, sql.toString(), paramMap, SttpDto.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + /** + * 递归解析站类过滤条件 + */ + private String parseSttpFilter(FilterDescriptor filter, Map paramMap, int[] paramIndex) { + if (filter == null) return ""; + + List childFilters = filter.getFilters(); + if (CollUtil.isNotEmpty(childFilters)) { + List childConditions = new ArrayList<>(); + for (FilterDescriptor child : childFilters) { + String childSql = parseSttpFilter(child, paramMap, paramIndex); + if (StrUtil.isNotBlank(childSql)) { + childConditions.add(childSql); + } + } + if (childConditions.isEmpty()) return ""; + String logic = StrUtil.isNotBlank(filter.getLogic()) ? filter.getLogic() : "and"; + String connector = "and".equalsIgnoreCase(logic) ? " AND " : " OR "; + return "(" + String.join(connector, childConditions) + ")"; + } + + String field = filter.getField(); + Object value = filter.getValue(); + String operator = filter.getOperator(); + + if (StrUtil.isBlank(field)) return ""; + if (!isSafeSttpField(field)) return ""; + + String paramKey = "stp" + paramIndex[0]++; + paramMap.put(paramKey, value); + + if ("contains".equalsIgnoreCase(operator)) { + return field + " LIKE '%' || #{map." + paramKey + "} || '%'"; + } else if ("startswith".equalsIgnoreCase(operator)) { + return field + " LIKE #{map." + paramKey + "} || '%'"; + } else if ("endswith".equalsIgnoreCase(operator)) { + return field + " LIKE '%' || #{map." + paramKey + "}"; + } else if ("neq".equalsIgnoreCase(operator)) { + return field + " != #{map." + paramKey + "}"; + } else if ("gt".equalsIgnoreCase(operator)) { + return field + " > #{map." + paramKey + "}"; + } else if ("gte".equalsIgnoreCase(operator)) { + return field + " >= #{map." + paramKey + "}"; + } else if ("lt".equalsIgnoreCase(operator)) { + return field + " < #{map." + paramKey + "}"; + } else if ("lte".equalsIgnoreCase(operator)) { + return field + " <= #{map." + paramKey + "}"; + } else if ("isnull".equalsIgnoreCase(operator)) { + paramMap.remove(paramKey); + return field + " IS NULL"; + } else if ("isnotnull".equalsIgnoreCase(operator)) { + paramMap.remove(paramKey); + return field + " IS NOT NULL"; + } else if (value == null) { + paramMap.remove(paramKey); + return ""; + } else { + // 默认 eq + return field + " = #{map." + paramKey + "}"; + } + } + + /** + * 站类表安全字段白名单 + */ + private boolean isSafeSttpField(String field) { + if (StrUtil.isBlank(field)) return false; + Set validFields = new HashSet<>(Arrays.asList( + "ID", "STTP_CODE", "STTP_NAME", "STTP_SNAME", "DESCRIPTION", + "ENABLED", "PARENT_ID", "FULL_PATH", "TREE_LEVEL", "HAS_CHILDREN", + "INTRODUCE", "LOGO", "INFFILE", "INTERNAL", "ORDER_INDEX", + "IS_DELETED" + )); + return validFields.contains(field.toUpperCase()); + } + /** * 递归解析 FilterDescriptor(完美适配你的内部类结构) */