浏览代码

优化查下优惠券套餐

zhangdongming 8 月之前
父节点
当前提交
983a760d68
共有 3 个文件被更改,包括 72 次插入30 次删除
  1. 53 21
      Controller/CloudPhoto/CloudServiceController.py
  2. 11 9
      Controller/CloudStorage.py
  3. 8 0
      Object/Enums/RedisKeyConstant.py

+ 53 - 21
Controller/CloudPhoto/CloudServiceController.py

@@ -6,11 +6,15 @@
 @Email   : zhangdongming@asj6.wecom.work
 @Software: PyCharm
 """
+import json
 import time
 
 from django.views import View
 
+from Ansjer.config import LOGGER
 from Model.models import CouponCombo, CouponModel
+from Object.Enums.RedisKeyConstant import RedisKeyConstant
+from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 
@@ -63,34 +67,62 @@ class CloudServiceController(View):
     def get_user_coupon_list(cls, user_id):
         """
         获取用户未使用优惠券配置ID列表
-        @param user_id:用户id
-        @return: coupon_qs
+        @param user_id: 用户id
+        @return: coupon_ids 列表,可能为空
+                  如果没有未使用的优惠券,返回空列表 []
         """
-        now_time = int(time.time())
-        coupon_qs = CouponModel.objects.filter(
-            userID=user_id,
-            use_status=0,
-            distribute_time__lte=now_time,
-            valid_time__gt=now_time
-        ).values('coupon_config__id')
-        return coupon_qs
+        try:
+            now_time = int(time.time())
+            coupon_conf_ids = CouponModel.objects.filter(
+                userID=user_id,
+                use_status=0,
+                distribute_time__lte=now_time,
+                valid_time__gt=now_time
+            ).values_list('coupon_config__id', flat=True)  # 使用 values_list 获取 ID 列表
+
+            return list(coupon_conf_ids)  # 可能为空
+        except Exception as e:
+            LOGGER.error('获取用户优惠券异常:userID:{}, error_line:{}, error_msg:{}'
+                         .format(user_id, e.__traceback__.tb_lineno, repr(e)))
+            return []
 
     @classmethod
     def get_combo_list(cls, coupon_type, coupon_id):
         """
         根据优惠券类型与优惠券ID,获取关联套餐列表
-        @param coupon_type: 优惠券类型
-        @param coupon_id: 套餐id
-        @return: coupon_list
+        :param coupon_type: 优惠券类型
+        :param coupon_id: 优惠券ID
+        :return: 关联的套餐ID列表
         """
-        combo_qs = CouponCombo.objects.filter(coupon_type=coupon_type, coupon_id=coupon_id) \
-            .values('combo_id')
-        combo_list = []
-        if not combo_qs.exists():
-            return combo_list
-        for item in combo_qs:
-            combo_list.append(item['combo_id'])
-        return combo_list
+        try:
+            redis_obj = RedisObject()  # 创建 Redis 对象以访问缓存
+            # 构建 Redis 缓存键
+            conf_key = f'{RedisKeyConstant.BASIC_CLOUD_COUPON.value}{coupon_type}:{coupon_id}'
+
+            # 尝试从 Redis 获取数据
+            conf_data = redis_obj.get_data(conf_key)
+            if conf_data:  # 如果缓存中存在数据,则直接返回
+                return json.loads(conf_data)
+
+                # 从数据库中查询关联的套餐ID
+            combo_qs = CouponCombo.objects.filter(coupon_type=coupon_type, coupon_id=coupon_id).values('combo_id')
+
+            # 初始化套餐ID列表
+            combo_list = []
+            if combo_qs.exists():  # 检查查询集是否存在数据
+                for item in combo_qs:
+                    combo_list.append(item['combo_id'])  # 逐个添加套餐ID
+
+            # 将查询结果存入 Redis 缓存
+            redis_obj.set_data(conf_key, json.dumps(combo_list), expire=RedisKeyConstant.EXPIRE_TIME_24_HOURS)
+
+            return combo_list  # 返回套餐ID列表
+
+        except Exception as e:
+            # 记录异常信息和相关上下文
+            LOGGER.error('获取优惠券套餐异常: couponID: {}, error_line: {}, error_msg: {}'
+                         .format(coupon_id, e.__traceback__.tb_lineno, repr(e)))
+            return []  # 返回空列表以表示失败
 
     @classmethod
     def get_coupon_list(cls, coupon_type, combo_id):

+ 11 - 9
Controller/CloudStorage.py

@@ -277,7 +277,8 @@ class CloudStorageView(View):
             store_list = list(store_qs)
             store_list.sort(key=itemgetter('bucket__area'))
             res = []
-            coupon_qs = '' if not user_id else CloudServiceController.get_user_coupon_list(user_id)
+            coupon_conf_ids = CloudServiceController.get_user_coupon_list(user_id)
+
             for area, items in groupby(store_list, key=itemgetter('bucket__area')):
                 items_list = list(items)
                 for item in items_list:
@@ -285,8 +286,11 @@ class CloudStorageView(View):
                     item['pay_type'] = list(pay_type_qs)
                     item['is_pay_cycle'] = 1 if item['cycle_config_id'] else 0
                     del item['cycle_config_id']
-                    item['isCoupon'] = False if not coupon_qs or not coupon_qs.exists() else \
-                        CloudStorageView.check_user_coupon_is_available(coupon_qs, item['id'])
+                    # 检查优惠券是否可用,并赋值给 item['isCoupon']
+                    if coupon_conf_ids:
+                        item['isCoupon'] = CloudStorageView.check_user_coupon_is_available(coupon_conf_ids, item['id'])
+                    else:
+                        item['isCoupon'] = False
                     for each in item['pay_type']:
                         if each['id'] == 10 and CONFIG_INFO != CONFIG_CN:
                             if is_ai == 0:
@@ -339,20 +343,18 @@ class CloudStorageView(View):
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
     @staticmethod
-    def check_user_coupon_is_available(coupon_qs, combo_id):
+    def check_user_coupon_is_available(coupon_conf_ids, combo_id):
         """
         查看用户优惠券是否可用
-        @param coupon_qs: 优惠券列表
+        @param coupon_conf_ids: 优惠券配置ids列表
         @param combo_id: 套餐id
         @return:
         """
-        if not coupon_qs.exists():
-            return False
         result = False
-        for item in coupon_qs:
+        for conf_id in coupon_conf_ids:
             if result:
                 break
-            combo_list = CloudServiceController.get_combo_list(0, item['coupon_config__id'])
+            combo_list = CloudServiceController.get_combo_list(0, conf_id)
             if not combo_list:
                 continue
             if combo_id in combo_list:

+ 8 - 0
Object/Enums/RedisKeyConstant.py

@@ -16,3 +16,11 @@ class RedisKeyConstant(Enum):
     COUPON_ID_LOCK = 'COUPON:ID:LOCK:'
     # 云存优惠券
     CLOUD_STORAGE_COUPONS = 'cloud_storage_coupons_'
+    # 基础模块用户优惠券
+    BASIC_CLOUD_COUPON = 'BASIC:CLOUD:COUPON:'
+
+    # Redis 过期时间常量(秒)
+    EXPIRE_TIME_60_SECONDS = 60  # 60秒
+    EXPIRE_TIME_30_MINUTES = 1800  # 30分钟
+    EXPIRE_TIME_1_HOUR = 3600  # 1小时
+    EXPIRE_TIME_24_HOURS = 86400  # 24小时