路飞学城结算中心实现

路飞学城结算中心的优惠券表结构

# ########################### 优惠券 ################################
class Coupon(models.Model):
    """优惠券生成规则"""
    name = models.CharField(max_length=64, verbose_name="活动名称")
    brief = models.TextField(blank=True, null=True, verbose_name="优惠券介绍")
    coupon_type_choices = ((0, '立减券'), (1, '满减券'), (2, '折扣券'))
    coupon_type = models.SmallIntegerField(choices=coupon_type_choices, default=0, verbose_name="券类型")

    """
    通用:
        money_equivalent_value=100
        off_percent=null
        minimum_consume=0
    满减:
        money_equivalent_value=100
        off_percent=null
        minimum_consume=1000
    折扣:
        money_equivalent_value=0
        off_percent=79
        minimum_consume=0
    """
    money_equivalent_value = models.IntegerField(verbose_name="等值货币")
    off_percent = models.PositiveSmallIntegerField("折扣百分比", help_text="只针对折扣券,例7.9折,写79", blank=True, null=True)
    minimum_consume = models.PositiveIntegerField("最低消费", default=0, help_text="仅在满减券时填写此字段")

    content_type = models.ForeignKey(ContentType, blank=True, null=True)
    object_id = models.PositiveIntegerField("绑定课程", blank=True, null=True, help_text="可以把优惠券跟课程绑定")
    content_object = GenericForeignKey('content_type', 'object_id')

    quantity = models.PositiveIntegerField("数量(张)", default=1)
    open_date = models.DateField("优惠券领取开始时间")
    close_date = models.DateField("优惠券领取结束时间")
    valid_begin_date = models.DateField(verbose_name="有效期开始时间", blank=True, null=True)
    valid_end_date = models.DateField(verbose_name="有效结束时间", blank=True, null=True)
    coupon_valid_days = models.PositiveIntegerField(verbose_name="优惠券有效期(天)", blank=True, null=True,
                                                    help_text="自券被领时开始算起")
    date = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = "31. 优惠券生成记录"

    def __str__(self):
        return "%s(%s)" % (self.get_coupon_type_display(), self.name)

    def save(self, *args, **kwargs):
        if not self.coupon_valid_days or (self.valid_begin_date and self.valid_end_date):
            if self.valid_begin_date and self.valid_end_date:
                if self.valid_end_date <= self.valid_begin_date:
                    raise ValueError("valid_end_date 有效期结束日期必须晚于 valid_begin_date ")
            if self.coupon_valid_days == 0:
                raise ValueError("coupon_valid_days 有效期不能为0")
        if self.close_date < self.open_date:
            raise ValueError("close_date 优惠券领取结束时间必须晚于 open_date优惠券领取开始时间 ")

        super(Coupon, self).save(*args, **kwargs)


class CouponRecord(models.Model):
    """优惠券发放、消费纪录"""
    coupon = models.ForeignKey("Coupon")
    number = models.CharField(max_length=64, unique=True)
    account = models.ForeignKey("Account", verbose_name="拥有者")
    status_choices = ((0, '未使用'), (1, '已使用'), (2, '已过期'))
    status = models.SmallIntegerField(choices=status_choices, default=0)
    get_time = models.DateTimeField(verbose_name="领取时间", help_text="用户领取时间")
    used_time = models.DateTimeField(blank=True, null=True, verbose_name="使用时间")
    # order = models.ForeignKey("Order", blank=True, null=True, verbose_name="关联订单")  # 一个订单可以有多个优惠券

    class Meta:
        verbose_name_plural = "32. 用户优惠券"

    def __str__(self):
        return '%s-%s-%s' % (self.account, self.number, self.status)
优惠券表结构

 结算中心的实现思路及数据结构

 结算中心 
		
		1.购物车(可以选择价格策略)
			{
				luffy_shopping_car_6_11:{
					'title':'21天入门到放弃',
					'src':'xxx.png',
					'policy':{
						1:{id:'xx'.....},
						2:{id:'xx'.....},
						3:{id:'xx'.....},
						4:{id:'xx'.....},
					},
					'default_policy':3
				},
				luffy_shopping_car_6_13:{
					...
				}
			}

			2.结算(可以选择优惠券)
				a. POST请求,去结算
				   请求体:
						{
							courseids:[1,2]
						}
					业务处理:
						1. 检测课程ID是否已经加入到购物车
						2. 获取指定价格策略信息
						3. 获取优惠券信息
						4. 构造结构放入redis
						
				b. GET请求,获取结算中心数据
					业务处理:
						1. 获取结算中心里的课程信息(绑定课程优惠券)
						2. 获取全局优惠券
						
				c. PATCH请求,选择优惠券
					请求体:
						{
							courseid:0
							couponid:12
						}
					业务处理:
						1. 校验结算中心是否存在该课程
						2. 校验优惠券是否可用
					
				注意: 
					1. 优惠券状态
					2. 优惠券使用时间
#结算中心
{
    payment_1_2:{
                'course_id':str(course_id),
                'title':self.conn.hget(car_key, 'title').decode('utf-8'),
                'img'  :self.conn.hget(car_key, 'img').decode('utf-8'),
                'coupon':{
                    'coupon_id':coupon_id,
                    'coupon_type':coupon_type,
                    'coupon_type_display':item.coupon.get_coupon_type_display(),
                    'money_equivalent_value':item.coupon.money_equivalent_value,
                },
                'default_coupon':0,
    },
    payment_1_3:{
                'course_id':str(course_id),
                'title':self.conn.hget(car_key, 'title').decode('utf-8'),
                'img'  :self.conn.hget(car_key, 'img').decode('utf-8'),
                'coupon':{
                    'coupon_id':coupon_id,
                    'coupon_type':coupon_type,
                    'coupon_type_display':item.coupon.get_coupon_type_display(),
                    'money_equivalent_value':item.coupon.money_equivalent_value,
                },
                'default_coupon':0,
    },
}

payment_global_coupon_1={
    'coupon':{
        coupon_id:{ 
            'coupon_id':coupon_id,
            'coupon_type':coupon_type,
            'coupon_type_display':item.coupon.get_coupon_type_display(),
            'money_equivalent_value':item.coupon.money_equivalent_value,
                    },
    },
    'defalut_coupon':0
}
结算数据及目标:
			payment_dict = {
				'2': {
					course_id:2,
					'title': 'CRM客户关系管理系统实战开发-专题', 
					'img': 'CRM.jpg', 'policy_id': '4', 
					'coupon': {}, 
					'default_coupon': 0, 
					'period': 210, 'period_display': '12个月', 'price': 122.0}, 
				'1': {
					course_id:2,
					'title': '爬虫开发-专题', 
					'img': '爬虫开发-专题.jpg', 
					'policy_id': '2', 
					'coupon': {
						4: {'coupon_type': 0, 'coupon_display': '立减券', 'money_equivalent_value': 40}, 
						6: {'coupon_type': 1, 'coupon_display': '满减券', 'money_equivalent_value': 60, 'minimum_consume': 100}
					}, 
					'default_coupon': 0, 
					'period': 60, 
					'period_display': '2个月', 
					'price': 599.0}
			}

			global_coupon_dict = {
				'coupon': {
					2: {'coupon_type': 1, 'coupon_display': '满减券', 'money_equivalent_value': 200, 'minimum_consume': 500}
				}, 
				'default_coupon': 0
			}
			========================================= redis ==============================================
			redis = {
				payment_1_2:{
					course_id:2,
					'title': 'CRM客户关系管理系统实战开发-专题', 
					'img': 'CRM.jpg', 'policy_id': '4', 
					'coupon': {}, 
					'default_coupon': 0, 
					'period': 210, 'period_display': '12个月', 'price': 122.0}, 
				},
				payment_1_1:{
					course_id:1,
					'title': '爬虫开发-专题', 
					'img': '爬虫开发-专题.jpg', 
					'policy_id': '2', 
					'coupon': {
						4: {'coupon_type': 0, 'coupon_display': '立减券', 'money_equivalent_value': 40}, 
						6: {'coupon_type': 1, 'coupon_display': '满减券', 'money_equivalent_value': 60, 'minimum_consume': 100}
					}, 
					'default_coupon': 0, 
					'period': 60, 
					'period_display': '2个月', 
					'price': 599.0}
				},
				payment_global_coupon_1:{
					'coupon': {
						2: {'coupon_type': 1, 'coupon_display': '满减券', 'money_equivalent_value': 200, 'minimum_consume': 500}
					}, 
					'default_coupon': 0
				}
			}
			

猜你喜欢

转载自www.cnblogs.com/weidaijie/p/10510742.html