Exemplo n.º 1
0
class TbdfBase(object) :

    def __init__(self,amount):
        self.ut = UtilTime()

        self.amount = amount

        #当前时间
        self.today = self.ut.today

        #有效时间 300秒
        self.order_failure_time = 300

        #订单失效时间 4填
        self.order_max_failure_time = 3 * 24 * 60 * 60

    # def get_qrcode_obj(self,id):
    #     try:
    #         qrcode_obj = Qrcode.objects.get(id=id,status='0')
    #     except Qrcode.DoesNotExist:
    #         raise PubErrorCustom("无此二维码!")
    #     return qrcode_obj


    def get_expire_time(self,updtime=None,timetype=None):
        """
        获取过期时间(时间戳)
        :param timetype: 为None时默认为时间戳,为True代表时间
        :return:
        """

        return  self.ut.timestamp_to_arrow(updtime).replace(seconds=self.order_failure_time ).timestamp if not timetype else \
                     self.ut.timestamp_to_arrow(updtime).replace(seconds=self.order_failure_time )

    def get_valid_max_time(self,timetype=None):
        """
        获取对应码的有效时间(时间戳)
        :param timetype: 为None时默认为时间戳,为True代表时间
        :return:
        """

        return self.today.replace(seconds=self.order_max_failure_time * -1).timestamp if not timetype else \
                     self.today.replace(seconds=self.order_max_failure_time * -1)

    def get_valid_time(self,timetype=None):
        """
        获取对应码的有效时间(时间戳)
        :param timetype: 为None时默认为时间戳,为True代表时间
        :return:
        """

        return self.today.replace(seconds=self.order_failure_time * -1).timestamp if not timetype else \
                     self.today.replace(seconds=self.order_failure_time * -1)

    def qrcode_valid(self,updtime=None):
        """
        判断二维码是否有效
        :param updtime:  创建时间时间戳
        :return:  True : 有效 , False : 失效
        """

        return True if self.get_valid_time() < updtime else False

    def get_qrcode(self):
        """
        #获取有效二维码
        :param
        :return:
        """
        print(self.get_valid_max_time())
        qrcodes = TbDFPool.objects.filter(status='0',amount=self.amount,createtime__gte=self.get_valid_max_time()).order_by('id')

        if not qrcodes.exists():
            raise InnerErrorCustom("10010", "码池正在加紧上码,请稍等刷新!")
        qrids = [ item.id for item in qrcodes ]

        print(self.get_valid_time())
        qrids_exists = [ item.qr_id for item in Order.objects.select_for_update().filter(Q(qr_id__in=qrids,status=0) | Q(qr_id__in=qrids,status=1 ,createtime__gte=self.get_valid_time())) ]

        logger.info("\n 二维码列表:{} \n 已在订单表里存在的二维码列表:{}".format(qrids,qrids_exists))

        valid_ids = [ item for item in qrids if item not in qrids_exists ]

        if not valid_ids:
            raise InnerErrorCustom("10010", "码池正在加紧上码,请稍等刷新!")

        #筛选出有效二维码
        valid_id = random.sample(valid_ids,1)[0]

        valid_obj = None

        for item in qrcodes:
            print(item.id,valid_id)
            if item.id == valid_id:
                valid_obj = item

        if not valid_obj:
            raise InnerErrorCustom("10010", "码池正在加紧上码,请稍等刷新!")

        valid_obj.updtime = self.ut.timestamp
        print(valid_obj.updtime)
        valid_obj.save()

        return valid_obj
Exemplo n.º 2
0
class QrcodeBase(object):
    def __init__(self, type=None):
        self.ut = UtilTime()

        #当前时间
        self.today = self.ut.today

        #有效时间
        self.order_failure_time = int(get_sysparam().order_failure_time)

        #二维码类型
        self.type = type

    def get_qrcode_obj(self, id):
        try:
            qrcode_obj = Qrcode.objects.get(id=id, status='0')
        except Qrcode.DoesNotExist:
            raise PubErrorCustom("无此二维码!")
        return qrcode_obj

    def get_expire_time(self, updtime=None, timetype=None):
        """
        获取过期时间(时间戳)
        :param timetype: 为None时默认为时间戳,为True代表时间
        :return:
        """

        return  self.ut.timestamp_to_arrow(updtime).replace(seconds=self.order_failure_time ).timestamp if not timetype else \
                     self.ut.timestamp_to_arrow(updtime).replace(seconds=self.order_failure_time )

    def get_valid_time(self, timetype=None):
        """
        获取对应码的有效时间(时间戳)
        :param timetype: 为None时默认为时间戳,为True代表时间
        :return:
        """

        return self.today.replace(seconds=self.order_failure_time * -1).timestamp if not timetype else \
                     self.today.replace(seconds=self.order_failure_time * -1)

    def qrcode_valid(self, updtime=None):
        """
        判断二维码是否有效
        :param updtime:  创建时间时间戳
        :return:  True : 有效 , False : 失效
        """

        return True if self.get_valid_time() < updtime else False

    def get_qrcode(self, order=None):
        """
        #获取有效二维码
        :param
        :return:
        """
        #二维码轮询
        self.last_qr = get_sysnumber(self.type)
        qrcodes = Qrcode.objects.filter(status='0',
                                        type=self.type).order_by('id')
        if not qrcodes.exists():
            raise InnerErrorCustom("10010", "码池正在加紧制作二维码,请稍等刷新!")
        qrids = [item.id for item in qrcodes]
        qrids.sort()

        qrids_exists = [ item.qr_id for item in Order.objects.select_for_update().filter(qr_id__in=qrids,status=1,createtime__gte=self.get_valid_time()) \
                                if item.amount == order.amount ]

        logger.info("\n 二维码列表:{} \n 已存在相同金额的二维码列表:{}".format(
            qrids, qrids_exists))

        def check_valid_index_qrcode(index):
            max_qrids = len(qrids) - 1
            index += 1
            index = 0 if index > max_qrids else index

            while index <= max_qrids:
                if qrids[index] not in qrids_exists:
                    return qrids[index]
                else:
                    index += 1

            return False

        #开始轮询检查
        res = check_valid_index_qrcode(
            qrids.index(int(self.last_qr.last_qrcode)
                        ) if int(self.last_qr.last_qrcode) in qrids else -1)
        if not res:
            res = check_valid_index_qrcode(-1)
        if not res:
            raise InnerErrorCustom("10010", "码池正在加紧制作二维码,请稍等刷新!")
        else:
            self.last_qr.last_qrcode = res

        useing_qrcode_obj = [
            item for item in qrcodes if item.id == self.last_qr.last_qrcode
        ][0]

        useing_qrcode_obj.updtime = self.ut.timestamp
        useing_qrcode_obj.save()
        self.last_qr.save()

        return useing_qrcode_obj