sync-lobster-menus-master.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /**
  2. * Sync lobster menus on master DB (ylrz_saas):
  3. * tenant_sys_menu = tenant admin template (includes semantic-keywords 29933)
  4. * tenant_company_menu = sales template (excludes 29933)
  5. * Usage: node scripts/sync-lobster-menus-master.js [audit|sync]
  6. */
  7. const mysql = require('mysql2/promise')
  8. const { LOBSTER_MENUS, TENANT_COMPANY_MENU_EXCLUDE } = require('./lobster-menu-definitions')
  9. const DB_CFG = {
  10. host: 'cq-cdb-8fjmemkb.sql.tencentcdb.com',
  11. port: 27220,
  12. user: 'root',
  13. password: 'Ylrz_1q2w3e4r5t6y',
  14. multipleStatements: true,
  15. charset: 'utf8mb4',
  16. database: 'ylrz_saas'
  17. }
  18. const TENANT_COMPANY_MENU_IDS = LOBSTER_MENUS.filter(m => !TENANT_COMPANY_MENU_EXCLUDE.has(m.id)).map(m => m.id)
  19. async function upsertTenantSysMenu(conn, m) {
  20. const [ex] = await conn.query('SELECT menu_id FROM tenant_sys_menu WHERE menu_id = ?', [m.id])
  21. if (!ex.length) {
  22. await conn.query(
  23. `INSERT INTO tenant_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)
  24. VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, '0', 0, 0, ?, 'admin', NOW(), 'lobster master sync')`,
  25. [m.id, m.name, m.parent, m.order, m.path, m.component, m.type, m.icon, m.visible, m.perms]
  26. )
  27. return 'insert'
  28. }
  29. await conn.query(
  30. `UPDATE tenant_sys_menu SET menu_name=?, parent_id=?, order_num=?, path=?, component=?, menu_type=?, icon=?, visible=?, status='0', perms=?, update_time=NOW() WHERE menu_id=?`,
  31. [m.name, m.parent, m.order, m.path, m.component, m.type, m.icon, m.visible, m.perms, m.id]
  32. )
  33. return 'update'
  34. }
  35. async function upsertTenantCompanyMenu(conn, m) {
  36. const [ex] = await conn.query('SELECT menu_id FROM tenant_company_menu WHERE menu_id = ? LIMIT 1', [m.id])
  37. if (!ex.length) {
  38. await conn.query(
  39. `INSERT INTO tenant_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)
  40. VALUES (?, ?, ?, ?, ?, ?, 0, 0, ?, ?, '0', ?, ?, 'admin', NOW(), NULL, 'lobster master sync')`,
  41. [m.id, m.name, m.parent, m.order, m.path, m.component, m.type, m.visible, m.perms, m.icon]
  42. )
  43. return 'insert'
  44. }
  45. await conn.query(
  46. `UPDATE tenant_company_menu SET menu_name=?, parent_id=?, order_num=?, path=?, component=?, menu_type=?, icon=?, visible=?, status='0', perms=?, update_time=NOW() WHERE menu_id=?`,
  47. [m.name, m.parent, m.order, m.path, m.component, m.type, m.icon, m.visible, m.perms, m.id]
  48. )
  49. return 'update'
  50. }
  51. async function audit(conn) {
  52. const ids = LOBSTER_MENUS.map(m => m.id)
  53. const [sysRows] = await conn.query(
  54. `SELECT menu_id, menu_name, path, component, visible FROM tenant_sys_menu WHERE menu_id IN (${ids.join(',')}) ORDER BY order_num, menu_id`
  55. )
  56. const [cmRows] = await conn.query(
  57. `SELECT menu_id, menu_name, path FROM tenant_company_menu WHERE menu_id IN (${TENANT_COMPANY_MENU_IDS.join(',')}) ORDER BY order_num, menu_id`
  58. )
  59. console.log('\n=== tenant_sys_menu === count', sysRows.length, '/', LOBSTER_MENUS.length)
  60. sysRows.forEach(r => console.log(` ${r.menu_id}\t${r.menu_name}\t${r.path}`))
  61. const missSys = LOBSTER_MENUS.filter(m => !sysRows.find(r => r.menu_id === m.id))
  62. if (missSys.length) console.log('missing tenant_sys_menu:', missSys.map(m => m.id + ':' + m.name).join(', '))
  63. const [badCm] = await conn.query(`SELECT menu_id, menu_name FROM tenant_company_menu WHERE menu_id = 29933`)
  64. if (badCm.length) console.log('WARN tenant_company_menu still has 29933:', badCm)
  65. console.log('\n=== tenant_company_menu === count', cmRows.length, '/', TENANT_COMPANY_MENU_IDS.length)
  66. const missCm = TENANT_COMPANY_MENU_IDS.filter(id => !cmRows.find(r => r.menu_id === id))
  67. if (missCm.length) console.log('missing tenant_company_menu:', missCm.join(', '))
  68. }
  69. async function sync(conn) {
  70. await conn.query('DELETE FROM tenant_company_menu WHERE menu_id = 29933 OR path = \'semantic-keywords\' OR component = \'lobster/semantic-keywords/index\'')
  71. let sysIns = 0
  72. let sysUpd = 0
  73. let cmIns = 0
  74. let cmUpd = 0
  75. for (const m of LOBSTER_MENUS) {
  76. const r = await upsertTenantSysMenu(conn, m)
  77. if (r === 'insert') sysIns++
  78. else sysUpd++
  79. }
  80. for (const id of TENANT_COMPANY_MENU_IDS) {
  81. const m = LOBSTER_MENUS.find(x => x.id === id)
  82. const companyMenu = id === 29934 ? { ...m, perms: 'workflow:lobster:query' } : m
  83. const r = await upsertTenantCompanyMenu(conn, companyMenu)
  84. if (r === 'insert') cmIns++
  85. else cmUpd++
  86. }
  87. await conn.query(`UPDATE tenant_sys_menu SET visible='1' WHERE menu_id IN (29936,29922,29948,29926)`)
  88. await conn.query(`UPDATE tenant_company_menu SET visible='1' WHERE menu_id IN (29922,29948,29926)`)
  89. console.log(`\nSync: tenant_sys_menu +${sysIns}/~${sysUpd}, tenant_company_menu +${cmIns}/~${cmUpd}`)
  90. }
  91. async function main() {
  92. const mode = process.argv[2] || 'sync'
  93. const conn = await mysql.createConnection(DB_CFG)
  94. console.log('DB: ylrz_saas mode:', mode)
  95. await audit(conn)
  96. if (mode === 'sync') {
  97. await sync(conn)
  98. await audit(conn)
  99. }
  100. await conn.end()
  101. }
  102. main().catch(e => {
  103. console.error(e)
  104. process.exit(1)
  105. })