From 1787de99e27b2b32d719e9e1939fefd27a94bf99 Mon Sep 17 00:00:00 2001 From: wangxiaoxian <1094175543@qq.com> Date: Tue, 10 Mar 2026 20:06:56 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/statisticsController.js | 82 +++++++++++++++++++++++++++++ routes/statistics.js | 2 + 2 files changed, 84 insertions(+) diff --git a/controllers/statisticsController.js b/controllers/statisticsController.js index 9c4c5b1..a77e103 100644 --- a/controllers/statisticsController.js +++ b/controllers/statisticsController.js @@ -379,6 +379,86 @@ const getTenantRentalStats = async (req, res) => { } }; +// 即将到期房间分布统计(按公寓分组) +const getSoonExpireRoomsByApartment = async (req, res) => { + try { + // 获取所有公寓(排除已删除的) + const apartments = await Apartment.findAll({ where: { isDeleted: 0 } }); + + // 获取所有即将到期的房间(排除已删除的) + const soonExpireRooms = await Room.findAll({ + where: { + status: 'rented', + subStatus: 'soon_expire', + isDeleted: 0 + } + }); + + // 构建按公寓分组的即将到期房间数据 + const soonExpireRoomsByApartment = apartments.map(apartment => { + const apartmentSoonExpireRooms = soonExpireRooms + .filter(room => room.apartmentId === apartment.id) + .map(room => ({ + id: room.id, + roomNumber: room.roomNumber, + type: room.type, + area: room.area + })); + + return { + apartmentId: apartment.id, + apartmentName: apartment.name, + soonExpireRooms: apartmentSoonExpireRooms + }; + }); + + res.status(200).json(soonExpireRoomsByApartment); + } catch (error) { + console.error('获取即将到期分布数据时出错:', error); + res.status(500).json({ error: error.message }); + } +}; + +// 已到期房间分布统计(按公寓分组) +const getExpiredRoomsByApartment = async (req, res) => { + try { + // 获取所有公寓(排除已删除的) + const apartments = await Apartment.findAll({ where: { isDeleted: 0 } }); + + // 获取所有已到期的房间(排除已删除的) + const expiredRooms = await Room.findAll({ + where: { + status: 'rented', + subStatus: 'expired', + isDeleted: 0 + } + }); + + // 构建按公寓分组的已到期房间数据 + const expiredRoomsByApartment = apartments.map(apartment => { + const apartmentExpiredRooms = expiredRooms + .filter(room => room.apartmentId === apartment.id) + .map(room => ({ + id: room.id, + roomNumber: room.roomNumber, + type: room.type, + area: room.area + })); + + return { + apartmentId: apartment.id, + apartmentName: apartment.name, + expiredRooms: apartmentExpiredRooms + }; + }); + + res.status(200).json(expiredRoomsByApartment); + } catch (error) { + console.error('获取已到期分布数据时出错:', error); + res.status(500).json({ error: error.message }); + } +}; + module.exports = { getRentStatistics, getRoomStatusStatistics, @@ -386,5 +466,7 @@ module.exports = { getApartmentRoomStatusStatistics, getEmptyRoomsByApartment, getRentedRoomsByApartment, + getSoonExpireRoomsByApartment, + getExpiredRoomsByApartment, getTenantRentalStats }; \ No newline at end of file diff --git a/routes/statistics.js b/routes/statistics.js index 27512b8..923e46c 100644 --- a/routes/statistics.js +++ b/routes/statistics.js @@ -9,6 +9,8 @@ router.get('/dashboard', statisticsController.getDashboardStatistics); router.get('/apartment-room-status', statisticsController.getApartmentRoomStatusStatistics); router.get('/empty-rooms-by-apartment', statisticsController.getEmptyRoomsByApartment); router.get('/rented-rooms-by-apartment', statisticsController.getRentedRoomsByApartment); +router.get('/soon-expire-rooms-by-apartment', statisticsController.getSoonExpireRoomsByApartment); +router.get('/expired-rooms-by-apartment', statisticsController.getExpiredRoomsByApartment); router.get('/tenant-rental-stats', statisticsController.getTenantRentalStats); module.exports = router; \ No newline at end of file