备份:修复前完整项目快照 2026-04-19
This commit is contained in:
@@ -0,0 +1,191 @@
|
||||
const db = require('./backend/db-sqlite');
|
||||
async function fix() {
|
||||
const statements = [
|
||||
// logistics_companies
|
||||
`CREATE TABLE IF NOT EXISTS logistics_companies (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL,
|
||||
contact_person TEXT DEFAULT '',
|
||||
phone TEXT DEFAULT '',
|
||||
email TEXT DEFAULT '',
|
||||
address TEXT DEFAULT '',
|
||||
service_type TEXT DEFAULT '',
|
||||
service_area TEXT DEFAULT '',
|
||||
remark TEXT DEFAULT '',
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
)`,
|
||||
|
||||
// purchase_requests
|
||||
`CREATE TABLE IF NOT EXISTS purchase_requests (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
code TEXT DEFAULT '',
|
||||
title TEXT NOT NULL DEFAULT '',
|
||||
project_id INTEGER,
|
||||
applicant TEXT DEFAULT '',
|
||||
department TEXT DEFAULT '',
|
||||
priority TEXT DEFAULT 'normal',
|
||||
expected_date TEXT DEFAULT '',
|
||||
approved_by TEXT DEFAULT '',
|
||||
status TEXT DEFAULT 'pending',
|
||||
total_amount REAL DEFAULT 0,
|
||||
items TEXT DEFAULT '[]',
|
||||
remark TEXT DEFAULT '',
|
||||
request_date TEXT DEFAULT '',
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
)`,
|
||||
|
||||
// executions
|
||||
`CREATE TABLE IF NOT EXISTS executions (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
type TEXT DEFAULT '',
|
||||
title TEXT NOT NULL DEFAULT '',
|
||||
related_id INTEGER,
|
||||
status TEXT DEFAULT 'pending',
|
||||
applicant TEXT DEFAULT '',
|
||||
approver TEXT DEFAULT '',
|
||||
approved_at TEXT DEFAULT '',
|
||||
remark TEXT DEFAULT '',
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
)`,
|
||||
|
||||
// returns
|
||||
`CREATE TABLE IF NOT EXISTS returns (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
code TEXT DEFAULT '',
|
||||
project_id INTEGER,
|
||||
material_name TEXT DEFAULT '',
|
||||
quantity REAL DEFAULT 0,
|
||||
unit TEXT DEFAULT '',
|
||||
reason TEXT DEFAULT '',
|
||||
status TEXT DEFAULT 'pending',
|
||||
applicant TEXT DEFAULT '',
|
||||
remark TEXT DEFAULT '',
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
)`,
|
||||
|
||||
// logistics_contacts
|
||||
`CREATE TABLE IF NOT EXISTS logistics_contacts (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
logistics_company_id INTEGER,
|
||||
name TEXT DEFAULT '',
|
||||
phone TEXT DEFAULT '',
|
||||
position TEXT DEFAULT '',
|
||||
is_primary INTEGER DEFAULT 0,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
)`,
|
||||
|
||||
// category_tree
|
||||
`CREATE TABLE IF NOT EXISTS category_tree (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL,
|
||||
parent_id INTEGER,
|
||||
level INTEGER DEFAULT 0,
|
||||
sort_order INTEGER DEFAULT 0,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
)`,
|
||||
];
|
||||
|
||||
for (const sql of statements) {
|
||||
try {
|
||||
await db.query(sql);
|
||||
const name = sql.match(/CREATE TABLE IF NOT EXISTS (\w+)/)[1];
|
||||
console.log('OK:', name);
|
||||
} catch(e) {
|
||||
console.log('ERR:', e.message.substring(0, 100));
|
||||
}
|
||||
}
|
||||
|
||||
// Now add missing columns to existing tables
|
||||
const alterStatements = [
|
||||
// purchase_orders
|
||||
"ALTER TABLE purchase_orders ADD COLUMN project_id INTEGER DEFAULT 0",
|
||||
"ALTER TABLE purchase_orders ADD COLUMN supplier_country TEXT DEFAULT ''",
|
||||
"ALTER TABLE purchase_orders ADD COLUMN supplier_contact TEXT DEFAULT ''",
|
||||
"ALTER TABLE purchase_orders ADD COLUMN supplier_phone TEXT DEFAULT ''",
|
||||
"ALTER TABLE purchase_orders ADD COLUMN contract_url TEXT DEFAULT ''",
|
||||
"ALTER TABLE purchase_orders ADD COLUMN contract_no TEXT DEFAULT ''",
|
||||
"ALTER TABLE purchase_orders ADD COLUMN quotation_url TEXT DEFAULT ''",
|
||||
"ALTER TABLE purchase_orders ADD COLUMN quotation_no TEXT DEFAULT ''",
|
||||
"ALTER TABLE purchase_orders ADD COLUMN delivery_date TEXT DEFAULT ''",
|
||||
"ALTER TABLE purchase_orders ADD COLUMN payment_terms TEXT DEFAULT ''",
|
||||
|
||||
// payment_plans
|
||||
"ALTER TABLE payment_plans ADD COLUMN payment_request_id INTEGER",
|
||||
"ALTER TABLE payment_plans ADD COLUMN purchase_order_id INTEGER",
|
||||
"ALTER TABLE payment_plans ADD COLUMN stage TEXT DEFAULT ''",
|
||||
"ALTER TABLE payment_plans ADD COLUMN planned_amount REAL DEFAULT 0",
|
||||
"ALTER TABLE payment_plans ADD COLUMN paid_amount REAL DEFAULT 0",
|
||||
"ALTER TABLE payment_plans ADD COLUMN planned_percentage REAL DEFAULT 0",
|
||||
"ALTER TABLE payment_plans ADD COLUMN actual_amount REAL DEFAULT 0",
|
||||
"ALTER TABLE payment_plans ADD COLUMN payment_method TEXT DEFAULT ''",
|
||||
"ALTER TABLE payment_plans ADD COLUMN contract_id INTEGER",
|
||||
"ALTER TABLE payment_plans ADD COLUMN project_id INTEGER",
|
||||
|
||||
// customers
|
||||
"ALTER TABLE customers ADD COLUMN is_default INTEGER DEFAULT 0",
|
||||
"ALTER TABLE customers ADD COLUMN type TEXT DEFAULT ''",
|
||||
"ALTER TABLE customers ADD COLUMN address TEXT DEFAULT ''",
|
||||
|
||||
// products
|
||||
"ALTER TABLE products ADD COLUMN source TEXT DEFAULT ''",
|
||||
"ALTER TABLE products ADD COLUMN supplier TEXT DEFAULT ''",
|
||||
"ALTER TABLE products ADD COLUMN location TEXT DEFAULT ''",
|
||||
"ALTER TABLE products ADD COLUMN remark TEXT DEFAULT ''",
|
||||
"ALTER TABLE products ADD COLUMN model TEXT DEFAULT ''",
|
||||
"ALTER TABLE products ADD COLUMN brand TEXT DEFAULT ''",
|
||||
"ALTER TABLE products ADD COLUMN specification TEXT DEFAULT ''",
|
||||
"ALTER TABLE products ADD COLUMN category_name TEXT DEFAULT ''",
|
||||
"ALTER TABLE products ADD COLUMN barcode TEXT DEFAULT ''",
|
||||
"ALTER TABLE products ADD COLUMN cost_price REAL DEFAULT 0",
|
||||
"ALTER TABLE products ADD COLUMN stock REAL DEFAULT 0",
|
||||
"ALTER TABLE products ADD COLUMN min_stock REAL DEFAULT 0",
|
||||
|
||||
// projects
|
||||
"ALTER TABLE projects ADD COLUMN manager TEXT DEFAULT ''",
|
||||
"ALTER TABLE projects ADD COLUMN contract_no TEXT DEFAULT ''",
|
||||
"ALTER TABLE projects ADD COLUMN project_type TEXT DEFAULT ''",
|
||||
|
||||
// budget_projects
|
||||
"ALTER TABLE budget_projects ADD COLUMN created_by INTEGER",
|
||||
"ALTER TABLE budget_projects ADD COLUMN status TEXT DEFAULT 'active'",
|
||||
"ALTER TABLE budget_projects ADD COLUMN description TEXT DEFAULT ''",
|
||||
|
||||
// reimbursements
|
||||
"ALTER TABLE reimbursements ADD COLUMN items TEXT DEFAULT '[]'",
|
||||
"ALTER TABLE reimbursements ADD COLUMN total_amount REAL DEFAULT 0",
|
||||
"ALTER TABLE reimbursements ADD COLUMN description TEXT DEFAULT ''",
|
||||
"ALTER TABLE reimbursements ADD COLUMN type TEXT DEFAULT ''",
|
||||
];
|
||||
|
||||
for (const sql of alterStatements) {
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Fix admin user password
|
||||
const bcrypt = require('bcryptjs');
|
||||
const hash = await bcrypt.hash('X123c321@', 10);
|
||||
try {
|
||||
await db.query(`UPDATE users SET password_hash = ? WHERE username = 'admin'`, [hash]);
|
||||
console.log('OK: admin password updated');
|
||||
} catch(e) {
|
||||
console.log('ERR:', e.message);
|
||||
}
|
||||
|
||||
console.log('\nAll fixes applied!');
|
||||
process.exit();
|
||||
}
|
||||
fix();
|
||||
Reference in New Issue
Block a user