瀏覽代碼

云存兼容阿里云

locky 2 周之前
父節點
當前提交
ef7ce24d4c

+ 14 - 4
AdminController/DeviceManagementController.py

@@ -34,6 +34,7 @@ from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
 from Service.EquipmentInfoService import EquipmentInfoService
 from Service.ModelService import ModelService
+from Service.VodHlsOssService import SplitVodHlsOssObject
 from Service.VodHlsService import SplitVodHlsObject
 from django.conf import settings
 AWS_ACCESS_KEY_ID = settings.AWS_ACCESS_KEY_ID
@@ -391,9 +392,11 @@ class DeviceManagement(View):
                 # Order_Model.objects.filter(UID=uid, order_type=0).delete()
                 StsCrdModel.objects.filter(uid=uid).delete()
                 VodHlsModel.objects.filter(uid=uid).delete()
-                # 删除vod_hls分表数据
+                # 删除云存分表数据
                 split_vod_hls_obj = SplitVodHlsObject()
                 split_vod_hls_obj.del_vod_hls_data(uid=uid)
+                split_vod_hls_oss_obj = SplitVodHlsOssObject()
+                split_vod_hls_oss_obj.del_vod_hls_data(uid=uid)
                 ExperienceContextModel.objects.filter(uid=uid).delete()
                 Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')
             return response.json(0)
@@ -583,6 +586,8 @@ class DeviceManagement(View):
                     # 删除vod_hls分表数据
                     split_vod_hls_obj = SplitVodHlsObject()
                     split_vod_hls_obj.del_vod_hls_data(uid__in=uidList)
+                    split_vod_hls_oss_obj = SplitVodHlsOssObject()
+                    split_vod_hls_oss_obj.del_vod_hls_data(uid__in=uidList)
                     Unused_Uid_Meal.objects.filter(uid__in=uidList).delete()
                     ExperienceContextModel.objects.filter(uid__in=uidList).delete()
                     # Order_Model.objects.filter(UID__in=uidList, order_type=0).delete()
@@ -906,9 +911,11 @@ class DeviceManagement(View):
                 # Order_Model.objects.filter(UID=uid, order_type=0).delete()
                 StsCrdModel.objects.filter(uid=uid).delete()
                 VodHlsModel.objects.filter(uid=uid).delete()
-                # 删除vod_hls分表数据
+                # 删除云存分表数据
                 split_vod_hls_obj = SplitVodHlsObject()
                 split_vod_hls_obj.del_vod_hls_data(uid=uid)
+                split_vod_hls_oss_obj = SplitVodHlsOssObject()
+                split_vod_hls_oss_obj.del_vod_hls_data(uid=uid)
                 ExperienceContextModel.objects.filter(uid=uid).delete()
                 # 删除AI
                 ExperienceAiModel.objects.filter(uid=uid).delete()
@@ -1551,6 +1558,7 @@ class DeviceManagement(View):
                         'supportsPTZ': device_ver_info.supports_ptz,
                         'supportsAi': device_ver_info.supports_ai,
                         'supportsCloudStorage': device_ver_info.supports_cloud_storage,
+                        'vodLocation': device_ver_info.vod_location,
                         'supportsAlexa': device_ver_info.supports_alexa,
                         'deviceType': device_ver_info.device_type,
                         'resolution': device_ver_info.resolution,
@@ -1602,7 +1610,7 @@ class DeviceManagement(View):
         electricity_statistics = request_dict.get('electricityStatistics', 0)
         supports_pet_tracking = request_dict.get('supportsPetTracking', 0)
         has_4g_cloud = request_dict.get('has4gCloud', -1)
-
+        vod_location = int(request_dict.get('vodLocation', 0))
 
         if not all([d_code, software_ver, video_code,
                     device_type, supports_alarm,
@@ -1646,6 +1654,7 @@ class DeviceManagement(View):
                 electricity_statistics=electricity_statistics,
                 supports_pet_tracking=supports_pet_tracking,
                 has_4g_cloud=has_4g_cloud,
+                vod_location=vod_location,
                 created_time=now_time,
                 updated_time=now_time
             )
@@ -1680,7 +1689,7 @@ class DeviceManagement(View):
         electricity_statistics = request_dict.get('electricityStatistics', 0)
         supports_pet_tracking = request_dict.get('supportsPetTracking', 0)
         has_4g_cloud = request_dict.get('has4gCloud', -1)
-
+        vod_location = int(request_dict.get('vodLocation', 0))
 
         if not all([device_ver_id, video_code, device_type, supports_alarm, screen_channels, network_type]):
             return response.json(444)
@@ -1731,6 +1740,7 @@ class DeviceManagement(View):
                 electricity_statistics=electricity_statistics,
                 supports_pet_tracking=supports_pet_tracking,
                 has_4g_cloud=has_4g_cloud,
+                vod_location=vod_location,
                 created_time=now_time,
                 updated_time=now_time
             )

+ 27 - 3
Ansjer/cn_config/formal_settings.py

@@ -59,7 +59,8 @@ INSTALLED_APPS = [
     'PushModel',
     'django_apscheduler',
     'AgentModel',
-    'Roomumy'
+    'Roomumy',
+    'VodHlsOssModel'
 ]
 
 MIDDLEWARE = [
@@ -139,6 +140,12 @@ SERVER_HOST4 = os.getenv('SERVER_HOST4')
 DATABASES_USER4 = os.getenv('DATABASES_USER4')
 DATABASES_PASS4 = os.getenv('DATABASES_PASS4')
 
+# OSS云存分表数据库
+DATABASE_DATA5 = os.getenv('DATABASE_DATA5')
+SERVER_HOST5 = os.getenv('SERVER_HOST5')
+DATABASES_USER5 = os.getenv('DATABASES_USER5')
+DATABASES_PASS5 = os.getenv('DATABASES_PASS5')
+
 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.mysql',
@@ -198,15 +205,32 @@ DATABASES = {
             'use_unicode': True,
             'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
         }
-    }
+    },
+    'mysql05': {
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': DATABASE_DATA5,
+        'USER': DATABASES_USER5,
+        'PASSWORD': DATABASES_PASS5,
+        'HOST': SERVER_HOST5,
+        'PORT': '3306',
+        'AUTOCOMMIT': True,
+        'CONN_MAX_AGE': 60,
+        'OPTIONS': {
+            'charset': 'utf8mb4',
+            'use_unicode': True,
+            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
+        }
+    },
 }
+
 DATABASE_ROUTERS = ['Ansjer.database_router.DatabaseAppsRouter']
 DATABASE_APPS_MAPPING = {
     'Model': 'default',
     'PushModel': 'mysql02',
     'django_apscheduler': 'default',
     'AgentModel': 'mysql03',
-    'Roomumy': 'mysql04'
+    'Roomumy': 'mysql04',
+    'VodHlsOssModel': 'mysql05'
 }
 
 AUTH_PASSWORD_VALIDATORS = [

+ 11 - 0
Ansjer/cn_config/test_settings.py

@@ -28,6 +28,17 @@ OCI_TENANCY = env('OCI_TENANCY', default='')
 OCI_REGION = env.list('OCI_REGION', default=[])
 OCI_KEY_FILE = env('OCI_KEY_FILE', default='')
 OCI_NAMESPACE_NAME = env('OCI_NAMESPACE_NAME', default='')
+# 支付宝
+ALIPAY_PRI_KEY = env('ALIPAY_PRI_KEY', default='')
+ALIPAY_PUB_KEY = env('ALIPAY_PUB_KEY', default='')
+# 微信支付
+WX_APPID = env('WX_APPID', default='')
+WX_MCHID = env('WX_MCHID', default='')
+WX_APIKEY = env('WX_APIKEY', default='')
+WX_CERT = env('WX_CERT', default='')
+WX_KEY = env('WX_KEY', default='')
+# omni key
+OMNI_API_KEY = env('OMNI_API_KEY', default='')
 
 SECRET_KEY = 'c7ki2_gkg4#sjfm-u1%$s#&n#szf01f*v69rwv2qsf#-zmm@tl'
 DEBUG = True

+ 25 - 2
Ansjer/eur_config/formal_settings.py

@@ -58,7 +58,8 @@ INSTALLED_APPS = [
     'PushModel',
     'django_apscheduler',
     'AgentModel',
-    'Roomumy'
+    'Roomumy',
+    'VodHlsOssModel'
 ]
 
 MIDDLEWARE = [
@@ -137,6 +138,12 @@ SERVER_HOST4 = env('SERVER_HOST4')
 DATABASES_USER4 = env('DATABASES_USER4')
 DATABASES_PASS4 = env('DATABASES_PASS4')
 
+# OSS云存分表数据库
+DATABASE_DATA5 = env('DATABASE_DATA5')
+SERVER_HOST5 = env('SERVER_HOST5')
+DATABASES_USER5 = env('DATABASES_USER5')
+DATABASES_PASS5 = env('DATABASES_PASS5')
+
 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.mysql',
@@ -196,7 +203,22 @@ DATABASES = {
                 'use_unicode': True,
                 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
             }
+        },
+    'mysql05': {
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': DATABASE_DATA5,
+        'USER': DATABASES_USER5,
+        'PASSWORD': DATABASES_PASS5,
+        'HOST': SERVER_HOST5,
+        'PORT': '3306',
+        'AUTOCOMMIT': True,
+        'CONN_MAX_AGE': 60,
+        'OPTIONS': {
+            'charset': 'utf8mb4',
+            'use_unicode': True,
+            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
         }
+    },
 }
 DATABASE_ROUTERS = ['Ansjer.database_router.DatabaseAppsRouter']
 DATABASE_APPS_MAPPING = {
@@ -204,7 +226,8 @@ DATABASE_APPS_MAPPING = {
     'PushModel': 'mysql02',
     'django_apscheduler': 'default',
     'AgentModel': 'mysql03',
-    'Roomumy': 'mysql04'
+    'Roomumy': 'mysql04',
+    'VodHlsOssModel': 'mysql05'
 }
 
 AUTH_PASSWORD_VALIDATORS = [

+ 26 - 3
Ansjer/us_config/formal_settings.py

@@ -58,7 +58,8 @@ INSTALLED_APPS = [
     'PushModel',
     'django_apscheduler',
     'AgentModel',
-    'Roomumy'
+    'Roomumy',
+    'VodHlsOssModel'
 ]
 
 MIDDLEWARE = [
@@ -137,6 +138,12 @@ SERVER_HOST4 = env('SERVER_HOST4')
 DATABASES_USER4 = env('DATABASES_USER4')
 DATABASES_PASS4 = env('DATABASES_PASS4')
 
+# OSS云存分表数据库
+DATABASE_DATA5 = env('DATABASE_DATA5')
+SERVER_HOST5 = env('SERVER_HOST5')
+DATABASES_USER5 = env('DATABASES_USER5')
+DATABASES_PASS5 = env('DATABASES_PASS5')
+
 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.mysql',
@@ -196,7 +203,22 @@ DATABASES = {
                 'use_unicode': True,
                 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
             }
-    }
+    },
+    'mysql05': {
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': DATABASE_DATA5,
+        'USER': DATABASES_USER5,
+        'PASSWORD': DATABASES_PASS5,
+        'HOST': SERVER_HOST5,
+        'PORT': '3306',
+        'AUTOCOMMIT': True,
+        'CONN_MAX_AGE': 60,
+        'OPTIONS': {
+            'charset': 'utf8mb4',
+            'use_unicode': True,
+            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
+        }
+    },
 }
 DATABASE_ROUTERS = ['Ansjer.database_router.DatabaseAppsRouter']
 DATABASE_APPS_MAPPING = {
@@ -204,7 +226,8 @@ DATABASE_APPS_MAPPING = {
     'PushModel': 'mysql02',
     'django_apscheduler': 'default',
     'AgentModel': 'mysql03',
-    'Roomumy': 'mysql04'
+    'Roomumy': 'mysql04',
+    'VodHlsOssModel': 'mysql05'
 }
 
 

File diff suppressed because it is too large
+ 483 - 284
Controller/CloudStorage.py


+ 8 - 1
Controller/CloudTransfer.py

@@ -19,6 +19,7 @@ from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
 from Service.ModelService import ModelService
+from Service.VodHlsOssService import SplitVodHlsOssObject
 from Service.VodHlsService import SplitVodHlsObject
 from Ansjer.config import LOGGER
 
@@ -125,6 +126,8 @@ class cloudTestView(View):
                 # 删除vod_hls分表数据
                 split_vod_hls_obj = SplitVodHlsObject()
                 split_vod_hls_obj.del_vod_hls_data(uid=uid)
+                split_vod_hls_oss_obj = SplitVodHlsOssObject()
+                split_vod_hls_oss_obj.del_vod_hls_data(uid=uid)
                 if not serial_number:
                     serial_number = CommonService.query_serial_with_uid(uid)
                 u_dev_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number)
@@ -310,9 +313,13 @@ class cloudTestView(View):
                 # 更新转入设备的主用户信息
                 Device_Info.objects.filter(UID=new_uid).update(vodPrimaryUserID=vodPrimaryUserID,
                                                                vodPrimaryMaster=vodPrimaryMaster)
+                # 删除转入设备的vod_uid_bucket数据
+                UID_Bucket.objects.filter(uid=new_uid).delete()
                 # 更新正在使用套餐的uid,重置拥有未使用套餐
                 old_using_uid_bucket_id = old_using_uid_bucket[0]['id']
-                UID_Bucket.objects.filter(id=old_using_uid_bucket_id).update(uid=new_uid, has_unused=0)
+                UID_Bucket.objects.filter(id=old_using_uid_bucket_id).update(
+                    uid=new_uid, has_unused=0, addTime=nowTime, updateTime=nowTime)
+
                 StsCrdModel.objects.filter(uid=old_uid).delete()  # 删除转出设备stscrd表关联数据
                 # 转移AI服务
                 if old_ai_service.exists() and new_uid_set[0]['is_ai'] != 2:

+ 13 - 5
Controller/Cron/CronTaskController.py

@@ -39,6 +39,7 @@ from Object.ResponseObject import ResponseObject
 from Object.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
 from Service.EquipmentInfoService import EQUIPMENT_INFO_MODEL_LIST, EquipmentInfoService
+from Service.VodHlsOssService import SplitVodHlsOssObject
 from Service.VodHlsService import SplitVodHlsObject
 from Object.UnicomObject import UnicomObjeect
 from Object.WechatPayObject import WechatPayObject
@@ -371,9 +372,11 @@ class CronDelDataView(View):
             sql = 'DELETE FROM `vod_hls` WHERE endTime<{} LIMIT 50000'.format(month_ago_time)
             cursor.execute(sql)
             cursor.close()
-            # 删除vod_hls分表数据
+            # 删除云存分表数据
             split_vod_hls_obj = SplitVodHlsObject()
             split_vod_hls_obj.del_vod_hls_data(end_time__lt=month_ago_time)
+            split_vod_hls_oss_obj = SplitVodHlsOssObject()
+            split_vod_hls_oss_obj.del_vod_hls_data(end_time__lt=month_ago_time)
             return response.json(0)
         except Exception as e:
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
@@ -435,9 +438,11 @@ class CronDelDataView(View):
                 # Order_Model.objects.filter(UID__in=uid_list).delete()
                 StsCrdModel.objects.filter(uid__in=uid_list).delete()
                 VodHlsModel.objects.filter(uid__in=uid_list).delete()
-                # 删除vod_hls分表数据
+                # 删除云存分表数据
                 split_vod_hls_obj = SplitVodHlsObject()
                 split_vod_hls_obj.del_vod_hls_data(uid__in=uid_list)
+                split_vod_hls_oss_obj = SplitVodHlsOssObject()
+                split_vod_hls_oss_obj.del_vod_hls_data(uid__in=uid_list)
                 ExperienceContextModel.objects.filter(uid__in=uid_list).delete()
                 Device_Info.objects.filter(userID__in=device_user).delete()
             return response.json(0)
@@ -802,6 +807,8 @@ class CronUpdateDataView(View):
                 # 删除vod_hls分表数据
                 split_vod_hls_obj = SplitVodHlsObject()
                 split_vod_hls_obj.del_vod_hls_data(uid__in=uid_list)
+                split_vod_hls_oss_obj = SplitVodHlsOssObject()
+                split_vod_hls_oss_obj.del_vod_hls_data(uid__in=uid_list)
                 ExperienceContextModel.objects.filter(uid__in=uid_list).delete()
 
                 # 重置AI
@@ -1386,8 +1393,8 @@ class CronCollectDataView(View):
             print('结束')
         except Exception as e:
             LOGGER.info(
-                'thread_collect_operating_costs接口异常:errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
-
+                'thread_collect_operating_costs接口异常:errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno,
+                                                                                      repr(e)))
 
     @staticmethod
     def collect_obj_size(response):
@@ -1882,7 +1889,8 @@ class CronComparedDataView(View):
                     'order_id': order_id,
                     'pay_type': 3,
                     'price': order['订单金额'].replace('`', ''),
-                    'pay_time': int(datetime.datetime.strptime(order['\ufeff交易时间'], "`%Y-%m-%d %H:%M:%S").timestamp()),
+                    'pay_time': int(
+                        datetime.datetime.strptime(order['\ufeff交易时间'], "`%Y-%m-%d %H:%M:%S").timestamp()),
                     'upd_time': now_time,
                     'meal_name': order['商品名称'].replace('`', ''),
                 }

+ 9 - 4
Controller/DetectController.py

@@ -15,7 +15,6 @@ import logging
 import os
 import time
 
-import apns2
 import jpush as jpush
 import oss2
 from django.http import JsonResponse
@@ -33,6 +32,7 @@ from Object.UidTokenObject import UidTokenObject
 from Object.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
 from Service.EquipmentInfoService import EquipmentInfoService
+from Service.VodHlsOssService import SplitVodHlsOssObject
 from Service.VodHlsService import SplitVodHlsObject
 from django.conf import settings
 ALICLOUD_AK = settings.ALICLOUD_AK
@@ -140,10 +140,15 @@ class DetectControllerView(View):
                 elif p['is_st'] == 2:
                     # 列表装载回放时间戳标记
                     split_vod_hls_obj = SplitVodHlsObject()
-                    vodqs = split_vod_hls_obj.get_vod_hls_data(uid=devUid, channel=channel, start_time=int(eventTime)).values(
-                        "bucket_id")
+                    vodqs = split_vod_hls_obj.get_vod_hls_data(
+                        uid=devUid, channel=channel, start_time=int(eventTime)).values("bucket_id")
                     if not vodqs.exists():
-                        return response.json(173)
+                        vod_hls_oss_obj = SplitVodHlsOssObject()
+                        vodqs = vod_hls_oss_obj.get_vod_hls_data(
+                            uid=devUid, channel=channel, start_time=int(eventTime)).values("bucket_id")
+                        if not vodqs.exists():
+                            return response.json(173)
+
                     vod_bucket_qs = VodBucketModel.objects.filter(id=vodqs[0]['bucket_id']).values('bucket', 'endpoint')
                     if not vod_bucket_qs.exists():
                         return response.json(173)

+ 12 - 3
Controller/DetectControllerV2.py

@@ -26,6 +26,7 @@ from Object.TokenObject import TokenObject
 from Object.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
 from Service.EquipmentInfoService import EquipmentInfoService
+from Service.VodHlsOssService import SplitVodHlsOssObject
 from Service.VodHlsService import SplitVodHlsObject
 from django.conf import settings
 AWS_ACCESS_KEY_ID = settings.AWS_ACCESS_KEY_ID
@@ -509,7 +510,11 @@ class DetectControllerViewV2(View):
                     vodqs = split_vod_hls_obj.get_vod_hls_data(
                         uid=uid, channel=channel, start_time=int(event_time)).values('bucket_id')
                     if not vodqs.exists():
-                        return response.json(173)
+                        vod_hls_oss_obj = SplitVodHlsOssObject()
+                        vodqs = vod_hls_oss_obj.get_vod_hls_data(
+                            uid=uid, channel=channel, start_time=int(event_time)).values('bucket_id')
+                        if not vodqs.exists():
+                            return response.json(173)
                     vod_bucket_qs = VodBucketModel.objects.filter(id=vodqs[0]['bucket_id']).values('bucket', 'endpoint')
                     if not vod_bucket_qs.exists():
                         return response.json(173)
@@ -579,7 +584,6 @@ class DetectControllerViewV2(View):
                     equipment_info['ai_event_type_list'] = list(map(int, str(event_type)))
                 if EquipmentInfoService.is_combo_tag(event_type, event_tag):
                     equipment_info['ai_event_type_list'] += EquipmentInfoService.get_combo_types(event_type, event_tag)
-
                 res.append(equipment_info)
             return response.json(0, {'datas': res, 'count': count})
         except Exception as e:
@@ -834,7 +838,12 @@ class DetectControllerViewV2(View):
                     vodqs = split_vod_hls_obj.get_vod_hls_data(
                         uid=uid, channel=channel, start_time=int(event_time)).values('bucket_id')
                     if not vodqs.exists():
-                        return response.json(173)
+                        vod_hls_oss_obj = SplitVodHlsOssObject()
+                        vodqs = vod_hls_oss_obj.get_vod_hls_data(
+                            uid=uid, channel=channel, start_time=int(event_time)).values('bucket_id')
+                        if not vodqs.exists():
+                            return response.json(173)
+
                     vod_bucket_qs = VodBucketModel.objects.filter(id=vodqs[0]['bucket_id']).values('bucket', 'endpoint')
                     if not vod_bucket_qs.exists():
                         return response.json(173)

+ 5 - 0
Controller/UidSetController.py

@@ -29,6 +29,7 @@ from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
 from Service.ModelService import ModelService
+from Service.VodHlsOssService import SplitVodHlsOssObject
 from Service.VodHlsService import SplitVodHlsObject
 
 '''
@@ -165,6 +166,8 @@ class UidSetView(View):
                     # 删除vod_hls分表数据
                     split_vod_hls_obj = SplitVodHlsObject()
                     split_vod_hls_obj.del_vod_hls_data(uid__in=uid)
+                    split_vod_hls_oss_obj = SplitVodHlsOssObject()
+                    split_vod_hls_oss_obj.del_vod_hls_data(uid__in=uid)
                     ExperienceContextModel.objects.filter(uid__in=uid).delete()
                     Device_Info.objects.filter(UID__in=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')
                 if 'Device_Info' in id_list:
@@ -503,6 +506,8 @@ class UidSetView(View):
                     # 删除vod_hls分表数据
                     split_vod_hls_obj = SplitVodHlsObject()
                     split_vod_hls_obj.del_vod_hls_data(uid=uid)
+                    split_vod_hls_oss_obj = SplitVodHlsOssObject()
+                    split_vod_hls_oss_obj.del_vod_hls_data(uid=uid)
                     ExperienceContextModel.objects.filter(uid=uid).delete()
                     # UIDMainUser.objects.filter(UID=uid).delete()
                     Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')

+ 4 - 0
Model/models.py

@@ -1649,6 +1649,8 @@ class VodBucketModel(models.Model):
 
     mold = models.SmallIntegerField(default=0, verbose_name='存储区域类型')  # 0:国内阿里 1:国外aws
     region_id = models.IntegerField(default=1, verbose_name='大洲编号')
+    # 0: AWS, 1: 阿里云
+    vod_location = models.SmallIntegerField(default=0, verbose_name='云存位置')
 
     def __str__(self):
         return self.id
@@ -5231,6 +5233,8 @@ class DeviceVersionInfo(models.Model):
     electricity_statistics = models.IntegerField(default=0, verbose_name='电量显示')
     supports_pet_tracking = models.SmallIntegerField(default=0, verbose_name='是否支持宠物追踪')
     has_4g_cloud = models.SmallIntegerField(default=-1, verbose_name='-1:未配置,0:是4G但没云存,1:4G带云存')
+    # 0: AWS, 1: 阿里云
+    vod_location = models.SmallIntegerField(default=0, verbose_name='云存位置')
     created_time = models.IntegerField(default=0, verbose_name='创建时间')
     updated_time = models.IntegerField(default=0, verbose_name='更新时间')
 

+ 79 - 0
Object/AliOssUtil.py

@@ -0,0 +1,79 @@
+import traceback
+import oss2
+
+
+class AliOssUtil:
+    def __init__(self, access_key_id, access_key_secret, endpoint):
+        self.access_id = access_key_id
+        self.access_secret = access_key_secret
+        self.endpoint = endpoint
+        self.auth = oss2.Auth(access_key_id, access_key_secret)
+        
+    def upload_file_obj(self, bucket_name, file_key, file_obj, extra_args=None):
+        """
+        对象上传至OSS存储桶
+        @param bucket_name: 存储桶名称-必须
+        @param file_key: 需要上传文件路径+文件名称
+        @param file_obj: 文件对象
+        @param extra_args: 额外参数
+        @return: 当上传成功时为True;否则,False
+        """
+        try:
+            bucket = oss2.Bucket(self.auth, self.endpoint, bucket_name)
+            bucket.put_object(file_key, file_obj, headers=extra_args)
+            return True
+        except Exception as e:
+            print(e.args)
+            ex = traceback.format_exc()
+            print('具体错误{}'.format(ex))
+            return False
+
+    def generate_file_obj_url(self, bucket_name, file_key):
+        """
+        生成对象URL
+        @param bucket_name: 存储桶名称
+        @param file_key: 文件名称
+        @return: url
+        """
+        try:
+            bucket = oss2.Bucket(self.auth, self.endpoint, bucket_name)
+            # 设置URL过期时间为3600秒(1小时)
+            response_url = bucket.sign_url('GET', file_key, 3600)
+            return response_url
+        except Exception as e:
+            print(e.args)
+            ex = traceback.format_exc()
+            print('具体错误{}'.format(ex))
+            return ""
+
+    def delete_obj(self, bucket_name, file_key):
+        """
+        删除对象
+        @param bucket_name: 存储桶
+        @param file_key: 文件名称
+        @return: 当删除成功时为True;否则,False
+        """
+        try:
+            bucket = oss2.Bucket(self.auth, self.endpoint, bucket_name)
+            bucket.delete_object(file_key)
+            return True
+        except Exception as e:
+            print(e.args)
+            ex = traceback.format_exc()
+            print('具体错误{}'.format(ex))
+            return False
+
+    def bucket_exists(self, bucket_name):
+        """
+        判断桶是否存在,是否有访问权限
+        @param bucket_name: 存储桶
+        @return: 当桶存在且有权限时为True;否则,False
+        """
+        try:
+            bucket = oss2.Bucket(self.auth, self.endpoint, bucket_name)
+            return bucket.get_bucket_info() is not None
+        except Exception as e:
+            print(e.args)
+            ex = traceback.format_exc()
+            print('具体错误{}'.format(ex))
+            return False

+ 428 - 0
Service/VodHlsOssService.py

@@ -0,0 +1,428 @@
+# @Author    : Rocky
+# @File      : VodHlsOssService.py
+# @Time      : 2023/2/1 15:57
+import random
+from Ansjer.config import LOGGER
+from django.db import connection
+from django.db.models import Value, CharField, Count
+
+from Model.models import VodHlsTag
+from VodHlsOssModel.models import VodHlsOss01, VodHlsOss02, VodHlsOss03, VodHlsOss04, VodHlsOss05, VodHlsOss06, VodHlsOss07, VodHlsOss08, VodHlsOss09, \
+    VodHlsOss10, VodHlsOss11, VodHlsOss12, VodHlsOss13, VodHlsOss14, VodHlsOss15, VodHlsOss16, VodHlsOss17, VodHlsOss18, VodHlsOss19, VodHlsOss20, \
+    VodHlsOss21, VodHlsOss22, VodHlsOss23, VodHlsOss24, VodHlsOss25, VodHlsOss26, VodHlsOss27, VodHlsOss28, VodHlsOss29, VodHlsOss30, VodHlsOss31, \
+    VodHlsOss32, VodHlsOss33, VodHlsOss34, VodHlsOss35, VodHlsOss36, VodHlsOss37, VodHlsOss38, VodHlsOss39, VodHlsOss40
+
+Vod_Hls_List = [VodHlsOss01, VodHlsOss02, VodHlsOss03, VodHlsOss04, VodHlsOss05, VodHlsOss06, VodHlsOss07, VodHlsOss08, VodHlsOss09, VodHlsOss10,
+                VodHlsOss11, VodHlsOss12, VodHlsOss13, VodHlsOss14, VodHlsOss15, VodHlsOss16, VodHlsOss17, VodHlsOss18, VodHlsOss19, VodHlsOss20,
+                VodHlsOss21, VodHlsOss22, VodHlsOss23, VodHlsOss24, VodHlsOss25, VodHlsOss26, VodHlsOss27, VodHlsOss28, VodHlsOss29, VodHlsOss30,
+                VodHlsOss31, VodHlsOss32, VodHlsOss33, VodHlsOss34, VodHlsOss35, VodHlsOss36, VodHlsOss37, VodHlsOss38, VodHlsOss39, VodHlsOss40]
+
+
+class SplitVodHlsOssObject:
+    # VodHlsOss分表功能类
+
+    @staticmethod
+    def creat_vod_hls_data(**kwargs):
+        """
+        分表保存云存信息数据
+        """
+        vod_hls_model = random.choice(Vod_Hls_List)
+        tal_num = Vod_Hls_List.index(vod_hls_model) + 1
+        vod_hls_obj = vod_hls_model.objects.create(**kwargs)
+        return vod_hls_obj, tal_num
+
+    @staticmethod
+    def del_vod_hls_data(**kwargs):
+        """
+        分表删除云存信息数据
+        """
+        if 'id__in' in kwargs and 'uid' in kwargs:
+            uid = kwargs['uid']
+            for vod_id in kwargs['id__in']:
+                tal_index = int(vod_id[:2]) - 11
+                temp_id = vod_id[2:]
+                Vod_Hls_List[tal_index].objects.filter(id=temp_id, uid=uid).delete()
+        else:
+            for model in Vod_Hls_List:
+                model.objects.filter(**kwargs).delete()
+
+    def get_vod_hls_data(self, **kwargs):
+        """
+        分表获取云存信息数据
+        @return: vod_hls
+        """
+        if 'type_list' in kwargs and kwargs['type_list']:
+            kwargs = self.vod_query_param(**kwargs)
+            if 'id__in' in kwargs:
+                if 1 in kwargs['id__in']:
+                    vod_hls_01 = VodHlsOss01.objects.filter(id__in=kwargs['id__in'][1]).annotate(
+                        tab_val=Value('11', output_field=CharField()))
+                else:
+                    vod_hls_01 = VodHlsOss01.objects.none().annotate(tab_val=Value('11', output_field=CharField()))
+                if 2 in kwargs['id__in']:
+                    vod_hls_02 = VodHlsOss02.objects.filter(id__in=kwargs['id__in'][2]).annotate(
+                        tab_val=Value('12', output_field=CharField()))
+                else:
+                    vod_hls_02 = VodHlsOss02.objects.none().annotate(tab_val=Value('12', output_field=CharField()))
+                if 3 in kwargs['id__in']:
+                    vod_hls_03 = VodHlsOss03.objects.filter(id__in=kwargs['id__in'][3]).annotate(
+                        tab_val=Value('13', output_field=CharField()))
+                else:
+                    vod_hls_03 = VodHlsOss03.objects.none().annotate(tab_val=Value('13', output_field=CharField()))
+                if 4 in kwargs['id__in']:
+                    vod_hls_04 = VodHlsOss04.objects.filter(id__in=kwargs['id__in'][4]).annotate(
+                        tab_val=Value('14', output_field=CharField()))
+                else:
+                    vod_hls_04 = VodHlsOss04.objects.none().annotate(tab_val=Value('14', output_field=CharField()))
+                if 5 in kwargs['id__in']:
+                    vod_hls_05 = VodHlsOss05.objects.filter(id__in=kwargs['id__in'][5]).annotate(
+                        tab_val=Value('15', output_field=CharField()))
+                else:
+                    vod_hls_05 = VodHlsOss05.objects.none().annotate(tab_val=Value('15', output_field=CharField()))
+                if 6 in kwargs['id__in']:
+                    vod_hls_06 = VodHlsOss06.objects.filter(id__in=kwargs['id__in'][6]).annotate(
+                        tab_val=Value('16', output_field=CharField()))
+                else:
+                    vod_hls_06 = VodHlsOss06.objects.none().annotate(tab_val=Value('16', output_field=CharField()))
+                if 7 in kwargs['id__in']:
+                    vod_hls_07 = VodHlsOss07.objects.filter(id__in=kwargs['id__in'][7]).annotate(
+                        tab_val=Value('17', output_field=CharField()))
+                else:
+                    vod_hls_07 = VodHlsOss07.objects.none().annotate(tab_val=Value('17', output_field=CharField()))
+                if 8 in kwargs['id__in']:
+                    vod_hls_08 = VodHlsOss08.objects.filter(id__in=kwargs['id__in'][8]).annotate(
+                        tab_val=Value('18', output_field=CharField()))
+                else:
+                    vod_hls_08 = VodHlsOss08.objects.none().annotate(tab_val=Value('18', output_field=CharField()))
+                if 9 in kwargs['id__in']:
+                    vod_hls_09 = VodHlsOss09.objects.filter(id__in=kwargs['id__in'][9]).annotate(
+                        tab_val=Value('19', output_field=CharField()))
+                else:
+                    vod_hls_09 = VodHlsOss09.objects.none().annotate(tab_val=Value('19', output_field=CharField()))
+                if 10 in kwargs['id__in']:
+                    vod_hls_10 = VodHlsOss10.objects.filter(id__in=kwargs['id__in'][10]).annotate(
+                        tab_val=Value('20', output_field=CharField()))
+                else:
+                    vod_hls_10 = VodHlsOss10.objects.none().annotate(tab_val=Value('20', output_field=CharField()))
+                if 11 in kwargs['id__in']:
+                    vod_hls_11 = VodHlsOss11.objects.filter(id__in=kwargs['id__in'][11]).annotate(
+                        tab_val=Value('21', output_field=CharField()))
+                else:
+                    vod_hls_11 = VodHlsOss11.objects.none().annotate(tab_val=Value('21', output_field=CharField()))
+                if 12 in kwargs['id__in']:
+                    vod_hls_12 = VodHlsOss12.objects.filter(id__in=kwargs['id__in'][12]).annotate(
+                        tab_val=Value('22', output_field=CharField()))
+                else:
+                    vod_hls_12 = VodHlsOss12.objects.none().annotate(tab_val=Value('22', output_field=CharField()))
+                if 13 in kwargs['id__in']:
+                    vod_hls_13 = VodHlsOss13.objects.filter(id__in=kwargs['id__in'][13]).annotate(
+                        tab_val=Value('23', output_field=CharField()))
+                else:
+                    vod_hls_13 = VodHlsOss13.objects.none().annotate(tab_val=Value('23', output_field=CharField()))
+                if 14 in kwargs['id__in']:
+                    vod_hls_14 = VodHlsOss14.objects.filter(id__in=kwargs['id__in'][14]).annotate(
+                        tab_val=Value('24', output_field=CharField()))
+                else:
+                    vod_hls_14 = VodHlsOss14.objects.none().annotate(tab_val=Value('24', output_field=CharField()))
+                if 15 in kwargs['id__in']:
+                    vod_hls_15 = VodHlsOss15.objects.filter(id__in=kwargs['id__in'][15]).annotate(
+                        tab_val=Value('25', output_field=CharField()))
+                else:
+                    vod_hls_15 = VodHlsOss15.objects.none().annotate(tab_val=Value('25', output_field=CharField()))
+                if 16 in kwargs['id__in']:
+                    vod_hls_16 = VodHlsOss16.objects.filter(id__in=kwargs['id__in'][16]).annotate(
+                        tab_val=Value('26', output_field=CharField()))
+                else:
+                    vod_hls_16 = VodHlsOss16.objects.none().annotate(tab_val=Value('26', output_field=CharField()))
+                if 17 in kwargs['id__in']:
+                    vod_hls_17 = VodHlsOss17.objects.filter(id__in=kwargs['id__in'][17]).annotate(
+                        tab_val=Value('27', output_field=CharField()))
+                else:
+                    vod_hls_17 = VodHlsOss17.objects.none().annotate(tab_val=Value('27', output_field=CharField()))
+                if 18 in kwargs['id__in']:
+                    vod_hls_18 = VodHlsOss18.objects.filter(id__in=kwargs['id__in'][18]).annotate(
+                        tab_val=Value('28', output_field=CharField()))
+                else:
+                    vod_hls_18 = VodHlsOss18.objects.none().annotate(tab_val=Value('28', output_field=CharField()))
+                if 19 in kwargs['id__in']:
+                    vod_hls_19 = VodHlsOss19.objects.filter(id__in=kwargs['id__in'][19]).annotate(
+                        tab_val=Value('29', output_field=CharField()))
+                else:
+                    vod_hls_19 = VodHlsOss19.objects.none().annotate(tab_val=Value('29', output_field=CharField()))
+                if 20 in kwargs['id__in']:
+                    vod_hls_20 = VodHlsOss20.objects.filter(id__in=kwargs['id__in'][20]).annotate(
+                        tab_val=Value('30', output_field=CharField()))
+                else:
+                    vod_hls_20 = VodHlsOss20.objects.none().annotate(tab_val=Value('30', output_field=CharField()))
+                if 21 in kwargs['id__in']:
+                    vod_hls_21 = VodHlsOss21.objects.filter(id__in=kwargs['id__in'][21]).annotate(
+                        tab_val=Value('31', output_field=CharField()))
+                else:
+                    vod_hls_21 = VodHlsOss21.objects.none().annotate(tab_val=Value('31', output_field=CharField()))
+                if 22 in kwargs['id__in']:
+                    vod_hls_22 = VodHlsOss22.objects.filter(id__in=kwargs['id__in'][22]).annotate(
+                        tab_val=Value('32', output_field=CharField()))
+                else:
+                    vod_hls_22 = VodHlsOss22.objects.none().annotate(tab_val=Value('32', output_field=CharField()))
+                if 23 in kwargs['id__in']:
+                    vod_hls_23 = VodHlsOss23.objects.filter(id__in=kwargs['id__in'][23]).annotate(
+                        tab_val=Value('33', output_field=CharField()))
+                else:
+                    vod_hls_23 = VodHlsOss23.objects.none().annotate(tab_val=Value('33', output_field=CharField()))
+                if 24 in kwargs['id__in']:
+                    vod_hls_24 = VodHlsOss24.objects.filter(id__in=kwargs['id__in'][24]).annotate(
+                        tab_val=Value('34', output_field=CharField()))
+                else:
+                    vod_hls_24 = VodHlsOss24.objects.none().annotate(tab_val=Value('34', output_field=CharField()))
+                if 25 in kwargs['id__in']:
+                    vod_hls_25 = VodHlsOss25.objects.filter(id__in=kwargs['id__in'][25]).annotate(
+                        tab_val=Value('35', output_field=CharField()))
+                else:
+                    vod_hls_25 = VodHlsOss25.objects.none().annotate(tab_val=Value('35', output_field=CharField()))
+                if 26 in kwargs['id__in']:
+                    vod_hls_26 = VodHlsOss26.objects.filter(id__in=kwargs['id__in'][26]).annotate(
+                        tab_val=Value('36', output_field=CharField()))
+                else:
+                    vod_hls_26 = VodHlsOss26.objects.none().annotate(tab_val=Value('36', output_field=CharField()))
+                if 27 in kwargs['id__in']:
+                    vod_hls_27 = VodHlsOss27.objects.filter(id__in=kwargs['id__in'][27]).annotate(
+                        tab_val=Value('37', output_field=CharField()))
+                else:
+                    vod_hls_27 = VodHlsOss27.objects.none().annotate(tab_val=Value('37', output_field=CharField()))
+                if 28 in kwargs['id__in']:
+                    vod_hls_28 = VodHlsOss28.objects.filter(id__in=kwargs['id__in'][28]).annotate(
+                        tab_val=Value('38', output_field=CharField()))
+                else:
+                    vod_hls_28 = VodHlsOss28.objects.none().annotate(tab_val=Value('38', output_field=CharField()))
+                if 29 in kwargs['id__in']:
+                    vod_hls_29 = VodHlsOss29.objects.filter(id__in=kwargs['id__in'][29]).annotate(
+                        tab_val=Value('39', output_field=CharField()))
+                else:
+                    vod_hls_29 = VodHlsOss29.objects.none().annotate(tab_val=Value('39', output_field=CharField()))
+                if 30 in kwargs['id__in']:
+                    vod_hls_30 = VodHlsOss30.objects.filter(id__in=kwargs['id__in'][30]).annotate(
+                        tab_val=Value('40', output_field=CharField()))
+                else:
+                    vod_hls_30 = VodHlsOss30.objects.none().annotate(tab_val=Value('40', output_field=CharField()))
+                if 31 in kwargs['id__in']:
+                    vod_hls_31 = VodHlsOss31.objects.filter(id__in=kwargs['id__in'][31]).annotate(
+                        tab_val=Value('41', output_field=CharField()))
+                else:
+                    vod_hls_31 = VodHlsOss31.objects.none().annotate(tab_val=Value('41', output_field=CharField()))
+                if 32 in kwargs['id__in']:
+                    vod_hls_32 = VodHlsOss32.objects.filter(id__in=kwargs['id__in'][32]).annotate(
+                        tab_val=Value('42', output_field=CharField()))
+                else:
+                    vod_hls_32 = VodHlsOss32.objects.none().annotate(tab_val=Value('42', output_field=CharField()))
+                if 33 in kwargs['id__in']:
+                    vod_hls_33 = VodHlsOss33.objects.filter(id__in=kwargs['id__in'][33]).annotate(
+                        tab_val=Value('43', output_field=CharField()))
+                else:
+                    vod_hls_33 = VodHlsOss33.objects.none().annotate(tab_val=Value('43', output_field=CharField()))
+                if 34 in kwargs['id__in']:
+                    vod_hls_34 = VodHlsOss34.objects.filter(id__in=kwargs['id__in'][34]).annotate(
+                        tab_val=Value('44', output_field=CharField()))
+                else:
+                    vod_hls_34 = VodHlsOss34.objects.none().annotate(tab_val=Value('44', output_field=CharField()))
+                if 35 in kwargs['id__in']:
+                    vod_hls_35 = VodHlsOss35.objects.filter(id__in=kwargs['id__in'][35]).annotate(
+                        tab_val=Value('45', output_field=CharField()))
+                else:
+                    vod_hls_35 = VodHlsOss35.objects.none().annotate(tab_val=Value('45', output_field=CharField()))
+                if 36 in kwargs['id__in']:
+                    vod_hls_36 = VodHlsOss36.objects.filter(id__in=kwargs['id__in'][36]).annotate(
+                        tab_val=Value('46', output_field=CharField()))
+                else:
+                    vod_hls_36 = VodHlsOss36.objects.none().annotate(tab_val=Value('46', output_field=CharField()))
+                if 37 in kwargs['id__in']:
+                    vod_hls_37 = VodHlsOss37.objects.filter(id__in=kwargs['id__in'][37]).annotate(
+                        tab_val=Value('47', output_field=CharField()))
+                else:
+                    vod_hls_37 = VodHlsOss37.objects.none().annotate(tab_val=Value('47', output_field=CharField()))
+                if 38 in kwargs['id__in']:
+                    vod_hls_38 = VodHlsOss38.objects.filter(id__in=kwargs['id__in'][38]).annotate(
+                        tab_val=Value('48', output_field=CharField()))
+                else:
+                    vod_hls_38 = VodHlsOss38.objects.none().annotate(tab_val=Value('48', output_field=CharField()))
+                if 39 in kwargs['id__in']:
+                    vod_hls_39 = VodHlsOss39.objects.filter(id__in=kwargs['id__in'][39]).annotate(
+                        tab_val=Value('49', output_field=CharField()))
+                else:
+                    vod_hls_39 = VodHlsOss39.objects.none().annotate(tab_val=Value('49', output_field=CharField()))
+                if 40 in kwargs['id__in']:
+                    vod_hls_40 = VodHlsOss40.objects.filter(id__in=kwargs['id__in'][40]).annotate(
+                        tab_val=Value('50', output_field=CharField()))
+                else:
+                    vod_hls_40 = VodHlsOss40.objects.none().annotate(tab_val=Value('50', output_field=CharField()))
+                vod_hls_union = vod_hls_01.union(vod_hls_02, vod_hls_03, vod_hls_04, vod_hls_05, vod_hls_06, vod_hls_07,
+                                                 vod_hls_08, vod_hls_09, vod_hls_10, vod_hls_11, vod_hls_12, vod_hls_13,
+                                                 vod_hls_14, vod_hls_15, vod_hls_16, vod_hls_17, vod_hls_18, vod_hls_19,
+                                                 vod_hls_20, vod_hls_21, vod_hls_22, vod_hls_23, vod_hls_24, vod_hls_25,
+                                                 vod_hls_26, vod_hls_27, vod_hls_28, vod_hls_29, vod_hls_30, vod_hls_31,
+                                                 vod_hls_32, vod_hls_33, vod_hls_34, vod_hls_35, vod_hls_36, vod_hls_37,
+                                                 vod_hls_38, vod_hls_39, vod_hls_40, all=True)
+            else:
+                vod_hls_union = VodHlsOss01.objects.none().annotate(tab_val=Value('11', output_field=CharField()))
+        else:
+            if 'type_list' in kwargs:
+                kwargs.pop('type_list')
+            vod_hls_01 = VodHlsOss01.objects.filter(**kwargs).annotate(tab_val=Value('11', output_field=CharField()))
+            vod_hls_02 = VodHlsOss02.objects.filter(**kwargs).annotate(tab_val=Value('12', output_field=CharField()))
+            vod_hls_03 = VodHlsOss03.objects.filter(**kwargs).annotate(tab_val=Value('13', output_field=CharField()))
+            vod_hls_04 = VodHlsOss04.objects.filter(**kwargs).annotate(tab_val=Value('14', output_field=CharField()))
+            vod_hls_05 = VodHlsOss05.objects.filter(**kwargs).annotate(tab_val=Value('15', output_field=CharField()))
+            vod_hls_06 = VodHlsOss06.objects.filter(**kwargs).annotate(tab_val=Value('16', output_field=CharField()))
+            vod_hls_07 = VodHlsOss07.objects.filter(**kwargs).annotate(tab_val=Value('17', output_field=CharField()))
+            vod_hls_08 = VodHlsOss08.objects.filter(**kwargs).annotate(tab_val=Value('18', output_field=CharField()))
+            vod_hls_09 = VodHlsOss09.objects.filter(**kwargs).annotate(tab_val=Value('19', output_field=CharField()))
+            vod_hls_10 = VodHlsOss10.objects.filter(**kwargs).annotate(tab_val=Value('20', output_field=CharField()))
+            vod_hls_11 = VodHlsOss11.objects.filter(**kwargs).annotate(tab_val=Value('21', output_field=CharField()))
+            vod_hls_12 = VodHlsOss12.objects.filter(**kwargs).annotate(tab_val=Value('22', output_field=CharField()))
+            vod_hls_13 = VodHlsOss13.objects.filter(**kwargs).annotate(tab_val=Value('23', output_field=CharField()))
+            vod_hls_14 = VodHlsOss14.objects.filter(**kwargs).annotate(tab_val=Value('24', output_field=CharField()))
+            vod_hls_15 = VodHlsOss15.objects.filter(**kwargs).annotate(tab_val=Value('25', output_field=CharField()))
+            vod_hls_16 = VodHlsOss16.objects.filter(**kwargs).annotate(tab_val=Value('26', output_field=CharField()))
+            vod_hls_17 = VodHlsOss17.objects.filter(**kwargs).annotate(tab_val=Value('27', output_field=CharField()))
+            vod_hls_18 = VodHlsOss18.objects.filter(**kwargs).annotate(tab_val=Value('28', output_field=CharField()))
+            vod_hls_19 = VodHlsOss19.objects.filter(**kwargs).annotate(tab_val=Value('29', output_field=CharField()))
+            vod_hls_20 = VodHlsOss20.objects.filter(**kwargs).annotate(tab_val=Value('30', output_field=CharField()))
+            vod_hls_21 = VodHlsOss21.objects.filter(**kwargs).annotate(tab_val=Value('31', output_field=CharField()))
+            vod_hls_22 = VodHlsOss22.objects.filter(**kwargs).annotate(tab_val=Value('32', output_field=CharField()))
+            vod_hls_23 = VodHlsOss23.objects.filter(**kwargs).annotate(tab_val=Value('33', output_field=CharField()))
+            vod_hls_24 = VodHlsOss24.objects.filter(**kwargs).annotate(tab_val=Value('34', output_field=CharField()))
+            vod_hls_25 = VodHlsOss25.objects.filter(**kwargs).annotate(tab_val=Value('35', output_field=CharField()))
+            vod_hls_26 = VodHlsOss26.objects.filter(**kwargs).annotate(tab_val=Value('36', output_field=CharField()))
+            vod_hls_27 = VodHlsOss27.objects.filter(**kwargs).annotate(tab_val=Value('37', output_field=CharField()))
+            vod_hls_28 = VodHlsOss28.objects.filter(**kwargs).annotate(tab_val=Value('38', output_field=CharField()))
+            vod_hls_29 = VodHlsOss29.objects.filter(**kwargs).annotate(tab_val=Value('39', output_field=CharField()))
+            vod_hls_30 = VodHlsOss30.objects.filter(**kwargs).annotate(tab_val=Value('40', output_field=CharField()))
+            vod_hls_31 = VodHlsOss31.objects.filter(**kwargs).annotate(tab_val=Value('41', output_field=CharField()))
+            vod_hls_32 = VodHlsOss32.objects.filter(**kwargs).annotate(tab_val=Value('42', output_field=CharField()))
+            vod_hls_33 = VodHlsOss33.objects.filter(**kwargs).annotate(tab_val=Value('43', output_field=CharField()))
+            vod_hls_34 = VodHlsOss34.objects.filter(**kwargs).annotate(tab_val=Value('44', output_field=CharField()))
+            vod_hls_35 = VodHlsOss35.objects.filter(**kwargs).annotate(tab_val=Value('45', output_field=CharField()))
+            vod_hls_36 = VodHlsOss36.objects.filter(**kwargs).annotate(tab_val=Value('46', output_field=CharField()))
+            vod_hls_37 = VodHlsOss37.objects.filter(**kwargs).annotate(tab_val=Value('47', output_field=CharField()))
+            vod_hls_38 = VodHlsOss38.objects.filter(**kwargs).annotate(tab_val=Value('48', output_field=CharField()))
+            vod_hls_39 = VodHlsOss39.objects.filter(**kwargs).annotate(tab_val=Value('49', output_field=CharField()))
+            vod_hls_40 = VodHlsOss40.objects.filter(**kwargs).annotate(tab_val=Value('50', output_field=CharField()))
+            vod_hls_union = vod_hls_01.union(vod_hls_02, vod_hls_03, vod_hls_04, vod_hls_05, vod_hls_06, vod_hls_07,
+                                             vod_hls_08, vod_hls_09, vod_hls_10, vod_hls_11, vod_hls_12, vod_hls_13,
+                                             vod_hls_14, vod_hls_15, vod_hls_16, vod_hls_17, vod_hls_18, vod_hls_19,
+                                             vod_hls_20, vod_hls_21, vod_hls_22, vod_hls_23, vod_hls_24, vod_hls_25,
+                                             vod_hls_26, vod_hls_27, vod_hls_28, vod_hls_29, vod_hls_30, vod_hls_31,
+                                             vod_hls_32, vod_hls_33, vod_hls_34, vod_hls_35, vod_hls_36, vod_hls_37,
+                                             vod_hls_38, vod_hls_39, vod_hls_40, all=True)
+
+        LOGGER.info('vod_hls_oss_union结果:{},kwargs:{}'.format(vod_hls_union.values(), kwargs))
+        return vod_hls_union
+
+    @staticmethod
+    def get_vod_hls_date(**kwargs):
+        """
+        分表获取云存日期信息数据
+        @return: vod_hls
+        """
+        vod_hls_union = VodHlsOss01.objects.none()
+        for vod_hls_model in Vod_Hls_List:
+            vod_hls_union = vod_hls_union.union(vod_hls_model.objects.extra(
+                select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values('date', 'start_time').filter(
+                **kwargs).annotate(
+                count=Count('start_time')).order_by('-date'))
+        result = {}
+        for item in vod_hls_union:
+            if item['date'] not in result:
+                result[item['date']] = item['count']
+            else:
+                result[item['date']] += item['count']
+        res = []
+        for key, value in result.items():
+            res.append({'date': key, 'count': value})
+        return res
+
+    @classmethod
+    def cloud_vod_hls_tag(cls, vod_id, num, uid, start_time, sec):
+        """
+        云存回调信息关联标签
+        @param vod_id: 云存回放信息id
+        @param num: 云存所在表编号
+        @param uid: 设备UID
+        @param start_time: 云存开始时间
+        @param sec: 云存片段秒数
+        @return: True | False
+        """
+        try:
+            start_time = int(start_time)
+            end_time = start_time + sec
+            vod_tag_qs = VodHlsTag.objects.filter(ai_event_time__range=(start_time, end_time), uid=uid)
+            if not vod_tag_qs.exists():
+                return False
+            vod_tag_qs.update(vod_hls_id=vod_id, tab_num=num)
+            return True
+        except Exception as e:
+            print(
+                'cloud_vod_hls_tag异常详情,uid:{},errLine:{},errMsg:{}'.format(uid, e.__traceback__.tb_lineno, repr(e)))
+            return False
+
+    @classmethod
+    def vod_query_param(cls, **kwargs):
+        vod_ids = cls.query_tag_by_types(kwargs.get('uid'),
+                                         kwargs.get('start_time__range'),
+                                         kwargs.get('type_list'))
+        if vod_ids:
+            kwargs['id__in'] = vod_ids
+        kwargs.pop('type_list')
+        return kwargs
+
+    @classmethod
+    def query_tag_by_types(cls, uid, time, types):
+        """
+        根据类型查询云存标签关联ID
+        @return:
+        """
+        try:
+            if not types or len(types) == 0:
+                return {}
+            cursor = connection.cursor()
+            param_list = [int(time[0]), int(time[1]), uid]
+            sql = 'SELECT vod_hls_id, tab_num FROM '
+            sql += 'vod_hls_tag vht INNER JOIN vod_hls_tag_type vhtt ON vht.id = vhtt.tag_id '
+            sql += 'WHERE vht.ai_event_time >= %s AND vht.ai_event_time <= %s '
+            sql += 'AND vht.uid = %s '
+            if types:
+                sql += 'AND vhtt.type IN %s '
+                param_list.append(types)
+
+            cursor.execute(sql, param_list)
+            data_list = cursor.fetchall()
+            cursor.close()  # 执行完,关闭
+            connection.close()
+            data_dict = {}
+            for item in data_list:
+                if item[1] not in data_dict:
+                    data_dict[item[1]] = [item[0]]
+                else:
+                    data_dict[item[1]].append(item[0])
+            return data_dict
+        except Exception as e:
+            print('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return False
+
+    @classmethod
+    def query_tag_type_list(cls, vod_ids):
+        """
+        根据云存ID获取AI类型
+        @return:
+        """
+        try:
+            qs = VodHlsTag.objects.none()
+            for vod_id in vod_ids:
+                tab_val = int(vod_id[:2]) - 10
+                temp_id = vod_id[2:]
+                qs = qs.union(VodHlsTag.objects.filter(vod_hls_id=temp_id, tab_num=tab_val).values('id', 'vod_hls_id'))
+            if not qs:
+                return []
+            return list(qs)
+        except Exception as e:
+            print('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return []

+ 5 - 3
Service/VodHlsService.py

@@ -29,15 +29,17 @@ class SplitVodHlsObject:
         vod_hls_obj = vod_hls_model.objects.create(**kwargs)
         return vod_hls_obj, tal_num
 
-    def del_vod_hls_data(self, **kwargs):
+    @staticmethod
+    def del_vod_hls_data(**kwargs):
         """
         分表删除云存信息数据
         """
-        if 'id__in' in kwargs:
+        if 'id__in' in kwargs and 'uid' in kwargs:
+            uid = kwargs['uid']
             for vod_id in kwargs['id__in']:
                 tal_index = int(vod_id[:2]) - 11
                 temp_id = vod_id[2:]
-                Vod_Hls_List[tal_index].objects.filter(id=temp_id).delete()
+                Vod_Hls_List[tal_index].objects.filter(id=temp_id, uid=uid).delete()
         else:
             for model in Vod_Hls_List:
                 model.objects.filter(**kwargs).delete()

+ 0 - 0
VodHlsOssModel/__init__.py


+ 3 - 0
VodHlsOssModel/admin.py

@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.

+ 6 - 0
VodHlsOssModel/apps.py

@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class VodHlsOssModelConfig(AppConfig):
+    default_auto_field = 'django.db.models.BigAutoField'
+    name = 'VodHlsOssModel'

+ 302 - 0
VodHlsOssModel/models.py

@@ -0,0 +1,302 @@
+from django.db import models
+
+
+class VodHlsOssBase(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='主键')
+    uid = models.CharField(max_length=20, db_index=True, verbose_name='uid')
+    channel = models.SmallIntegerField(default=0, verbose_name='通道')
+    start_time = models.IntegerField(default=0, db_index=True, verbose_name='开始时间')
+    end_time = models.IntegerField(default=0, db_index=True, verbose_name='结束时间')
+    sec = models.IntegerField(default=0, verbose_name='秒数')
+    bucket_id = models.SmallIntegerField(default=1, blank=True, verbose_name='关联vod_bucket表id')
+    fg = models.CharField(default='', max_length=20, verbose_name='ts文件信息数据')
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'vod_hls_oss_base'
+        verbose_name = 'OSS云存回放信息表'
+        ordering = ('-id',)
+        abstract = True
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss01(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_01'
+        verbose_name = 'OSS云存回放信息表01'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss02(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_02'
+        verbose_name = 'OSS云存回放信息表02'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss03(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_03'
+        verbose_name = 'OSS云存回放信息表03'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss04(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_04'
+        verbose_name = 'OSS云存回放信息表04'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss05(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_05'
+        verbose_name = 'OSS云存回放信息表05'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss06(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_06'
+        verbose_name = 'OSS云存回放信息表06'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss07(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_07'
+        verbose_name = 'OSS云存回放信息表07'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss08(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_08'
+        verbose_name = 'OSS云存回放信息表08'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss09(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_09'
+        verbose_name = 'OSS云存回放信息表09'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss10(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_10'
+        verbose_name = 'OSS云存回放信息表10'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss11(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_11'
+        verbose_name = 'OSS云存回放信息表11'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss12(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_12'
+        verbose_name = 'OSS云存回放信息表12'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss13(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_13'
+        verbose_name = 'OSS云存回放信息表13'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss14(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_14'
+        verbose_name = 'OSS云存回放信息表14'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss15(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_15'
+        verbose_name = 'OSS云存回放信息表15'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss16(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_16'
+        verbose_name = 'OSS云存回放信息表16'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss17(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_17'
+        verbose_name = 'OSS云存回放信息表17'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss18(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_18'
+        verbose_name = 'OSS云存回放信息表18'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss19(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_19'
+        verbose_name = 'OSS云存回放信息表19'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss20(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_20'
+        verbose_name = 'OSS云存回放信息表20'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss21(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_21'
+        verbose_name = 'OSS云存回放信息表21'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss22(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_22'
+        verbose_name = 'OSS云存回放信息表22'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss23(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_23'
+        verbose_name = 'OSS云存回放信息表23'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss24(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_24'
+        verbose_name = 'OSS云存回放信息表24'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss25(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_25'
+        verbose_name = 'OSS云存回放信息表25'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss26(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_26'
+        verbose_name = 'OSS云存回放信息表26'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss27(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_27'
+        verbose_name = 'OSS云存回放信息表27'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss28(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_28'
+        verbose_name = 'OSS云存回放信息表28'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss29(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_29'
+        verbose_name = 'OSS云存回放信息表29'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss30(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_30'
+        verbose_name = 'OSS云存回放信息表30'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss31(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_31'
+        verbose_name = 'OSS云存回放信息表31'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss32(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_32'
+        verbose_name = 'OSS云存回放信息表32'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss33(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_33'
+        verbose_name = 'OSS云存回放信息表33'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss34(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_34'
+        verbose_name = 'OSS云存回放信息表34'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss35(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_35'
+        verbose_name = 'OSS云存回放信息表35'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss36(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_36'
+        verbose_name = 'OSS云存回放信息表36'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss37(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_37'
+        verbose_name = 'OSS云存回放信息表37'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss38(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_38'
+        verbose_name = 'OSS云存回放信息表38'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss39(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_39'
+        verbose_name = 'OSS云存回放信息表39'
+        app_label = 'VodHlsOssModel'
+
+
+class VodHlsOss40(VodHlsOssBase):
+    class Meta:
+        db_table = 'vod_hls_oss_40'
+        verbose_name = 'OSS云存回放信息表40'
+        app_label = 'VodHlsOssModel'

+ 3 - 0
VodHlsOssModel/tests.py

@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.

+ 3 - 0
VodHlsOssModel/views.py

@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.

Some files were not shown because too many files changed in this diff