apply-sales-corpus-task-migration.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. const mysql = require('mysql2/promise')
  2. const fs = require('fs')
  3. const path = require('path')
  4. const DB_CFG = {
  5. host: 'cq-cdb-8fjmemkb.sql.tencentcdb.com',
  6. port: 27220,
  7. user: 'root',
  8. password: 'Ylrz_1q2w3e4r5t6y',
  9. multipleStatements: true,
  10. charset: 'utf8mb4'
  11. }
  12. const TARGET_DB = process.argv[2] || 'fs_tenant_cs1'
  13. async function columnExists(conn, table, column) {
  14. const [rows] = await conn.query(
  15. `SELECT COUNT(*) AS cnt FROM information_schema.COLUMNS
  16. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,
  17. [table, column]
  18. )
  19. return rows[0].cnt > 0
  20. }
  21. async function tableExists(conn, table) {
  22. const [rows] = await conn.query(
  23. `SELECT COUNT(*) AS cnt FROM information_schema.TABLES
  24. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,
  25. [table]
  26. )
  27. return rows[0].cnt > 0
  28. }
  29. async function main() {
  30. const conn = await mysql.createConnection({ ...DB_CFG, database: TARGET_DB })
  31. console.log('Applying sales corpus task migration on', TARGET_DB)
  32. if (!(await tableExists(conn, 'lobster_sales_corpus_task'))) {
  33. await conn.query(`
  34. CREATE TABLE lobster_sales_corpus_task (
  35. id BIGINT NOT NULL AUTO_INCREMENT,
  36. company_id BIGINT NOT NULL,
  37. batch_no VARCHAR(64) DEFAULT NULL,
  38. task_name VARCHAR(200) DEFAULT NULL,
  39. salesperson_name VARCHAR(100) DEFAULT NULL,
  40. scenario VARCHAR(100) DEFAULT NULL,
  41. total_count INT DEFAULT 0,
  42. qualified_count INT DEFAULT 0,
  43. optimizable_count INT DEFAULT 0,
  44. optimized_count INT DEFAULT 0,
  45. kb_written_count INT DEFAULT 0,
  46. overall_score DECIMAL(5,2) DEFAULT NULL,
  47. ai_summary TEXT,
  48. status VARCHAR(32) DEFAULT 'imported',
  49. create_by VARCHAR(64) DEFAULT '',
  50. create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
  51. update_by VARCHAR(64) DEFAULT '',
  52. update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  53. PRIMARY KEY (id),
  54. KEY idx_company_status (company_id, status),
  55. KEY idx_batch_no (batch_no)
  56. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
  57. `)
  58. console.log(' created lobster_sales_corpus_task')
  59. } else {
  60. console.log(' lobster_sales_corpus_task already exists')
  61. }
  62. const alters = [
  63. ['customer_question', 'ADD COLUMN customer_question TEXT NULL AFTER dialog_text'],
  64. ['sales_answer', 'ADD COLUMN sales_answer TEXT NULL AFTER customer_question'],
  65. ['task_id', 'ADD COLUMN task_id BIGINT NULL AFTER company_id'],
  66. ['salesperson_name', 'ADD COLUMN salesperson_name VARCHAR(100) NULL AFTER task_id'],
  67. ['status', 'ADD COLUMN status VARCHAR(32) NULL AFTER tags'],
  68. ['quality_status', 'ADD COLUMN quality_status VARCHAR(32) NULL AFTER status'],
  69. ['optimized_answer', 'ADD COLUMN optimized_answer TEXT NULL AFTER quality_status'],
  70. ['ai_feedback', 'ADD COLUMN ai_feedback TEXT NULL AFTER optimized_answer'],
  71. ['kb_written', 'ADD COLUMN kb_written TINYINT DEFAULT 0 AFTER ai_feedback']
  72. ]
  73. for (const [col, sql] of alters) {
  74. if (!(await columnExists(conn, 'lobster_sales_corpus', col))) {
  75. await conn.query(`ALTER TABLE lobster_sales_corpus ${sql}`)
  76. console.log(' added column', col)
  77. }
  78. }
  79. const [idxRows] = await conn.query(
  80. `SELECT COUNT(*) AS cnt FROM information_schema.STATISTICS
  81. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'lobster_sales_corpus' AND INDEX_NAME = 'idx_task_id'`
  82. )
  83. if (idxRows[0].cnt === 0) {
  84. await conn.query('ALTER TABLE lobster_sales_corpus ADD INDEX idx_task_id (task_id)')
  85. console.log(' added idx_task_id')
  86. }
  87. await conn.end()
  88. console.log('Done.')
  89. }
  90. main().catch(err => {
  91. console.error(err)
  92. process.exit(1)
  93. })