Files
yunhaifinance/backend/test-supplier-ledger.js
T

265 lines
9.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 测试供应商台账功能
* 遵循设计方案:采购-付款-物流-退库一体化流程设计方案.md
* 章节:步骤10 - 供应商台账
*
* 测试内容:
* 1. 供应商订单列表API
* 2. 供应商台账API(财务汇总+订单列表)
*/
const sqlite3 = require('sqlite3').verbose();
const path = require('path');
const dbPath = path.join(__dirname, 'company_finance.db');
const db = new sqlite3.Database(dbPath, (err) => {
if (err) {
console.error('数据库连接失败:', err.message);
process.exit(1);
}
console.log('SQLite数据库连接成功:', dbPath);
});
const runSQL = (sql, params = []) => {
return new Promise((resolve, reject) => {
db.run(sql, params, function(err) {
if (err) {
reject(err);
} else {
resolve({ lastID: this.lastID, changes: this.changes });
}
});
});
};
const runAllSQL = (sql, params = []) => {
return new Promise((resolve, reject) => {
db.all(sql, params, (err, rows) => {
if (err) {
reject(err);
} else {
resolve(rows);
}
});
});
};
async function test() {
let passed = 0;
let failed = 0;
const errors = [];
let testSupplierId = null;
let testProjectId = null;
let testOrderIds = [];
try {
console.log('\n========================================');
console.log('测试供应商台账功能');
console.log('========================================\n');
console.log('--- 测试1:创建测试数据 ---\n');
const supplierCode = 'TEST-SUP-' + Date.now();
const supplierResult = await runSQL(`
INSERT INTO suppliers (name, supply_category, country, created_at, updated_at)
VALUES (?, '电力设备', 'Laos', datetime('now'), datetime('now'))
`, [supplierCode]);
testSupplierId = supplierResult.lastID;
console.log(` ✅ 创建测试供应商,ID: ${testSupplierId}`);
passed++;
const projectCode = 'TEST-PRJ-' + Date.now();
const projectResult = await runSQL(`
INSERT INTO projects (code, name, status, created_at, updated_at)
VALUES (?, '测试供应商台账项目', 'active', datetime('now'), datetime('now'))
`, [projectCode]);
testProjectId = projectResult.lastID;
console.log(` ✅ 创建测试项目,ID: ${testProjectId}`);
passed++;
const order1Result = await runSQL(`
INSERT INTO purchase_orders
(code, project_id, supplier_id, total_amount, paid_amount, order_date, status, currency, created_at, updated_at)
VALUES (?, ?, ?, 50000, 20000, date('now'), 'confirmed', 'CNY', datetime('now'), datetime('now'))
`, ['TEST-PO-' + Date.now() + '-1', testProjectId, testSupplierId]);
testOrderIds.push(order1Result.lastID);
console.log(` ✅ 创建测试订单1ID: ${order1Result.lastID},金额: 50000,已付: 20000`);
passed++;
const order2Result = await runSQL(`
INSERT INTO purchase_orders
(code, project_id, supplier_id, total_amount, paid_amount, order_date, status, currency, created_at, updated_at)
VALUES (?, ?, ?, 30000, 30000, date('now', '-1 day'), 'paid', 'CNY', datetime('now'), datetime('now'))
`, ['TEST-PO-' + Date.now() + '-2', testProjectId, testSupplierId]);
testOrderIds.push(order2Result.lastID);
console.log(` ✅ 创建测试订单2ID: ${order2Result.lastID},金额: 30000,已付: 30000`);
passed++;
const order3Result = await runSQL(`
INSERT INTO purchase_orders
(code, project_id, supplier_id, total_amount, paid_amount, order_date, status, currency, created_at, updated_at)
VALUES (?, ?, ?, 80000, 0, date('now', '-2 day'), 'confirmed', 'CNY', datetime('now'), datetime('now'))
`, ['TEST-PO-' + Date.now() + '-3', testProjectId, testSupplierId]);
testOrderIds.push(order3Result.lastID);
console.log(` ✅ 创建测试订单3ID: ${order3Result.lastID},金额: 80000,已付: 0`);
passed++;
console.log('\n--- 测试2:供应商订单列表API ---\n');
const orders = await runAllSQL(`
SELECT
po.id,
po.code,
po.total_amount,
po.paid_amount,
(po.total_amount - po.paid_amount) as unpaid_amount,
po.order_date,
po.status,
p.name as project_name
FROM purchase_orders po
LEFT JOIN projects p ON po.project_id = p.id
WHERE po.supplier_id = ?
ORDER BY po.order_date DESC
`, [testSupplierId]);
if (orders.length === 3) {
console.log(` ✅ 订单列表查询成功,共 ${orders.length} 条记录`);
orders.forEach((order, index) => {
console.log(` 订单${index + 1}: ${order.code}, 金额: ${order.total_amount}, 未付: ${order.unpaid_amount}`);
});
passed++;
} else {
console.log(` ❌ 订单数量不正确,期望3条,实际${orders.length}条`);
failed++;
}
console.log('\n--- 测试3:供应商台账财务汇总 ---\n');
const summary = await runAllSQL(`
SELECT
COUNT(*) as order_count,
COALESCE(SUM(total_amount), 0) as total_amount,
COALESCE(SUM(paid_amount), 0) as paid_amount,
COALESCE(SUM(total_amount - paid_amount), 0) as unpaid_amount
FROM purchase_orders
WHERE supplier_id = ?
`, [testSupplierId]);
if (summary.length > 0) {
const s = summary[0];
console.log(` ✅ 财务汇总:`);
console.log(` 订单数量: ${s.order_count}`);
console.log(` 订单总额: ${s.total_amount}`);
console.log(` 已付金额: ${s.paid_amount}`);
console.log(` 未付金额: ${s.unpaid_amount}`);
if (s.order_count === 3 && s.total_amount === 160000 && s.paid_amount === 50000 && s.unpaid_amount === 110000) {
console.log(` ✅ 财务汇总计算正确`);
passed++;
} else {
console.log(` ❌ 财务汇总计算错误`);
console.log(` 期望: 订单数=3, 总额=160000, 已付=50000, 未付=110000`);
failed++;
}
} else {
console.log(` ❌ 财务汇总查询失败`);
failed++;
}
console.log('\n--- 测试4:验证未付金额计算 ---\n');
console.log(' 计算公式: 未付金额 = 订单总额 - 已付金额');
console.log(' 订单1: 50000 - 20000 = 30000');
console.log(' 订单2: 30000 - 30000 = 0');
console.log(' 订单3: 80000 - 0 = 80000');
console.log(' 总未付: 30000 + 0 + 80000 = 110000');
const orderDetails = await runAllSQL(`
SELECT code, total_amount, paid_amount, (total_amount - paid_amount) as unpaid_amount
FROM purchase_orders
WHERE supplier_id = ?
ORDER BY code
`, [testSupplierId]);
let totalUnpaid = 0;
orderDetails.forEach(order => {
totalUnpaid += order.unpaid_amount;
});
if (totalUnpaid === 110000) {
console.log(` ✅ 未付金额计算正确: ${totalUnpaid}`);
passed++;
} else {
console.log(` ❌ 未付金额计算错误: ${totalUnpaid}`);
failed++;
}
console.log('\n--- 测试5:验证订单状态显示 ---\n');
const statusOrders = await runAllSQL(`
SELECT code, status, total_amount, paid_amount
FROM purchase_orders
WHERE supplier_id = ?
ORDER BY code
`, [testSupplierId]);
let statusCorrect = true;
statusOrders.forEach(order => {
console.log(` 订单: ${order.code}, 状态: ${order.status}`);
});
if (statusOrders.filter(o => o.status === 'confirmed').length === 2 &&
statusOrders.filter(o => o.status === 'paid').length === 1) {
console.log(` ✅ 订单状态正确`);
passed++;
} else {
console.log(` ❌ 订单状态不正确`);
failed++;
}
console.log('\n--- 清理测试数据 ---\n');
for (const orderId of testOrderIds) {
await runSQL('DELETE FROM purchase_orders WHERE id = ?', [orderId]);
}
await runSQL('DELETE FROM projects WHERE id = ?', [testProjectId]);
await runSQL('DELETE FROM suppliers WHERE id = ?', [testSupplierId]);
console.log(' 测试数据已清理');
console.log('\n========================================');
console.log('测试结果汇总');
console.log('========================================\n');
console.log(`通过: ${passed}`);
console.log(`失败: ${failed}`);
if (errors.length > 0) {
console.log('\n错误详情:');
errors.forEach(err => console.log(` - ${err}`));
}
console.log('\n========================================');
if (failed === 0) {
console.log('✅ 所有测试通过!供应商台账功能符合设计方案。');
} else {
console.log('❌ 部分测试失败,请检查错误详情。');
}
console.log('========================================\n');
db.close();
process.exit(failed > 0 ? 1 : 0);
} catch (error) {
console.error('测试失败:', error);
if (testSupplierId) {
try {
for (const orderId of testOrderIds) {
await runSQL('DELETE FROM purchase_orders WHERE id = ?', [orderId]);
}
await runSQL('DELETE FROM projects WHERE id = ?', [testProjectId]);
await runSQL('DELETE FROM suppliers WHERE id = ?', [testSupplierId]);
} catch (e) {}
}
db.close();
process.exit(1);
}
}
test();