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
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