rentease-backend/controllers/electricityBillController.js

180 lines
4.6 KiB
JavaScript
Raw Normal View History

2026-03-02 12:36:41 +00:00
const { ElectricityBill, Room } = require('../models');
const { Op } = require('sequelize');
// 格式化时间(考虑时区,转换为北京时间)
const formatDate = (date) => {
if (!date) return null;
// 创建一个新的Date对象加上8小时的时区偏移
const beijingDate = new Date(date.getTime() + 8 * 60 * 60 * 1000);
return beijingDate.toISOString().split('T')[0];
};
// 格式化电费数据
const formatElectricityBillData = (bill) => {
const formattedBill = {
...bill.toJSON(),
startDate: formatDate(bill.startDate),
endDate: formatDate(bill.endDate),
createTime: formatDate(bill.createTime)
};
// 格式化关联数据
if (formattedBill.Room) {
formattedBill.Room = {
...formattedBill.Room,
createTime: formatDate(formattedBill.Room.createTime)
};
}
return formattedBill;
};
// 获取所有电费记录(支持搜索和分页)
const getAllElectricityBills = async (req, res) => {
try {
const { roomId, status, startDate, endDate, page = 1, pageSize = 10 } = req.query;
// 构建查询条件
const where = {};
if (roomId) {
where.roomId = roomId;
}
if (status) {
where.status = status;
}
if (startDate) {
where.startDate = { [Op.gte]: new Date(startDate) };
}
if (endDate) {
where.endDate = { [Op.lte]: new Date(endDate) };
}
// 计算偏移量
const offset = (page - 1) * pageSize;
// 查询电费数据
const { count, rows } = await ElectricityBill.findAndCountAll({
where,
include: [Room],
limit: parseInt(pageSize),
offset: parseInt(offset)
});
// 格式化数据
const formattedBills = rows.map(formatElectricityBillData);
// 返回结果
res.status(200).json({
data: formattedBills,
total: count,
page: parseInt(page),
pageSize: parseInt(pageSize)
});
} catch (error) {
res.status(500).json({ error: error.message });
}
};
// 获取单个电费记录
const getElectricityBillById = async (req, res) => {
try {
const { id } = req.params;
const bill = await ElectricityBill.findByPk(id, {
include: [Room]
});
if (!bill) {
return res.status(404).json({ error: '电费记录不存在' });
}
const formattedBill = formatElectricityBillData(bill);
res.status(200).json(formattedBill);
} catch (error) {
res.status(500).json({ error: error.message });
}
};
// 创建电费记录
const createElectricityBill = async (req, res) => {
try {
const { roomId, startDate, endDate, startReading, endReading, unitPrice } = req.body;
// 计算用电量和费用
const usage = parseFloat(endReading) - parseFloat(startReading);
const amount = usage * parseFloat(unitPrice);
const bill = await ElectricityBill.create({
roomId,
startDate,
endDate,
startReading,
endReading,
usage,
unitPrice,
amount
});
const formattedBill = formatElectricityBillData(bill);
res.status(201).json(formattedBill);
} catch (error) {
res.status(500).json({ error: error.message });
}
};
// 更新电费记录
const updateElectricityBill = async (req, res) => {
try {
const { id } = req.params;
const { startDate, endDate, startReading, endReading, unitPrice, status } = req.body;
const bill = await ElectricityBill.findByPk(id);
if (!bill) {
return res.status(404).json({ error: '电费记录不存在' });
}
// 计算用电量和费用
let usage = bill.usage;
let amount = bill.amount;
if (startReading && endReading && unitPrice) {
usage = parseFloat(endReading) - parseFloat(startReading);
amount = usage * parseFloat(unitPrice);
}
await bill.update({
startDate,
endDate,
startReading,
endReading,
usage,
unitPrice,
amount,
status
});
const formattedBill = formatElectricityBillData(bill);
res.status(200).json(formattedBill);
} catch (error) {
res.status(500).json({ error: error.message });
}
};
// 删除电费记录
const deleteElectricityBill = async (req, res) => {
try {
const { id } = req.params;
const bill = await ElectricityBill.findByPk(id);
if (!bill) {
return res.status(404).json({ error: '电费记录不存在' });
}
await bill.destroy();
res.status(200).json({ message: '电费记录删除成功' });
} catch (error) {
res.status(500).json({ error: error.message });
}
};
module.exports = {
getAllElectricityBills,
getElectricityBillById,
createElectricityBill,
updateElectricityBill,
deleteElectricityBill
};