结算中心流程

在结算中心中,主要是对用户添加到购物车商品的结算,由于用户可能添加了多个课程,但是,结算时会选择性的进行支付。在结算时会选中课程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)

AI学习吧-结算中心的更多相关文章

  1. AI学习吧

    一:AI学习吧 项目描述 系统使用前后端分离的模式,前端使用vue框架,后端使用restframework实现. 项目需求 公司开发AI学习吧,由于公司需要一款线上学习平台,要开发具有线上视频学习.支 ...

  2. python 全栈开发,Day104(DRF用户认证,结算中心,django-redis)

    考试第二部分:MySQL数据库 6.  MySQL中char和varchar的区别(1分) char是定长,varchar是变长. char的查询速度比varchar要快. 7.   MySQL中va ...

  3. python 全栈开发,Day103(微信消息推送,结算中心业务流程)

    昨日内容回顾 第一部分:考试题(Python基础) 第二部分:路飞相关 1. 是否遇到bug?难解决的技术点?印象深刻的事? - orm操作费劲 - 最开始学习路由系统时候,匹配规则: 答案一: 有, ...

  4. AI学习笔记(02)

    AI学习笔记   第一个黑箭头是用于挑选物体和移 动物体.在绘图是选中一个物体,就可以将它自由的移动.和其他的绘图软件相同当你选 中物体的时候物体周围就会出现八个方形的控制点,你可以通过这些控制点对物 ...

  5. 英特尔® 至强® 平台集成 AI 加速构建数据中心智慧网络

    英特尔 至强 平台集成 AI 加速构建数据中心智慧网络 SNA 通过 AI 方法来实时感知网络状态,基于网络数据分析来实现自动化部署和风险预测,从而让企业网络能更智能.更高效地为最终用户业务提供支撑. ...

  6. DeepLearning.ai学习笔记汇总

    第一章 神经网络与深度学习(Neural Network & Deeplearning) DeepLearning.ai学习笔记(一)神经网络和深度学习--Week3浅层神经网络 DeepLe ...

  7. DeepLearning.ai学习笔记(三)结构化机器学习项目--week2机器学习策略(2)

    一.进行误差分析 很多时候我们发现训练出来的模型有误差后,就会一股脑的想着法子去减少误差.想法固然好,但是有点headlong~ 这节视频中吴大大介绍了一个比较科学的方法,具体的看下面的例子 还是以猫 ...

  8. AI 学习路线

    [导读] 本文由知名开源平台,AI技术平台以及领域专家:Datawhale,ApacheCN,AI有道和黄海广博士联合整理贡献,内容涵盖AI入门基础知识.数据分析挖掘.机器学习.深度学习.强化学习.前 ...

  9. AI - 学习路径(Learning Path)

    初见 机器学习图解 错过了这一篇,你学机器学习可能要走很多弯路 这3张脑图,带你清晰人工智能学习路线 一些课程 Andrew Ng的网络课程 HomePage:http://www.deeplearn ...

随机推荐

  1. “指定的参数已超出有效值的范围”在【 parameterUpdate.Add(new OracleParameter("STATUS", 0));】报错

    改成:parameterUpdate.Add()); 就不报错,并不能知道为什么,有知道为什么的,评论告诉我. /// <summary> /// 插入数据 /// </summar ...

  2. C++以const 作为返回值类型的意义

    const rational operator*(const rational& lhs, const rational& rhs); 很多程序员第一眼看到它会纳闷:为什么operat ...

  3. MySQL报错总结

    错误一: MySQL从cmd使用命令“mysql -u root -p”启动报错,显示“不能连接到端口xxx”(实际端口为3306),这里的问题实际是由于我没有设置mysql开机自启动,所以解决方案就 ...

  4. js学习笔记--基础部分

    自增 自增 ++ 通过自增可以使变量在自身的基础上增加1 对于一个变量自增以后,原变量的值会立即自增1 无论使a++, 还是++a,都会立即使原变量的值自增1. 不同的是a++ 和++a的值不同. a ...

  5. HTTP协议03-http特点及请求方式

    无状态: HTTP是一种不保存状态,既无状态协议.HTTP自身不对请求和响应之间的通信状态进行保存,也就是说不做持久化处理.这是为了更快处理大量事务,确保协议的可伸缩性. 随着web的不断发展,无状态 ...

  6. linux系统的三种网络连接模式

    VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式. 1 ...

  7. 题解-Codeforces710F String Set Queries

    咕了好久没更博客,最近得知可以去冬眠营玩耍,还可以搭顺风车回广州过年 (最近做到的比较有意思的题目:bzoj3958.hihocoder1419) Problem Codeforces-710F--洛 ...

  8. hibernate框架学习第二天:核心API、工具类、事务、查询、方言、主键生成策略等

    核心API Configuration 描述的是一个封装所有配置信息的对象 1.加载hibernate.properties(非主流,早期) Configuration conf = new Conf ...

  9. [SCOI2014]方伯伯的OJ

    看到这道题的第一想法就是要用FHQ treap 过了这道题...于是至今尚未成功(华丽的 T 掉了 (╯‵□′)╯︵┻━┻ ).于是附个地址. 然后水一波博客. 题意简介 emmmm...方伯伯脑抽做 ...

  10. Alpha 冲刺 (5/10)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:冲刺5 团队部分 后敬甲(组长) 过去两天完成了哪些任务 文字描述 最近事情有点多,只是跟进了下进度,写了写博客 接下来 ...