def kill_order(self, order_no): time.sleep(ORDER_TIMEOUT * 60) try: order = Order().order.get(order_no=order_no) if not order: print('order is not exist') if order.trade_status in (0, 2, 3): # 交易状态为待支付/交易成功/交易完成则 logger.info(order.trade_status) print('execute celery Failure:order {} status is {}'.format( order_no, order.trade_status)) # 过期订单标记删除 Order().order.delete(order_no=order_no) logger.info('kill order {} successfully'.format(order_no)) # 修改账号状态为未出售 goods = Goods().account.gets(order__order_no=order_no) for good in goods: good.isSale = 0 good.save() print('kill order {} successful'.format(order_no)) except Exception: logger.error(traceback.format_exc()) print(traceback.format_exc())
def get(self, request): try: name = get_name(request) page_id = request.GET.get('page_id', '1') # 当前页 limit = request.GET.get('limit', '4') # 每页显示条数 has_previous = False # 是否有前一页 has_next = False # 是否有后一页 types = Goods().type.gets() if not (page_id.isdigit() and limit.isdigit()): return render(request, 'ac_goods/index.html') page_id = int(page_id) limit = int(limit) data = {} data['name'] = name data['types'] = types type_list = [] for type in types: data_dic = {} # 存放每个类型下的所有信息 sum = 0 # 每个类型下的账号总数 for i in type.price.filter(): # count = i.account.filter(isSale=0, sale_time__lt=current_time).count() count = i.account.filter(isSale=0).count() sum += count data_dic.setdefault('title', type.title) data_dic.setdefault('description', type.description) data_dic.setdefault('sum', sum) data_dic.setdefault('avatar', type.avatar) data_dic.setdefault('type_id', type.pk) type_list.append(data_dic) paginator = Paginator(type_list, limit) # 分页 goods_list = paginator.page(page_id) page_list = paginator.page_range if not (goods_list and page_list): return render(request, 'ac_goods/index.html', data) if page_id > 1: has_previous = True if page_id < page_list[-1]: has_next = True data['goods_list'] = goods_list data['page_list'] = page_list data['has_previous'] = has_previous data['has_next'] = has_next data['page_curr'] = page_id return render(request, 'ac_goods/index.html', data) except Exception as e: logger.error(traceback.format_exc()) return render(request, 'error.html', {'error': 500})
def get(self, request): try: name = get_name(request) types = Goods().type.gets() data = {} data['types'] = types data['name'] = name return render(request, 'ac_order/ordered.html', data) except Exception as e: logger.error(traceback.format_exc()) return render(request, 'error.html', {'error': '500'})
def modify_account_status(self, order_no): '''修改账号状态''' try: order = Order().order.get(order_no=order_no) account_list = Goods().account.gets(order=order, isSale=2) if account_list: for account in account_list: account.isSale = 1 account.save() return True except Exception as e: return False
def post(self, request): try: # 获取数据 user = request.user info = {'status': 100, 'msg': None} type_id = request.GET.get('type_id', None) order_data = {} # 校验数据 forms = OrderForms(request.POST) if not forms.is_valid(): info['status'] = 101 error_all = forms.errors.get('__all__') error_price_id = forms.errors.get('price_id') info['msg'] = error_price_id if error_price_id else error_all return self.get(request, type_id, info) if type_id is None: return self.get(request, type_id, info) # 生成订单 tran_id = transaction.savepoint() # 建立事物点 try: dic = forms.cleaned_data price_id, price = dic['price_id'] price_obj = Goods().price.get(pk=price_id) count = dic['count'] total_price = float(price) * int(count) # 计算出总价格 order_no = get_new_no() # 生成一个唯一随机订单号 order_data.setdefault('order_no', order_no) # 订单号 order_data.setdefault('user', user) # 用户 order_data.setdefault('price', price_obj) # 单价 order_data.setdefault('total_price', total_price) # 总价格 order_data.setdefault('count', count) # 数量 create_res = self.create_order(order_data) # 创建订单 dispatch_res = self.dispatch_account(order_no) if create_res and dispatch_res: return redirect( '/order/order_pay/?order_no={}'.format(order_no)) except Exception as e: logger.error(traceback.format_exc()) transaction.savepoint_rollback(tran_id) # 期间出错,全部回滚 info['status'] = 101 info['msg'] = '订单生成失败' return self.get(request, type_id, info) except Exception as e: logger.error(traceback.format_exc()) return render(request, 'error.html', {'error': 500})
def dispatch_account(self, order_no): '''分配账号信息''' order = Order().order.get(order_no=order_no) count = int(order.count) try: # account_list = Goods().account.gets(price=order.price, isSale=0, allow_sale_time__lt=current_time).order_by( account_list = Goods().account.gets( price=order.price, isSale=0).order_by('add_time')[:count] for i in account_list: i.order = order i.isSale = 2 i.sale_time = current_time i.save() return True except Exception as e: logger.error(traceback.format_exc()) return False
def get(self, request, type_id=None, *args): try: # 获取数据 name = get_name(request) types = Goods().type.gets() if not type_id: type_id = request.GET.get('type_id', None) error = {} if args: error['status'] = args[0]['status'] error['msg'] = args[0]['msg'] type = Goods().type.get(pk=type_id) data = {} data['name'] = name if not type or not types: return render(request, 'ac_goods/detail.html', data) title = type.title avatar = type.avatar levels = Goods().level.gets() level_list = [] for level in levels: price = Goods().price.get(type__pk=type_id, level__name=level.name) if price: level_dic = {} level_dic.setdefault('level', level.name) unit = price.unit units = price.get_currency_display( ) + '/' + unit # 构造单位:人民币/个 level_dic.setdefault('price', price.price) # level_dic.setdefault('count', price.account.filter(isSale=0, sale_time__lt=current_time).count()) level_dic.setdefault( 'count', price.account.filter(isSale=0).count()) level_dic.setdefault('units', units) level_dic.setdefault('price_id', price.pk) level_list.append(level_dic) data['types'] = types data['level_list'] = level_list data['title'] = title data['avatar'] = avatar data['type_id'] = type_id data['error'] = error return render(request, 'ac_goods/detail.html', data) except Exception as e: logger.error(traceback.format_exc()) return render(request, 'error.html', {'error': 500})
def get(self, request): try: # 获取参数 page_id = request.GET.get('page', 1) order_no = request.GET.get('order_no', None) limit = request.GET.get('limit', 5) # 条件:用户、订单、交易状态 accounts = Goods().account.gets(Q(order__trade_status=2) | Q(order__trade_status=3), order__order_no=order_no) if not accounts: return response_utils.wrapper_400('无商品信息') goods_list = [] for index, account in enumerate(accounts): account_dic = {} info = str(account.price).split(':') account_dic.setdefault('id', index + 1) account_dic.setdefault('order_no', order_no) account_dic.setdefault('type', info[0]) account_dic.setdefault('account_str', account.account_str) account_dic.setdefault('price', info[1]) account_dic.setdefault( 'sale_time', account.sale_time.strftime('%Y-%m-%d %H:%M:%S')) goods_list.append(account_dic) try: paginator = Paginator(goods_list, limit) # 分页,每页显示limit个 good_list = paginator.page(int(page_id)) good_list = [i for i in good_list] # 将数据从Page对象中遍历出来 page_count = paginator.count # 页码总数 except Exception as e: logger.error(traceback.format_exc()) return response_utils.wrapper_400('分页失败') return response_utils.wrapper_200(data=good_list, args=('count', page_count)) except Exception as e: logger.error(traceback.format_exc()) return response_utils.wrapper_500('获取订单详情信息失败,系统内部错误')
def kill_order(order_no): try: order = Order().order.get(order_no=order_no) if not order: return 'order is not exist' if order.trade_status in (2, 3): logger.info(order.trade_status) return 'order:{} status is {}'.format(order_no, order.trade_status) # 过期订单标记删除 Order().order.delete(order_no=order_no) logger.info('kill order {} successfully'.format(order_no)) # 修改账号状态为未出售 goods = Goods().account.gets(order__order_no=order_no) for good in goods: good.isSale = 0 good.save() return 'kill order {} successful'.format(order_no) except Exception: logger.error(traceback.format_exc()) return traceback.format_exc()
def get(self, request): try: user = request.user types = Goods().type.gets() order_no = request.GET.get('order_no') if not user: return render(request, 'ac_order/order_detail.html', {'msg': '获取用户对象失败'}) order = Order().order.get(user=user, order_no=order_no) # 条件:用户,订单号 if not order: return render(request, 'ac_order/order_detail.html', {'msg': '获取订单信息失败'}) order_dic = {} order_dic.setdefault('order_no', order.order_no) order_dic.setdefault('price', str(order.price)) order_dic.setdefault('total_price', order.total_price) order_dic.setdefault('count', order.count) order_dic.setdefault('add_time', order.add_time.strftime('%Y-%m-%d %H:%M:%S')) order_dic.setdefault('trade_status', order.get_trade_status_display()) order_dic.setdefault('trade_no', order.trade_no) order_dic.setdefault('trade_type', order.get_pay_mode_display()) data = {} data['types'] = types data['name'] = user.name data['order_dic'] = order_dic return render(request, 'ac_order/order_detail.html', data) except Exception as e: logger.error(traceback.format_exc()) return render(request, 'error.html', {'error': '500'})
def get(self, request, order_no=None): try: name = get_name(request) types = Goods().type.gets() if not order_no: order_no = request.GET.get('order_no') data = {} order = Order().order.get(order_no=order_no) if not order: data['msg'] = '获取订单信息失败' return render(request, 'ac_order/order.html', data) order_data = {} order_data.setdefault('order_no', order_no) order_data.setdefault('user', order.user) order_data.setdefault('price', order.price.price) order_data.setdefault('total_price', order.total_price) order_data.setdefault('count', order.count) delta = datetime.timedelta(minutes=ORDER_TIMEOUT) # 设置延时时间 end_time = (order.add_time + delta).strftime('%Y/%m/%d,%H:%M:%S') order_data.setdefault('end_time', str(end_time)) type = order.price.type.title level = order.price.level.name order_data.setdefault('type', type + ':' + level) data['types'] = types data['name'] = name data['order_data'] = order_data return render(request, 'ac_order/order.html', data) except Exception as e: logger.error(traceback.format_exc()) return render(request, 'error.html', {'error': 500})
# models.OrderInfo.objects(pk=1) from ac_goods.models import Account from ac_order.models import OrderInfo # accounts = Account.objects.filter(order__order_no='c68b9751866b4b00aaed3e9f1b7cad19') # for account in accounts: # print(account) # order = OrderInfo.objects.filter(order_no='23132').first() # print(order) # if hasattr(locals(),'Account'): # a = getattr(locals(),'Account') # import datetime # time_now = datetime.datetime.now() # # order = Order().order.get(order_no='27c5339c64c248928674e4699aff3b34') # goods = Goods().account.gets(price=order.price, allow_sale_time__lt=time_now).order_by( # 'add_time')[:order.count] # print(goods) from django.db.models import Q order_no = '27df9c84fe7f4453925177298525b0d0' accounts = Goods().account.gets(Q(order__trade_status=2 or 3), order__order_no=order_no) print(accounts) orders = Order().order.gets(Q(trade_status=3) | Q(trade_status=2), order_no=order_no) print(orders)