Пример #1
0
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)
Пример #2
0
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
Пример #3
0
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()
Пример #4
0
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))
Пример #5
0
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()
Пример #6
0
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)
Пример #7
0
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!')