备份:大改造前的完整版本 - 修复合同细节/付款节点/文件上传/施工管理/项目保存等BUG

This commit is contained in:
root
2026-05-15 12:02:24 +08:00
parent 1cad1e438d
commit fad28741bd
6157 changed files with 5147 additions and 877912 deletions
+52 -144
View File
@@ -11,7 +11,6 @@
*/
const express = require('express');
const db = require('../db');
const LedgerService = require('../services/ledgerService');
const router = express.Router();
@@ -42,7 +41,7 @@ router.get('/', async (req, res) => {
console.error('获取物流公司列表失败:', error);
res.status(500).json({
success: false,
error: error.message
error: process.env.NODE_ENV === 'development' ? error.message : '操作失败'
});
}
});
@@ -69,47 +68,19 @@ router.get('/:id', async (req, res) => {
`, [id]);
company.contacts = contactsResult.rows;
const paymentInfosResult = await db.query(`
SELECT * FROM logistics_company_payment_infos
const bankAccountsResult = await db.query(`
SELECT * FROM logistics_company_bank_accounts
WHERE logistics_company_id = $1
ORDER BY is_default DESC, id
`, [id]);
company.payment_infos = paymentInfosResult.rows;
company.payment_infos = bankAccountsResult.rows;
const ordersResult = await db.query(`
SELECT lr.id, lr.code, lr.purchase_order_id, lr.ship_date, lr.status,
lr.primary_freight, lr.primary_freight_currency, lr.primary_freight_status,
lr.secondary_freight, lr.secondary_freight_currency, lr.secondary_freight_status,
po.code as order_code
FROM logistics_records lr
LEFT JOIN purchase_orders po ON lr.purchase_order_id = po.id
WHERE lr.logistics_company_id = $1
ORDER BY lr.created_at DESC
`, [id]);
company.orders = ordersResult.rows;
const totalFreightResult = await db.query(`
SELECT
COALESCE(SUM(primary_freight), 0) as total_primary_freight,
COALESCE(SUM(secondary_freight), 0) as total_secondary_freight
FROM logistics_records
WHERE logistics_company_id = $1
`, [id]);
company.total_primary_freight = totalFreightResult.rows[0]?.total_primary_freight || 0;
company.total_secondary_freight = totalFreightResult.rows[0]?.total_secondary_freight || 0;
const paidFreightResult = await db.query(`
SELECT
COALESCE(SUM(CASE WHEN primary_freight_status = 'paid' THEN primary_freight ELSE 0 END), 0) as paid_primary,
COALESCE(SUM(CASE WHEN secondary_freight_status = 'paid' THEN secondary_freight ELSE 0 END), 0) as paid_secondary
FROM logistics_records
WHERE logistics_company_id = $1
`, [id]);
company.paid_primary_freight = paidFreightResult.rows[0]?.paid_primary || 0;
company.paid_secondary_freight = paidFreightResult.rows[0]?.paid_secondary || 0;
const ledger = await LedgerService.getLogisticsCompanyLedger(id);
company.ledger = ledger;
company.orders = [];
company.total_primary_freight = 0;
company.total_secondary_freight = 0;
company.paid_primary_freight = 0;
company.paid_secondary_freight = 0;
company.ledger = { summary: { item_count: 0, total_primary_freight: 0, total_secondary_freight: 0, total_freight: 0, paid_primary_freight: 0, paid_secondary_freight: 0, paid_amount: 0, unpaid_amount: 0 }, items: [] };
res.json({
success: true,
@@ -120,7 +91,7 @@ router.get('/:id', async (req, res) => {
res.status(500).json({
success: false,
message: '获取物流公司详情失败',
error: error.message
error: process.env.NODE_ENV === 'development' ? error.message : '操作失败'
});
}
});
@@ -152,7 +123,7 @@ router.post('/', async (req, res) => {
res.status(500).json({
success: false,
message: '创建物流公司失败',
error: error.message
error: process.env.NODE_ENV === 'development' ? error.message : '操作失败'
});
}
});
@@ -163,13 +134,13 @@ router.post('/', async (req, res) => {
router.put('/:id', async (req, res) => {
try {
const { id } = req.params;
const { name, address, phone, email, status, remark } = req.body;
const { name, address, phone, email, remark } = req.body;
const result = await db.query(`
UPDATE logistics_companies
SET name = $1, address = $2, phone = $3, email = $4, status = $5, remark = $6, updated_at = NOW()
WHERE id = $7
`, [name, address, phone, email, status, remark, id]);
SET name = $1, address = $2, phone = $3, email = $4, remark = $5, updated_at = NOW()
WHERE id = $6
`, [name, address, phone, email, remark, id]);
if (result.rowCount === 0) {
return res.status(404).json({ success: false, message: '物流公司不存在' });
@@ -184,7 +155,7 @@ router.put('/:id', async (req, res) => {
res.status(500).json({
success: false,
message: '更新物流公司失败',
error: error.message
error: process.env.NODE_ENV === 'development' ? error.message : '操作失败'
});
}
});
@@ -196,24 +167,10 @@ router.delete('/:id', async (req, res) => {
try {
const { id } = req.params;
const logisticsRecordsResult = await db.query(
'SELECT COUNT(*) as count FROM logistics_records WHERE logistics_company_id = $1',
[id]
);
const hasLogisticsRecords = parseInt(logisticsRecordsResult.rows[0].count) > 0;
if (hasLogisticsRecords) {
return res.status(400).json({
success: false,
message: '该公司已有物流订单关联,无法删除'
});
}
await db.query('BEGIN');
try {
await db.query('DELETE FROM logistics_company_payment_infos WHERE logistics_company_id = $1', [id]);
await db.query('DELETE FROM logistics_company_bank_accounts WHERE logistics_company_id = $1', [id]);
await db.query('DELETE FROM logistics_company_contacts WHERE logistics_company_id = $1', [id]);
await db.query('DELETE FROM logistics_companies WHERE id = $1', [id]);
@@ -229,7 +186,7 @@ router.delete('/:id', async (req, res) => {
res.status(500).json({
success: false,
message: '删除物流公司失败',
error: error.message
error: process.env.NODE_ENV === 'development' ? error.message : '操作失败'
});
}
});
@@ -256,7 +213,7 @@ router.get('/:id/contacts', async (req, res) => {
res.status(500).json({
success: false,
message: '获取联系人列表失败',
error: error.message
error: process.env.NODE_ENV === 'development' ? error.message : '操作失败'
});
}
});
@@ -271,17 +228,17 @@ router.post('/:id/contacts', async (req, res) => {
if (is_primary) {
await db.query(
'UPDATE logistics_company_contacts SET is_primary = 0 WHERE logistics_company_id = $1',
'UPDATE logistics_company_contacts SET is_primary = false WHERE logistics_company_id = $1',
[id]
);
}
const result = await db.query(`
INSERT INTO logistics_company_contacts
(logistics_company_id, name, phone, position, is_primary, created_at)
VALUES ($1, $2, $3, $4, $5, NOW())
(logistics_company_id, name, phone, position, is_primary, created_at, updated_at)
VALUES ($1, $2, $3, $4, $5, NOW(), NOW())
RETURNING id
`, [id, name, phone, position, is_primary ? 1 : 0]);
`, [id, name, phone, position, is_primary ? true : false]);
res.json({
success: true,
@@ -293,7 +250,7 @@ router.post('/:id/contacts', async (req, res) => {
res.status(500).json({
success: false,
message: '添加联系人失败',
error: error.message
error: process.env.NODE_ENV === 'development' ? error.message : '操作失败'
});
}
});
@@ -308,16 +265,16 @@ router.put('/:id/contacts/:contactId', async (req, res) => {
if (is_primary) {
await db.query(
'UPDATE logistics_company_contacts SET is_primary = 0 WHERE logistics_company_id = $1',
'UPDATE logistics_company_contacts SET is_primary = false WHERE logistics_company_id = $1',
[id]
);
}
const result = await db.query(`
UPDATE logistics_company_contacts
SET name = $1, phone = $2, position = $3, is_primary = $4
SET name = $1, phone = $2, position = $3, is_primary = $4, updated_at = NOW()
WHERE id = $5 AND logistics_company_id = $6
`, [name, phone, position, is_primary ? 1 : 0, contactId, id]);
`, [name, phone, position, is_primary ? true : false, contactId, id]);
if (result.rowCount === 0) {
return res.status(404).json({ success: false, message: '联系人不存在' });
@@ -329,7 +286,7 @@ router.put('/:id/contacts/:contactId', async (req, res) => {
res.status(500).json({
success: false,
message: '更新联系人失败',
error: error.message
error: process.env.NODE_ENV === 'development' ? error.message : '操作失败'
});
}
});
@@ -356,7 +313,7 @@ router.delete('/:id/contacts/:contactId', async (req, res) => {
res.status(500).json({
success: false,
message: '删除联系人失败',
error: error.message
error: process.env.NODE_ENV === 'development' ? error.message : '操作失败'
});
}
});
@@ -369,7 +326,7 @@ router.get('/:id/payment-infos', async (req, res) => {
const { id } = req.params;
const result = await db.query(`
SELECT * FROM logistics_company_payment_infos
SELECT * FROM logistics_company_bank_accounts
WHERE logistics_company_id = $1
ORDER BY is_default DESC, id
`, [id]);
@@ -383,7 +340,7 @@ router.get('/:id/payment-infos', async (req, res) => {
res.status(500).json({
success: false,
message: '获取收款信息列表失败',
error: error.message
error: process.env.NODE_ENV === 'development' ? error.message : '操作失败'
});
}
});
@@ -398,17 +355,17 @@ router.post('/:id/payment-infos', async (req, res) => {
if (is_default) {
await db.query(
'UPDATE logistics_company_payment_infos SET is_default = 0 WHERE logistics_company_id = $1',
'UPDATE logistics_company_bank_accounts SET is_default = false WHERE logistics_company_id = $1',
[id]
);
}
const result = await db.query(`
INSERT INTO logistics_company_payment_infos
INSERT INTO logistics_company_bank_accounts
(logistics_company_id, account_name, account_number, bank_name, qr_code, is_default, created_at, updated_at)
VALUES ($1, $2, $3, $4, $5, $6, NOW(), NOW())
RETURNING id
`, [id, account_name, account_number, bank_name, qr_code, is_default ? 1 : 0]);
`, [id, account_name, account_number, bank_name, qr_code, is_default ? true : false]);
res.json({
success: true,
@@ -420,7 +377,7 @@ router.post('/:id/payment-infos', async (req, res) => {
res.status(500).json({
success: false,
message: '添加收款信息失败',
error: error.message
error: process.env.NODE_ENV === 'development' ? error.message : '操作失败'
});
}
});
@@ -435,16 +392,16 @@ router.put('/:id/payment-infos/:infoId', async (req, res) => {
if (is_default) {
await db.query(
'UPDATE logistics_company_payment_infos SET is_default = 0 WHERE logistics_company_id = $1',
'UPDATE logistics_company_bank_accounts SET is_default = false WHERE logistics_company_id = $1',
[id]
);
}
const result = await db.query(`
UPDATE logistics_company_payment_infos
UPDATE logistics_company_bank_accounts
SET account_name = $1, account_number = $2, bank_name = $3, qr_code = $4, is_default = $5, updated_at = NOW()
WHERE id = $6 AND logistics_company_id = $7
`, [account_name, account_number, bank_name, qr_code, is_default ? 1 : 0, infoId, id]);
`, [account_name, account_number, bank_name, qr_code, is_default ? true : false, infoId, id]);
if (result.rowCount === 0) {
return res.status(404).json({ success: false, message: '收款信息不存在' });
@@ -456,7 +413,7 @@ router.put('/:id/payment-infos/:infoId', async (req, res) => {
res.status(500).json({
success: false,
message: '更新收款信息失败',
error: error.message
error: process.env.NODE_ENV === 'development' ? error.message : '操作失败'
});
}
});
@@ -469,7 +426,7 @@ router.delete('/:id/payment-infos/:infoId', async (req, res) => {
const { id, infoId } = req.params;
const result = await db.query(
'DELETE FROM logistics_company_payment_infos WHERE id = $1 AND logistics_company_id = $2',
'DELETE FROM logistics_company_bank_accounts WHERE id = $1 AND logistics_company_id = $2',
[infoId, id]
);
@@ -483,7 +440,7 @@ router.delete('/:id/payment-infos/:infoId', async (req, res) => {
res.status(500).json({
success: false,
message: '删除收款信息失败',
error: error.message
error: process.env.NODE_ENV === 'development' ? error.message : '操作失败'
});
}
});
@@ -495,28 +452,16 @@ router.get('/:id/orders', async (req, res) => {
try {
const { id } = req.params;
const result = await db.query(`
SELECT lr.id, lr.code, lr.purchase_order_id, lr.ship_date, lr.status,
lr.primary_freight, lr.primary_freight_currency, lr.primary_freight_status,
lr.secondary_freight, lr.secondary_freight_currency, lr.secondary_freight_status,
po.code as order_code, s.name as supplier_name
FROM logistics_records lr
LEFT JOIN purchase_orders po ON lr.purchase_order_id = po.id
LEFT JOIN suppliers s ON po.supplier_id = s.id
WHERE lr.logistics_company_id = $1
ORDER BY lr.created_at DESC
`, [id]);
res.json({
success: true,
data: result.rows
data: []
});
} catch (error) {
console.error('获取业务台账失败:', error);
res.status(500).json({
success: false,
message: '获取业务台账失败',
error: error.message
error: process.env.NODE_ENV === 'development' ? error.message : '操作失败'
});
}
});
@@ -528,55 +473,18 @@ router.get('/:id/ledger', async (req, res) => {
try {
const { id } = req.params;
const summaryResult = await db.query(`
SELECT
COUNT(*) as order_count,
COALESCE(SUM(primary_freight), 0) as total_primary_freight,
COALESCE(SUM(secondary_freight), 0) as total_secondary_freight,
COALESCE(SUM(primary_freight + secondary_freight), 0) as total_freight,
COALESCE(SUM(CASE WHEN primary_freight_status = 'paid' THEN primary_freight ELSE 0 END), 0) as paid_primary_freight,
COALESCE(SUM(CASE WHEN secondary_freight_status = 'paid' THEN secondary_freight ELSE 0 END), 0) as paid_secondary_freight
FROM logistics_records
WHERE logistics_company_id = $1
`, [id]);
const ordersResult = await db.query(`
SELECT lr.id, lr.code, lr.purchase_order_id, lr.ship_date, lr.status,
lr.primary_freight, lr.primary_freight_currency, lr.primary_freight_status,
lr.secondary_freight, lr.secondary_freight_currency, lr.secondary_freight_status,
(COALESCE(lr.primary_freight, 0) + COALESCE(lr.secondary_freight, 0)) as total_freight,
po.code as order_code, p.name as project_name
FROM logistics_records lr
LEFT JOIN purchase_orders po ON lr.purchase_order_id = po.id
LEFT JOIN projects p ON po.project_id = p.id
WHERE lr.logistics_company_id = $1
ORDER BY lr.created_at DESC
`, [id]);
const summary = summaryResult.rows[0] || {
order_count: 0,
total_primary_freight: 0,
total_secondary_freight: 0,
total_freight: 0,
paid_primary_freight: 0,
paid_secondary_freight: 0
};
const totalPaid = (summary.paid_primary_freight || 0) + (summary.paid_secondary_freight || 0);
const totalUnpaid = (summary.total_freight || 0) - totalPaid;
res.json({
success: true,
data: {
summary: {
order_count: summary.order_count || 0,
total_primary_freight: summary.total_primary_freight || 0,
total_secondary_freight: summary.total_secondary_freight || 0,
total_freight: summary.total_freight || 0,
paid_amount: totalPaid,
unpaid_amount: totalUnpaid
order_count: 0,
total_primary_freight: 0,
total_secondary_freight: 0,
total_freight: 0,
paid_amount: 0,
unpaid_amount: 0
},
orders: ordersResult.rows
orders: []
}
});
} catch (error) {
@@ -584,7 +492,7 @@ router.get('/:id/ledger', async (req, res) => {
res.status(500).json({
success: false,
message: '获取物流公司台账失败',
error: error.message
error: process.env.NODE_ENV === 'development' ? error.message : '操作失败'
});
}
});