Browse Source

云存状态查询,基站复位修改通道名称

zhangdongming 4 days ago
parent
commit
c7458dd3f1

+ 93 - 1
AdminController/ServeManagementController.py

@@ -27,7 +27,7 @@ from Model.models import VodBucketModel, CDKcontextModel, Store_Meal, Order_Mode
     UID_Bucket, ExperienceContextModel, Lang, CloudLogModel, UidSetModel, Unused_Uid_Meal, \
     Device_Info, DeviceTypeModel, UnicomComboOrderInfo, AiService, CountryModel, CouponLang, CouponConfigModel, \
     CouponCombo, CouponModel, Device_User, AbnormalOrder, DailyReconciliation, StsCrdModel, LogModel, \
-    InAppPurchasePackage, InAppRefund
+    InAppPurchasePackage, InAppRefund, VodHlsSummary
 from Object.AppleInAppPurchaseSubscriptionObject import InAppPurchase
 from Object.Enums.RedisKeyConstant import RedisKeyConstant
 from Object.RedisObject import RedisObject
@@ -36,6 +36,7 @@ from Object.TokenObject import TokenObject
 from Object.UnicomObject import UnicomObjeect
 from Object.utils.PayPalUtil import PayPalService
 from Service.CommonService import CommonService
+from Service.VodHlsService import SplitVodHlsObject
 
 LOGGER = logging.getLogger('info')
 
@@ -132,6 +133,8 @@ class serveManagement(View):
             # 云存用户信息
             elif operation == 'getCloudUserList':  # 获取云存用户信息
                 return self.getCloudUserList(request_dict, response)
+            elif operation == 'getCloudStorageStatusByUid':  # 获取云存用户信息
+                return self.get_cloud_storage_status_by_uid(request_dict, response)
             elif operation == 'deviceAttritionAlert':  # 流失预警
                 return self.deviceAttritionAlert(request_dict, response)
             elif operation == 'deactivationPackage':  # 停用套餐
@@ -1963,6 +1966,95 @@ class serveManagement(View):
             print(e)
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
+    @classmethod
+    def get_cloud_storage_status_by_uid(cls, request_dict, response):
+        """
+        根据用户ID获取云存储状态
+        :param request_dict: 请求参数,包含用户ID和日期
+        :param response: 响应对象
+        :return: 云存储状态数据
+        """
+        # 解析请求参数
+        uid = request_dict.get('uid')
+        date_time = request_dict.get('date_time')
+
+        # 验证参数有效性
+        if not uid or not date_time:
+            return response.json(444, "缺少必要参数: uid 或 date_time")
+
+        try:
+            # 解析日期参数
+            date_obj = datetime.datetime.strptime(date_time, '%Y-%m-%d')
+            start_time = int(datetime.datetime(date_obj.year, date_obj.month, 1).timestamp())
+            end_time = int(datetime.datetime(date_obj.year, date_obj.month + 1, 1).timestamp())
+
+            # 查询云存储数据
+            vod_hls_summary_qs = VodHlsSummary.objects.filter(
+                time__gte=start_time,
+                time__lt=end_time
+            ).values('time', 'upload_duration', 'upload_frequency')
+
+            # 查询用户请求数据
+            sts_crd_qs = StsCrdModel.objects.filter(uid=uid).values('addTime', 'channel')
+
+            # 初始化响应数据
+            res_data = {
+                'last_request_time': 0,
+                'sts_count': 0,
+                'channel': 0,
+                'upload_duration': 0,
+                'upload_frequency': 0,
+                'time': 0,
+                'cloud_video_count': 0,
+                'total_duration_seconds': 0,
+                'bucket_vod_location': 0
+            }
+
+            # 填充用户请求数据
+            if sts_crd_qs.exists():
+                sts_crd = sts_crd_qs[0]
+                res_data['last_request_time'] = sts_crd['addTime']
+                res_data['channel'] = sts_crd['channel']
+
+            # 填充云存储数据
+            if vod_hls_summary_qs.exists():
+                vod_hls_summary = vod_hls_summary_qs[0]
+                res_data['upload_duration'] = vod_hls_summary['upload_duration']
+                res_data['upload_frequency'] = vod_hls_summary['upload_frequency']
+                res_data['time'] = vod_hls_summary['time']
+
+            # 查询aws+oss分表数据
+            now_time = int(time.time())
+            split_vod_hls_obj = SplitVodHlsObject()
+            # 获取当天的开始时间戳(00:00:00)
+            start_timestamp = int(date_obj.timestamp())
+
+            # 获取当天的结束时间戳(23:59:59)
+            end_timestamp = int((date_obj + datetime.timedelta(days=1)).timestamp()) - 1
+            vod_hls_qs = split_vod_hls_obj.get_vod_hls_data(
+                uid=uid, end_time__gte=now_time, start_time__range=(start_timestamp, end_timestamp)) \
+                .values("id", "start_time", "sec", "fg", "bucket_id", "channel", "tab_val")
+
+            count = vod_hls_qs.count()
+            if count > 0:
+                res_data['cloud_video_count'] = count
+                sec_values = vod_hls_qs.values_list('sec', flat=True)
+                res_data['total_duration_seconds'] = sum(sec_values) if sec_values else 0
+
+            # 从Redis获取请求计数
+            redis_obj = RedisObject()
+            key = f'sts_count_{uid}'
+            sts_count = redis_obj.get_data(key)
+            if sts_count:
+                res_data['sts_count'] = sts_count
+
+            return response.json(0, res_data)
+
+        except Exception as e:
+            LOGGER.error(f'获取云存储状态失败 - uid: {uid}, 错误: {repr(e)}')
+            return response.json(500, f'服务器错误: {repr(e)}')
+
+
     def exportCloudUserList(self, request_dict, response):
         # UID_Bucket表查询数据
         uid = request_dict.get('uid', None)

+ 52 - 3
AdminController/dataSystemManagement/BusinessDataController.py

@@ -8,9 +8,10 @@
 """
 
 import requests
+from django.db.models import Sum, Count
 from django.views.generic.base import View
 
-from Model.models import VodHlsSummary
+from Model.models import VodHlsSummary, UID_Bucket
 from Service.CommonService import CommonService
 
 
@@ -35,6 +36,8 @@ class BusinessDataView(View):
             return self.query_device_vod_business(request_dict, response)
         elif operation == 'global/vodData':  # 查询全球设备云存储数据
             return self.query_global_device_vod_business(request, request_dict, response)
+        elif operation == 'uploadDurationStatistics':
+            return self.query_upload_duration_statistics(request, request_dict, response)
         else:
             return response.json(414)
 
@@ -72,7 +75,7 @@ class BusinessDataView(View):
             }
             return response.json(0, res)
         except Exception as e:
-            return response.json(500, repr(e))
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
     @classmethod
     def query_global_device_vod_business(cls, request, request_dict, response):
@@ -111,4 +114,50 @@ class BusinessDataView(View):
             }
             return response.json(0, res)
         except Exception as e:
-            return response.json(500, repr(e))
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @classmethod
+    def query_upload_duration_statistics(cls, request, request_dict, response):
+        """查询上传秒数数据统计"""
+        start_time = request_dict.get('startTime')
+        end_time = request_dict.get('endTime')
+
+        if not all([start_time, end_time]):
+            return response.json(444, {'error param': 'startTime or endTime'})
+
+        try:
+            #上传总秒数
+            upload_sum = VodHlsSummary.objects.filter(
+                created_time__gte=start_time,
+                updated_time__lt=end_time,
+                upload_duration__lt=2592000
+            ).aggregate(
+                total_duration=Sum('upload_duration')
+            )
+            total_duration = upload_sum['total_duration'] or 0
+
+            #设备总数
+            device_sum = UID_Bucket.objects.filter(
+                status=1,
+                endTime__gt=end_time
+            ).aggregate(
+                total_device=Count('id')
+            )
+            total_device = device_sum['total_device'] or 0
+
+            if total_device == 0:
+                monthly_average_data = 0.0
+                day_average_data = 0.0
+            else:
+                monthly_average_data = total_duration / total_device / 3600 #月均
+                day_average_data = monthly_average_data / 30 #日均
+
+            return response.json(0, {
+                'total_upload_duration': total_duration,
+                'total_device_count': total_device,
+                'monthly_average_data': round(monthly_average_data, 2),  # 保留2位小数
+                'day_average_data': round(day_average_data, 2)
+            })
+
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 33 - 1
Controller/UserDevice/DeviceReportController.py

@@ -16,9 +16,10 @@ from django.http import QueryDict
 from django.views import View
 
 from Ansjer.config import LOGGER
-from Model.models import DeviceDailyReport
+from Model.models import DeviceDailyReport, UidChannelSetModel, UidSetModel
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
 
 
 class DeviceReportView(View):
@@ -57,6 +58,8 @@ class DeviceReportView(View):
             return self.get_battery_capacity_list(userID, request, request_dict, response)
         elif operation == 'getWakeSleepData':
             return self.get_wake_sleep_data(userID, request_dict, response)
+        elif operation == 'deviceReset':
+            return self.device_reset(userID, request, request_dict, response)
         return response.json(414)
 
     @classmethod
@@ -195,3 +198,32 @@ class DeviceReportView(View):
         except Exception as e:
             LOGGER.error(f'查询设备电量上报列表异常: {e}')
             return response.json(0, {})
+
+    def device_reset(self, userID, request, request_dict, response):
+        """900兆基站修改通道名"""
+        ip = CommonService.get_ip_address(request)
+        uid = request_dict.get('uid', None)
+
+        if None in [uid]:
+            return response.json(444)
+
+        LOGGER.info(f'900兆基站类型设备,uid={uid},位置={ip},开始修改通道名')
+        try:
+            uid_set_qs = UidSetModel.objects.filter(uid=uid).values('id').first()
+            if not uid_set_qs:
+                LOGGER.info(f"uid={uid},ip={ip},未查询到对应记录")
+                return response.json(0)
+
+            channel_list = UidChannelSetModel.objects.filter(uid_id=uid_set_qs['id']).values('channel')
+            for channel_qs in channel_list:
+                channel = channel_qs['channel']
+                channel_name = 'Channel {}'.format(channel)
+                UidChannelSetModel.objects.filter(uid_id=uid_set_qs['id'], channel=channel).update(channel_name=channel_name)
+
+            DeviceDailyReport.objects.filter(device_id=uid).delete()
+            LOGGER.info(f"uid={uid},ip={ip},通道名称修改成功")
+
+            return response.json(0)
+        except Exception as e:
+            LOGGER.error(f"{uid}修改通道名时发生错误: {str(e)}")
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))