sync-lobster-menus-tenant.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /**
  2. * Sync lobster menus for tenant DB (sys_menu + company_menu)
  3. * Usage: node scripts/sync-lobster-menus-tenant.js [dbName] [audit|sync]
  4. */
  5. const mysql = require('mysql2/promise')
  6. const { LOBSTER_MENUS, TENANT_COMPANY_MENU_EXCLUDE } = require('./lobster-menu-definitions')
  7. const DB_CFG = {
  8. host: 'cq-cdb-8fjmemkb.sql.tencentcdb.com',
  9. port: 27220,
  10. user: 'root',
  11. password: 'Ylrz_1q2w3e4r5t6y',
  12. multipleStatements: true,
  13. charset: 'utf8mb4'
  14. }
  15. const TARGET_DB = process.argv[2] || 'fs_tenant_cs1'
  16. const COMPANY_MENU_EXCLUDE = TENANT_COMPANY_MENU_EXCLUDE
  17. const COMPANY_MENU_IDS = LOBSTER_MENUS.filter(m => !COMPANY_MENU_EXCLUDE.has(m.id)).map(m => m.id)
  18. async function upsertSysMenu(conn, m) {
  19. const [ex] = await conn.query('SELECT menu_id FROM sys_menu WHERE menu_id = ?', [m.id])
  20. if (!ex.length) {
  21. await conn.query(
  22. `INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, perms, create_by, create_time, remark)
  23. VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, '0', 0, 0, ?, 'admin', NOW(), 'lobster sync')`,
  24. [m.id, m.name, m.parent, m.order, m.path, m.component, m.type, m.icon, m.visible, m.perms]
  25. )
  26. return 'insert'
  27. }
  28. await conn.query(
  29. `UPDATE sys_menu SET menu_name=?, parent_id=?, order_num=?, path=?, component=?, menu_type=?, icon=?, visible=?, status='0', perms=? WHERE menu_id=?`,
  30. [m.name, m.parent, m.order, m.path, m.component, m.type, m.icon, m.visible, m.perms, m.id]
  31. )
  32. return 'update'
  33. }
  34. async function upsertCompanyMenu(conn, m) {
  35. const [ex] = await conn.query('SELECT menu_id FROM company_menu WHERE menu_id = ?', [m.id])
  36. if (!ex.length) {
  37. await conn.query(
  38. `INSERT INTO company_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, company_id, remark)
  39. VALUES (?, ?, ?, ?, ?, ?, 0, 0, ?, ?, '0', ?, ?, 'admin', NOW(), NULL, 'lobster sync')`,
  40. [m.id, m.name, m.parent, m.order, m.path, m.component, m.type, m.visible, m.perms, m.icon]
  41. )
  42. return 'insert'
  43. }
  44. await conn.query(
  45. `UPDATE company_menu SET menu_name=?, parent_id=?, order_num=?, path=?, component=?, menu_type=?, icon=?, visible=?, status='0', perms=? WHERE menu_id=?`,
  46. [m.name, m.parent, m.order, m.path, m.component, m.type, m.icon, m.visible, m.perms, m.id]
  47. )
  48. return 'update'
  49. }
  50. async function audit(conn) {
  51. const ids = LOBSTER_MENUS.map(m => m.id)
  52. const [sysRows] = await conn.query(
  53. `SELECT menu_id, menu_name, path, component, visible FROM sys_menu WHERE menu_id IN (${ids.join(',')}) ORDER BY order_num, menu_id`
  54. )
  55. const [cmRows] = await conn.query(
  56. `SELECT menu_id, menu_name, path, component, visible FROM company_menu WHERE menu_id IN (${COMPANY_MENU_IDS.join(',')}) ORDER BY order_num, menu_id`
  57. )
  58. console.log('\n=== sys_menu === count', sysRows.length, '/', LOBSTER_MENUS.length)
  59. sysRows.forEach(r => console.log(` ${r.menu_id}\t${r.menu_name}\t${r.path}\t${r.component}`))
  60. const missSys = LOBSTER_MENUS.filter(m => !sysRows.find(r => r.menu_id === m.id))
  61. if (missSys.length) console.log('missing sys:', missSys.map(m => m.id + ':' + m.name).join(', '))
  62. console.log('\n=== company_menu === count', cmRows.length, '/', COMPANY_MENU_IDS.length)
  63. cmRows.forEach(r => console.log(` ${r.menu_id}\t${r.menu_name}\t${r.path}`))
  64. const missCm = COMPANY_MENU_IDS.filter(id => !cmRows.find(r => r.menu_id === id))
  65. if (missCm.length) console.log('missing company:', missCm.join(', '))
  66. }
  67. async function sync(conn) {
  68. await conn.query('DELETE FROM sys_role_menu WHERE menu_id IN (29923, 2999, 29937, 29938, 29939, 29946, 29947, 3005)')
  69. await conn.query('DELETE FROM company_role_menu WHERE menu_id IN (29923, 2999, 29933, 29937, 29938, 29939, 29946, 29947, 3005)')
  70. await conn.query("DELETE FROM company_menu WHERE menu_id IN (29923, 2999, 29933, 29937, 29938, 29939, 29946, 29947, 3005) OR path IN ('execution-config', 'dashboard', 'evolution', 'token-stats') OR component IN ('lobster/summary-config/index', 'lobster/model-route/index', 'lobster/execution-config/index', 'lobster/dashboard/index', 'lobster/evolution/index', 'lobster/token-stats/index')")
  71. await conn.query("DELETE FROM sys_menu WHERE menu_id IN (29923, 2999, 29937, 29938, 29939, 29946, 29947, 3005) OR path IN ('execution-config', 'dashboard', 'evolution', 'token-stats') OR component IN ('lobster/summary-config/index', 'lobster/model-route/index', 'lobster/execution-config/index', 'lobster/dashboard/index', 'lobster/evolution/index', 'lobster/token-stats/index')")
  72. await conn.query('DROP TABLE IF EXISTS company_lobster_summary_config')
  73. let sysIns = 0; let sysUpd = 0; let cmIns = 0; let cmUpd = 0
  74. for (const m of LOBSTER_MENUS) {
  75. const r = await upsertSysMenu(conn, m)
  76. if (r === 'insert') sysIns++; else sysUpd++
  77. }
  78. for (const id of COMPANY_MENU_IDS) {
  79. const m = LOBSTER_MENUS.find(x => x.id === id)
  80. const companyMenu = id === 29934 ? { ...m, perms: 'workflow:lobster:query' } : m
  81. const r = await upsertCompanyMenu(conn, companyMenu)
  82. if (r === 'insert') cmIns++; else cmUpd++
  83. }
  84. await conn.query(`UPDATE sys_menu SET visible='1' WHERE menu_id IN (29936,29922,29948,29926)`)
  85. await conn.query(`UPDATE company_menu SET visible='1' WHERE menu_id IN (29922,29948,29926)`)
  86. await conn.query(`
  87. INSERT IGNORE INTO sys_role_menu (role_id, menu_id)
  88. SELECT DISTINCT srm.role_id, m.menu_id
  89. FROM sys_role_menu srm
  90. CROSS JOIN (SELECT menu_id FROM sys_menu WHERE parent_id = 29900 OR menu_id = 29900) m
  91. WHERE srm.menu_id = 29900
  92. `)
  93. await conn.query(`
  94. INSERT IGNORE INTO sys_role_menu (role_id, menu_id)
  95. SELECT 1, menu_id FROM sys_menu WHERE parent_id = 29900 OR menu_id = 29900
  96. `)
  97. await conn.query(`
  98. INSERT IGNORE INTO company_role_menu (role_id, menu_id)
  99. SELECT DISTINCT crm.role_id, m.menu_id
  100. FROM company_role_menu crm
  101. CROSS JOIN (SELECT menu_id FROM company_menu WHERE parent_id = 29900 OR menu_id = 29900) m
  102. WHERE crm.menu_id = 29900
  103. `)
  104. console.log(`\nSync: sys +${sysIns}/~${sysUpd}, company +${cmIns}/~${cmUpd}`)
  105. }
  106. async function main() {
  107. const mode = process.argv[3] || 'sync'
  108. const conn = await mysql.createConnection({ ...DB_CFG, database: TARGET_DB })
  109. console.log('DB:', TARGET_DB, 'mode:', mode)
  110. await audit(conn)
  111. if (mode === 'sync') {
  112. await sync(conn)
  113. await audit(conn)
  114. }
  115. await conn.end()
  116. }
  117. main().catch(e => { console.error(e); process.exit(1) })