diff --git a/src/views/Dashboard.vue b/src/views/Dashboard.vue index 886314e..5bb6e24 100644 --- a/src/views/Dashboard.vue +++ b/src/views/Dashboard.vue @@ -51,6 +51,17 @@ + + +
+ +
+
{{ reservedRoomCount }}
+
预订数量
+
+
+
+
@@ -125,6 +136,7 @@ + @@ -148,6 +160,7 @@ export default { apartmentCount: 0, roomCount: 0, emptyRoomCount: 0, + reservedRoomCount: 0, rentedRoomCount: 0, soonExpireRoomCount: 0, expiredRoomCount: 0, @@ -176,6 +189,7 @@ export default { this.apartmentCount = dashboardStats.apartmentCount this.roomCount = dashboardStats.roomCount this.emptyRoomCount = dashboardStats.emptyRoomCount + this.reservedRoomCount = dashboardStats.reservedRoomCount this.rentedRoomCount = dashboardStats.rentedRoomCount this.soonExpireRoomCount = dashboardStats.soonExpireRoomCount this.expiredRoomCount = dashboardStats.expiredRoomCount @@ -210,6 +224,10 @@ export default { const value = Number(curr) || 0; return prev + value; }, 0); + } else if (column.property === 'total') { + sums[index] = data.reduce((sum, item) => { + return sum + (Number(item.empty) || 0) + (Number(item.reserved) || 0) + (Number(item.rented) || 0); + }, 0); } else { sums[index] = ''; } diff --git a/src/views/rental/Detail.vue b/src/views/rental/Detail.vue index bb0b265..2fadd39 100644 --- a/src/views/rental/Detail.vue +++ b/src/views/rental/Detail.vue @@ -5,7 +5,9 @@
房屋详情
- 租房 + 租房 + 预订 + 取消预订 退房 打扫 维修 @@ -387,6 +389,7 @@ export default { getStatusType(status) { switch (status) { case 'empty': return '' + case 'reserved': return 'warning' case 'rented': return 'success' case 'soon_expire': return 'warning' case 'expired': return 'danger' @@ -398,6 +401,7 @@ export default { getStatusText(status) { switch (status) { case 'empty': return '空房' + case 'reserved': return '预订' case 'rented': return '在租' case 'soon_expire': return '即将到期' case 'expired': return '到期' @@ -445,6 +449,50 @@ export default { } }) }, + async handleReserve() { + if (!this.room.id) { + this.$message.error('房间信息加载失败,无法进行预订操作') + return + } + + this.$confirm('确定要预订这个房间吗?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'info' + }).then(async () => { + try { + const roomId = this.$route.params.id + await roomApi.update(roomId, { status: 'reserved' }) + this.$message.success('预订成功') + this.loadData() + } catch (error) { + console.error('预订失败:', error) + this.$message.error('预订失败:' + (error.message || '未知错误')) + } + }).catch(() => {}) + }, + async handleCancelReserve() { + if (!this.room.id) { + this.$message.error('房间信息加载失败,无法进行取消预订操作') + return + } + + this.$confirm('确定要取消预订吗?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }).then(async () => { + try { + const roomId = this.$route.params.id + await roomApi.update(roomId, { status: 'empty' }) + this.$message.success('取消预订成功') + this.loadData() + } catch (error) { + console.error('取消预订失败:', error) + this.$message.error('取消预订失败:' + (error.message || '未知错误')) + } + }).catch(() => {}) + }, async handleCheckout() { if (!this.room.id) { this.$message.error('房间信息加载失败,无法进行退房操作') diff --git a/src/views/rental/List.vue b/src/views/rental/List.vue index 7c191ac..631b1de 100644 --- a/src/views/rental/List.vue +++ b/src/views/rental/List.vue @@ -19,6 +19,7 @@ + @@ -61,7 +62,7 @@

{{ getApartmentName(room.apartmentId) }}

{{ getSubStatusText(room.subStatus) }} - 空房 + {{ getStatusText(room.status) }} {{ getOtherStatusText(room.otherStatus) }}
@@ -190,6 +191,22 @@ export default { const apartment = this.apartments.find(a => a.id == apartmentId) return apartment ? apartment.name : '' }, + getStatusType(status) { + switch (status) { + case 'empty': return 'info' + case 'reserved': return 'warning' + case 'rented': return 'success' + default: return '' + } + }, + getStatusText(status) { + switch (status) { + case 'empty': return '空房' + case 'reserved': return '预订' + case 'rented': return '在租' + default: return status + } + }, getSubStatusType(status) { switch (status) { case 'normal': return 'success' diff --git a/src/views/room/Add.vue b/src/views/room/Add.vue index 9c36ce9..5a5d982 100644 --- a/src/views/room/Add.vue +++ b/src/views/room/Add.vue @@ -27,6 +27,7 @@ + diff --git a/src/views/room/Edit.vue b/src/views/room/Edit.vue index 720dc13..85dfae1 100644 --- a/src/views/room/Edit.vue +++ b/src/views/room/Edit.vue @@ -27,6 +27,7 @@ + diff --git a/src/views/room/List.vue b/src/views/room/List.vue index 36d9eb1..864035e 100644 --- a/src/views/room/List.vue +++ b/src/views/room/List.vue @@ -20,6 +20,7 @@ + @@ -246,6 +247,7 @@ export default { getStatusType(status) { switch (status) { case 'empty': return 'info' + case 'reserved': return 'warning' case 'rented': return 'success' default: return '' } @@ -253,6 +255,7 @@ export default { getStatusText(status) { switch (status) { case 'empty': return '空房' + case 'reserved': return '预订' case 'rented': return '在租' default: return status } diff --git a/src/views/statistics/House.vue b/src/views/statistics/House.vue index ead2a94..f4c8c8a 100644 --- a/src/views/statistics/House.vue +++ b/src/views/statistics/House.vue @@ -44,7 +44,7 @@ export default { computed: { totalCount() { return this.roomStatusData - .filter(item => item.status === '在租' || item.status === '空房') + .filter(item => item.status === '在租' || item.status === '空房' || item.status === '预订') .reduce((sum, item) => sum + item.count, 0) } }, @@ -57,7 +57,7 @@ export default { const response = await statisticsApi.getRoomStatus() const data = response const total = data - .filter(item => item.status === '在租' || item.status === '空房') + .filter(item => item.status === '在租' || item.status === '空房' || item.status === '预订') .reduce((sum, item) => sum + item.count, 0) this.roomStatusData = data.map(item => ({ ...item,