/** * Fix garbled UTF-8 for workflow_llm / summary_generation scenes and related menus. * Use \\u escapes only ?? avoid literal Chinese in this file (Windows console/script encoding). */ const mysql = require('mysql2/promise') const SCENES = [ { code: 'workflow_llm', name: '\u63d0\u793a\u8bcd\u7ba1\u7406' }, { code: 'summary_generation', name: '\u6458\u8981\u751f\u6210' } ] const MENUS = [ { component: 'lobster/prompt/index', name: '\u63d0\u793a\u8bcd\u7ba1\u7406' } ] const MENU_TABLES = ['sys_menu', 'tenant_sys_menu', 'company_menu', 'tenant_company_menu'] async function main() { const host = process.env.DB_HOST || 'cq-cdb-8fjmemkb.sql.tencentcdb.com' const port = Number(process.env.DB_PORT || 27220) const user = process.env.DB_USER || 'root' const password = process.env.DB_PASSWORD || 'Ylrz_1q2w3e4r5t6y' const masterDb = process.env.DB_NAME || 'ylrz_saas' const master = await mysql.createConnection({ host, port, user, password, database: masterDb, charset: 'utf8mb4' }) console.log('=== Fix MASTER ===') await fixConn(master) const tenantConn = await mysql.createConnection({ host, port, user, password, database: masterDb, charset: 'utf8mb4' }) const [tenants] = await tenantConn.query('SELECT id, tenant_code, db_url, db_account, db_pwd FROM tenant_info WHERE status=1') await tenantConn.end() for (const t of tenants) { const db = parseDbName(t.db_url) if (!db) continue console.log('=== Fix TENANT', t.id, t.tenant_code, '===') try { const conn = await mysql.createConnection({ host, port, user: t.db_account || user, password: t.db_pwd || password, database: db, charset: 'utf8mb4' }) await fixConn(conn, false) await conn.end() } catch (e) { console.log('skip:', e.message) } } await master.end() const verify = await mysql.createConnection({ host, port, user, password, database: masterDb, charset: 'utf8mb4' }) const [rows] = await verify.query( "SELECT scene_code, scene_name, HEX(scene_name) hx FROM admin_ai_scene WHERE scene_code IN ('workflow_llm','summary_generation')" ) console.log('verify:', JSON.stringify(rows, null, 2)) await verify.end() console.log('Done.') } async function fixConn(conn, includeScenes = true) { if (includeScenes && await tableExists(conn, 'admin_ai_scene')) { for (const s of SCENES) { const [r] = await conn.query('UPDATE admin_ai_scene SET scene_name=?, update_time=NOW() WHERE scene_code=?', [s.name, s.code]) console.log('scene', s.code, 'rows=', r.affectedRows, 'name=', s.name) } } for (const table of MENU_TABLES) { if (!(await tableExists(conn, table))) continue for (const m of MENUS) { const [r] = await conn.query(`UPDATE ${table} SET menu_name=? WHERE component=?`, [m.name, m.component]) if (r.affectedRows) console.log(table, m.component, 'rows=', r.affectedRows) } } } async function tableExists(conn, table) { const [r] = await conn.query('SHOW TABLES LIKE ?', [table]) return r.length > 0 } function parseDbName(dbUrl) { if (!dbUrl) return null const m = String(dbUrl).match(/\/([^/?]+)(?:\?|$)/) return m ? m[1] : null } main().catch(e => { console.error(e); process.exit(1) })