const db = require('./backend/db-sqlite'); async function fix() { const fixes = [ // projects - missing columns "ALTER TABLE projects ADD COLUMN code TEXT DEFAULT ''", "ALTER TABLE projects ADD COLUMN location TEXT DEFAULT ''", "ALTER TABLE projects ADD COLUMN contract_amount REAL DEFAULT 0", "ALTER TABLE projects ADD COLUMN start_date TEXT DEFAULT ''", "ALTER TABLE projects ADD COLUMN end_date TEXT DEFAULT ''", "ALTER TABLE projects ADD COLUMN description TEXT DEFAULT ''", "ALTER TABLE projects ADD COLUMN manager_id INTEGER DEFAULT 0", "ALTER TABLE projects ADD COLUMN customer_id INTEGER DEFAULT 0", // budget_quotations table `CREATE TABLE IF NOT EXISTS budget_quotations ( id INTEGER PRIMARY KEY AUTOINCREMENT, project_id INTEGER, version INTEGER DEFAULT 1, quotation_date TEXT DEFAULT '', amount REAL DEFAULT 0, currency TEXT DEFAULT 'CNY', status TEXT DEFAULT 'draft', file_url TEXT DEFAULT '', remark TEXT DEFAULT '', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP )`, // budget_projects - missing columns "ALTER TABLE budget_projects ADD COLUMN manager_id INTEGER DEFAULT 0", "ALTER TABLE budget_projects ADD COLUMN location TEXT DEFAULT ''", "ALTER TABLE budget_projects ADD COLUMN survey_date TEXT DEFAULT ''", "ALTER TABLE budget_projects ADD COLUMN intermediary TEXT DEFAULT ''", "ALTER TABLE budget_projects ADD COLUMN intermediary_fee_type TEXT DEFAULT ''", "ALTER TABLE budget_projects ADD COLUMN intermediary_fee_value REAL DEFAULT 0", "ALTER TABLE budget_projects ADD COLUMN customer_requirements TEXT DEFAULT ''", "ALTER TABLE budget_projects ADD COLUMN project_overview TEXT DEFAULT ''", "ALTER TABLE budget_projects ADD COLUMN attachments TEXT DEFAULT '[]'", "ALTER TABLE budget_projects ADD COLUMN survey_photos TEXT DEFAULT '[]'", "ALTER TABLE budget_projects ADD COLUMN status TEXT DEFAULT 'negotiating'", "ALTER TABLE budget_projects ADD COLUMN updated_at DATETIME DEFAULT CURRENT_TIMESTAMP", // exchange_rates - missing columns "ALTER TABLE exchange_rates ADD COLUMN pair_key TEXT DEFAULT ''", "ALTER TABLE exchange_rates ADD COLUMN effective_date TEXT DEFAULT ''", "ALTER TABLE exchange_rates ADD COLUMN updated_at DATETIME DEFAULT CURRENT_TIMESTAMP", // project_contracts table `CREATE TABLE IF NOT EXISTS project_contracts ( id INTEGER PRIMARY KEY AUTOINCREMENT, project_id INTEGER, contract_code TEXT DEFAULT '', contract_amount REAL DEFAULT 0, currency TEXT DEFAULT 'CNY', settlement_method TEXT DEFAULT 'lump_sum', contract_period INTEGER DEFAULT 180, start_date TEXT DEFAULT '', end_date TEXT DEFAULT '', warranty_deposit_percentage REAL DEFAULT 5, warranty_period INTEGER DEFAULT 12, contract_file TEXT DEFAULT '', other_info TEXT DEFAULT '', tax_included INTEGER DEFAULT 1, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP )`, // project_milestones table `CREATE TABLE IF NOT EXISTS project_milestones ( id INTEGER PRIMARY KEY AUTOINCREMENT, project_id INTEGER, milestone_name TEXT DEFAULT '', condition TEXT DEFAULT '', percentage REAL DEFAULT 0, amount REAL DEFAULT 0, expected_date TEXT DEFAULT '', status TEXT DEFAULT 'pending', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP )`, // project_materials table `CREATE TABLE IF NOT EXISTS project_materials ( id INTEGER PRIMARY KEY AUTOINCREMENT, project_id INTEGER, product_name TEXT DEFAULT '', unit TEXT DEFAULT '', budget_quantity REAL DEFAULT 0, average_price REAL DEFAULT 0, total_amount REAL DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP )`, ]; for (const sql of fixes) { try { await db.query(sql); console.log('OK:', sql.substring(0, 70)); } catch(e) { const msg = e.message || ''; if (msg.includes('duplicate') || msg.includes('already exists')) { console.log('SKIP:', sql.substring(0, 70)); } else { console.log('ERR:', msg.substring(0, 100)); } } } console.log('\nDone!'); process.exit(); } fix();