Files
yunhaifinance/fix-cloud-db3.js
T

249 lines
9.6 KiB
JavaScript

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);
});