class Movie(db.Model, Model): mid = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), nullable=False) language = db.Column(db.String(32)) subtitle = db.Column(db.String(32)) show_date = db.Column(db.Date) vision = db.Column(db.String(16)) model = db.Column(db.String(16)) screen_size = db.Column(db.String(16)) introduction = db.Column(db.Text) status = db.Column(db.Integer, default=0, nullable=False, index=True) @classmethod def create_test_data(cls, num=10): for i in range(1, num + 1): m = Movie() m.mid = i m.sn = str(i).zfill(10) m.name = '电影名称%s' % i m.language = '英文' m.subtitle = '中文' # m.show_date = m.mode = '数字' m.vision = '2D' m.screen_size = 'IMAX' m.introduction = 'blahblah哈哈' m.status = 1 db.session.add(m) db.session.commit() print('movie test data done!')
class Hall(db.Model, Model): hid = db.Column(db.Integer, primary_key=True) cid = db.Column(db.Integer) name = db.Column(db.String(64), nullable=False) screen_type = db.Column(db.String(32)) audio_type = db.Column(db.String(32)) seats_num = db.Column(db.Integer, default=0, nullable=False) status = db.Column(db.Integer, nullable=False, index=True)
class Cinema(db.Model, Model): #cid 影院id,主键 cid = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True, nullable=False) address = db.Column(db.String(128), nullable=False) halls = db.Column(db.Integer, default=0, nullable=False) handle_fee = db.Column(db.INTEGER, default=0, nullable=False) buy_limit = db.Column(db.INTEGER, default=0, nullable=False) status = db.Column(db.INTEGER, default=0, nullable=False, index=True)
class Movie(db.Model, Model): #电影主键ID mid = db.Column(db.Integer, primary_key=True) #电影名字 name = db.Column(db.String(64), nullable=False) #语言种类 language = db.Column(db.String(32)) #字幕 subtitle = db.Column(db.String(32)) #上映时间 show_date = db.Column(db.Date) #电影格式 mode = db.Column(db.String(16)) #放映类型3D,4D vision = db.Column(db.String(16)) #屏幕尺寸 screen_size = db.Column(db.String(16)) #内容简介 introduction = db.Column(db.Text) #状态 status = db.Column(db.Integer, default=0, nullable=False, index=True)
class Movie(db.Model, Model): """电影信息表""" """电影ID,主键""" mid = db.Column(db.Integer, primary_key=True) """电影名称""" name = db.Column(db.String(64), nullable=False) """语言""" language = db.Column(db.String(32)) """字幕""" subtitle = db.Column(db.String(32)) """上映时间""" show_date = db.Column(db.Date) """电影格式,比如胶字、数字""" mode = db.Column(db.String(16)) """放映类型,3D 2D""" vision = db.Column(db.String(16)) """屏幕尺寸""" screen_size = db.Column(db.String(16)) """内容简介""" introduction = db.Column(db.Text) """状态""" status = db.Column(db.Integer, default=0, nullable=False, index=True)
class Movie(db.Model, Model): mid = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(200), unique=True, nullable=False) language = db.Column(db.String(32)) subtitle = db.Column(db.String(32)) show_date = db.Column(db.Date) vision = db.Column(db.String(16)) model = db.Column(db.String(16)) screen_size = db.Column(db.String(16)) introduction = db.Column(db.Text) status = db.Column(db.Integer, default=0, index=True, nullable=False) def __json__(self): keys = vars(self).keys() data = {} for key in keys: if not key.startswith('_'): data[key] = getattr(self, key) return data @classmethod def create_test_data(cls, num=10): for i in range(1, num + 1): m = Movie() m.mid = i m.sn = str(i).zfill(10) m.name = '电影名称%s' % i m.language = '英文' m.subtitle = '中文' # m.show_date = m.mode = '数字' m.vision = '2D' m.screen_size = 'IMAX' m.introduction = 'blahblah哈哈' m.status = 1 db.session.add(m) db.session.commit() print('movie test data done!')
class Hall(db.Model, Model): """影厅表""" """影厅ID,主键""" hid = db.Column(db.Integer, primary_key=True) """cid,影院ID""" cid = db.Column(db.Integer) """影厅名称""" name = db.Column(db.String(64), nullable=False) """屏幕的类型""" screen_type = db.Column(db.String(32)) """音响类型""" audio_type = db.Column(db.String(32)) """座位数量""" seats_num = db.Column(db.Integer, default=0, nullable=False) """状态""" status = db.Column(db.Integer, default=0, nullable=False, index=True)
class Cinema(db.Model, Model): cid = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True, nullable=False) address = db.Column(db.String(256), nullable=False) halls = db.Column(db.Integer, default=0, nullable=False) handle_fee = db.Column(db.Integer, default=0, nullable=False) buy_limit = db.Column(db.Integer, default=0, nullable=False) status = db.Column(db.Integer, nullable=False, index=True) @classmethod def create_test_data(cls, cinema_num=10, hall_num=10, play_num=10): HALL_SEATS_NUM = 25 start_time = time.time() from tigereye.models.hall import Hall from tigereye.models.movie import Movie from tigereye.models.play import Play from tigereye.models.seat import Seat, PlaySeat from tigereye.models.order import Order f = faker.Faker('zh_CN') screen_types = ['普通', 'IMAX'] audio_types = ['普通', '杜比环绕'] cinemas = [] for i in range(1, cinema_num + 1): cinema = Cinema() cinema.cid = i cinema.name = '%s影城' % f.name() cinema.address = f.address() cinema.status = 1 cinema.put() cinemas.append(cinema) Cinema.commit() halls = [] plays = [] seats = [] for cinema in cinemas: for n in range(1, hall_num + 1): hall = Hall() hall.cid = cinema.cid hall.name = '%s号厅' % n hall.screen_type = random.choice(screen_types) hall.audio_type = random.choice(audio_types) hall.seats_num = HALL_SEATS_NUM hall.status = 1 hall.put() halls.append(hall) Hall.commit() for hall in halls: hall.seats = [] for s in range(1, hall.seats_num + 1): seat = Seat() seat.cid = hall.cid seat.hid = hall.hid seat.x = s % 5 or 5 seat.y = math.ceil(s / 5) seat.row = seat.x seat.column = seat.y seat.seat_type = 1 seat.put() hall.seats.append(seat) Seat.commit() for p in range(1, play_num + 1): play = Play() play.cid = cinema.cid play.hid = hall.hid play.mid = p play.start_time = datetime.now() play.duration = 3600 play.price_type = 1 play.price = 7000 play.market_price = 5000 play.lowest_price = 3000 play.status = 1 play.put() play.hall = hall plays.append(play) Play.commit() for play in plays: for seat in play.hall.seats: ps = PlaySeat() ps.pid = play.pid ps.copy(seat) ps.put() PlaySeat.commit() current_app.logger.info('create test data done! cost %.2f seconds' % (time.time() - start_time))
class Play(db.Model, Model): __tablename__ = "play" pid = db.Column(db.Integer, primary_key=True) cid = db.Column(db.Integer) hid = db.Column(db.Integer) mid = db.Column(db.Integer) start_time = db.Column(db.DATETIME, nullable=False) # 时长 duration = db.Column(db.Integer, default=0, nullable=False) price_type = db.Column(db.Integer) price = db.Column(db.Integer) market_price = db.Column(db.Integer) lowest_price = db.Column(db.Integer) # 在服务器段进行时间的定义 created_time = db.Column(db.DATETIME, server_default=text("CURRENT_TIMESTAMP")) # 当修改的时候获取时间 updated_time = db.Column(db.DATETIME, onupdate=func.now()) status = db.Column(db.Integer, nullable=False, default=0, index=True)
class PlaySeat(db.Model, Model): psid = db.Column(db.Integer, primary_key=True) orderno = db.Column(db.String(32), index=True) cid = db.Column(db.Integer) hid = db.Column(db.Integer) sid = db.Column(db.Integer) pid = db.Column(db.Integer) seat_type = db.Column(db.String(16)) love_seats = db.Column(db.String(16)) x = db.Column(db.Integer) y = db.Column(db.Integer) row = db.Column(db.String(16)) column = db.Column(db.String(16)) area = db.Column(db.String(16)) status = db.Column(db.Integer, default=0, index=True, nullable=False) lock_time = db.Column(db.DateTime) created_time = db.Column(db.DateTime, server_default=text('CURRENT_TIMESTAMP')) def copy(self, seat): self.sid = seat.sid self.cid = seat.cid self.hid = seat.hid self.x = seat.x self.y = seat.y self.row = seat.row self.column = seat.column self.area = seat.area self.seat_type = seat.seat_type self.love_seats = seat.love_seats self.status = seat.status @classmethod # 类方法,能直接被类. 调用 def lock(cls, orderno, pid, sid_list): # 事物 session = db.create_scoped_session() # query能直接放对象吗?<sql:query>标签用来运行SQL SELECT语句, # filter用类名.属性名,比较用==,filter_by直接用属性名,比较用= # rows 是链式调用返回的修改数 rows = session.query(PlaySeat).filter( PlaySeat.pid == pid, # Seatstatus 自定义类方法 PlaySeat.status == SeatStatus.ok.value, # sqlalchemy in语法查询,查询id 在一个list里的所有集合 PlaySeat.sid.in_(sid_list) ).update( { 'orderno': orderno, 'status': SeatStatus.locked.value, 'lock_time': datetime.now() # 属于 update 的参数 synchronize_session用于query在进行delete or update操作时,对session的同步策略。 # False - 不对session进行同步,直接进行delete or update操作。 }, synchronize_session=False) if rows != len(sid_list): session.rollback() return 0 session.commit() return rows @classmethod def unlock(cls, orderno, pid, sid_list): session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.locked.value).update( { 'orderno': None, 'status': SeatStatus.ok.value, }, synchronize_session=False) if rows != len(sid_list): session.rollback() # 返回的是0, return 0 session.commit() return rows @classmethod def buy(cls, orderno, pid, sid_list): session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.locked.value).update( { 'status': SeatStatus.sold.value, }, synchronize_session=False) if rows != len(sid_list): session.rollback() # 返回的是0, return 0 session.commit() return rows @classmethod def refund(cls, orderno, pid, sid_list): session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.sold.value # 把座位的状态码改了,订单号改为无 ).update({ 'status': SeatStatus.ok.value, 'orderno': None, }, synchronize_session=False) if rows != len(sid_list): session.rollback() # 返回的是0, return 0 session.commit() return rows @classmethod def print_tickets(cls, orderno, pid, sid_list): session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.sold.value # 把座位的状态码改了,订单号改为无 ).update({ 'status': SeatStatus.ok.value, 'orderno': None, }, synchronize_session=False) # 如果操作数和 座位数长度不一样就回滚 if rows != len(sid_list): session.rollback() # 返回的是0, return 0 session.commit() return rows @classmethod def getby_orderno(cls, orderno): # filter的时候条件之间是使用“==",fitler_by使用的是"=" return cls.query.filter_by(orderno=orderno).all()
class Cinema(db.Model, Model): cid = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True, nullable=False) address = db.Column(db.String(256), nullable=False) halls = db.Column(db.Integer, default=0, nullable=False) handle_fee = db.Column(db.Integer, default=0, nullable=False) buy_limit = db.Column(db.Integer, default=0, nullable=False) status = db.Column(db.Integer, nullable=False, index=True) @classmethod def create_test_data(cls, cinema_num=10, hall_num=10, play_num=10): from tigereye.models.hall import Hall from tigereye.models.movie import Movie from tigereye.models.order import Order from tigereye.models.seat import Seat, PlaySeat from tigereye.models.play import Play time1 = time.time() f = faker.Faker('zh_CN') screen_types = ['普通', 'IMAX'] audio_types = ['普通', '杜比环绕'] cm_name = ['影院', '影城', '国际影城', '国际影院'] for i in range(1, cinema_num + 1): cinema = Cinema() cinema.cid = i cinema.name = f.company()[:-6] + random.choice(cm_name) cinema.address = f.address() cinema.status = 1 print(cinema.name) cinema.save() for n in range(1, hall_num + 1): hall = Hall() hall.cid = cinema.cid hall.name = '%s号厅' % n hall.screen_type = random.choice(screen_types) hall.audio_type = random.choice(audio_types) hall.seats_num = 25 hall.status = 1 hall.save() seats = [] for s in range(1, hall.seats_num + 1): seat = Seat() seat.cid = cinema.cid seat.hid = hall.hid seat.x = s % 5 or 5 seat.y = ceil(s / 5) seat.row = seat.x seat.column = seat.y seat.seat_type = 1 seat.put() seats.append(seat) Seat.commit() for p in range(1, play_num + 1): play = Play() play.cid = cinema.cid play.hid = hall.hid play.mid = p play.start_time = datetime.now() play.duration = 3600 play.price_type = 1 play.price = 7000 play.market_price = 5000 play.lowest_price = 3000 play.status = 1 play.save() for seat in seats: ps = PlaySeat() ps.pid = play.pid ps.copy(seat) ps.put() PlaySeat.commit() current_app.logger.info('create test data done! %.2f s' % (time.time() - time1))
class Order(db.Model, Model): #订单表名称 __tablename__ = "orders" # 订单id 主键 oid = db.Column(db.String(32), primary_key=True) # 排期id pid = db.Column(db.Integer) # 影院id cid = db.Column(db.Integer, default=0, nullable=False) # 座位id sid = db.Column(db.String(32), nullable=False) # 取票码 ticket_flag = db.Column(db.String(64)) # 订单总金融 amount = db.Column(db.Integer, default=0, nullable=False) # 销售房订单好 seller_order_no = db.Column(db.String(32), unique=True) # 支付时间 paid_time = db.Column(db.DateTime) # 取票时间 printed_time = db.Column(db.DateTime) # 创建时间 created_time = db.Column(db.DateTime, server_default=text("CURRENT_TIMESTAMP")) # 最后更新时间 updated_time = db.Column(db.DateTime, onupdate=func.now()) # 订单状态 status = db.Column(db.Integer, default=0, nullable=False) @classmethod def create(cls, cid, pid, sid): '''根据影院ID,排期ID和座位ID,创建订单对象''' order = cls() order.oid = "%s%s%s" % (tetime.now(), randint(100000, 999999), pid) order.cid = cid order.pid = pid order.sid = ",".join(str(i) for i in sid) return order @classmethod def getby_orderno(cls, orderno): """根据销售方订单号获取order记录""" return Order.query.filter_by(seller_order_no=orderno).first() def gen_ticket_flag(self): """生成取票码""" self.ticket_flag = ''.join( [str(randint(1000, 9999)) for i in range(8)]) def validate(self, ticket_flag): """验证取票码的有效性""" return self.ticket_flag == ticket_flag
class Order(db.Model, Model): __tablename__ = "orders" # 自己的订单号 oid = db.Column(db.String(32), primary_key=True) # 第三方订单号 sell_order_no = db.Column(db.String(32), index=True) cid = db.Column(db.Integer) pid = db.Column(db.Integer) sid = db.Column(db.String(32)) # 取票码 ticket_flag = db.Column(db.String(64)) # 票数 ticket_num = db.Column(db.Integer) # 金额 amount = db.Column(db.Integer) # 支付时间 paid_time = db.Column(db.DATETIME) # 取票时间 print_time = db.Column(db.DATETIME) # 退款时间 refund_time = db.Column(db.DATETIME) created_time = db.Column(db.DATETIME, server_default=text("CURRENT_TIMESTAMP")) updated_time = db.Column(db.DATETIME, onupdate=func.now()) status = db.Column(db.Integer, default=0, index=True, nullable=False) # 定义类方法 @classmethod # 创建订单表 def create(cls, cid, pid, sid): order = cls() # 购买时间+随机6位数字+排期id order.oid = "%s%s%s" % (tetime.now(), randint(100000, 999999), pid) order.pid = pid order.cid = cid # 对sid进行组合,以便进行保存 if type(sid) == list: order.sid = ",".join(str(i) for i in sid) else: order.sid = sid return order @classmethod # 通过orderno获取order对象 def getby_orderno(cls, orderno): return Order.query.filter_by(sell_order_no=orderno).first() # 生成取票码 def gen_ticket_flag(self): self.ticket_flag = "".join( [str(randint(1000, 9999)) for i in range(8)]) # 判断取票码 def validate(self, ticket_flag): return self.ticket_flag == ticket_flag # 通过取票码获取order对象 @classmethod def getby_ticket_flag(cls, ticket_flag): return cls.query.filter_by(ticket_flag=ticket_flag).first()
class Play(db.Model, Model): '''排期表,存储排期相关信息''' '''排期id,主键''' pid = db.Column(db.Integer, primary_key=True) '''电影院id''' cid = db.Column(db.Integer, default=0, nullable=False) '''影厅id''' hid = db.Column(db.Integer, default=0, nullable=False) '''电影id''' mid = db.Column(db.Integer, default=0, nullable=False) '''放映开始时间''' start_time = db.Column(db.DateTime, nullable=False) '''放映时长''' duration = db.Column(db.Integer, default=0, nullable=False) '''价格类型''' price_type = db.Column(db.Integer) '''价格''' price = db.Column(db.Integer) '''销售价格''' market_price = db.Column(db.Integer) '''最低价格''' lowest_price = db.Column(db.Integer) '''创建时间''' created_time = db.Column(db.DateTime) '''最后更新时间''' updated_time = db.Column(db.DateTime) '''状态''' status = db.Column(db.Integer, default=0, nullable=False, index=True)
class Order(db.Model, Model): """订单表""" __tablename__ = 'orders' """订单ID,主键""" oid = db.Column(db.String(32), primary_key=True) """排期ID,主键""" pid = db.Column(db.Integer) """电影院ID""" cid = db.Column(db.Integer, default=0, nullable=False) """座位ID""" sid = db.Column(db.String(32), nullable=False) """取票码""" ticket_flag = db.Column(db.String(64)) """订单总金额""" amount = db.Column(db.Integer, default=0, nullable=False) """销售方订单号""" seller_order_no = db.Column(db.String(32), unique=True) """支付时间""" paid_time = db.Column(db.DateTime) """取票时间""" printed_time = db.Column(db.DateTime) """创建时间""" created_time = db.Column(db.DateTime, server_default=text('CURRENT_TIMESTAMP')) """最后更新时间""" updated_time = db.Column(db.DateTime, onupdate=func.now()) """订单状态""" status = db.Column(db.Integer, default=0, nullable=False) @classmethod def create(cls, cid, pid, sid): """根据影院ID,排期ID和座位ID,创建订单对象""" order = cls() order.oid = '%s%s%s' % (tetime.now(), randint(100000, 999999), pid) order.cid = cid order.pid = pid order.sid = ','.join(str(i) for i in sid) return order @classmethod def getby_orderno(cls, orderno): """根据销售方订单号获取order记录""" return Order.query.filter_by(seller_order_no=orderno).first() def gen_ticket_flag(self): """生成取票码""" self.ticket_flag = ''.join( [str(randint(1000, 9999)) for i in range(8)]) def validate(self, ticket_flag): """验证取票码的有效性""" return self.ticket_flag == ticket_flag
class Order(db.Model, Model): __tablename__ = 'orders' # 订单ID,我们自己的订单号 oid = db.Column(db.String(32), primary_key=True) # 销售方订单号 seller_order_no = db.Column(db.String(32), index=True) cid = db.Column(db.Integer) pid = db.Column(db.Integer) sid = db.Column(db.String(32)) # 取票码 ticket_flag = db.Column(db.String(64)) tickets_num = db.Column(db.Integer) amount = db.Column(db.Integer) paid_time = db.Column(db.DateTime) printed_time = db.Column(db.DateTime) refund_time = db.Column(db.DateTime) created_time = db.Column(db.DateTime, server_default=text('CURRENT_TIMESTAMP')) updated_time = db.Column(db.DateTime, onupdate=func.now()) status = db.Column(db.Integer, default=0, nullable=False, index=True) @classmethod def create(cls, cid, pid, sid): order = cls() order.oid = '%s%s%s' % (tetime.now(), randint(100000, 999999), pid) order.cid = cid order.pid = pid if type(sid) == list: order.sid = ','.join(str(i) for i in sid) else: order.sid = sid return order @classmethod def getby_orderno(cls, orderno): return Order.query.filter_by(seller_order_no=orderno).first() def gen_ticket_flag(self): self.ticket_flag = ''.join( [str(randint(1000, 9999)) for i in range(8)]) def validate(self, ticket_flag): return self.ticket_flag == ticket_flag @classmethod def getby_ticket_flag(cls, ticket_flag): return cls.query.filter_by(ticket_flag=ticket_flag).first()
class PlaySeat(db.Model, Model): '''排期座位主键''' psid = db.Column(db.Integer, primary_key=True) '''第三方订单号''' orderno = db.Column(db.String(32), index=True) '''座位id''' sid = db.Column(db.Integer, nullable=False) '''排期id''' pid = db.Column(db.Integer, nullable=False) '''影院id''' cid = db.Column(db.Integer, nullable=False) '''影厅id''' hid = db.Column(db.Integer, nullable=False) x = db.Column(db.INTEGER, default=0, nullable=False) y = db.Column(db.INTEGER, default=0, nullable=False) """显示行名称""" row = db.Column(db.String(8)) """显示列名称""" column = db.Column(db.String(8)) """区域""" area = db.Column(db.String(16)) """座位类型""" seat_type = db.Column(db.String(16)) """是否是情侣座""" love_seats = db.Column(db.String(32)) """座位锁定时间""" locked_time = db.Column(db.DateTime) """创建时间""" created_time = db.Column(db.DateTime, server_default=text("CURRENT_TIMESTAMP")) '''状态''' status = db.Column(db.INTEGER, default=0, nullable=False, index=True) def copy(self, seat): """将一个Seat对象中的信息拷贝到PlaySeat对象中""" self.sid = seat.sid self.cid = seat.cid self.hid = seat.hid self.x = seat.x self.y = seat.y self.row = seat.row self.column = seat.column self.area = seat.area self.seat_type = seat.seat_type self.love_seats = seat.love_seats self.status = seat.status @classmethod def lock(cls, orderno, pid, sid_list): #创建数据库session session = db.create_scoped_session() # 查询出pid,status,sid符合锁定条件的座位 rows = session.query(PlaySeat).filter( PlaySeat.pid == pid, PlaySeat.status == SeatStatus.ok.value, PlaySeat.sid.in_(sid_list) # 然后更新这些座位的信息 ).update( { 'orderno': orderno, 'status': SeatStatus.locked.value, 'locked_time': datetime.now() }, synchronize_session=False) # 如果更新的行数量与我们传入的座位数量不符,则回滚,并返回0 if rows != len(sid_list): session.rollback() return 0 session.commit() return rows @classmethod def unlock(cls, orderno, pid, sid_list): """解锁play_seat表的锁座信息""" session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.locked.value, ).update({ 'orderno': None, 'status': SeatStatus.ok.value, }, synchronize_session=False) # 如果更新的行数量与我们传入的座位数量不符,则回滚,并返回0 if rows != len(sid_list): session.rollback() return 0 # 如果数量符合,则提交,并返回锁定的座位数量 session.commit() return rows @classmethod def buy(cls, orderno, pid, sid_list): """购买座位""" session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.locked.value, ).update({ 'status': SeatStatus.sold.value, }, synchronize_session=False) if rows != len(sid_list): session.rollback() return 0 session.commit() return rows @classmethod def refund(cls, orderno, pid, sid_list): """退款,修改座位状态""" session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.sold.value, ).update( { # 修改座位状态为正常,并将订单号设为空 'status': SeatStatus.ok.value, 'orderno': None, }, synchronize_session=False) # 如果更新的行数量与我们传入的座位数量不符,则回滚,并返回0 if rows != len(sid_list): session.rollback() return 0 # 如果数量符合,则提交,并返回锁定的座位数量 session.commit() return rows @classmethod def print_tickets(cls, orderno, pid, sid_list): """执行取票操作,修改座位状态""" session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.sold.value, ).update( { 'status': SeatStatus.printed.value, # 'orderno':None, }, synchronize_session=False) if rows != len(sid_list): session.rollback() return 0 session.commit() return rows
class Seat(db.Model, Model): """座位id""" sid = db.Column(db.INTEGER, primary_key=True) """影厅id""" hid = db.Column(db.INTEGER) """影院id""" cid = db.Column(db.INTEGER) x = db.Column(db.INTEGER, default=0, nullable=False) y = db.Column(db.INTEGER, default=0, nullable=False) """显示行名称""" row = db.Column(db.String(8)) """显示列名称""" column = db.Column(db.String(8)) '''区域''' area = db.Column(db.String(16)) '''座位类型''' seat_type = db.Column(db.String(16)) '''是否是情侣座''' love_seats = db.Column(db.String(32)) '''状态''' status = db.Column(db.INTEGER, default=0, nullable=False, index=True)
class Seat(db.Model, Model): sid = db.Column(db.Integer, primary_key=True) cid = db.Column(db.Integer) hid = db.Column(db.Integer) x = db.Column(db.Integer) y = db.Column(db.Integer) row = db.Column(db.String(16)) column = db.Column(db.String(16)) area = db.Column(db.String(16)) seat_type = db.Column(db.String(16)) love_seats = db.Column(db.String(16)) status = db.Column(db.Integer, default=0, nullable=False, index=True)
class Play(db.Model, Model): """排期表,存储排期相关信息""" """排期ID,主键""" pid = db.Column(db.Integer, primary_key=True) """电影院ID""" cid = db.Column(db.Integer, default=0, nullable=False) """影厅ID""" hid = db.Column(db.Integer, default=0, nullable=False) """电影ID""" mid = db.Column(db.Integer, default=0, nullable=False) """放映开始时间""" start_time = db.Column(db.DateTime, nullable=False) """放映时长""" duration = db.Column(db.Integer, default=0, nullable=False) """价格类型""" price_type = db.Column(db.Integer) """价格""" price = db.Column(db.Integer) """销售价格""" market_price = db.Column(db.Integer) """最低价格""" lowest_price = db.Column(db.Integer) """创建时间""" created_time = db.Column(db.DateTime) """最后更新时间""" updated_time = db.Column(db.DateTime) """状态""" status = db.Column(db.Integer, default=0, nullable=False, index=True)
class PlaySeat(db.Model, Model): psid = db.Column(db.Integer, primary_key=True) orderno = db.Column(db.String(32), index=True) pid = db.Column(db.Integer) sid = db.Column(db.Integer) cid = db.Column(db.Integer) hid = db.Column(db.Integer) x = db.Column(db.Integer) y = db.Column(db.Integer) row = db.Column(db.String(16)) column = db.Column(db.String(16)) area = db.Column(db.String(16)) seat_type = db.Column(db.String(16)) love_seats = db.Column(db.String(16)) status = db.Column(db.Integer, default=0, nullable=False, index=True) lock_time = db.Column(db.DateTime) create_time = db.Column(db.DateTime, server_default=text('CURRENT_TIMESTAMP')) def copy(self, seat): self.sid = seat.sid self.cid = seat.cid self.hid = seat.hid self.x = seat.x self.y = seat.y self.row = seat.row self.column = seat.column self.area = seat.area self.seat_type = seat.seat_type self.love_seats = seat.love_seats self.status = seat.status @classmethod def lock(cls, orderno, pid, sid_list): session = db.create_scoped_session() rows = session.query(PlaySeat).filter( PlaySeat.pid == pid, PlaySeat.status == SeatStatus.ok.value, PlaySeat.sid.in_(sid_list)).update( { 'orderno': orderno, 'status': SeatStatus.locked.value, 'lock_time': datetime.now() }, synchronize_session=False) if rows != len(sid_list): session.rollback() return 0 session.commit() return rows @classmethod def unlock(cls, orderno, pid, sid_list): session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.locked.value).update( { 'orderno': None, 'status': SeatStatus.ok.value }, synchronize_session=False) if rows != len(sid_list): session.rollback() return 0 session.commit() return rows @classmethod def buy(cls, orderno, pid, sid_list): session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.locked.value).update( {'status': SeatStatus.sold.value}, synchronize_session=False) if rows != len(sid_list): session.rollback() return 0 session.commit() return rows @classmethod def refund(cls, orderno, pid, sid_list): session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.sold.value).update( { 'status': SeatStatus.ok.value, 'orderno': None }, synchronize_session=False) if rows != len(sid_list): session.rollback() return 0 session.commit() return rows @classmethod def print_tickets(cls, orderno, pid, sid_list): session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.sold.value).update( {'status': SeatStatus.printed.value}, synchronize_session=False) if rows != len(sid_list): session.rollback() return 0 session.commit() return rows @classmethod def getby_orderno(cls, orderno): return cls.query.filter_by(orderno=orderno).all()
class Cinema(db.Model,Model): #cid 影院id,主键 cid = db.Column(db.Integer,primary_key=True) name = db.Column(db.String(64),unique=True,nullable=False) address = db.Column(db.String(128),nullable=False) halls = db.Column(db.Integer,default=0,nullable=False) handle_fee = db.Column(db.INTEGER,default=0,nullable=False) buy_limit = db.Column(db.INTEGER,default=0,nullable=False) status = db.Column(db.INTEGER,default=0,nullable=False,index=True) @classmethod def create_test_data(cls,cinema_num = 3,hall_num = 3,play_num = 10): import time from tigereye.models.hall import Hall from tigereye.models.seat import Seat,PlaySeat,SeatType from tigereye.models.movie import Movie from tigereye.models.cinema import Cinema from tigereye.models.play import Play from faker import Faker import math from datetime import datetime start_time = time.time() HALL_SEATS_NUM = 25 faker = Faker('zh_CN') cinemas = [] for i in range(1,cinema_num+1): cinema = Cinema() cinema.name = '%s影城' % faker.name() cinema.address = faker.address() cinema.status = 1 cinema.put() cinemas.append(cinema) Cinema.commit() halls = [] plays = [] for cinema in cinemas: for n in range(1,hall_num+1): hall = Hall() hall.cid = cinema.cid hall.name = '%s 号厅' % n hall.screen_type = "IMAX" hall.audio_type = '杜比环绕' hall.seats_num = HALL_SEATS_NUM hall.status = 1 hall.put() halls.append(hall) Hall.commit() for hall in halls: hall.seats = [] for x in range(1,HALL_SEATS_NUM+1): seat = Seat() seat.cid = hall.cid seat.hid = hall.hid seat.x = x % 5 or 5 seat.y = math.ceil(x / 5) seat.row = '%s 排' % seat.x seat.column = '%s 列' % seat.y seat.seat_type = SeatType.single.value seat.status = SeatStatus.ok.value seat.put() hall.seats.append(seat) Seat.commit() for p in range(1,play_num+1): play = Play() play.cid = hall.cid play.hid = hall.hid play.mid = p play.start_time = datetime.now() play.duration = 3600 play.price_type = 1 play.price = 70000 play.market_price = 5000 play.lowest_price = 3000 play.status = 1 play.put() play.hall = hall plays.append(play) Play.commit() for play in plays: for seat in play.hall.seats: ps = PlaySeat() ps.pid = play.pid ps.copy(seat) ps.put() PlaySeat.commit() for i in range(10): m = Movie() m.name = '电影名称 %s' % (i +1) m.language = '英文' m.subtitle = '中文' m.mode = '数字' m.vision = '3D' m.screen_size = 'IMAX' m.introduction = '哈哈哈' m.status = 1 m.save() print('create test data done! cost %s seconds' % (time.time() - start_time))
class Cinema(db.Model, Model): __tablename__ = "cinema" cid = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) address = db.Column(db.String(256), nullable=False) halls = db.Column(db.Integer, default=0, nullable=False) # 手续费 handle_fee = db.Column(db.Integer, default=0, nullable=False) buy_limit = db.Column(db.Integer, default=0, nullable=False) status = db.Column(db.Integer, nullable=False, index=True) @classmethod def create_test_data(cls, cinema_num=10, hall_num=10, play_num=10): start_time = time.time() from tigereye.models.seat import Seat, PlaySeat from tigereye.models.play import Play from tigereye.models.hall import Hall f = faker.Faker("zh_CN") screen_types = ["普通", "IMAX"] audio_types = ["普通", "杜比音效"] cinemas = [] for i in range(1, cinema_num + 1): cinema = Cinema() cinema.cid = i cinema.name = "%s影院" % f.name() cinema.address = f.address() cinema.status = 1 cinema.put() cinemas.append(cinema) Cinema.commit() halls = [] for cinema in cinemas: for n in range(1, hall_num + 1): hall = Hall() hall.cid = cinema.cid hall.name = "%s号厅" % n hall.screen_type = random.choice(screen_types) hall.audio_type = random.choice(audio_types) hall.seats_num = 25 hall.status = 1 hall.put() halls.append(hall) Hall.commit() plays = [] for hall in halls: hall.seats = [] for s in range(1, hall.seats_num + 1): seat = Seat() seat.cid = hall.cid seat.hid = hall.hid seat.x = s % 5 or 5 seat.y = ceil(s / 5) seat.row = seat.x seat.column = seat.y seat.seat_type = 1 seat.put() hall.seats.append(seat) Seat.commit() for p in range(1, play_num + 1): play = Play() play.cid = cinema.cid play.hid = hall.hid play.mid = p play.start_time = datetime.now() play.duration = 3600 play.price_type = 1 play.price = 7000 play.market_price = 5000 play.lowest_price = 3000 play.status = 1 play.hall = hall play.put() plays.append(play) Play.commit() for play in plays: for seat in play.hall.seats: ps = PlaySeat() ps.pid = play.pid ps.copy(seat) ps.put() PlaySeat.commit() current_app.logger.info("screate test data done: %f" % (time.time() - start_time))
class Play(db.Model, Model): pid = db.Column(db.Integer, primary_key=True) cid = db.Column(db.Integer) hid = db.Column(db.Integer) mid = db.Column(db.Integer) start_time = db.Column(db.DateTime, nullable=False) duration = db.Column(db.Integer, default=0, nullable=False) price_type = db.Column(db.Integer) price = db.Column(db.Integer) market_price = db.Column(db.Integer) lowest_price = db.Column(db.Integer) created_time = db.Column(db.DateTime, server_default=text('CURRENT_TIMESTAMP')) updated_time = db.Column(db.DateTime, onupdate=func.now()) status = db.Column(db.Integer, default=0, nullable=False, index=True)
class PlaySeat(db.Model, Model): __tablename__ = "playseat" psid = db.Column(db.Integer, primary_key=True) orderno = db.Column(db.String(32), index=True) cid = db.Column(db.Integer) hid = db.Column(db.Integer) pid = db.Column(db.Integer) sid = db.Column(db.Integer) x = db.Column(db.Integer) y = db.Column(db.Integer) row = db.Column(db.String(16)) column = db.Column(db.String(16)) area = db.Column(db.String(16)) seat_type = db.Column(db.String(16)) lova_seat = db.Column(db.String(16)) status = db.Column(db.Integer, nullable=False, default=0, index=True) lock_time = db.Column(db.DATETIME) create_time = db.Column(db.DATETIME, server_default=text("CURRENT_TIMESTAMP")) # 执行复制操作 def copy(self, seat): self.sid = seat.sid self.cid = seat.cid self.hid = seat.hid self.x = seat.x self.y = seat.y self.row = seat.row self.column = seat.column self.area = seat.area self.seat_type = seat.seat_type self.love_seat = seat.lova_seat self.status = seat.status @classmethod # 进行锁定操作 def lock(cls, orderno, pid, sid_list): # 创建session session = db.create_scoped_session() # 直接对PlaySeat进行操作 # 进行锁定操作,修改订单号和状态 rows = session.query(PlaySeat).filter( PlaySeat.pid == pid, PlaySeat.status == SeatStatus.ok.value, PlaySeat.sid.in_(sid_list), # 进行修改 ).update( { "orderno": orderno, "status": SeatStatus.locked.value, "lock_time": datetime.now() # 关闭同步session操作 }, synchronize_session=False) # 如果操作没有成功,执行rollback回滚 if rows != len(sid_list): session.rollback() return 0 session.commit() return rows # 进行解锁操作 @classmethod def unlock(cls, orderno, pid, sid_list): # 创建一个db.session对象 session = db.create_scoped_session() # 完成解锁操作 rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.locked.value).update( { "orderno": None, "status": SeatStatus.ok.value, }, synchronize_session=False) # 判断是否进行了解锁 if rows != len(sid_list): session.rollback() return 0 # 进行提交 session.commit() return rows # 购买操作 @classmethod def buy(cls, orderno, pid, sid_list): session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.locked.value, ).update({ "status": SeatStatus.sold.value, }, synchronize_session=False) if rows != len(sid_list): session.rollback() return 0 session.commit() return rows # 退票 @classmethod def refund(cls, orderno, pid, sid_list): session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.sold.value, ).update({ "status": SeatStatus.ok.value, "orderno": None, }, synchronize_session=False) if rows != len(sid_list): session.rollback() return 0 session.commit() return rows # 出票 @classmethod def print_ticket(cls, orderno, pid, sid_list): session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.sold.value, ).update({ "status": SeatStatus.printed.value, }, synchronize_session=False) if rows != len(sid_list): session.rollback() return 0 session.commit() return rows # 获取数据 @classmethod def getby_orderno(cls, orderno): return cls.query.filter_by(orderno=orderno).all()
class Seat(db.Model, Model): """物理座位表""" """座位ID,主键""" sid = db.Column(db.Integer, primary_key=True) """影厅ID""" hid = db.Column(db.Integer) """影院ID""" cid = db.Column(db.Integer) """x座标""" x = db.Column(db.Integer, default=0, nullable=False) """y座标""" y = db.Column(db.Integer, default=0, nullable=False) """显示的行名称""" row = db.Column(db.String(8)) """显示的列名称""" column = db.Column(db.String(8)) """区域""" area = db.Column(db.String(16)) """座位类型""" seat_type = db.Column(db.String(16)) """是否是情侣座""" love_seats = db.Column(db.String(32)) """状态""" status = db.Column(db.Integer, default=0, nullable=False, index=True)