add-conversation-summary-menu.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /**
  2. * Deploy menu 29948 (conversation-summary) to master + all tenant DBs.
  3. * Use \\u escapes only for Chinese literals.
  4. */
  5. const mysql = require('mysql2/promise')
  6. const MENU = {
  7. id: 29948,
  8. name: '\u4f1a\u8bdd\u6458\u8981',
  9. parentId: 29900,
  10. orderNum: 161,
  11. path: 'conversation-summary',
  12. component: 'lobster/conversation-summary/index',
  13. perms: 'workflow:lobster:summary',
  14. icon: 'el-icon-document-copy',
  15. refMenuId: 29923
  16. }
  17. async function main() {
  18. const host = process.env.DB_HOST || 'cq-cdb-8fjmemkb.sql.tencentcdb.com'
  19. const port = Number(process.env.DB_PORT || 27220)
  20. const user = process.env.DB_USER || 'root'
  21. const password = process.env.DB_PASSWORD || 'Ylrz_1q2w3e4r5t6y'
  22. const masterDb = process.env.DB_NAME || 'ylrz_saas'
  23. const master = await mysql.createConnection({ host, port, user, password, database: masterDb, charset: 'utf8mb4' })
  24. console.log('=== MASTER ===')
  25. await deployMaster(master)
  26. await master.end()
  27. const tenantConn = await mysql.createConnection({ host, port, user, password, database: masterDb, charset: 'utf8mb4' })
  28. const [tenants] = await tenantConn.query('SELECT id, tenant_code, db_url, db_account, db_pwd FROM tenant_info WHERE status=1')
  29. await tenantConn.end()
  30. for (const t of tenants) {
  31. const db = parseDbName(t.db_url)
  32. if (!db) continue
  33. console.log('=== TENANT', t.id, t.tenant_code, '===')
  34. try {
  35. const conn = await mysql.createConnection({
  36. host, port, user: t.db_account || user, password: t.db_pwd || password, database: db, charset: 'utf8mb4'
  37. })
  38. await deployTenant(conn)
  39. await conn.end()
  40. } catch (e) {
  41. console.log('skip:', e.message)
  42. }
  43. }
  44. console.log('Done.')
  45. }
  46. async function fixMenuNames(conn, tables) {
  47. for (const table of tables) {
  48. if (!(await tableExists(conn, table))) continue
  49. const [r] = await conn.query(
  50. `UPDATE ${table} SET menu_name=? WHERE menu_id=? OR component=?`,
  51. [MENU.name, MENU.id, MENU.component]
  52. )
  53. if (r.affectedRows) console.log(table, 'name fix rows=', r.affectedRows)
  54. }
  55. }
  56. async function deployMaster(conn) {
  57. if (await tableExists(conn, 'tenant_sys_menu')) {
  58. const [r] = await conn.query(
  59. `INSERT IGNORE INTO tenant_sys_menu
  60. (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)
  61. VALUES (?, ?, ?, ?, ?, ?, 'C', ?, '0', '0', 0, 0, ?, 'admin', NOW(), ?)`,
  62. [MENU.id, MENU.name, MENU.parentId, MENU.orderNum, MENU.path, MENU.component, MENU.icon, MENU.perms, MENU.name]
  63. )
  64. console.log('tenant_sys_menu rows=', r.affectedRows)
  65. }
  66. if (await tableExists(conn, 'tenant_company_menu')) {
  67. const [r] = await conn.query(
  68. `INSERT IGNORE INTO tenant_company_menu
  69. (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)
  70. SELECT menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, NULL, remark
  71. FROM tenant_sys_menu WHERE menu_id = ?`,
  72. [MENU.id]
  73. )
  74. console.log('tenant_company_menu rows=', r.affectedRows)
  75. }
  76. await fixMenuNames(conn, ['tenant_sys_menu', 'tenant_company_menu'])
  77. }
  78. async function deployTenant(conn) {
  79. if (!(await tableExists(conn, 'sys_menu'))) return
  80. const [r1] = await conn.query(
  81. `INSERT IGNORE INTO sys_menu
  82. (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)
  83. VALUES (?, ?, ?, ?, ?, ?, 'C', ?, '0', '0', 0, 0, ?, 'admin', NOW(), ?)`,
  84. [MENU.id, MENU.name, MENU.parentId, MENU.orderNum, MENU.path, MENU.component, MENU.icon, MENU.perms, MENU.name]
  85. )
  86. console.log('sys_menu rows=', r1.affectedRows)
  87. if (await tableExists(conn, 'company_menu')) {
  88. const [r2] = await conn.query(
  89. `INSERT IGNORE INTO company_menu
  90. (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)
  91. SELECT menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, NULL, remark
  92. FROM sys_menu WHERE menu_id = ?`,
  93. [MENU.id]
  94. )
  95. console.log('company_menu rows=', r2.affectedRows)
  96. }
  97. if (await tableExists(conn, 'sys_role_menu')) {
  98. const [r3] = await conn.query(
  99. `INSERT IGNORE INTO sys_role_menu (role_id, menu_id)
  100. SELECT DISTINCT rm.role_id, ?
  101. FROM sys_role_menu rm
  102. JOIN sys_menu m ON m.menu_id = rm.menu_id
  103. WHERE m.menu_id = ? OR m.parent_id = ?`,
  104. [MENU.id, MENU.parentId, MENU.parentId]
  105. )
  106. console.log('sys_role_menu rows=', r3.affectedRows)
  107. }
  108. if (await tableExists(conn, 'company_role_menu')) {
  109. const [r4] = await conn.query(
  110. `INSERT IGNORE INTO company_role_menu (role_id, menu_id)
  111. SELECT DISTINCT rm.role_id, ?
  112. FROM company_role_menu rm
  113. JOIN company_menu m ON m.menu_id = rm.menu_id
  114. WHERE m.menu_id = ? OR m.parent_id = ?`,
  115. [MENU.id, MENU.parentId, MENU.parentId]
  116. )
  117. console.log('company_role_menu rows=', r4.affectedRows)
  118. }
  119. await fixMenuNames(conn, ['sys_menu', 'company_menu'])
  120. }
  121. async function tableExists(conn, table) {
  122. const [r] = await conn.query('SHOW TABLES LIKE ?', [table])
  123. return r.length > 0
  124. }
  125. function parseDbName(dbUrl) {
  126. if (!dbUrl) return null
  127. const m = String(dbUrl).match(/\/([^/?]+)(?:\?|$)/)
  128. return m ? m[1] : null
  129. }
  130. main().catch(e => { console.error(e); process.exit(1) })