def get_address(self, request): """ :param request: :return: address_list(地址列表) """ user = get_user_by_request(request) addresses = Address.objects.filter(is_alive=True, uid=user) addresses_list = [] for address in addresses: if address.default_address == False: addresses_list.append({ "id": address.id, "name": address.receiver, "mobile": address.receiver_mobile, "title": address.tag, "address": address.address }) else: addresses_list.insert( 0, { "id": address.id, "name": address.receiver, "mobile": address.receiver_mobile, "title": address.tag, "address": address.address }) return addresses_list
def get_cart_dict(self, request): """ :param request: :return: cart_list(购物车中的商品) """ user = get_user_by_request(request) redis_conn = get_redis_connection('cart') redis_cart = redis_conn.hgetall('cart_%d' % user.id) cart_dict = {} for sku_id, status in redis_cart.items(): cart_dict[int(sku_id.decode())] = { 'state': json.loads(status.decode()), } return cart_dict
def post(self, request): """ 处理业务生成订单,跳转订单支付,响应支付成功 状态码0 -- 生成订单 状态码1 -- 跳转订单支付 状态码2 -- 跳转立即购买 :param request: :return: """ status = json.loads(request.body).get("status") user = get_user_by_request(request) # 处理生成订单业务 if status == 0: address_id = json.loads(request.body).get("address_id") settlement_type = json.loads(request.body).get("settlement_type") try: address = Address.objects.get(id=address_id, is_alive=True) except: return http.JsonResponse({'code': 50102, 'errmsg': '收货地址无效'}) now = datetime.datetime.now() with transaction.atomic(): # 禁止自动提交 # 开启事务 sid = transaction.savepoint() # 1.创建订单基本对象 order_id = '%s%02d' % (now.strftime('%Y%m%d%H%M%S'), user.id) total_count = 0 total_amount = 0 order = OrderInfo.objects.create(order_id=order_id, user_id=user.id, address_id=address_id, total_count=0, total_amount=0, freight=1, pay_method=1, status=1) # 2.数据库中修改商品的数量 cart_dict = self.get_cart_dict(request) # 从redis中获取订单商品的信息. skus = SKU.objects.filter(id__in=cart_dict.keys()) # 用以存储购物车中选中的商品,用作订单生成后删除redis中的商品. sku_ids = [] for sku in skus: selected = int(cart_dict[sku.id]['state']['selected']) if selected == 0: continue cart_count = int(cart_dict[sku.id]['state']['count']) sku_ids.append(sku.id) # 判断库存,不足则提示,如果足够则继续执行 if sku.stock < cart_count: # 回滚事务 transaction.savepoint_rollback(sid) sku_ids.remove(sku.id) # 给出提示 return http.JsonResponse({ 'code': 50103, 'errmsg': '商品[%d]库存不足' % sku.id }) # 使用乐观锁进行修改 # 使用乐观锁修改商品数量 version_old = sku.version result = SKU.objects.filter( pk=sku.id, version=version_old).update( stock=sku.stock - cart_count, sales=sku.sales + cart_count, version=version_old + 1) # result表示sql语句修改数据的个数 if result == 0: # 库存发生变化,未成功购买 transaction.savepoint_rollback(sid) sku_ids.remove(sku.id) return http.JsonResponse({ 'code': 50104, 'errmsg': '操作太快了,请稍后重试' }) # 创建订单商品对象 order_sku = OrderGoods.objects.create(order_id=order_id, sku_id=sku.id, count=cart_count, price=sku.price) # 计算总金额、总数量 total_count += cart_count total_amount += sku.price * cart_count # 5.修改订单对象的总金额、总数量 order.total_count = total_count order.total_amount = total_amount order.freight = 10 order.save() # 提交 transaction.savepoint_commit(sid) # 3.从redis中删除所有已经加入了订单的商品 redis_cli = get_redis_connection('cart') for sku_id in sku_ids: redis_cli.hdel('cart_%d' % user.id, sku_id) # 4.生成支付宝支付链接 sku_goods = OrderGoods.objects.filter(order=order_id) order_string = self.get_order_string(order.order_id, order.total_amount + 10, sku_goods) # 构建让用户跳转的支付链接 pay_url = "https://openapi.alipaydev.com/gateway.do?" + order_string # 5.组织数据 data = { 'saller': '达达商城', 'total_amount': order.total_amount + order.freight, 'order_id': order_id, 'pay_url': pay_url } # 响应 return http.JsonResponse({'code': 200, 'data': data}) # 跳转订单支付 elif status == 1: order_id = json.loads(request.body).get("order_id") order = OrderInfo.objects.filter(order_id=order_id)[0] # 1.生成支付链接 sku_goods = OrderGoods.objects.filter(order=order_id) order_string = self.get_order_string(order.order_id, order.total_amount, sku_goods) # 构建让用户跳转的支付链接 pay_url = "https://openapi.alipaydev.com/gateway.do?" + order_string # 2.组织数据 data = { 'saller': '达达商城', 'total_amount': order.total_amount + 10, 'order_id': order_id, 'pay_url': pay_url } # 响应 return http.JsonResponse({'code': 200, 'data': data})
def get(self, request): """ 处理业务确认订单和展示订单 状态码0 -- 处理确认订单业务 状态码1 -- 处理展示订单业务 状态码2 -- 处理确认收货业务 :param request: :return: """ status = int(request.GET.get("status")) user = get_user_by_request(request) # 确认订单业务 if status == 0: # 1.获取收货地址列表 addresses_list = self.get_address(request) # 2.组织商品数据 settlement = int(request.GET.get('settlement_type')) # 购物车结算 if settlement == 0: # 获取购买购物车商品列表 cart_dict = self.get_cart_dict(request) #从redis中获取购物车中的商品id skus = SKU.objects.filter(id__in=cart_dict.keys()) # 3.获取商品列表,总数量,总价格,运费,实付款(总价格+运费) sku_list, total_count, total_amount, transit, payment_amount = self.get_order_list( skus, cart_dict) # 直接购买结算 elif settlement == 1: sku_id = request.GET.get('sku_id') count = request.GET.get('buy_num') skus = SKU.objects.filter(id=sku_id) cart_dict = None # 获取商品列表,总数量,总价格,运费,实付款(总价格+运费) sku_list, total_count, total_amount, transit, payment_amount = self.get_order_list( skus, cart_dict, count) # 3.组织数据 data = { 'addresses': addresses_list, 'sku_list': sku_list, 'total_count': total_count, 'total_amount': total_amount, 'transit': transit, 'payment_amount': payment_amount } return http.JsonResponse({ 'code': 200, 'data': data, 'base_url': PIC_URL }) # 查询用户订单数据 elif status == 1: # 获取状态码为依据返回制定状态的订单. order_status = request.GET.get("order_status") if order_status == '0': order_list = OrderInfo.objects.filter(user=user) else: order_list = OrderInfo.objects.filter(user=user, status=order_status) orders_lists = [] for order in order_list: good_skus = OrderGoods.objects.filter(order=order) sku_list = [] # 1.组织订单中sku数据 for good_sku in good_skus: sku = good_sku.sku sku_sale_attr_names, sku_sale_attr_vals, _ = self.get_sku_list( sku) sku_list.append({ 'id': sku.id, 'default_image_url': str(sku.default_image_url), 'name': sku.name, 'price': sku.price, 'count': good_sku.count, 'total_amount': sku.price * good_sku.count, "sku_sale_attr_names": sku_sale_attr_names, "sku_sale_attr_vals": sku_sale_attr_vals, }) # 2.组织订单信息 orders_lists.append({ "order_id": order.order_id, "order_total_count": order.total_count, "order_total_amount": order.total_amount, "order_freight": order.freight, "address": { "title": order.address.tag, "address": order.address.address, "mobile": order.address.receiver_mobile, "receiver": order.address.receiver }, "status": order.status, "order_sku": sku_list, "order_time": str(order.created_time)[0:19] }) data = { 'orders_list': orders_lists, } return http.JsonResponse({ "code": 200, "data": data, 'base_url': PIC_URL }) # 买家确认收货业务 elif status == 2: order_id = request.GET.get("order_id") order = OrderInfo.objects.filter(order_id=order_id)[0] order.status = 4 order.save() return http.JsonResponse({"code": 200, 'base_url': PIC_URL})