备份:修复前完整项目快照 2026-04-19
This commit is contained in:
+195
@@ -0,0 +1,195 @@
|
||||
const db = require('./backend/db-sqlite');
|
||||
|
||||
async function fixDatabase() {
|
||||
console.log('开始修复云端数据库...');
|
||||
|
||||
const migrations = [
|
||||
// 物流公司表
|
||||
`CREATE TABLE IF NOT EXISTS logistics_companies (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL,
|
||||
contact_person TEXT,
|
||||
phone TEXT,
|
||||
email TEXT,
|
||||
address TEXT,
|
||||
service_type TEXT DEFAULT 'domestic',
|
||||
remark TEXT,
|
||||
status TEXT DEFAULT 'active',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
)`,
|
||||
|
||||
// 执行记录表
|
||||
`CREATE TABLE IF NOT EXISTS executions (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
type TEXT NOT NULL,
|
||||
reference_id INTEGER,
|
||||
title TEXT,
|
||||
description TEXT,
|
||||
amount REAL,
|
||||
currency TEXT DEFAULT 'CNY',
|
||||
status TEXT DEFAULT 'pending',
|
||||
executed_by TEXT,
|
||||
executed_at TIMESTAMP,
|
||||
created_by TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
)`,
|
||||
|
||||
// 采购订单表
|
||||
`CREATE TABLE IF NOT EXISTS purchase_orders (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
order_number TEXT UNIQUE,
|
||||
title TEXT NOT NULL,
|
||||
supplier_id INTEGER,
|
||||
project_id INTEGER,
|
||||
total_amount REAL DEFAULT 0,
|
||||
currency TEXT DEFAULT 'CNY',
|
||||
status TEXT DEFAULT 'draft',
|
||||
priority TEXT DEFAULT 'normal',
|
||||
delivery_date TEXT,
|
||||
delivery_address TEXT,
|
||||
remark TEXT,
|
||||
items TEXT,
|
||||
created_by TEXT,
|
||||
approved_by TEXT,
|
||||
approved_at TIMESTAMP,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
)`,
|
||||
|
||||
// 付款计划表
|
||||
`CREATE TABLE IF NOT EXISTS payment_plans (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
plan_number TEXT UNIQUE,
|
||||
title TEXT NOT NULL,
|
||||
purchase_order_id INTEGER,
|
||||
supplier_id INTEGER,
|
||||
total_amount REAL DEFAULT 0,
|
||||
paid_amount REAL DEFAULT 0,
|
||||
currency TEXT DEFAULT 'CNY',
|
||||
status TEXT DEFAULT 'pending',
|
||||
payment_items TEXT,
|
||||
remark TEXT,
|
||||
created_by TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
)`,
|
||||
|
||||
// 施工管理表
|
||||
`CREATE TABLE IF NOT EXISTS construction_logs (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
project_id INTEGER,
|
||||
date TEXT NOT NULL,
|
||||
weather TEXT,
|
||||
workers_count INTEGER DEFAULT 0,
|
||||
work_content TEXT,
|
||||
progress TEXT,
|
||||
issues TEXT,
|
||||
photos TEXT,
|
||||
created_by TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
)`,
|
||||
|
||||
`CREATE TABLE IF NOT EXISTS construction_milestones (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
project_id INTEGER,
|
||||
name TEXT NOT NULL,
|
||||
planned_date TEXT,
|
||||
actual_date TEXT,
|
||||
status TEXT DEFAULT 'pending',
|
||||
description TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
)`,
|
||||
|
||||
// 预算项目表
|
||||
`CREATE TABLE IF NOT EXISTS budget_projects (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL,
|
||||
project_id INTEGER,
|
||||
total_budget REAL DEFAULT 0,
|
||||
currency TEXT DEFAULT 'CNY',
|
||||
status TEXT DEFAULT 'draft',
|
||||
description TEXT,
|
||||
items TEXT,
|
||||
created_by TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
)`,
|
||||
|
||||
// 退库记录表
|
||||
`CREATE TABLE IF NOT EXISTS returns (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
return_number TEXT UNIQUE,
|
||||
title TEXT NOT NULL,
|
||||
type TEXT DEFAULT 'material',
|
||||
project_id INTEGER,
|
||||
supplier_id INTEGER,
|
||||
total_amount REAL DEFAULT 0,
|
||||
currency TEXT DEFAULT 'CNY',
|
||||
status TEXT DEFAULT 'pending',
|
||||
items TEXT,
|
||||
remark TEXT,
|
||||
created_by TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
)`,
|
||||
|
||||
// 项目材料表
|
||||
`CREATE TABLE IF NOT EXISTS project_materials (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
project_id INTEGER NOT NULL,
|
||||
material_name TEXT NOT NULL,
|
||||
specification TEXT,
|
||||
unit TEXT DEFAULT '件',
|
||||
quantity REAL DEFAULT 0,
|
||||
unit_price REAL DEFAULT 0,
|
||||
total_price REAL DEFAULT 0,
|
||||
category TEXT,
|
||||
supplier_id INTEGER,
|
||||
status TEXT DEFAULT 'planned',
|
||||
remark TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
)`,
|
||||
|
||||
// 付款执行表
|
||||
`CREATE TABLE IF NOT EXISTS payment_executions (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
payment_plan_id INTEGER,
|
||||
amount REAL NOT NULL,
|
||||
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
|
||||
)`,
|
||||
];
|
||||
|
||||
for (const sql of migrations) {
|
||||
try {
|
||||
await db.query(sql);
|
||||
console.log('✅ 成功:', sql.substring(0, 60) + '...');
|
||||
} catch (err) {
|
||||
console.log('⚠️ 跳过:', err.message);
|
||||
}
|
||||
}
|
||||
|
||||
// 验证表
|
||||
const result = await db.query("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name");
|
||||
console.log('\n当前数据库表:');
|
||||
result.rows.forEach(r => console.log(' -', r.name));
|
||||
|
||||
console.log('\n数据库修复完成!');
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
fixDatabase().catch(err => {
|
||||
console.error('修复失败:', err);
|
||||
process.exit(1);
|
||||
});
|
||||
Reference in New Issue
Block a user