ApplyLobsterSysOnlyAdminMenus.java 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import java.nio.charset.StandardCharsets;
  2. import java.nio.file.Files;
  3. import java.nio.file.Path;
  4. import java.sql.Connection;
  5. import java.sql.DriverManager;
  6. import java.sql.ResultSet;
  7. import java.sql.Statement;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. /**
  11. * Apply lobster sys-only admin menus to master + tenant DB(s).
  12. * Usage:
  13. * java -cp ".;lib/mysql-connector-j-8.0.33.jar" ApplyLobsterSysOnlyAdminMenus [tenantDb]
  14. */
  15. public class ApplyLobsterSysOnlyAdminMenus {
  16. private static final String HOST = "cq-cdb-8fjmemkb.sql.tencentcdb.com:27220";
  17. private static final String USER = "root";
  18. private static final String PASS = "Ylrz_1q2w3e4r5t6y";
  19. private static final String MASTER_DB = "ylrz_saas";
  20. private static final String SALES =
  21. "29900,32481,29949,29905,29950,29934,29906,3008,29912";
  22. private static final String ADMIN_ONLY =
  23. "29925,29951,29963,29964,29907,29908,29909,29933,29965,29966";
  24. private static final String ADMIN_DROP =
  25. "29947,29938,29944,29936,29946,29937";
  26. public static void main(String[] args) throws Exception {
  27. Class.forName("com.mysql.cj.jdbc.Driver");
  28. Path tenantSqlPath = Path.of("d:/ylrz_saas_new/java/fs-agent/src/main/resources/db/migration/tenant/V20260724_04__lobster_sys_only_admin_menus.sql");
  29. Path masterSqlPath = Path.of("d:/ylrz_saas_new/java/sql/master/V20260724_04__lobster_sys_only_admin_menus.sql");
  30. String tenantSql = readSql(tenantSqlPath);
  31. String masterSql = readSql(masterSqlPath);
  32. String tenantDb = args.length > 0 ? args[0] : "fs_tenant_cs1";
  33. System.out.println("=== MASTER " + MASTER_DB + " ===");
  34. try (Connection c = open(MASTER_DB)) {
  35. exec(c, masterSql);
  36. report(c, "tenant_sys_menu", "29900");
  37. report(c, "tenant_company_menu", "29900");
  38. }
  39. System.out.println("\n=== TENANT " + tenantDb + " ===");
  40. try (Connection c = open(tenantDb)) {
  41. exec(c, tenantSql);
  42. report(c, "sys_menu", "29900");
  43. report(c, "company_menu", "29900");
  44. }
  45. writeReport(tenantDb);
  46. System.out.println("\nDone.");
  47. }
  48. private static String readSql(Path path) throws Exception {
  49. byte[] bytes = Files.readAllBytes(path);
  50. String sql = new String(bytes, StandardCharsets.UTF_8);
  51. if (!sql.isEmpty() && sql.charAt(0) == '') {
  52. sql = sql.substring(1);
  53. }
  54. return sql;
  55. }
  56. private static void exec(Connection c, String sql) throws Exception {
  57. try (Statement st = c.createStatement()) {
  58. st.execute(sql);
  59. }
  60. }
  61. private static void report(Connection c, String table, String rootId) throws Exception {
  62. System.out.println("\n--- " + table + " ---");
  63. int sysCount = count(c, table, rootId, false);
  64. int salesCount = count(c, table, rootId, true);
  65. System.out.println("total under " + rootId + ": " + sysCount);
  66. System.out.println("sales visible leaf: " + salesCount);
  67. if ("sys_menu".equals(table) || "tenant_sys_menu".equals(table)) {
  68. listAdminOnly(c, table);
  69. }
  70. }
  71. private static int count(Connection c, String table, String rootId, boolean salesOnly) throws Exception {
  72. String sql = "SELECT COUNT(*) FROM " + table + " WHERE menu_id=" + rootId
  73. + " OR parent_id=" + rootId;
  74. if (salesOnly) {
  75. sql += " AND menu_type='C' AND visible='0' AND status='0' AND menu_id IN (" + SALES + ")";
  76. }
  77. try (Statement st = c.createStatement(); ResultSet rs = st.executeQuery(sql)) {
  78. rs.next();
  79. return rs.getInt(1);
  80. }
  81. }
  82. private static void listAdminOnly(Connection c, String table) throws Exception {
  83. String sql = "SELECT menu_id, menu_name, order_num, path FROM " + table
  84. + " WHERE parent_id=29900 AND menu_type='C' AND visible='0' AND status='0'"
  85. + " AND menu_id IN (" + ADMIN_ONLY + ") ORDER BY order_num, menu_id";
  86. try (Statement st = c.createStatement(); ResultSet rs = st.executeQuery(sql)) {
  87. int n = 0;
  88. while (rs.next()) {
  89. n++;
  90. System.out.printf(" admin-only %2d. [%d] %s | %s%n",
  91. n, rs.getLong("menu_id"), rs.getString("menu_name"), rs.getString("path"));
  92. }
  93. System.out.println("admin-only count=" + n);
  94. }
  95. }
  96. private static void writeReport(String tenantDb) throws Exception {
  97. Path out = Path.of("d:/ylrz_saas_new/java/scripts/output/lobster-sys-only-admin-menus-report.txt");
  98. Files.createDirectories(out.getParent());
  99. List<String> lines = new ArrayList<>();
  100. lines.add("lobster sys-only admin menus applied");
  101. lines.add("tenant=" + tenantDb);
  102. lines.add("sales_keep=" + SALES);
  103. lines.add("admin_only=" + ADMIN_ONLY);
  104. lines.add("admin_drop=" + ADMIN_DROP);
  105. try (Connection master = open(MASTER_DB); Connection tenant = open(tenantDb)) {
  106. lines.add("");
  107. lines.add("=== MASTER tenant_sys_menu admin-only ===");
  108. appendAdminLines(master, lines, "tenant_sys_menu");
  109. lines.add("");
  110. lines.add("=== MASTER tenant_company_menu (should be sales only) ===");
  111. appendLeafLines(master, lines, "tenant_company_menu", SALES);
  112. lines.add("");
  113. lines.add("=== TENANT sys_menu admin-only ===");
  114. appendAdminLines(tenant, lines, "sys_menu");
  115. lines.add("");
  116. lines.add("=== TENANT company_menu (should be sales only) ===");
  117. appendLeafLines(tenant, lines, "company_menu", SALES);
  118. }
  119. Files.write(out, lines, StandardCharsets.UTF_8);
  120. System.out.println("Report: " + out);
  121. }
  122. private static void appendAdminLines(Connection c, List<String> lines, String table) throws Exception {
  123. String sql = "SELECT menu_id, menu_name, order_num, path FROM " + table
  124. + " WHERE parent_id=29900 AND menu_id IN (" + ADMIN_ONLY + ") ORDER BY order_num, menu_id";
  125. try (Statement st = c.createStatement(); ResultSet rs = st.executeQuery(sql)) {
  126. while (rs.next()) {
  127. lines.add(String.format("[%d] %s | order=%d | %s",
  128. rs.getLong("menu_id"), rs.getString("menu_name"),
  129. rs.getInt("order_num"), rs.getString("path")));
  130. }
  131. }
  132. }
  133. private static void appendLeafLines(Connection c, List<String> lines, String table, String ids) throws Exception {
  134. String sql = "SELECT menu_id, menu_name, order_num, path FROM " + table
  135. + " WHERE parent_id=29900 AND menu_type='C' AND visible='0' AND status='0'"
  136. + " AND menu_id IN (" + ids + ") ORDER BY order_num, menu_id";
  137. try (Statement st = c.createStatement(); ResultSet rs = st.executeQuery(sql)) {
  138. while (rs.next()) {
  139. lines.add(String.format("[%d] %s | order=%d | %s",
  140. rs.getLong("menu_id"), rs.getString("menu_name"),
  141. rs.getInt("order_num"), rs.getString("path")));
  142. }
  143. }
  144. }
  145. private static Connection open(String db) throws Exception {
  146. String url = "jdbc:mysql://" + HOST + "/" + db
  147. + "?useSSL=false&serverTimezone=GMT%2B8&characterEncoding=utf8&allowMultiQueries=true";
  148. return DriverManager.getConnection(url, USER, PASS);
  149. }
  150. }