262 lines
6.2 KiB
JavaScript
262 lines
6.2 KiB
JavaScript
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
|
||
}; |