AI学习吧-结算中心

结算中心流程

在结算中心中,主要是对用户添加到购物车商品的结算,由于用户可能添加了多个课程,但是,结算时会选择性的进行支付。在结算时会选中课程id,和对应的价格策略。在后台,首先会对用户进行校验,验证是否登录,接着对课程id进行校验,和之前加入购物车的课程id进行对比,在redis中查看是否存在这个课程,再进行对价格策略进行选择。

加入到结算中心流程:
  1、校验课程是否在购物车
  2、清空用户结算中心
  3、循环要结算的课程id,从购物车汇总获取相关信息
  4、从数据库获取当前用户可以用于购买专题课的优惠券
  5、循环要结算的课程,给课程添加优惠券
  6、将客户未绑定课程的优惠券加入到redis中

 数据结构

结算中心数据结构:
根据选中的课程选出对应的优惠券信息,示例对用户id为1的用户、选的课程id为1的课程支付,进行支付:

account_car_1_1:{
"course_detail":{"name":"","img":"","price":"","d_price":""},

"course_coupon":{1:{"name":"","coupon_type":"","money_equivalent_value":"","off_percent":"","minimum_consume","object_id"},
                      2:{...}}
}        

接下来判断,当前课程是否存在优惠券,没有就用全局优惠券:
全局优惠券格式:
global_coupon_1:{
            3:{},                         #里边的形式时普通优惠券的格式
            4:{}
}                   

结算中心具体流程

1、校验课程是否在购物车  

        # 1 获取课程ID列表
        course_id_list =request.data.get('course_id_list')
        print(course_id_list) # course_id_list:[1, 2]

        # 2 获取用户ID
        user_pk =request.user.pk

            for course_id in course_id_list:

                # 校验数据
                course_obj = Course.objects.get(pk=course_id)   #其实是在数据库中校验,因为,当直接买时,
                                      就不用加入购物车,直接在数据库中校验即可!

2、清空用户结算中心  

        # 清除
        keys =self.redis.keys("account_car_%s_*" % user_pk)
        if keys:
            self.redis.delete(*keys)

3、循环要结算的课程id,从购物车汇总获取相关信息  

            for course_id in course_id_list:
                # 结算课程字典的键
                account_key =settings.ACCOUNT_KEY %(user_pk ,course_id)
                # 结算课程字典的值
                course_account ={}

                # 校验数据
                course_obj = Course.objects.get(pk=course_id)

                shopping_car_key =settings.SHOPPING_CAR_KEY %(user_pk ,course_id)
                print("shopping_car_key" ,shopping_car_key)
                course_info =self.redis.hgetall(shopping_car_key)

 

4、从数据库获取当前用户可以用于购买专题课的优惠券  

# 查询该用户所有的有效的优惠券信息
                import datetime

                now =datetime.datetime.now()
                coupon_record_list =CouponRecord.objects.filter(user=request.user, #筛选未过期的优惠券
                                                               status=0,
                                                               coupon__valid_begin_date__lt=now,
                                                               coupon__valid_end_date__gt=now
                                                               )

                course_coupon_dict ={}
                global_coupon_dict ={}

                for coupon_record in coupon_record_list:
                    coupon_info ={
                        "name" :coupon_record.coupon.name,
                        "coupon_type" :coupon_record.coupon.coupon_type,
                        "money_equivalent_value" :coupon_record.coupon.money_equivalent_value or "",
                        "off_percent" :coupon_record.coupon.off_percent or "",
                        "minimum_consume" :coupon_record.coupon.minimum_consume or "",
                        "object_id" :coupon_record.coupon.object_id or ""
                    }

                    object_id =coupon_info.get("object_id")
                    if object_id:  #如果存在就说明课程里有这个优惠券就加入到课程优惠券
                        course_coupon_dict[coupon_record.pk ] =coupon_info
                    else:   #不存在,就说明时全局的优惠券,加到全局优惠券
                        global_coupon_dict[coupon_record.pk ] =coupon_info

           #course_coupon这个字典就是存储的有效优惠券信息:{"course_coupon":"course_coupon_dict"}
                course_account["course_coupon" ] =json.dumps(course_coupon_dict)

 

5、循环要结算的课程,给课程添加优惠券  

object_id =coupon_info.get("object_id")
                    if object_id:  #如果存在,就说明课程里有这个优惠券,就加入到课程优惠券
                        course_coupon_dict[coupon_record.pk ] =coupon_info
                    else:   #不存在,就说明时全局的优惠券,加到全局优惠券
                        global_coupon_dict[coupon_record.pk ] =coupon_info

           #course_coupon这个字典就是存储的有效优惠券信息:{"course_coupon":"course_coupon_dict"}
                course_account["course_coupon" ] =json.dumps(course_coupon_dict)

6、在redis写入结算数据 将客户未绑定课程的优惠券加入到redis中

                self.redis.hmset(account_key ,course_account)
                self.redis.hmset("global_coupon_%s " %(user_pk) ,global_coupon_dict)
原文地址:https://www.cnblogs.com/djfboai/p/10115238.html