const models = require('../models'); const { Op } = require('sequelize'); // 格式化时间(考虑时区,转换为北京时间) const formatDate = (date) => { if (!date) return null; const beijingDate = new Date(date.getTime() + 8 * 60 * 60 * 1000); return beijingDate.toISOString().replace('T', ' ').slice(0, 19); }; // 格式化日期(只返回年月日) const formatDateOnly = (date) => { if (!date) return null; const beijingDate = new Date(date.getTime() + 8 * 60 * 60 * 1000); return beijingDate.toISOString().split('T')[0]; }; // 格式化费用支出数据 const formatExpenseData = (expense) => { return { ...expense.toJSON(), date: formatDateOnly(expense.date), createTime: formatDate(expense.createTime), updateTime: formatDate(expense.updateTime) }; }; // 获取所有费用支出(支持搜索和分页) const getAllExpenses = async (req, res) => { try { const { category, startDate, endDate, page = 1, pageSize = 10 } = req.query; // 构建查询条件 const where = { isDeleted: 0 }; if (category) { where.category = { [Op.like]: `%${category}%` }; } if (startDate) { where.date = { ...where.date, [Op.gte]: startDate }; } if (endDate) { where.date = { ...where.date, [Op.lte]: endDate }; } // 计算偏移量 const offset = (page - 1) * pageSize; // 查询费用支出数据 const { count, rows } = await models.Expense.findAndCountAll({ where, limit: parseInt(pageSize), offset: parseInt(offset), order: [['date', 'DESC']] }); // 格式化数据 const formattedExpenses = rows.map(formatExpenseData); // 返回结果 res.status(200).json({ data: formattedExpenses, total: count, page: parseInt(page), pageSize: parseInt(pageSize) }); } catch (error) { res.status(500).json({ error: error.message }); } }; // 获取单个费用支出 const getExpenseById = async (req, res) => { try { const { id } = req.params; const expense = await models.Expense.findOne({ where: { id, isDeleted: 0 } }); if (!expense) { return res.status(404).json({ error: '费用支出不存在' }); } const formattedExpense = formatExpenseData(expense); res.status(200).json(formattedExpense); } catch (error) { res.status(500).json({ error: error.message }); } }; // 创建费用支出 const createExpense = async (req, res) => { try { const { date, amount, category, remark, operator } = req.body; const expense = await models.Expense.create({ date, amount, category, remark, operator, createBy: req.user.id, updateBy: req.user.id }); const formattedExpense = formatExpenseData(expense); res.status(201).json(formattedExpense); } catch (error) { res.status(500).json({ error: error.message }); } }; // 更新费用支出 const updateExpense = async (req, res) => { try { const { id } = req.params; const { date, amount, category, remark, operator } = req.body; const expense = await models.Expense.findOne({ where: { id, isDeleted: 0 } }); if (!expense) { return res.status(404).json({ error: '费用支出不存在' }); } await expense.update({ date, amount, category, remark, operator, updateBy: req.user.id }); const formattedExpense = formatExpenseData(expense); res.status(200).json(formattedExpense); } catch (error) { res.status(500).json({ error: error.message }); } }; // 删除费用支出(软删除) const deleteExpense = async (req, res) => { try { const { id } = req.params; const expense = await models.Expense.findOne({ where: { id, isDeleted: 0 } }); if (!expense) { return res.status(404).json({ error: '费用支出不存在' }); } await expense.update({ isDeleted: 1, updateBy: req.user.id }); res.status(200).json({ message: '费用支出删除成功' }); } catch (error) { res.status(500).json({ error: error.message }); } }; // 获取所有费用支出(不分页) const listExpenses = async (req, res) => { try { const { category, startDate, endDate } = req.query; // 构建查询条件 const where = { isDeleted: 0 }; if (category) { where.category = { [Op.like]: `%${category}%` }; } if (startDate) { where.date = { ...where.date, [Op.gte]: startDate }; } if (endDate) { where.date = { ...where.date, [Op.lte]: endDate }; } // 查询费用支出数据 const expenses = await models.Expense.findAll({ where, order: [['date', 'DESC']] }); // 格式化数据 const formattedExpenses = expenses.map(formatExpenseData); // 返回结果 res.status(200).json(formattedExpenses); } catch (error) { res.status(500).json({ error: error.message }); } }; module.exports = { getAllExpenses, listExpenses, getExpenseById, createExpense, updateExpense, deleteExpense };