import java.sql.*; /** 只读核对:s_menu 全量父子关系、路由、path,确认哪些节点挂错了父级。 */ public class CheckMenuTree { public static void main(String[] args) throws Exception { String url = "jdbc:sqlserver://118.89.70.199:1433;databaseName=FMS;encrypt=true;trustServerCertificate=true"; try (Connection conn = DriverManager.getConnection(url, "sa", System.getenv("FMS_SA_PWD"))) { System.out.println("=== s_menu 全量(按现有 b_parent_id 展开)==="); try (PreparedStatement ps = conn.prepareStatement( "select b_id, b_name, b_parent_id, b_depth, b_path, b_route, b_menu_type, b_canuse, b_xh " + "from s_menu order by b_depth, b_xh, b_id"); ResultSet rs = ps.executeQuery()) { while (rs.next()) { System.out.printf(" id=%-12s name=%-10s parent=%-10s depth=%-2d canuse=%d%n", rs.getString("b_id"), rs.getString("b_name"), String.valueOf(rs.getString("b_parent_id")), rs.getInt("b_depth"), rs.getInt("b_canuse")); System.out.printf(" path=%-28s route=%-26s type=%s%n", rs.getString("b_path"), String.valueOf(rs.getString("b_route")), rs.getString("b_menu_type")); } } System.out.println("\n=== 路由前缀 vs 父级 一致性检查 ==="); try (PreparedStatement ps = conn.prepareStatement( "select m.b_id, m.b_name, m.b_parent_id, m.b_route, m.b_path, " + "p.b_name as parent_name, p.b_path as parent_path " + "from s_menu m left join s_menu p on p.b_id = m.b_parent_id " + "where m.b_route is not null order by m.b_id"); ResultSet rs = ps.executeQuery()) { while (rs.next()) { String route = String.valueOf(rs.getString("b_route")); String parentPath = String.valueOf(rs.getString("parent_path")); // 路由首段(/base/othercompany -> base)与父级 path 段比对 String routeSeg = route.split("/").length > 1 ? route.split("/")[1] : ""; String parentSeg = parentPath.split("/").length > 1 ? parentPath.split("/")[1] : ""; boolean mismatch = !routeSeg.isEmpty() && !parentSeg.isEmpty() && !routeSeg.equals(parentSeg); System.out.printf(" %-12s route=%-24s 父=%-10s(父path=%-16s) %s%n", rs.getString("b_id"), route, String.valueOf(rs.getString("parent_name")), parentPath, mismatch ? " <== 不一致" : ""); } } } } }