rentease-backend/controllers/expenseController.js

208 lines
5.1 KiB
JavaScript
Raw Normal View History

2026-03-15 12:37:31 +00:00
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 } = req.body;
const expense = await models.Expense.create({
date,
amount,
category,
remark,
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 } = 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,
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
};