class PaymentView(APIView):
authentication_classes = [authentication.MyAuthentication, ]
# 后台获取优惠券集合
@staticmethod
def get_coupons_queryset(request, course_id=None):
coupons_query_set = models.CouponRecord.objects.filter(
user=request.user,
status=0,
coupon__content_type_id=ContentType.objects.filter(
# 类表名._meta
model=models.Course._meta.model_name
).first().id,
coupon__valid_begin_date__lte=now(),
coupon__valid_end_date__gte=now(),
coupon__object_id=course_id, # 课程id
)
return coupons_query_set
# 结算只用优惠券之后的价格
@staticmethod
def cal_course_coupon_price(price, coupon_id):
coupon_obj = models.Coupon.objects.filter(id=coupon_id).first()
coupon_type = coupon_obj.coupon_type
# 等值货币
money_equivalent_value = coupon_obj.money_equivalent_value
# 折扣百分比
off_percent = coupon_obj.off_percent
# 最低消费
minimum_consume = coupon_obj.minimum_consume
if coupon_type == 0: # 立减券
price -= money_equivalent_value
if price < 0:
price = 0
elif coupon_type == 1: # 满减券
if price < minimum_consume:
raise MyException(1070, '不满足最低消费')
price -= money_equivalent_value
else: # 折扣券
price *= off_percent/100
return price
@staticmethod
def post(request):
my_res = BaseResponse()
total_price = 0
try:
"""1.对course_info列表每一项进行校验"""
# 是否为列表类型
course_info_list = request.data.get('course_info', '')
if type(course_info_list) != list:
raise MyException(501, '参数类型错误')
# 获取数据
for dic in course_info_list:
if type(dic) != dict:
raise MyException(502, '参数类型错误')
# get 出来的全部都是 str
course_id = dic.get('course_id', ' ').strip()
price_policy_id = dic.get('price_policy_id', ' ').strip()
course_coupon_id = dic.get('coupon_record_id', ' ').strip()
# 优惠券可以不填
if not course_id or not price_policy_id or not course_coupon_id:
raise MyException(503, '缺少参数值')
"""2.判断课程id是否合法"""
if not course_id.isdigit() or not price_policy_id.isdigit() or not course_coupon_id.isdigit():
raise MyException(504, '课程参数类型非法')
"""3.判断价格策略id是否合法"""
course_obj = models.Course.objects.filter(id=course_id).first()
if not course_obj:
raise MyException(5041, '课程类型不合法')
if price_policy_id not in \
[str(obj.id) for obj in course_obj.price_policy.all()]:
raise MyException(505, '价格策略不存在')
"""4.判断课程优惠券id是否合法"""
course_coupons_query_set = PaymentView.get_coupons_queryset(request, course_id=course_id)
if course_coupon_id not in [str(obj.id) for obj in course_coupons_query_set]:
raise MyException(506, '课程户优惠券不合法')
"""4.1 计算课程优惠券之后的价格"""
price = models.PricePolicy.objects.filter(id=price_policy_id).first().price
total_price += PaymentView.cal_course_coupon_price(price, course_coupon_id)
"""5.判断通用优惠券是否合法"""
global_coupon_id = request.data.get('global_coupon_id', '')
global_coupons_query_set = PaymentView.get_coupons_queryset(request)
if global_coupon_id not in [str(obj.id) for obj in global_coupons_query_set]:
raise MyException(507, '通用优惠券不合法')
"""5.1计算通用优惠券之后的价格"""
price = models.PricePolicy.objects.filter(id=global_coupon_id).first().price
total_price += price
my_res.code = 1000
my_res.msg = 'SUCCESS'
my_res.data = '您实际需要支付的费用是{}'.format(total_price)
except MyException as e:
my_res.code = e.code
my_res.msg = e.msg
except Exception as e:
my_res.code = 500
my_res.error = '网络异常!'
my_res.ex = str(e)
return Response(my_res.dict)
# 支付数据结构
payment = {
"courses_info": [
{
'course_id': "XXX",
'price_policy_id': "XXX",
'coupon_record_id': "XXX"
},
{
'course_id': "XXX",
'price_policy_id': "XXX",
'coupon_record_id': "XXX"
}
# ...
# ...
],
'global_coupon_id': "XXX",
'beli': "XXX",
'pay_money': "XXX",
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。