import pdb import random import time import uuid from datetime import timedelta, datetime from sqlalchemy import func from app.models import db from app.models.ticket_lib import Ticket from app.models.train_station_lib import TrainStation class Order(db.Model): __tablename__ = 'order' id = db.Column(db.Integer, primary_key=True) order_no = db.Column(db.String(120), unique=True, nullable=False) price = db.Column(db.Numeric(8, 2)) payment_time = db.Column(db.DateTime) state = db.Column(db.Integer, default=0) passenger_id = db.Column(db.Integer, db.ForeignKey('passenger.id'), nullable=False, index=True) created_at = db.Column(db.DateTime, default=func.now()) updated_at = db.Column(db.DateTime, default=func.now()) passenger = db.relationship('Passenger', backref=db.backref('orders')) def __repr__(self): return f'' @classmethod def setOrderState(cls, order_no, passenger_id, **kwargs): # order = cls.query.filter_by(order_no=order_no, passenger_id=passenger_id).first() # if order: # # 更新订单的属性 # for key, value in kwargs.items(): # setattr(order, key, value) # if key == 'state' and value == 1: # for ticket in order.tickets: # Ticket.updateState(ticket) # Update state to 1 # # 提交更改到数据库 # db.session.commit() # return order # else: # # 处理订单未找到的情况 # return None try: # 尝试从数据库中查询特定的订单 order = cls.query.filter_by(order_no=order_no, passenger_id=passenger_id).first() if order: # 如果找到了订单,则根据传入的参数更新订单的属性 for key, value in kwargs.items(): setattr(order, key, value) # 如果更新了订单状态为1,则更新该订单下所有车票的状态 if key == 'state' and value == 1: for ticket in order.tickets: Ticket.updateState(ticket) # 提交更改到数据库 db.session.commit() return order else: # 如果没有找到订单,返回None return None except Exception as e: # 如果发生异常,回滚数据库更改并重新抛出异常 db.session.rollback() raise e def generate_unique_id(length=4): # 获取当前的秒级时间戳 timestamp_seconds = int(time.time()) # 生成 4 位随机数 random_number = random.randint(0, 10 ** length - 1) # 确保随机数是 4 位数字 random_number_str = str(random_number).zfill(length) # 生成唯一标识符 unique_id = f"{timestamp_seconds}{random_number_str}" return unique_id def generateOrder(params, passenger_id): # Create a new Order object order = Order( order_no=generate_unique_id(5), passenger_id=passenger_id ) for e in params['tickets']: # 创建Ticket对象 ticket = Ticket.generateTicket(e, passenger_id) # 计算起始站和终点站 from_station = TrainStation.query.filter_by(train_no=ticket.train_no, station_name=ticket.from_station).one() to_station = TrainStation.query.filter_by(train_no=ticket.train_no, station_name=ticket.to_station).one() # 计算区间价格 train_stations = TrainStation.query.filter( TrainStation.train_no == ticket.train_no, TrainStation.index > from_station.index, TrainStation.index <= to_station.index ).all() ticket.price = sum(e.price for e in train_stations) # 计算座位号 seat_count = db.session.query(func.count(Ticket.id)).filter_by( train_no=ticket.train_no, date=ticket.date ).scalar() ticket.seat_no = seat_count + 1 # 转换时间 计算出发时间 interval_days = ( datetime.strptime(ticket.date, "%Y/%m/%d") - datetime.combine(from_station.departure_time.date(), datetime.min.time())).days ticket.departure_time = from_station.departure_time + timedelta(days=interval_days) ticket.arrival_time = to_station.arrival_time + timedelta(days=interval_days) order.tickets.append(ticket) order.price = sum(ticket.price for ticket in order.tickets) return order