支付中心
一,支付中心之格式
(一)前端发来的请求格式
(二)存储redis格式
课程Id为Key值,后面是用户课程的全部信息(包括优惠券字典和价格策略字典)
(三)优惠券存redis格式
二,支付中心
增加之思路分析
第一步:构造存入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)