备份:修复前完整项目快照 2026-04-19
This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
const express = require('express');
|
||||
const db = require('../db');
|
||||
const { authenticate, requireAdmin } = require('../middleware/auth');
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
router.get('/', async (req, res) => {
|
||||
try {
|
||||
const result = await db.query(`
|
||||
SELECT * FROM executions
|
||||
ORDER BY created_at DESC
|
||||
`);
|
||||
res.json({ success: true, data: result.rows, count: result.rows.length });
|
||||
} catch (error) {
|
||||
console.error('获取执行记录失败:', error);
|
||||
res.status(500).json({ success: false, message: '获取执行记录失败', error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
router.get('/pending', async (req, res) => {
|
||||
try {
|
||||
const advances = await db.query('SELECT * FROM advances WHERE status = $1', ['approved']);
|
||||
const reimbursements = await db.query('SELECT * FROM reimbursements WHERE status = $1', ['approved']);
|
||||
const payments = await db.query('SELECT * FROM payment_requests WHERE status = $1', ['approved']);
|
||||
const verifications = await db.query('SELECT * FROM verifications WHERE status = $1', ['approved']);
|
||||
const purchaseRequests = await db.query('SELECT * FROM purchase_requests WHERE status = $1', ['approved']);
|
||||
|
||||
const pendingData = [
|
||||
...advances.rows.map(item => ({ ...item, type: '预支申请', code: item.advance_code })),
|
||||
...reimbursements.rows.map(item => ({ ...item, type: '报销申请', code: item.reimbursement_code })),
|
||||
...payments.rows.map(item => ({ ...item, type: '付款申请', code: item.request_code })),
|
||||
...verifications.rows.map(item => ({ ...item, type: '核销申请', code: item.verification_code })),
|
||||
...purchaseRequests.rows.map(item => ({ ...item, type: '采购申请', code: item.request_code, amount: item.total_amount, date: item.request_date, reason: item.brief_description || item.remark || '采购申请' }))
|
||||
];
|
||||
|
||||
res.json({ success: true, data: pendingData, count: pendingData.length });
|
||||
} catch (error) {
|
||||
console.error('获取待执行列表失败:', error);
|
||||
res.status(500).json({ success: false, message: '获取待执行列表失败', error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
router.get('/executed', async (req, res) => {
|
||||
try {
|
||||
const advances = await db.query('SELECT * FROM advances WHERE status = $1', ['executed']);
|
||||
const reimbursements = await db.query('SELECT * FROM reimbursements WHERE status = $1', ['executed']);
|
||||
const payments = await db.query('SELECT * FROM payment_requests WHERE status = $1', ['executed']);
|
||||
const verifications = await db.query('SELECT * FROM verifications WHERE status = $1', ['executed']);
|
||||
const purchaseRequests = await db.query('SELECT * FROM purchase_requests WHERE status = $1', ['executed']);
|
||||
|
||||
const executedData = [
|
||||
...advances.rows.map(item => ({ ...item, type: '预支申请', code: item.advance_code })),
|
||||
...reimbursements.rows.map(item => ({ ...item, type: '报销申请', code: item.reimbursement_code })),
|
||||
...payments.rows.map(item => ({ ...item, type: '付款申请', code: item.request_code })),
|
||||
...verifications.rows.map(item => ({ ...item, type: '核销申请', code: item.verification_code })),
|
||||
...purchaseRequests.rows.map(item => ({
|
||||
...item,
|
||||
type: '采购申请',
|
||||
code: item.request_code,
|
||||
amount: item.total_amount,
|
||||
date: item.request_date,
|
||||
reason: item.brief_description || item.remark || '采购申请',
|
||||
executeDate: item.execute_date,
|
||||
executeMethod: item.execute_method
|
||||
}))
|
||||
];
|
||||
|
||||
res.json({ success: true, data: executedData, count: executedData.length });
|
||||
} catch (error) {
|
||||
console.error('获取已执行列表失败:', error);
|
||||
res.status(500).json({ success: false, message: '获取已执行列表失败', error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
router.post('/', async (req, res) => {
|
||||
try {
|
||||
const { apply_id, apply_type, action, execute_method, voucher_no, remark, reject_reason, voucher_files } = req.body;
|
||||
const operator = '系统管理员';
|
||||
const operator_role = 'admin';
|
||||
|
||||
await db.query(
|
||||
'INSERT INTO executions (apply_id, apply_type, action, execute_method, voucher_no, remark, reject_reason, voucher_files, operator, operator_role, created_at) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, NOW())',
|
||||
[apply_id, apply_type, action, execute_method, voucher_no, remark, reject_reason, JSON.stringify(voucher_files || []), operator, operator_role]
|
||||
);
|
||||
|
||||
let status = action === 'execute' ? 'executed' : 'rejected';
|
||||
if (action === 'reject') {
|
||||
status = 'pending_edit';
|
||||
}
|
||||
|
||||
const executeDate = new Date().toISOString().split('T')[0];
|
||||
|
||||
switch (apply_type) {
|
||||
case 'advance':
|
||||
await db.query('UPDATE advances SET status = $1, execute_date = $2, execute_method = $3 WHERE id = $4', [status, executeDate, execute_method, apply_id]);
|
||||
break;
|
||||
case 'reimbursement':
|
||||
await db.query('UPDATE reimbursements SET status = $1, execute_date = $2, execute_method = $3 WHERE id = $4', [status, executeDate, execute_method, apply_id]);
|
||||
break;
|
||||
case 'payment':
|
||||
await db.query('UPDATE payment_requests SET status = $1, execute_date = $2, execute_method = $3 WHERE id = $4', [status, executeDate, execute_method, apply_id]);
|
||||
break;
|
||||
case 'verification':
|
||||
await db.query('BEGIN');
|
||||
|
||||
try {
|
||||
await db.query('UPDATE verifications SET status = $1, execute_date = $2, execute_method = $3 WHERE id = $4', [status, executeDate, execute_method, apply_id]);
|
||||
|
||||
const verification = await db.query('SELECT advance_id, settlement, amount FROM verifications WHERE id = $1', [apply_id]);
|
||||
const advanceId = verification.rows[0]?.advance_id;
|
||||
const isSettlement = verification.rows[0]?.settlement === 1;
|
||||
const verificationAmount = verification.rows[0]?.amount || 0;
|
||||
|
||||
if (advanceId && status === 'executed') {
|
||||
await db.query('UPDATE advances SET total_reimbursed = total_reimbursed + $1 WHERE id = $2', [verificationAmount, advanceId]);
|
||||
|
||||
if (isSettlement) {
|
||||
await db.query('UPDATE advances SET status = $1 WHERE id = $2', ['completed', advanceId]);
|
||||
} else {
|
||||
await db.query('UPDATE advances SET status = $1 WHERE id = $2', ['partial_verification', advanceId]);
|
||||
}
|
||||
}
|
||||
|
||||
await db.query('COMMIT');
|
||||
} catch (error) {
|
||||
await db.query('ROLLBACK');
|
||||
throw error;
|
||||
}
|
||||
break;
|
||||
case 'purchase':
|
||||
await db.query('UPDATE purchase_requests SET status = $1, execute_date = $2, execute_method = $3 WHERE id = $4', [status, executeDate, execute_method, apply_id]);
|
||||
break;
|
||||
}
|
||||
|
||||
res.json({ success: true, message: '执行操作成功' });
|
||||
} catch (error) {
|
||||
console.error('执行操作失败:', error);
|
||||
res.status(500).json({ success: false, message: '执行操作失败', error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
Reference in New Issue
Block a user