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)