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),
|
2026-03-03 15:36:48 +00:00
|
|
|
|
createTime: formatDate(bill.createTime),
|
|
|
|
|
|
updateTime: formatDate(bill.updateTime)
|
2026-03-02 12:36:41 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 格式化关联数据
|
|
|
|
|
|
if (formattedBill.Room) {
|
|
|
|
|
|
formattedBill.Room = {
|
|
|
|
|
|
...formattedBill.Room,
|
2026-03-03 15:36:48 +00:00
|
|
|
|
createTime: formatDate(formattedBill.Room.createTime),
|
|
|
|
|
|
updateTime: formatDate(formattedBill.Room.updateTime)
|
2026-03-02 12:36:41 +00:00
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return formattedBill;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 获取所有电费记录(支持搜索和分页)
|
|
|
|
|
|
const getAllElectricityBills = async (req, res) => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const { roomId, status, startDate, endDate, page = 1, pageSize = 10 } = req.query;
|
|
|
|
|
|
|
|
|
|
|
|
// 构建查询条件
|
2026-03-03 15:36:48 +00:00
|
|
|
|
const where = { isDeleted: 0 };
|
2026-03-02 12:36:41 +00:00
|
|
|
|
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,
|
2026-03-03 15:36:48 +00:00
|
|
|
|
include: [
|
|
|
|
|
|
{
|
|
|
|
|
|
model: Room,
|
|
|
|
|
|
where: { isDeleted: 0 }
|
|
|
|
|
|
}
|
|
|
|
|
|
],
|
2026-03-02 12:36:41 +00:00
|
|
|
|
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;
|
2026-03-03 15:36:48 +00:00
|
|
|
|
const bill = await ElectricityBill.findOne({
|
|
|
|
|
|
where: { id, isDeleted: 0 },
|
|
|
|
|
|
include: [
|
|
|
|
|
|
{
|
|
|
|
|
|
model: Room,
|
|
|
|
|
|
where: { isDeleted: 0 }
|
|
|
|
|
|
}
|
|
|
|
|
|
]
|
2026-03-02 12:36:41 +00:00
|
|
|
|
});
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
2026-03-03 15:36:48 +00:00
|
|
|
|
const bill = await ElectricityBill.findOne({
|
|
|
|
|
|
where: { id, isDeleted: 0 }
|
|
|
|
|
|
});
|
2026-03-02 12:36:41 +00:00
|
|
|
|
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 });
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2026-03-03 15:36:48 +00:00
|
|
|
|
// 删除电费记录(软删除)
|
2026-03-02 12:36:41 +00:00
|
|
|
|
const deleteElectricityBill = async (req, res) => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const { id } = req.params;
|
2026-03-03 15:36:48 +00:00
|
|
|
|
const bill = await ElectricityBill.findOne({
|
|
|
|
|
|
where: { id, isDeleted: 0 }
|
|
|
|
|
|
});
|
2026-03-02 12:36:41 +00:00
|
|
|
|
if (!bill) {
|
|
|
|
|
|
return res.status(404).json({ error: '电费记录不存在' });
|
|
|
|
|
|
}
|
2026-03-03 15:36:48 +00:00
|
|
|
|
await bill.update({ isDeleted: 1 });
|
2026-03-02 12:36:41 +00:00
|
|
|
|
res.status(200).json({ message: '电费记录删除成功' });
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
res.status(500).json({ error: error.message });
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
|
|
getAllElectricityBills,
|
|
|
|
|
|
getElectricityBillById,
|
|
|
|
|
|
createElectricityBill,
|
|
|
|
|
|
updateElectricityBill,
|
|
|
|
|
|
deleteElectricityBill
|
|
|
|
|
|
};
|