支付中心

支付中心

一,支付中心之格式

(一)前端发来的请求格式

在这里插入图片描述

(二)存储redis格式

课程Id为Key值,后面是用户课程的全部信息(包括优惠券字典和价格策略字典)

1546071099802

(三)优惠券存redis格式

1546071444976

二,支付中心

增加之思路分析

第一步:构造存入redis的两个数据格式(方便下面存储数据),取出前端传来的课程列表

第二步:从redis中取出该用户的购物车(如果不存在则创建一个空的),判断前端传来的课程是否全在购物车中,如果不在则抛异常,如果存在,则把共同的课程定义一个字典(以key为键,value为字典当道最后的打字典中)

第三步:获取当前时间,过滤优惠券里面的时间,满足条件的放到一个列表中

第四步:循环优惠券列表,获取优惠券的类型,然后根据优惠券的类型,添加相应的字段到对应的字典中,判断是全栈优惠券,还是课程优惠券,把全栈优惠券放到单独的优惠券列表,课程优惠券放到对应的课程字典中

第五步:把对应的两个字典存入redis

from rest_framework.views import APIView
from rest_framework.response import Response
# 表模板的导入
from api import models
# 自定义返回值导入
from api.utils.commonUtils import MyResponse
from api.utils.MyAuth import LoginAuth
from api.utils.commonUtils import CommonException
from django_redis import get_redis_connection
import json


# 需要登录之后才能操作,写一个认证组件
class settlement(APIView):
    authentication_classes = [LoginAuth]
    conn = get_redis_connection()

    def post(self, request, *args, **kwargs):
        response = MyResponse()
        # 前端传来的数据格式{"course_list": [{"course_id": "1", "policy_id": "1"}, {"course_id": "2", "policy_id": "2"}]}
        course_list = request.data.get('course_list')
        try:
            # 构造出结算中心和全局优惠券字典(存在redis中,有两个表,一个是要结算的课程列表,一个是优惠券列表)
            payment_dic = {}
            global_coupon = {
                'coupon': {},
                'default_coupon': 0
            }
            # 去redis中取出该用户的购物车
            shoppingcart = self.conn.get('shoppingcart_%s' % request.user.pk)
            # 三元表达式(判断该用户是否存在购物车)
            shoppingcart_dic = json.loads(shoppingcart) if shoppingcart else {}
            # 循环前端传过来的课程列表.然后把购物车中的与结算课程对应的放到新定义的课程详情列表
            for course_in in course_list:
                # 判断课程id是否在购物车中,如果不在,直接抛异常
                course_in_id = course_in['course_id']
                if course_in_id not in shoppingcart_dic:
                    raise CommonException(101, '该课程不在购物车中')
                # 定义一个空的课程详情字典,内部放了一个空的优惠券字典和一个优惠券默认值
                course_detail = {
                    'coupon': {},
                    'default_coupon': 0
                }
                # 把购物车里面的课程放到刚定义的课程详情列表中
                course_detail.update(shoppingcart_dic[course_in_id])
                # 把刚构造的课程详情列表,放到结算中心字典
                payment_dic[course_in_id] = course_detail
            # 下面构造优惠券列表
            # 一次性查出当前用户的所有优惠券信息
            import datetime
            ctime = datetime.datetime.now()
            # 过滤取出该用户的所有满足条件的所有优惠券
            coupon_list = models.CouponRecord.objects.filter(user=request.user,
                                                             status=0,
                                                             coupon__valid_end_date__gte=ctime,
                                                             coupon__valid_begin_date__lte=ctime
                                                             )
            for coupon in coupon_list:
                # 拿出所有优惠券的数字类型
                coupon_type = coupon.coupon.coupon_type
                # 拿出优惠券类型的文字描述
                coupon_type_display = coupon.coupon.get_coupon_type_display()
                # 每个优惠券绑定的课程
                object_id = coupon.coupon.object_id
                # 优惠券详情字典中
                coupon_detail = {
                    'coupon_type': coupon_type,
                    'coupon_display': coupon_type_display
                }
                # 此时优惠券详情字典中的信息
                #     coupon_detail={
                #         "coupon_type":1,
                #         "coupon_display":"满减券",
                #         "money_equivalent_value":10,
                #         "minimum_consume":100
                # }
                # 下面对优惠券的种类,用三种字段表示
                if coupon_type == '0':  # 立减
                    coupon_detail['money_equivalent_value'] = coupon.coupon.money_equivalent_value
                elif coupon_type == '1':  # 满减
                    coupon_detail['money_equivalent_value'] = coupon.coupon.money_equivalent_value
                    coupon_detail['minimum_consume'] = coupon.coupon.minimum_consume

                else:  # 折扣
                    coupon_detail['off_percent'] = coupon.coupon.off_percent

                # 全栈优惠券
                if not object_id:
                    global_coupon['coupon'][str(coupon.pk)] = coupon_detail
                else:
                    # 课程优惠券
                    if payment_dic.get(str(object_id), None):
                        payment_dic[str(object_id)]['coupon'][str(coupon.pk)] = coupon_detail
            # 存到redis
            self.conn.set('payment_%s' % request.user.pk, json.dumps(payment_dic))
            self.conn.set('globalcoupon_%s' % request.user.pk, json.dumps(global_coupon))
            response.msg = '加入成功'
        except CommonException as e:
            response.status = e.status
            response.msg = e.msg
        except Exception as e:
            response.status = 400
            response.msg = '未知错误'
            print(str(e))
        return Response(response.get_dic)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值