备份:大改造前的完整版本 - 修复合同细节/付款节点/文件上传/施工管理/项目保存等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
+38 -53
View File
@@ -44,7 +44,7 @@ router.get('/', async (req, res) => {
const data = result.rows.map(row => ({
...row,
request_code: row.code
request_code: row.request_code
}));
res.json({
@@ -57,7 +57,7 @@ router.get('/', async (req, res) => {
res.status(500).json({
success: false,
message: '获取采购申请列表失败',
error: error.message
error: process.env.NODE_ENV === 'development' ? error.message : '操作失败'
});
}
});
@@ -74,7 +74,7 @@ router.get('/:id', async (req, res) => {
SELECT pr.*, p.name as project_name
FROM purchase_requests pr
LEFT JOIN projects p ON pr.project_id = p.id
WHERE pr.id = ?
WHERE pr.id = $1
`, [id]);
if (requestResult.rows.length === 0) {
@@ -82,20 +82,7 @@ router.get('/:id', async (req, res) => {
}
const purchaseRequest = requestResult.rows[0];
purchaseRequest.request_code = purchaseRequest.code;
if (purchaseRequest.attachments) {
if (typeof purchaseRequest.attachments === 'string') {
purchaseRequest.attachments = purchaseRequest.attachments.split(',').map((url) => ({
url: url,
name: url.split('/').pop() || '',
uid: url,
status: 'done'
}));
}
} else {
purchaseRequest.attachments = [];
}
// request_code is already in the table, no need to alias from code
res.json({
success: true,
@@ -106,7 +93,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 : '操作失败'
});
}
});
@@ -127,9 +114,8 @@ router.get('/:id', async (req, res) => {
router.post('/', async (req, res) => {
try {
const {
project_id, applicant, request_date,
expense_category, total_amount, currency, remark, attachments,
purchase_type, brief_description, expected_date
project_id, total_amount, currency,
purchase_type, remark
} = req.body;
const date = new Date();
@@ -137,12 +123,12 @@ router.post('/', async (req, res) => {
const result = await db.query(`
INSERT INTO purchase_requests
(code, title, project_id, applicant, request_date, expense_category, total_amount, currency,
status, purchase_type, brief_description, expected_date, remark, attachments, created_at, updated_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
`, [requestCode, brief_description || '采购申请', project_id, applicant || '系统管理员',
request_date, expense_category || 'material', total_amount || 0, currency || 'CNY',
'pending_edit', purchase_type || 'inventory', brief_description, expected_date, remark, attachments || '']);
(request_code, project_id, purchase_type, total_amount, currency,
status, remarks, created_at, updated_at)
VALUES ($1, $2, $3, $4, $5, $6, $7, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
RETURNING id`,
[requestCode, project_id, purchase_type || 'inventory', total_amount || 0, currency || 'CNY',
'pending_edit', remark]);
res.json({
success: true,
@@ -154,7 +140,7 @@ router.post('/', async (req, res) => {
res.status(500).json({
success: false,
message: '创建采购申请失败',
error: error.message
error: process.env.NODE_ENV === 'development' ? error.message : '操作失败'
});
}
});
@@ -167,21 +153,19 @@ router.put('/:id', async (req, res) => {
try {
const { id } = req.params;
const {
project_id, applicant, request_date,
expense_category, total_amount, currency, remark, attachments,
purchase_type, brief_description, expected_date
project_id, total_amount, currency,
purchase_type, remark
} = req.body;
const result = await db.query(`
UPDATE purchase_requests
SET project_id = ?, applicant = ?, request_date = ?, expense_category = ?,
total_amount = ?, currency = ?, purchase_type = ?, brief_description = ?,
expected_date = ?, remark = ?, attachments = ?, updated_at = CURRENT_TIMESTAMP
WHERE id = ?
`, [project_id, applicant, request_date, expense_category, total_amount, currency || 'CNY',
purchase_type || 'inventory', brief_description, expected_date, remark, attachments || '', id]);
SET project_id = $1, total_amount = $2, currency = $3,
purchase_type = $4, remarks = $5, updated_at = CURRENT_TIMESTAMP
WHERE id = $6
`, [project_id, total_amount, currency || 'CNY',
purchase_type || 'inventory', remark, id]);
if (result.changes === 0) {
if (result.rowCount === 0) {
return res.status(404).json({ success: false, message: '采购申请不存在' });
}
@@ -194,7 +178,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 : '操作失败'
});
}
});
@@ -208,7 +192,7 @@ router.delete('/:id', async (req, res) => {
const result = await db.query('DELETE FROM purchase_requests WHERE id = $1', [id]);
if (result.changes === 0) {
if (result.rowCount === 0) {
return res.status(404).json({ success: false, message: '采购申请不存在' });
}
@@ -221,7 +205,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 : '操作失败'
});
}
});
@@ -239,14 +223,14 @@ router.post('/:id/submit', async (req, res) => {
['pending', id]
);
if (result.changes === 0) {
if (result.rowCount === 0) {
return res.status(404).json({ success: false, message: '采购申请不存在' });
}
res.json({ success: true, message: '提交成功' });
} catch (error) {
console.error('提交采购申请失败:', error);
res.status(500).json({ success: false, message: '提交采购申请失败', error: error.message });
res.status(500).json({ success: false, message: '提交采购申请失败' });
}
});
@@ -282,16 +266,17 @@ router.post('/:id/approve', async (req, res) => {
const orderResult = await db.query(`
INSERT INTO purchase_orders
(code, purchase_request_id, project_id, estimated_amount, currency, status, created_by, created_at, updated_at)
VALUES (?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
`, [orderCode, id, purchaseRequest.project_id, purchaseRequest.total_amount,
purchaseRequest.currency || 'CNY', 'draft', purchaseRequest.applicant || '系统']);
VALUES ($1, $2, $3, $4, $5, $6, $7, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
RETURNING id`,
[orderCode, id, purchaseRequest.project_id, purchaseRequest.total_amount,
purchaseRequest.currency || 'CNY', 'draft', purchaseRequest.created_by || 1]);
await db.query('COMMIT');
res.json({
success: true,
message: '审批通过成功,已自动生成采购订单草稿',
data: { order_id: orderResult.lastID, order_code: orderCode }
data: { order_id: orderResult.rows[0]?.id, order_code: orderCode }
});
} catch (innerError) {
await db.query('ROLLBACK');
@@ -299,7 +284,7 @@ router.post('/:id/approve', async (req, res) => {
}
} catch (error) {
console.error('审批采购申请失败:', error);
res.status(500).json({ success: false, message: '审批采购申请失败', error: error.message });
res.status(500).json({ success: false, message: '审批采购申请失败' });
}
});
@@ -316,14 +301,14 @@ router.post('/:id/reject', async (req, res) => {
['pending_edit', id]
);
if (result.changes === 0) {
if (result.rowCount === 0) {
return res.status(404).json({ success: false, message: '采购申请不存在' });
}
res.json({ success: true, message: '驳回成功' });
} catch (error) {
console.error('驳回采购申请失败:', error);
res.status(500).json({ success: false, message: '驳回采购申请失败', error: error.message });
res.status(500).json({ success: false, message: '驳回采购申请失败' });
}
});
@@ -340,14 +325,14 @@ router.post('/:id/withdraw', async (req, res) => {
['withdrawn', id]
);
if (result.changes === 0) {
if (result.rowCount === 0) {
return res.status(404).json({ success: false, message: '采购申请不存在' });
}
res.json({ success: true, message: '撤回成功' });
} catch (error) {
console.error('撤回采购申请失败:', error);
res.status(500).json({ success: false, message: '撤回采购申请失败', error: error.message });
res.status(500).json({ success: false, message: '撤回采购申请失败' });
}
});
@@ -367,7 +352,7 @@ router.post('/:id/execute', async (req, res) => {
res.json({ success: true, message: '执行成功' });
} catch (error) {
console.error('执行采购申请失败:', error);
res.status(500).json({ success: false, message: '执行采购申请失败', error: error.message });
res.status(500).json({ success: false, message: '执行采购申请失败' });
}
});