Sfoglia il codice sorgente

记录每日云存列表界面访问次数、优化优惠券代码

linhaohong 6 mesi fa
parent
commit
1ed55a42ee

+ 66 - 2
AdminController/ServeManagementController.py

@@ -7,6 +7,7 @@ import time
 import uuid
 import json
 import logging
+from collections import defaultdict
 
 import paypalrestsdk
 import requests
@@ -24,10 +25,12 @@ from Controller.Cron.CronTaskController import CronUpdateDataView
 from Controller.UnicomCombo.UnicomComboTaskController import UnicomComboTaskView
 from Model.models import VodBucketModel, CDKcontextModel, Store_Meal, Order_Model, \
     UID_Bucket, ExperienceContextModel, Lang, CloudLogModel, UidSetModel, Unused_Uid_Meal, \
-    Device_Info, DeviceTypeModel, UnicomComboOrderInfo, AiService, CountryModel, \
-    Device_User, AbnormalOrder, DailyReconciliation, StsCrdModel, LogModel, \
+    Device_Info, DeviceTypeModel, UnicomComboOrderInfo, AiService, CountryModel, CouponLang, CouponConfigModel, \
+    CouponCombo, CouponModel, Device_User, AbnormalOrder, DailyReconciliation, StsCrdModel, LogModel, \
     InAppPurchasePackage, InAppRefund
 from Object.AppleInAppPurchaseSubscriptionObject import InAppPurchase
+from Object.Enums.RedisKeyConstant import RedisKeyConstant
+from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.UnicomObject import UnicomObjeect
@@ -64,6 +67,8 @@ class serveManagement(View):
             return self.cloudDataExport(request, response)
         elif operation == 'getDeviceOrderList':
             return self.getDeviceOrderList(request_dict, response)
+        elif operation == 'todayCloudPackageQueryNum':
+            return self.today_cloud_package_query_num(response)
         else:
             tko = TokenObject(
                 request.META.get('HTTP_AUTHORIZATION'),
@@ -141,6 +146,10 @@ class serveManagement(View):
                 return self.edit_refund_preference(request_dict, response)
             elif operation == 'addRefundOrder':
                 return self.add_refund_order(request_dict, response)
+
+            # 查询每日云存列表界面访问次数
+            elif operation == 'callTodayCloudPackageQueryNum':
+                return self.call_today_cloud_package_query_num(response)
             else:
                 return response.json(404)
 
@@ -2610,6 +2619,61 @@ class serveManagement(View):
                         created_time=now_time, updated_time=now_time)
         return response.json(0)
 
+    @staticmethod
+    def today_cloud_package_query_num(response):
+        """查询每日云存列表界面访问次数"""
+        try:
+            redis_obj = RedisObject()
+            # 获取所有字段
+            all_data = redis_obj.get_all_hash_data(RedisKeyConstant.TODAY_CLOUD_QUERY_NUMBER.value)
+            return response.json(0, all_data)
+        except Exception as e:
+            return response.json(500, str(e))
+
+    @staticmethod
+    def call_today_cloud_package_query_num(response):
+        """查询全球每日云存列表界面访问次数"""
+        try:
+            all_data = []
+            servers = {
+                "test": "https://test.zositechc.cn/serveManagement/todayCloudPackageQueryNum",
+                "eu": "https://api.zositeche.com/serveManagement/todayCloudPackageQueryNum",
+                "cn": "https://www.zositechc.cn/serveManagement/todayCloudPackageQueryNum",
+                "us": "https://www.dvema.com/serveManagement/todayCloudPackageQueryNum"
+            }
+
+            for region in servers:
+                res = requests.get(servers[region], timeout=10)
+                result = json.loads(res.text)
+                region_data = result['data']
+
+                # 数据格式化
+                for date, value in region_data.items():
+                    all_data.append({
+                        "date": date,
+                        "region": region,
+                        "value": int(value)
+                    })
+
+            # 计算总和 "all" 部分
+            merged = defaultdict(int)
+
+            for record in all_data:
+                date = record["date"]
+                merged[date] += record["value"]  # 累加相同日期的值
+
+            # 将"all"总和添加到all_data
+            for date, value in merged.items():
+                all_data.append({
+                    "date": date,
+                    "region": "all",
+                    "value": value
+                })
+
+            return response.json(0, {"list": all_data})
+
+        except Exception as e:
+            return response.json(500, str(e))
 
 
 

+ 43 - 6
Controller/CloudStorage.py

@@ -170,8 +170,7 @@ class CloudStorageView(View):
             data.append(order)
         return response.json(0, {'data': data, 'count': count})
 
-    @staticmethod
-    def do_commodity_list(request_dict, user_id, response):  # 查询套餐列表
+    def do_commodity_list(self, request_dict, user_id, response):  # 查询套餐列表
         """
         查询云存套餐列表
         @param user_id: 用户id
@@ -305,10 +304,7 @@ class CloudStorageView(View):
                             item['isCoupon'] = False
                         else:
                             # 在列表删除这个套餐
-                            coupon_combo_ids = CouponCombo.objects.filter(combo_id=item['id']).values_list("coupon_id",
-                                                                                                           flat=True)
-                            coupon_config_qs = CouponConfigModel.objects.filter(id__in=coupon_combo_ids)
-                            if coupon_config_qs.exists():
+                            if self.check_combo_is_coupon(item['id']):
                                 items_list.remove(item)
 
                 res_c = {'area': area, 'items': items_list}
@@ -341,6 +337,12 @@ class CloudStorageView(View):
                     },
                 'promotion': promotion,
             }
+
+            # 保存访问次数到redis中
+            redis_obj = RedisObject()
+            today = datetime.datetime.now().strftime("%Y-%m-%d")
+            redis_key = RedisKeyConstant.TODAY_CLOUD_QUERY_NUMBER.value
+            redis_obj.hash_field_increment(redis_key, today, 1)
             return response.json(0, result)
         except Exception as e:
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
@@ -364,6 +366,41 @@ class CloudStorageView(View):
                 result = True
         return result
 
+    @staticmethod
+    def check_combo_is_coupon(combo_id):
+        """
+        确认套餐是否有优惠信息
+        """
+        try:
+            key_coupon = RedisKeyConstant.PACKAGE_IS_COUPON_TRUE.value
+            key_not_coupon = RedisKeyConstant.PACKAGE_IS_COUPON_FALSE.value
+            redis_obj = RedisObject()
+            # 获取缓存数据列表,有优惠和无优惠
+            coupon_data = redis_obj.lrange(key_coupon, 0, -1)
+            not_coupon = redis_obj.lrange(key_not_coupon, 0, -1)
+            if combo_id in coupon_data:
+                return True
+            elif combo_id in not_coupon:
+                return False
+            else:
+                # 如果没有缓存数据,执行数据库查询
+                coupon_combo_ids = CouponCombo.objects.filter(combo_id=combo_id).values_list("coupon_id", flat=True)
+                coupon_config_qs = CouponConfigModel.objects.filter(id__in=coupon_combo_ids)
+                # 如果有优惠券配置,将套餐id添加到缓存中,并返回True
+                if coupon_config_qs.exists():
+                    redis_obj.rpush(key_coupon, combo_id)
+                    return True
+                redis_obj.rpush(key_not_coupon, combo_id)
+                return False
+        except Exception as e:
+            # 如果没有缓存数据,执行数据库查询
+            coupon_combo_ids = CouponCombo.objects.filter(combo_id=combo_id).values_list("coupon_id", flat=True)
+            coupon_config_qs = CouponConfigModel.objects.filter(id__in=coupon_combo_ids)
+            if coupon_config_qs.exists():
+                return True
+            LOGGER.info('error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return False
+
     @staticmethod
     def do_sign_play_m3u8(request_dict, response):  # 根据sts播放m3u8 视频流
         """

+ 5 - 4
Object/Enums/RedisKeyConstant.py

@@ -28,8 +28,9 @@ class RedisKeyConstant(Enum):
     # 基础模块用户ID
     BASIC_USER = 'BASIC:USER:'
 
-    # Redis 过期时间常量(秒)
-    EXPIRE_TIME_60_SECONDS = 60  # 60秒
+    # 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小时
+    EXPIRE_TIME_1_HOUR = 3600      # 1小时
+    EXPIRE_TIME_24_HOURS = 86400   # 24小时
+    EXPIRE_TIME_30_DAYS = 2592000  # 30天

+ 54 - 0
Object/RedisObject.py

@@ -156,3 +156,57 @@ class RedisObject:
         except Exception as e:
             print("redis unlock error.", e)
             return False
+
+    def incr(self, key, amount=1, ttl=0):
+        """
+        增加计数器的值
+        :param key: 键名,用于存储计数器的 Redis 键
+        :param amount: 增加的数量,默认为 1
+        :param ttl: 键的过期时间(秒)
+        :return: 更新后的计数值,若发生异常则返回 False
+        """
+        try:
+            # 增加计数器
+            result = self.CONN.incrby(key, amount)
+            # 设置过期时间
+            if ttl > 0:
+                self.CONN.expire(key, ttl)
+            return result
+        except Exception as e:
+            print(repr(e))
+            return False
+
+    def hash_field_increment(self, key, field, val=1, ttl=0):
+        """
+        哈希表中字段增量
+        :param key: redis的key
+        :param field: 哈希表字段
+        :param val: 增量
+        :param ttl: 键的过期时间(秒)
+        :return: 成功返回True 异常返回 False
+        """
+        try:
+            # 增加哈希表中指定字段的值
+            self.CONN.hincrby(key, field, val)
+            # 如果 ttl 大于 0,则设置过期时间(单位:秒)
+            if ttl > 0:
+                self.CONN.expire(key, ttl)
+            return True
+        except Exception as e:
+            # 发生异常时打印错误信息,便于调试
+            print(f"增值或设置过期时间时发生错误: {repr(e)}")
+            return False
+
+    def cleanup_hash_fields(self, key, field):
+        """
+        清理哈希表字段
+        :param key: redis的key
+        :param field: 字段名
+        :return: None
+        """
+        try:
+            self.CONN.hdel(key, field)
+            return True
+        except Exception as e:
+            print(f"清理过期字段时发生错误: {repr(e)}")
+            return False