|
|
|
|
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime
|
|
|
|
|
from sqlalchemy.orm import relationship
|
|
|
|
|
from datetime import datetime, timezone
|
|
|
|
|
from .room_management import Room, Base # 假设room_management.py在同一包内,或根据实际情况调整导入路径
|
|
|
|
|
|
|
|
|
|
# 预订模型
|
|
|
|
|
class Booking(Base):
|
|
|
|
|
__tablename__ = 'bookings' # 注意双下划线的正确使用
|
|
|
|
|
id = Column(Integer, primary_key=True)
|
|
|
|
|
room_id = Column(Integer, ForeignKey('rooms.id'), nullable=False)
|
|
|
|
|
guest_name = Column(String, nullable=False)
|
|
|
|
|
start_date = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc)) # 使用时区感知的默认值
|
|
|
|
|
end_date = Column(DateTime, nullable=False)
|
|
|
|
|
room = relationship("Room", back_populates="bookings")
|
|
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
|
return f"Booking(id={self.id}, room={self.room.room_number}, guest='{self.guest_name}', start_date={self.start_date}, end_date={self.end_date})"
|
|
|
|
|
|
|
|
|
|
# 初始化Room模型与Booking之间的关系
|
|
|
|
|
Room.bookings = relationship("Booking", order_by=Booking.id, back_populates="room")
|
|
|
|
|
|
|
|
|
|
def make_booking(room_number, guest_name, start_date_str, end_date_str):
|
|
|
|
|
"""创建预订"""
|
|
|
|
|
from dateutil.parser import parse
|
|
|
|
|
try:
|
|
|
|
|
start_date = parse(start_date_str).replace(tzinfo=None)
|
|
|
|
|
end_date = parse(end_date_str).replace(tzinfo=None)
|
|
|
|
|
room = session.query(Room).filter_by(room_number=room_number, status='available').first()
|
|
|
|
|
if not room:
|
|
|
|
|
return "该房间不可用或不存在。"
|
|
|
|
|
new_booking = Booking(guest_name=guest_name, start_date=start_date, end_date=end_date, room=room)
|
|
|
|
|
room.status = 'occupied'
|
|
|
|
|
session.add(new_booking)
|
|
|
|
|
session.commit()
|
|
|
|
|
return f"{guest_name} 的预订成功,房间号:{room_number},时间:{start_date} 至 {end_date}"
|
|
|
|
|
except Exception as e:
|
|
|
|
|
return str(e)
|
|
|
|
|
|
|
|
|
|
def cancel_booking(booking_id):
|
|
|
|
|
"""取消预订"""
|
|
|
|
|
booking = session.query(Booking).get(booking_id)
|
|
|
|
|
if not booking:
|
|
|
|
|
return "预订记录不存在。"
|
|
|
|
|
room = booking.room
|
|
|
|
|
room.status = 'available'
|
|
|
|
|
session.delete(booking)
|
|
|
|
|
session.commit()
|
|
|
|
|
return f"预订ID为{booking_id}的预订已取消。"
|
|
|
|
|
|
|
|
|
|
def get_bookings_by_guest(guest_name=None):
|
|
|
|
|
"""按客人姓名获取预订记录"""
|
|
|
|
|
query = session.query(Booking)
|
|
|
|
|
if guest_name:
|
|
|
|
|
query = query.filter_by(guest_name=guest_name)
|
|
|
|
|
return query.all()
|
|
|
|
|
|
|
|
|
|
def get_bookings_by_room(room_number):
|
|
|
|
|
"""按房间号获取预订记录"""
|
|
|
|
|
room = session.query(Room).filter_by(room_number=room_number).first()
|
|
|
|
|
if not room:
|
|
|
|
|
return []
|
|
|
|
|
return room.bookings
|