210 lines
5.1 KiB
JavaScript
210 lines
5.1 KiB
JavaScript
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
|
|
}; |