195 lines
5.8 KiB
JavaScript
195 lines
5.8 KiB
JavaScript
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);
|
|
}); |