143 lines
6.9 KiB
JavaScript
143 lines
6.9 KiB
JavaScript
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;
|