const db = require('./backend/db-sqlite'); async function fixDatabase() { console.log('开始全面修复云端数据库Schema...'); const fixes = [ // === 物流公司表 - 添加缺失列 === `ALTER TABLE logistics_companies ADD COLUMN quotation_description TEXT`, `ALTER TABLE logistics_companies ADD COLUMN code TEXT`, `ALTER TABLE logistics_companies ADD COLUMN address TEXT`, `ALTER TABLE logistics_companies ADD COLUMN phone TEXT`, // === 物流公司联系人表 === `CREATE TABLE IF NOT EXISTS logistics_company_contacts ( id INTEGER PRIMARY KEY AUTOINCREMENT, logistics_company_id INTEGER NOT NULL, name TEXT, phone TEXT, position TEXT, is_primary INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (logistics_company_id) REFERENCES logistics_companies(id) )`, // === 物流公司收款信息表 === `CREATE TABLE IF NOT EXISTS logistics_company_payment_infos ( id INTEGER PRIMARY KEY AUTOINCREMENT, logistics_company_id INTEGER NOT NULL, account_name TEXT, account_number TEXT, bank_name TEXT, qr_code TEXT, is_default INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (logistics_company_id) REFERENCES logistics_companies(id) )`, // === 物流记录表 === `CREATE TABLE IF NOT EXISTS logistics_records ( id INTEGER PRIMARY KEY AUTOINCREMENT, code TEXT, logistics_company_id INTEGER, purchase_order_id INTEGER, ship_date TEXT, status TEXT DEFAULT 'pending', primary_freight REAL DEFAULT 0, primary_freight_currency TEXT DEFAULT 'CNY', primary_freight_status TEXT DEFAULT 'unpaid', secondary_freight REAL DEFAULT 0, secondary_freight_currency TEXT DEFAULT 'LAK', secondary_freight_status TEXT DEFAULT 'unpaid', remark TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (logistics_company_id) REFERENCES logistics_companies(id), FOREIGN KEY (purchase_order_id) REFERENCES purchase_orders(id) )`, // === 采购订单表 - 添加缺失列 === `ALTER TABLE purchase_orders ADD COLUMN code TEXT`, `ALTER TABLE purchase_orders ADD COLUMN title TEXT`, `ALTER TABLE purchase_orders ADD COLUMN project_id INTEGER`, `ALTER TABLE purchase_orders ADD COLUMN order_number TEXT`, `ALTER TABLE purchase_orders ADD COLUMN delivery_date TEXT`, `ALTER TABLE purchase_orders ADD COLUMN delivery_address TEXT`, `ALTER TABLE purchase_orders ADD COLUMN priority TEXT DEFAULT 'normal'`, `ALTER TABLE purchase_orders ADD COLUMN items TEXT`, `ALTER TABLE purchase_orders ADD COLUMN approved_by TEXT`, `ALTER TABLE purchase_orders ADD COLUMN approved_at TIMESTAMP`, // === 付款计划表 - 添加缺失列 === `ALTER TABLE payment_plans ADD COLUMN payment_request_id INTEGER`, `ALTER TABLE payment_plans ADD COLUMN planned_date TEXT`, `ALTER TABLE payment_plans ADD COLUMN plan_number TEXT`, `ALTER TABLE payment_plans ADD COLUMN title TEXT`, `ALTER TABLE payment_plans ADD COLUMN purchase_order_id INTEGER`, `ALTER TABLE payment_plans ADD COLUMN supplier_id INTEGER`, `ALTER TABLE payment_plans ADD COLUMN total_amount REAL DEFAULT 0`, `ALTER TABLE payment_plans ADD COLUMN paid_amount REAL DEFAULT 0`, `ALTER TABLE payment_plans ADD COLUMN payment_items TEXT`, `ALTER TABLE payment_plans ADD COLUMN remark TEXT`, `ALTER TABLE payment_plans ADD COLUMN created_by TEXT`, // === 退库记录表 - 添加缺失列 === `ALTER TABLE return_records ADD COLUMN project_id INTEGER`, `ALTER TABLE return_records ADD COLUMN return_number TEXT`, `ALTER TABLE return_records ADD COLUMN product_id INTEGER`, `ALTER TABLE return_records ADD COLUMN product_name TEXT`, `ALTER TABLE return_records ADD COLUMN quantity REAL DEFAULT 0`, `ALTER TABLE return_records ADD COLUMN unit TEXT DEFAULT '件'`, `ALTER TABLE return_records ADD COLUMN unit_price REAL DEFAULT 0`, `ALTER TABLE return_records ADD COLUMN total_price REAL DEFAULT 0`, `ALTER TABLE return_records ADD COLUMN return_date TEXT`, `ALTER TABLE return_records ADD COLUMN reason TEXT`, `ALTER TABLE return_records ADD COLUMN status TEXT DEFAULT 'pending'`, `ALTER TABLE return_records ADD COLUMN remark TEXT`, `ALTER TABLE return_records ADD COLUMN created_by TEXT`, // === 供应商收款信息表 === `CREATE TABLE IF NOT EXISTS supplier_payment_infos ( id INTEGER PRIMARY KEY AUTOINCREMENT, supplier_id INTEGER NOT NULL, account_name TEXT, account_number TEXT, bank_name TEXT, qr_code TEXT, is_default INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (supplier_id) REFERENCES suppliers(id) )`, // === 分包商收款信息表 === `CREATE TABLE IF NOT EXISTS subcontractor_payment_infos ( id INTEGER PRIMARY KEY AUTOINCREMENT, subcontractor_id INTEGER NOT NULL, account_name TEXT, account_number TEXT, bank_name TEXT, qr_code TEXT, is_default INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (subcontractor_id) REFERENCES subcontractors(id) )`, // === 供应商联系人表 === `CREATE TABLE IF NOT EXISTS supplier_contacts ( id INTEGER PRIMARY KEY AUTOINCREMENT, supplier_id INTEGER NOT NULL, name TEXT, phone TEXT, position TEXT, is_primary INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (supplier_id) REFERENCES suppliers(id) )`, // === 分包商联系人表 === `CREATE TABLE IF NOT EXISTS subcontractor_contacts ( id INTEGER PRIMARY KEY AUTOINCREMENT, subcontractor_id INTEGER NOT NULL, name TEXT, phone TEXT, position TEXT, is_primary INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (subcontractor_id) REFERENCES subcontractors(id) )`, // === 客户联系人表 === `CREATE TABLE IF NOT EXISTS customer_contacts ( id INTEGER PRIMARY KEY AUTOINCREMENT, customer_id INTEGER NOT NULL, name TEXT, phone TEXT, position TEXT, is_primary INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (customer_id) REFERENCES customers(id) )`, // === 客户收款信息表 === `CREATE TABLE IF NOT EXISTS customer_payment_infos ( id INTEGER PRIMARY KEY AUTOINCREMENT, customer_id INTEGER NOT NULL, account_name TEXT, account_number TEXT, bank_name TEXT, qr_code TEXT, is_default INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (customer_id) REFERENCES customers(id) )`, // === 预算报价表 - 添加缺失列 === `ALTER TABLE budget_quotations ADD COLUMN project_id INTEGER`, `ALTER TABLE budget_quotations ADD COLUMN name TEXT`, `ALTER TABLE budget_quotations ADD COLUMN status TEXT DEFAULT 'draft'`, `ALTER TABLE budget_quotations ADD COLUMN total_amount REAL DEFAULT 0`, `ALTER TABLE budget_quotations ADD COLUMN items TEXT`, `ALTER TABLE budget_quotations ADD COLUMN description TEXT`, `ALTER TABLE budget_quotations ADD COLUMN created_by TEXT`, // === 付款执行表 === `CREATE TABLE IF NOT EXISTS payment_executions ( id INTEGER PRIMARY KEY AUTOINCREMENT, payment_plan_id INTEGER, amount REAL NOT NULL DEFAULT 0, payment_method TEXT, payment_date TEXT, voucher_number TEXT, status TEXT DEFAULT 'pending', remark TEXT, created_by TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP )`, ]; let successCount = 0; let skipCount = 0; let errorCount = 0; for (const sql of fixes) { try { await db.query(sql); console.log('✅ 成功:', sql.substring(0, 80)); successCount++; } catch (err) { if (err.message.includes('duplicate column') || err.message.includes('already exists')) { console.log('⏭️ 已存在:', sql.substring(0, 80)); skipCount++; } else { console.log('⚠️ 错误:', err.message.substring(0, 100)); errorCount++; } } } console.log(`\n修复统计: 成功=${successCount}, 跳过=${skipCount}, 错误=${errorCount}`); // 验证关键API const apiTests = [ '/api/logistics-companies', '/api/purchase-orders', '/api/payment-plans', '/api/returns', '/api/budget-projects', '/api/exchange-rates', '/api/executions', '/api/budget-quotations' ]; console.log('\n验证API端点:'); // We can't test APIs from here since the server needs restart, just verify tables const tables = await db.query("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name"); console.log('数据库表数量:', tables.rows.length); console.log('\n数据库Schema修复完成!'); process.exit(0); } fixDatabase().catch(err => { console.error('修复失败:', err); process.exit(1); });