python项目篇-结算中心

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27695659/article/details/88569932

1. POST请求,去结算

 请求体:
	{
		courseids:[1,2]
	}
业务处理:
	1. 检测课程ID是否已经加入到购物车
	2. 获取指定价格策略信息
	3. 获取优惠券信息
	4. 构造结构放入redis					

2. GET请求,获取结算中心数据

业务处理:
	1. 获取结算中心里的课程信息(绑定课程优惠券)
	2. 获取全局优惠券

3. PATCH请求,选择优惠券

请求体:
	{
		courseid:0
		couponid:12
	}
业务处理:
	1. 校验结算中心是否存在该课程
	2. 校验优惠券是否可用
					
注意: 
	1. 优惠券状态
	2. 优惠券使用时间

5、构建目标数据结构

结算数据结构:
			payment_dict = {
				'2': {
					course_id:2,
					'title': '法务一', 
					'img': '1.jpg', 'policy_id': '4', 
					'coupon': {}, 
					'default_coupon': 0, 
					'period': 210, 'period_display': '12个月', 'price': 122.0}, 
				'1': {
					course_id:2,
					'title': '法务2', 
					'img': '2.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': '法务1', 
					'img': '1.jpg', 'policy_id': '4', 
					'coupon': {}, 
					'default_coupon': 0, 
					'period': 210, 'period_display': '12个月', 'price': 122.0}, 
				},
				payment_1_1:{
					course_id:1,
					'title': '法务2', 
					'img': '2.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
				}
			}

4.代码

url:

#结算中心
    url(r'^payment/$', payment.PaymentViewSet.as_view()),

payment.py中:

class PaymentViewSet(APIView):
    authentication_classes = [ApiAuth]
    conn = get_redis_connection("default")

    def post(self, request, *args, **kwargs):
        ret = BaseResponse()

        try:
            # 清空用户结算中心的数据
            # payment_1_*
            # payment_coupon_1
            key_list = self.conn.keys(settings.PAYMENT_KEY % (request.auth.user_id, "*",))
            key_list.append(settings.PAYMENT_COUPON_KEY % (request.auth.user_id,))
            self.conn.delete(*key_list)

            payment_dict = {}
            global_coupon_dict = {
                "coupon": {},
                "default_coupon": 0
            }

            # 1.获取用户要结算的课程ID
            course_id_list = request.data.get('courseids')
            for course_id in course_id_list:
                car_key = settings.SHOPPING_CAR_KEY % (request.auth.user_id, course_id)
                # 1.1 检测用户结算的课程是否加入购物车
                if not self.conn.exists(car_key):
                    ret.code = 1001
                    ret.error = "课程需要加入购物车才能结算"
                # 1.2从购物车中获取信息,放入结算中心
                # 后去标题和图片
                policy = json.loads(self.conn.hget(car_key, 'policy').decode('utf-8'))
                default_policy = self.conn.hget(car_key, 'default_policy').decode('utf-8')
                policy_info = policy[default_policy]

                payment_course_dict = {
                    "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'),
                    "policy_id": default_policy,
                    "coupon": {},
                    "default_coupon": 0
                }
                payment_course_dict.update(policy_info)
                payment_dict[str(course_id)] = payment_course_dict
            # 2. 获取优惠券
            ctime = datetime.date.today()  # 获取今天时间

            coupon_list = models.CouponRecord.objects.filter(
                account=request.auth.user,
                status=0,
                coupon__valid_begin_date__lte=ctime,
                coupon__valid_end_date__gte=ctime,
            )

            for item in coupon_list:

                # 只处理绑定课程的优惠券
                if not item.coupon.object_id:
                    # 优惠券ID
                    coupon_id = item.id

                    # 优惠券类型:满减、折扣、立减
                    coupon_type = item.coupon.coupon_type

                    info = {}
                    info['coupon_type'] = coupon_type
                    info['coupon_display'] = item.coupon.get_coupon_type_display()
                    if coupon_type == 0:  # 立减
                        info['money_equivalent_value'] = item.coupon.money_equivalent_value
                    elif coupon_type == 1:  # 满减券
                        info['money_equivalent_value'] = item.coupon.money_equivalent_value
                        info['minimum_consume'] = item.coupon.minimum_consume
                    else:  # 折扣
                        info['off_percent'] = item.coupon.off_percent

                    global_coupon_dict['coupon'][coupon_id] = info

                    continue
                # 优惠券绑定课程的ID
                coupon_course_id = str(item.coupon.object_id)

                # 优惠券ID
                coupon_id = item.id

                # 优惠券类型:满减、折扣、立减
                coupon_type = item.coupon.coupon_type

                info = {}
                info['coupon_type'] = coupon_type
                info['coupon_display'] = item.coupon.get_coupon_type_display()
                if coupon_type == 0:  # 立减
                    info['money_equivalent_value'] = item.coupon.money_equivalent_value
                elif coupon_type == 1:  # 满减券
                    info['money_equivalent_value'] = item.coupon.money_equivalent_value
                    info['minimum_consume'] = item.coupon.minimum_consume
                else:  # 折扣
                    info['off_percent'] = item.coupon.off_percent

                if coupon_course_id not in payment_dict:
                    # 获取到优惠券,但是没有购买此课程
                    continue
                # 将优惠券设置到指定的课程字典中
                payment_dict[coupon_course_id]['coupon'][coupon_id] = info

                # 可以获取绑定的优惠券

                # 3. 将绑定优惠券课程+全站优惠券 写入到redis中(结算中心)。
                # 3.1 绑定优惠券课程放入redis
            for cid, cinfo in payment_dict.items():
                pay_key = settings.PAYMENT_KEY % (request.auth.user_id, cid,)
                cinfo['coupon'] = json.dumps(cinfo['coupon'])
                self.conn.hmset(pay_key, cinfo)
                # 3.2 将全站优惠券写入redis
            gcoupon_key = settings.PAYMENT_COUPON_KEY % (request.auth.user_id,)
            global_coupon_dict['coupon'] = json.dumps(global_coupon_dict['coupon'])
            self.conn.hmset(gcoupon_key, global_coupon_dict)

        except Exception as e:
            ret.code = 1001
            ret.error = "提交失败"

        return Response(ret.dict)

    def patch(self, request, *args, **kwargs):

        ret = BaseResponse()
        try:
            # 1. 用户提交要修改的优惠券
            course = request.data.get('courseid')
            course_id = str(course) if course else course

            coupon_id = str(request.data.get('couponid'))

            # payment_global_coupon_1
            redis_global_coupon_key = settings.PAYMENT_COUPON_KEY % (request.auth.user_id,)

            # 修改全站优惠券
            if not course_id:
                if coupon_id == "0":
                    # 不使用优惠券,请求数据:{"couponid":0}
                    self.conn.hset(redis_global_coupon_key, 'default_coupon', coupon_id)
                    ret.data = "修改成功"
                    return Response(ret.dict)
                # 使用优惠券,请求数据:{"couponid":2}
                coupon_dict = json.loads(self.conn.hget(redis_global_coupon_key, 'coupon').decode('utf-8'))

                # 判断用户选择得优惠券是否合法
                if coupon_id not in coupon_dict:
                    ret.code = 1001
                    ret.error = "全站优惠券不存在"
                    return Response(ret.dict)

                # 选择的优惠券合法
                self.conn.hset(redis_global_coupon_key, 'default_coupon', coupon_id)
                ret.data = "修改成功"
                return Response(ret.dict)

            # 修改课程优惠券
            #payment_1_1
            redis_payment_key = settings.PAYMENT_KEY % (request.auth.user_id, course_id,)
            # 不使用优惠券
            if coupon_id == "0":
                self.conn.hset(redis_payment_key, 'default_coupon', coupon_id)
                ret.data = "修改成功"
                return Response(ret.dict)

            # 使用优惠券
            coupon_dict = json.loads(self.conn.hget(redis_payment_key, 'coupon').decode('utf-8'))
            if coupon_id not in coupon_dict:
                ret.code = 1010
                ret.error = "课程优惠券不存在"
                return Response(ret.dict)

            self.conn.hset(redis_payment_key, 'default_coupon', coupon_id)

        except Exception as e:
            ret.code = 1111
            ret.error = "修改失败"

        return Response(ret.dict)

    def get(self, request, *args, **kwargs):

        ret = BaseResponse()

        try:
            # payment_1_*
            redis_payment_key = settings.PAYMENT_KEY % (request.auth.user_id, "*",)

            # payment_coupon_1
            redis_global_coupon_key = settings.PAYMENT_COUPON_KEY % (request.auth.user_id,)

            # 1. 获取绑定课程信息
            course_list = []
            for key in self.conn.scan_iter(redis_payment_key):
                info = {}
                data = self.conn.hgetall(key)
                for k, v in data.items():
                    kk = k.decode('utf-8')
                    if kk == "coupon":
                        info[kk] = json.loads(v.decode('utf-8'))
                    else:
                        info[kk] = v.decode('utf-8')
                course_list.append(info)

            # 2.全站优惠券
            global_coupon_dict = {
                'coupon': json.loads(self.conn.hget(redis_global_coupon_key, 'coupon').decode('utf-8')),
                'default_coupon': self.conn.hget(redis_global_coupon_key, 'default_coupon').decode('utf-8')
            }

            ret.data = {
                "course_list": course_list,
                "global_coupon_dict": global_coupon_dict
            }
        except Exception as e:
            ret.code = 1001
            ret.error = "获取失败"

        return Response(ret.dict)

效果:

post:

{"courseids":[1,2]}

get:

{
    "data": {
        "course_list": [
            {
                "course_id": "1",
                "default_coupon": "0",
                "policy_id": "2",
                "coupon": {
                    "1": {
                        "coupon_type": 1,
                        "coupon_display": "满减券",
                        "money_equivalent_value": 60,
                        "minimum_consume": 100
                    },
                    "4": {
                        "coupon_type": 1,
                        "coupon_display": "满减券",
                        "money_equivalent_value": 60,
                        "minimum_consume": 100
                    },
                    "5": {
                        "coupon_type": 0,
                        "coupon_display": "通用券",
                        "money_equivalent_value": 40
                    }
                },
                "img": "quanzhan.png",
                "period": "720",
                "period_display": "24个月",
                "title": "法务一",
                "price": "3000.0"
            },
            {
                "course_id": "2",
                "title": "法务2",
                "img": "jinrongfenxi.png",
                "policy_id": "4",
                "coupon": {},
                "default_coupon": "0",
                "period": "14",
                "period_display": "2周",
                "price": "12331.0"
            }
        ],
        "global_coupon_dict": {
            "coupon": {
                "2": {
                    "coupon_type": 1,
                    "coupon_display": "满减券",
                    "money_equivalent_value": 100,
                    "minimum_consume": 100
                },
                "3": {
                    "coupon_type": 0,
                    "coupon_display": "通用券",
                    "money_equivalent_value": 100
                }
            },
            "default_coupon": "0"
        }
    },
    "code": 1000,
    "error": null
}

猜你喜欢

转载自blog.csdn.net/qq_27695659/article/details/88569932