Ejemplo n.º 1
0
 def handle_seats(self, allow_seats, ticket_info):
     for seat in allow_seats:  # 检查座位是否有票
         self.set_seat(seat)
         ticket_of_seat = ticket_info[self.current_seat]
         if not self.is_has_ticket_by_seat(ticket_of_seat):  # 座位是否有效
             continue
         QueryLog.print_ticket_seat_available(
             left_date=self.get_info_of_left_date(),
             train_number=self.get_info_of_train_number(),
             seat_type=seat,
             rest_num=ticket_of_seat)
         if not self.is_member_number_valid(ticket_of_seat):  # 乘车人数是否有效
             if self.allow_less_member:
                 self.member_num_take = int(ticket_of_seat)
                 QueryLog.print_ticket_num_less_than_specified(
                     ticket_of_seat, self)
             else:
                 QueryLog.add_quick_log(
                     QueryLog.
                     MESSAGE_GIVE_UP_CHANCE_CAUSE_TICKET_NUM_LESS_THAN_SPECIFIED
                 ).flush()
                 continue
         if Const.IS_TEST: return
         # 检查完成 开始提交订单
         QueryLog.print_ticket_available(
             left_date=self.get_info_of_left_date(),
             train_number=self.get_info_of_train_number(),
             rest_num=ticket_of_seat)
         self.check_passengers()
         order = Order(user=self.get_user(), query=self)
         order.order()
Ejemplo n.º 2
0
    def handle_seats(self, allow_seats, ticket_info):
        for seat in allow_seats:  # 检查座位是否有票
            self.set_seat(seat)
            ticket_of_seat = ticket_info[self.current_seat]
            if not self.is_has_ticket_by_seat(ticket_of_seat):  # 座位是否有效
                continue
            QueryLog.print_ticket_seat_available(left_date=self.get_info_of_left_date(),
                                                 train_number=self.get_info_of_train_number(), seat_type=seat,
                                                 rest_num=ticket_of_seat)
            if not self.is_member_number_valid(ticket_of_seat):  # 乘车人数是否有效
                if self.allow_less_member:
                    self.member_num_take = int(ticket_of_seat)
                    QueryLog.print_ticket_num_less_than_specified(ticket_of_seat, self)
                else:
                    QueryLog.add_quick_log(
                        QueryLog.MESSAGE_GIVE_UP_CHANCE_CAUSE_TICKET_NUM_LESS_THAN_SPECIFIED).flush()
                    continue
            if Const.IS_TEST: return
            # 检查完成 开始提交订单
            QueryLog.print_ticket_available(left_date=self.get_info_of_left_date(),
                                            train_number=self.get_info_of_train_number(),
                                            rest_num=ticket_of_seat)
            if User.is_empty():
                QueryLog.add_quick_log(QueryLog.MESSAGE_USER_IS_EMPTY_WHEN_DO_ORDER.format(self.retry_time))
                return stay_second(self.retry_time)

            order_result = False
            user = self.get_user()
            if not user:
                QueryLog.add_quick_log(QueryLog.MESSAGE_ORDER_USER_IS_EMPTY.format(self.retry_time))
                return stay_second(self.retry_time)

            lock_id = Cluster.KEY_LOCK_DO_ORDER + '_' + user.key
            if Config().is_cluster_enabled():
                if self.cluster.get_lock(lock_id, Cluster.lock_do_order_time,
                                         {'node': self.cluster.node_name}):  # 获得下单锁
                    order_result = self.do_order(user)
                    if not order_result:  # 下单失败,解锁
                        self.cluster.release_lock(lock_id)
                else:
                    QueryLog.add_quick_log(
                        QueryLog.MESSAGE_SKIP_ORDER.format(self.cluster.get_lock_info(lock_id).get('node'),
                                                           user.user_name))
                    stay_second(self.retry_time)  # 防止过多重复
            else:
                order_result = self.do_order(user)

            # 任务已成功 通知集群停止任务
            if order_result:
                Event().job_destroy({'name': self.job_name})