From ba94a0e091761ac81565c10a7825dd245babef22 Mon Sep 17 00:00:00 2001 From: wangziqi Date: Thu, 9 Jul 2026 12:16:51 +0800 Subject: [PATCH] feat: add bed/locker selection to check-in form and occupancy table --- apps/admin/src/pages/Occupancies/index.tsx | 61 ++++++++++++++++++++-- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/apps/admin/src/pages/Occupancies/index.tsx b/apps/admin/src/pages/Occupancies/index.tsx index 09d57d0..4f53e19 100644 --- a/apps/admin/src/pages/Occupancies/index.tsx +++ b/apps/admin/src/pages/Occupancies/index.tsx @@ -54,6 +54,8 @@ const OccupanciesPage: React.FC = () => { const [checkOutForm] = Form.useForm(); const [transferForm] = Form.useForm(); const [batchCheckOutForm] = Form.useForm(); + const [availableBeds, setAvailableBeds] = useState([]); + const [availableLockers, setAvailableLockers] = useState([]); const fetchData = useCallback(async () => { setLoading(true); @@ -86,6 +88,25 @@ const OccupanciesPage: React.FC = () => { setSelectedRowKeys([]); }, [fetchData]); + const handleRoomChange = async (roomId: number) => { + checkInForm.setFieldValue('bedId', undefined); + checkInForm.setFieldValue('lockerId', undefined); + if (!roomId) { + setAvailableBeds([]); + setAvailableLockers([]); + return; + } + try { + const [beds, lockers] = await Promise.all([ + api.get(`/rooms/${roomId}/beds/available`), + api.get(`/rooms/${roomId}/lockers/available`), + ]); + setAvailableBeds(beds); + setAvailableLockers(lockers); + if (beds.length === 1) checkInForm.setFieldValue('bedId', beds[0].id); + } catch (e) { console.error(e); } + }; + const filteredData = useMemo(() => { if (!searchText) return data; const keyword = searchText.toLowerCase(); @@ -108,6 +129,8 @@ const OccupanciesPage: React.FC = () => { rentalType: values.rentalType, tenantId: values.tenantId, notes: values.notes, + bedId: values.bedId, + lockerId: values.lockerId || undefined, }); message.success('入住登记成功'); setCheckInModal(false); @@ -195,6 +218,8 @@ const OccupanciesPage: React.FC = () => { const columns = useMemo(() => [ { title: '学生', width: 120, render: (_: any, r: any) => r.student?.name || '-' }, { title: '宿舍', width: 120, render: (_: any, r: any) => r.room?.roomNumber || '-' }, + { title: '床位', width: 80, render: (_: unknown, r: Record) => (r.bed as Record | undefined)?.bedNumber || '-' }, + { title: '柜子', width: 80, render: (_: unknown, r: Record) => (r.locker as Record | undefined)?.lockerNumber || '-' }, { title: '入住日期', dataIndex: 'checkInDate', width: 110 }, { title: '计费起始', dataIndex: 'billingStartDate', width: 110 }, { @@ -494,18 +519,17 @@ const OccupanciesPage: React.FC = () => { name="roomId" label="选择宿舍" rules={[{ required: true, message: '请选择宿舍' }]} - > ({ + value: b.id, + label: b.bedNumber, + }))} + notFoundContent="该房间暂无可用床位" + /> + + {availableBeds.length > 0 && ( +
+ 空闲 {availableBeds.length} 张床位 +
+ )} + +