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, server_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) sid = db.Column(db.Integer, nullable=False) pid = db.Column(db.Integer, nullable=False) cid = db.Column(db.Integer, nullable=False) hid = db.Column(db.Integer, nullable=False) x = db.Column(db.Integer) y = db.Column(db.Integer) row = db.Column(db.String(8)) column = db.Column(db.String(8)) area = db.Column(db.String(8)) love_seats = db.Column(db.String(32)) seat_type = db.Column(db.String(16)) status = db.Column(db.Integer, nullable=False, server_default='0', index=True) locked_time = db.Column(db.DateTime) created_time = db.Column(db.DateTime, server_default=text('CURRENT_TIMESTAMP')) __table_args__ = (Index('ps_index', "pid", "sid"), ) @classmethod def getby(cls, pid, sid): return cls.get('%s-%s' % (pid, sid)) def copy(self, seat): """ 将一个Seat对象中的信息拷贝到PlaySeat对象中 @params seat: 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.love_seats = seat.love_seats self.seat_type = seat.seat_type self.status = seat.status @classmethod def getby_orderno(cls, orderno): return cls.query.filter_by(orderno=orderno).all() @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, 'locked_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 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 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
class Seat(db.Model, Model): """影厅座位信息 每一条记录对应一个座位 """ sid = db.Column(db.Integer, primary_key=True) cid = db.Column(db.Integer, nullable=False) hid = db.Column(db.Integer, nullable=False) x = db.Column(db.Integer) y = db.Column(db.Integer) row = db.Column(db.String(8)) column = db.Column(db.String(8)) area = db.Column(db.String(16)) love_seats = db.Column(db.String(32)) seat_type = db.Column(db.String(16)) status = db.Column(db.Integer, nullable=False, server_default='0') @classmethod def getby_hid(cls, hid): return cls.query.filter_by(hid=hid).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(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, server_default='0', 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('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 = cinema.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 Order(db.Model, Model): __tablename__ = 'orders' oid = db.Column(db.String(32), primary_key=True) cid = db.Column(db.Integer, nullable=False) pid = db.Column(db.Integer, nullable=False) sid = db.Column(db.Integer, nullable=False) """取票码""" ticket_flag = db.Column(db.String(64)) """订单总金额""" amount = db.Column(db.Integer, default=0, nullable=False) """此订单的票数""" tickets_num = 0 """销售方订单号""" seller_order_no = db.Column(db.String(32), unique=True) """支付时间""" 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, server_default='0', nullable=False) @classmethod def create(cls, cid, pid, sid): order = cls() order.oid = '%s%s%s' % (wetime.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 def gen_ticket_flag(self): s = [] for i in range(8): s.append(str(randint(1000, 9999))) self.ticket_flag = ''.join(s) def validate(self, ticket_flag): return self.ticket_flag == ticket_flag @classmethod def getby_orderno(cls, orderno): return Order.query.filter_by(seller_order_no=orderno).first() @classmethod def getby_ticket_flag(cls, ticket_flag): return cls.query.filter_by(ticket_flag=ticket_flag).first()
class Play(db.Model, Model): pid = db.Column(db.Integer, primary_key=True) cid = db.Column(db.Integer, nullable=False) hid = db.Column(db.Integer, nullable=False) mid = db.Column(db.Integer, nullable=False) start_time = db.Column(db.DateTime, nullable=False) duration = db.Column(db.Integer, default=0, nullable=False) # 影片时长 # 价格类型(1-正价 2-优惠场次)price_type=2说明marketPrice是优惠后的价格 price_type = db.Column(db.Integer) price = db.Column(db.Integer) # 原价(名义价格,主要用于显示,可不用) market_price = db.Column(db.Integer) # 影院柜台售卖价 lowest_price = db.Column(db.Integer, default=0) # 限制能卖的最低价格 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, server_default='0', nullable=False, index=True)
class Movie(db.Model, Model): mid = db.Column(db.Integer, primary_key=True) sn = db.Column(db.String(32), unique=True, nullable=False) # 广电总局规定的影片全国唯一编码 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)) # 电影格式,如:胶片,数字 vision = db.Column(db.String(16)) # 放映类型:3D 2D screen_size = db.Column(db.String(16)) # 屏幕尺寸 introduction = db.Column(db.Text) status = db.Column(db.Integer, server_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() current_app.logger.info('movie test data done!')