فهرست منبع

定时处理vodhls表数据

peng 2 سال پیش
والد
کامیت
4ec02a977a
3فایلهای تغییر یافته به همراه63 افزوده شده و 12 حذف شده
  1. 19 3
      AdminController/dataSystemManagement/BusinessDataController.py
  2. 26 8
      Controller/Cron/CronTaskController.py
  3. 18 1
      Model/models.py

+ 19 - 3
AdminController/dataSystemManagement/BusinessDataController.py

@@ -11,7 +11,7 @@ import requests
 from django.db.models import Q, Count, Sum
 from django.views.generic.base import View
 
-from Model.models import VodHlsModel, VideoPlaybackTimeModel
+from Model.models import VodHlsModel, VideoPlaybackTimeModel, VodHlsSummary
 from Service.CommonService import CommonService
 
 
@@ -54,15 +54,31 @@ class BusinessDataView(View):
         if not all([start_time, end_time]):
             return response.json(444, {'error param': 'startTime or endTime'})
         try:
+            vod_hls_summary_qs = VodHlsSummary.objects.filter(time__range=(start_time, end_time)).values()
             vod_hls_qs = VodHlsModel.objects.filter(time__range=(start_time, end_time))
             video_play_qs = VideoPlaybackTimeModel.objects.filter(startTime__range=(start_time, end_time),
                                                                   playMode='could')
             upload_duration_qs = vod_hls_qs.values('uid').annotate(uploadFrequency=Count('uid')).order_by(
                 'uploadFrequency')
-            upload_device_count = len(upload_duration_qs)  # 上传设备数量
+            upload_device_count = len(upload_duration_qs) + len(vod_hls_summary_qs)  # 上传设备数量
             uid_list = []
             for item in upload_duration_qs:
                 item['uploadDuration'] = vod_hls_qs.filter(uid=item['uid']).aggregate(total=Sum('sec'))['total']
+            upload_duration_list = list(upload_duration_qs)
+            for each in vod_hls_summary_qs:
+                flag = 0
+                for item in upload_duration_list:
+                    if each['uid'] == item['uid']:
+                        item['uploadDuration'] += each['sec']
+                        item['uploadFrequency'] += each['upload_frequency']
+                        flag = 1
+                if flag == 0:
+                    upload_duration_list.append({
+                        'uid': each['uid'],
+                        'uploadDuration': each['sec'],
+                        'uploadFrequency': each['upload_frequency']
+                    })
+            for item in upload_duration_list:
                 item['playDuration'] = video_play_qs.filter(uid=item['uid']).aggregate(total=Sum('duration'))['total']
                 item['playDuration'] = item['playDuration'] if item['playDuration'] else 0
                 item['playFrequency'] = video_play_qs.filter(uid=item['uid'], playMode='cloud').count()
@@ -80,7 +96,7 @@ class BusinessDataView(View):
             res = {
                 'uploadDeviceCount': upload_device_count,
                 'playDeviceCount': play_device_count,
-                'vodData': list(upload_duration_qs) + list(play_duration_qs)
+                'vodData': upload_duration_list + list(play_duration_qs)
             }
             return response.json(0, res)
         except Exception as e:

+ 26 - 8
Controller/Cron/CronTaskController.py

@@ -15,7 +15,7 @@ from django.db.models import Q
 from django.views import View
 
 from Model.models import Device_User, Device_Info, UidSetModel, UID_Bucket, Unused_Uid_Meal, Order_Model, StsCrdModel, \
-    VodHlsModel, ExperienceContextModel, AiService
+    VodHlsModel, ExperienceContextModel, AiService, VodHlsSummary
 from Object.ResponseObject import ResponseObject
 from Object.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
@@ -104,14 +104,32 @@ class CronDelDataView(View):
     @staticmethod
     def delVodHls(response):
         nowTime = int(time.time())
-        cursor = connection.cursor()
+        # cursor = connection.cursor()
         try:
-            # 删除3个月前的数据
-            sql = "DELETE FROM `vod_hls` WHERE endTime<={} LIMIT 50000".format(
-                nowTime - 3 * 30 * 24 * 60 * 60)
-            cursor.execute(sql)
-            # 关闭游标
-            cursor.close()
+            with transaction.atomic():
+                month_ago_time = nowTime - 1 * 30 * 24 * 60 * 60
+                vod_hls_qs = VodHlsModel.objects.filter(endTime__lte=month_ago_time)
+                for vod_hls in vod_hls_qs:
+                    end_time = vod_hls.endTime
+                    end_time_str = datetime.datetime.fromtimestamp(int(end_time))
+                    this_month_start = datetime.datetime(end_time_str.year, end_time_str.month, 1)
+                    this_month_start_stamp = CommonService.str_to_timestamp(
+                        this_month_start.strftime('%Y-%m-%d %H:%M:%S'))
+                    vod_business_qs = VodHlsSummary.objects.filter(time=this_month_start_stamp, uid=vod_hls.uid)
+                    if vod_business_qs.exists():
+                        vod_business = vod_business_qs.first()
+                        vod_business.sec = vod_business.sec + vod_hls.sec
+                        vod_business.upload_frequency = vod_business.upload_frequency + 1
+                        vod_business.save()
+                    else:
+                        VodHlsSummary.objects.create(time=this_month_start_stamp, uid=vod_hls.uid, sec=vod_hls.sec)
+                    vod_hls.delete()
+                # # 删除1个月前的数据
+                # sql = "DELETE FROM `vod_hls` WHERE endTime<={} LIMIT 50000".format(
+                #     nowTime - 1 * 30 * 24 * 60 * 60)
+                # cursor.execute(sql)
+                # 关闭游标
+            # cursor.close()
             return response.json(0)
         except Exception as e:
             return response.json(500, repr(e))

+ 18 - 1
Model/models.py

@@ -671,7 +671,7 @@ class User_Brand(models.Model):
         ordering = ('id',)
 
 
-# 存储
+# 存储
 class VodBucketModel(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='主键')
     bucket = models.CharField(max_length=60, verbose_name='存储桶名称')
@@ -1037,6 +1037,23 @@ class VodHlsModel(models.Model):
         ordering = ('-id',)
 
 
+class VodHlsSummary(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='回放汇总列表主键')
+    uid = models.CharField(max_length=20, verbose_name='设备UID', db_index=True)
+    time = models.IntegerField(verbose_name='汇总年月时间戳', default=0, db_index=True)
+    sec = models.IntegerField(verbose_name='上传秒数', default=0)
+    upload_frequency = models.SmallIntegerField(verbose_name='上传次数', default=1)
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'vod_hls_summary'
+        verbose_name = u'云存回放汇总信息表'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+
+
 class OssCrdModel(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='主键')
     uid = models.CharField(max_length=20, verbose_name='设备UID')