结算中心流程

在结算中心中,主要是对用户添加到购物车商品的结算,由于用户可能添加了多个课程,但是,结算时会选择性的进行支付。在结算时会选中课程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. TensorFlow学习笔记:保存和读取模型

    TensorFlow 更新频率实在太快,从 1.0 版本正式发布后,很多 API 接口就发生了改变.今天用 TF 训练了一个 CNN 模型,结果在保存模型的时候居然遇到各种问题.Google 搜出来的 ...

  2. 查找轮廓(cv2.findCountours函数)

    1.输入为二值图像,黑色为背景,白色为目标 2.该函数会修改原图像,因此若想保留原图像在,则需拷贝一份,在拷贝图里修改. 一.查找轮廓 cv2.findContours() 三个输入参数:输入图像(二 ...

  3. Java类锁和对象锁

    一.类锁和对象锁 二.使用注意 三.参考资料 一.类锁和对象锁 类锁:在代码中的方法上加了static和synchronized的锁,或者synchronized(xxx.class) 对象锁:在代码 ...

  4. 【转】浅析Python中的struct模块

    [转]浅析Python中的struct模块 最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概 ...

  5. 【转】Win10下python3和python2多版本同时安装并解决pip共存问题

    [转]Win10下python3和python2多版本同时安装并解决pip共存问题 特别说明,本文是在Windows64位系统下进行的,32位系统请下载相应版本的安装包,安装方法类似. 使用pytho ...

  6. libevent的入门学习-库的安装【转】

    转自:https://blog.csdn.net/lookintosky/article/details/61658067 libevent的入门学习-库的安装最近开始接触Linux应用层的东西,发现 ...

  7. Spring MVC全局异常处理

    继承HandlerExceptionResolver接口实现自己的处理方法,如: public class MyHandlerExceptionResolver implements HandlerE ...

  8. button 去掉原生边框

    button按钮触发 hover 时,自带边框会显示,尤其是 button 设置圆角时,如图: 解决办法: outline: 0;

  9. TCP与UDP区别小结

    TCP(Transmission Control Protocol):传输控制协议 UDP(User Datagram Protocol):用户数据报协议       主要从连接性(Connectiv ...

  10. $Django 在线文本编辑器skindeditor

    简介 KindEditor是一套开源的在线HTML编辑器,主要用于让用户在网站上获得所见即所得编辑效果,开发人员可以用 KindEditor 把传统的多行文本输入框(textarea)替换为可视化的富 ...