备份:修复前完整项目快照 2026-04-19
This commit is contained in:
@@ -0,0 +1,249 @@
|
||||
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);
|
||||
});
|
||||
Reference in New Issue
Block a user