def make_order(request): if request.method == 'POST': user = request.user data = { 'code': 200, 'msg': '请求成功', } if user.id: o_num = get_order_num() order = OrderModel.objects.create(user=user, o_num=o_num, o_status=0) # cart 表示的就是购物车里的商品 carts = CartModel.objects.filter(user=user, is_select=True) # 遍历购物车 让所有商品和订单建立关系 for cart in carts: OrderGoodsModel.objects.create(goods_num=cart.c_num, goods=cart.goods, order=order) carts.delete() data['order_id'] = order.id return JsonResponse(data) data['code'] = 1001 data['msg'] = '用户未登录' return JsonResponse(data)
def submit_order(reuqest): if reuqest.method == 'POST': user = reuqest.user carts = Cart.objects.filter(user=user, is_select=True) o_num = get_order_num() order = Order.objects.create(user=user, o_num=o_num) for cart in carts: OrderGoods.objects.create(order=order, goods=cart.goods, goods_num=cart.c_num) carts.delete() return JsonResponse({'code': 200})
def order(request): if request.method == 'POST': user = request.user # 那些商品需要下单 carts = CartModel.objects.filter(user=user, is_select=True) # 创建订单 o_num = get_order_num() order = OrderModel.objects.create(user=user, o_num=o_num) # 创建订单详情信息 for cart in carts: OrderGoodsModel.objects.create(order=order, goods=cart.goods, goods_num=cart.c_num) # 删除购物车中已经下单的商品信息 carts.delete() return JsonResponse({'code': 200, 'order_id': order.id})
def commit(request): # 提交订单 # 判断是否登录 user = request.user if not user.is_authenticated(): return JsonResponse({'res': 0, 'errmsg': '请登录'}) # 获取数据 # sku_ids: '1,2,3' sku_ids = request.POST.get('sku_ids') addr_id = request.POST.get('addr_id') pay_method = request.POST.get('pay_method') # 检验数据 if not all([sku_ids, addr_id, pay_method]): return JsonResponse({'res': 1, 'errmsg': '数据不完整'}) if pay_method not in OrderInfo.PAY_METHODS.keys(): return JsonResponse({'res': 2, 'errmsg': '选择的支付方式错误'}) # 检查地址 try: addr = Address.objects.get(id=addr_id) except Exception: return JsonResponse({'res': 3, 'errmsg': '收货地址不正确'}) # 创建节点 save_id = transaction.savepoint() # 创建订单 try: # 订单id:时间+用户id:20180620182030+id order_id = get_order_num() # 运费 transit_price = 0 # 总数和总金额 total_count = 0 total_price = 0 # 创建一条订单记录 order = OrderInfo.objects.create(order_id=order_id, user=user, addr=addr, pay_method=pay_method, total_count=total_count, total_price=total_price, transit_price=transit_price) sku_ids = sku_ids.split(',') for sku_id in sku_ids: for i in range(3): # 乐观锁 # 当数据更新的的时候,采取判断此数据是否更改 try: sku = GoodsSKU.objects.get(id=sku_id) except GoodsSKU.DoesNotExist: # 回滚到节点 transaction.savepoint_rollback(save_id) return JsonResponse({'res': 4, 'errmsg': '商品不存在'}) # 从redis中获取用户所要购买的商品数量 count = CartModel.objects.filter(user=user, is_select=True) # 想order_goods表中添加一条记录 OrderGoods.objects.create(order=order, sku=sku, count=count, price=sku.price) # 更新商品库存和销量 orgin_stock = sku.stock new_stock = orgin_stock - int(count) new_sales = sku.sales + int(count) # 返回受影响的行数 res = GoodsSKU.objects.filter(id=sku_id, stock=orgin_stock).update(stock=new_stock, sales=new_sales) if res == 0: # 如果受影响的行数为0,则说明此数据已经被修改,重新进行库存更新 # 防止并发 if i == 2: # 尝试三次 transaction.savepoint_rollback(save_id) return JsonResponse({'res': 4, 'errmsg': '商品库存不足'}) continue # 累加计算订单商品的总数量和总价格 amount = sku.price * int(count) total_count += int(count) total_price += amount # 跳出循环 break # 更新订单信息表中的商品的总数量和总价格 order.total_price = total_price order.total_count = total_count order.save() except Exception: transaction.savepoint_rollback(save_id) return JsonResponse({'res': 7, 'errmsg': '下单失败'}) # 提交到数据库 transaction.savepoint_commit(save_id) # 删除购物车中已经下单的商品信息 order.delete() return JsonResponse({'res': 5, 'errmsg': '创建成功'})