rentease-backend/controllers/waterBillController.js

262 lines
6.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const { WaterBill, 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 formatWaterBillData = (bill) => {
const formattedBill = {
...bill.toJSON(),
startDate: formatDate(bill.startDate),
endDate: formatDate(bill.endDate),
createTime: formatDate(bill.createTime),
updateTime: formatDate(bill.updateTime)
};
// 格式化关联数据
if (formattedBill.Room) {
formattedBill.Room = {
...formattedBill.Room,
createTime: formatDate(formattedBill.Room.createTime),
updateTime: formatDate(formattedBill.Room.updateTime)
};
}
return formattedBill;
};
// 获取所有水费记录(支持搜索和分页)
const getAllWaterBills = async (req, res) => {
try {
const {
apartmentId,
roomId,
status,
startDateFrom,
endDateTo,
page = 1,
pageSize = 10
} = req.query;
const where = { isDeleted: 0 };
if (roomId) {
where.roomId = roomId;
}
if (status) {
where.status = status;
}
if (startDateFrom && endDateTo) {
where.startDate = { [Op.gte]: new Date(startDateFrom) };
where.endDate = { [Op.lte]: new Date(endDateTo) };
}
const include = [
{
model: Room,
where: {
isDeleted: 0,
...(apartmentId ? { apartmentId } : {})
}
}
];
const offset = (page - 1) * pageSize;
const { count, rows } = await WaterBill.findAndCountAll({
where,
include,
limit: parseInt(pageSize),
offset: parseInt(offset),
order: [['createTime', 'DESC']]
});
const formattedBills = rows.map(formatWaterBillData);
res.status(200).json({
data: formattedBills,
total: count,
page: parseInt(page),
pageSize: parseInt(pageSize)
});
} catch (error) {
res.status(500).json({ error: error.message });
}
};
// 获取单个水费记录
const getWaterBillById = async (req, res) => {
try {
const { id } = req.params;
const bill = await WaterBill.findOne({
where: { id, isDeleted: 0 },
include: [
{
model: Room,
where: { isDeleted: 0 }
}
]
});
if (!bill) {
return res.status(404).json({ error: '水费记录不存在' });
}
const formattedBill = formatWaterBillData(bill);
res.status(200).json(formattedBill);
} catch (error) {
res.status(500).json({ error: error.message });
}
};
// 创建水费记录
const createWaterBill = async (req, res) => {
try {
const { roomId, startDate, endDate, startReading, endReading, unitPrice, status } = req.body;
let usage = null;
let amount = null;
if (startReading && endReading && unitPrice) {
usage = parseFloat(endReading) - parseFloat(startReading);
amount = usage * parseFloat(unitPrice);
}
const bill = await WaterBill.create({
roomId,
startDate,
endDate,
startReading,
endReading,
usage,
unitPrice,
amount,
status: status || 'unpaid',
createBy: req.user.id,
updateBy: req.user.id
});
const formattedBill = formatWaterBillData(bill);
res.status(201).json(formattedBill);
} catch (error) {
res.status(500).json({ error: error.message });
}
};
// 更新水费记录
const updateWaterBill = async (req, res) => {
try {
const { id } = req.params;
const { startDate, endDate, startReading, endReading, unitPrice, status } = req.body;
const bill = await WaterBill.findOne({
where: { id, isDeleted: 0 }
});
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: status !== undefined ? status : bill.status,
updateBy: req.user.id
});
const formattedBill = formatWaterBillData(bill);
res.status(200).json(formattedBill);
} catch (error) {
res.status(500).json({ error: error.message });
}
};
// 删除水费记录(软删除)
const deleteWaterBill = async (req, res) => {
try {
const { id } = req.params;
const bill = await WaterBill.findOne({
where: { id, isDeleted: 0 }
});
if (!bill) {
return res.status(404).json({ error: '水费记录不存在' });
}
await bill.update({
isDeleted: 1,
updateBy: req.user.id
});
res.status(200).json({ message: '水费记录删除成功' });
} catch (error) {
res.status(500).json({ error: error.message });
}
};
// 获取所有水费记录(不分页)
const listWaterBills = async (req, res) => {
try {
const {
apartmentId,
roomId,
status,
startDateFrom,
endDateTo
} = req.query;
const where = { isDeleted: 0 };
if (roomId) {
where.roomId = roomId;
}
if (status) {
where.status = status;
}
if (startDateFrom && endDateTo) {
where.startDate = { [Op.gte]: new Date(startDateFrom) };
where.endDate = { [Op.lte]: new Date(endDateTo) };
}
const include = [
{
model: Room,
where: {
isDeleted: 0,
...(apartmentId ? { apartmentId } : {})
}
}
];
const bills = await WaterBill.findAll({
where,
include,
order: [['createTime', 'DESC']]
});
const formattedBills = bills.map(formatWaterBillData);
res.status(200).json(formattedBills);
} catch (error) {
res.status(500).json({ error: error.message });
}
};
module.exports = {
getAllWaterBills,
listWaterBills,
getWaterBillById,
createWaterBill,
updateWaterBill,
deleteWaterBill
};