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 };