package com.ruoyi.basic.utils; import com.ruoyi.common.exception.base.BaseException; import java.util.regex.Pattern; /** * 标准树固定两级路径解析工具。 * * 兼容前端传递的两种叶子路径: * 标准库侧:行业 - null - 标准 * 下单侧:行业 - - 标准 * 统一解析为 industry = 第一个有效段,standard = 最后一个有效段。 */ public final class StandardTreePathParser { private static final String SEPARATOR = " - "; private static final String NULL_MARKER = "null"; private StandardTreePathParser() { } /** * 解析路径为行业 + 标准。标准可能为 null(表示仅行业节点)。 */ public static StandardTreePath parse(String tree) { if (tree == null || tree.trim().isEmpty()) { throw new BaseException("标准树路径格式错误"); } String[] parts = tree.split(Pattern.quote(SEPARATOR), -1); for (int i = 0; i < parts.length; i++) { parts[i] = parts[i].trim(); } if (parts.length == 1) { validateSegment(parts[0]); return new StandardTreePath(parts[0], null); } if (parts.length == 2) { validateSegment(parts[0]); validateSegment(parts[1]); return new StandardTreePath(parts[0], parts[1]); } if (parts.length == 3 && (parts[1].isEmpty() || NULL_MARKER.equals(parts[1]))) { validateSegment(parts[0]); validateSegment(parts[2]); return new StandardTreePath(parts[0], parts[2]); } throw new BaseException("标准树路径格式错误"); } /** * 生成规范路径:行业 - null - 标准 */ public static String canonical(String industry, String standard) { String normalizedIndustry = trim(industry); String normalizedStandard = trim(standard); validateSegment(normalizedIndustry); validateSegment(normalizedStandard); return normalizedIndustry + SEPARATOR + NULL_MARKER + SEPARATOR + normalizedStandard; } private static String trim(String value) { return value == null ? "" : value.trim(); } public static String normalizeNodeName(String value) { String normalized = trim(value); validateSegment(normalized); return normalized; } private static void validateSegment(String value) { if (value == null || value.isEmpty() || NULL_MARKER.equals(value) || value.contains(SEPARATOR)) { throw new BaseException("标准树路径格式错误"); } } }