浏览代码

添加云存流失预警功能

guanhailong 2 年之前
父节点
当前提交
716e0af47c
共有 1 个文件被更改,包括 102 次插入4 次删除
  1. 102 4
      AdminController/ServeManagementController.py

+ 102 - 4
AdminController/ServeManagementController.py

@@ -12,11 +12,12 @@ from django.utils.encoding import escape_uri_path
 from django.http import HttpResponse, StreamingHttpResponse
 from django.views.generic.base import View
 from Model.models import VodBucketModel, CDKcontextModel, Store_Meal, Order_Model, \
-    UID_Bucket, ExperienceContextModel, Lang, CloudLogModel, UidSetModel, Unused_Uid_Meal
+    UID_Bucket, ExperienceContextModel, Lang, CloudLogModel, UidSetModel, Unused_Uid_Meal, \
+    Device_Info, VodHlsModel
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
-from django.db.models import F, Sum, Count, Q
+from django.db.models import F, Sum, Count
 
 
 class serveManagement(View):
@@ -80,7 +81,7 @@ class serveManagement(View):
                 return self.getDeviceOrderList(request_dict, response)
             elif operation == 'deleteDeviceOrder':
                 return self.deleteDeviceOrder(userID, request_dict, response)
-            elif operation == 'getDevicePackageList':
+            elif operation == 'getDevicePackageList':  # 云存设备套餐
                 return self.getDevicePackageList(request_dict, response)
             elif operation == 'deleteDevicePackage':
                 return self.deleteDevicePackage(userID, request_dict, response)
@@ -88,6 +89,8 @@ class serveManagement(View):
                 return self.do_experience_reset(request_dict, userID, response)
             elif operation == 'getCloudUserList':  # 获取云存用户信息
                 return self.getCloudUserList(request_dict, response)
+            elif operation == 'deviceAttritionAlert':  # 流失预警
+                return self.deviceAttritionAlert(request_dict, response)
             else:
                 return response.json(404)
 
@@ -857,7 +860,8 @@ class serveManagement(View):
         else:
             return response.json(0, '重置云存体验失败')
 
-    def getCloudUserList(self, request_dict, response):
+    @classmethod
+    def getCloudUserList(cls, request_dict, response):
         print('request_dict: ', request_dict)
 
         # UID_Bucket表查询数据
@@ -989,6 +993,17 @@ class serveManagement(View):
                         endTime = time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(endTime))
                     else:
                         endTime = time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(uid_bucket.endTime))
+                    nowTime = int(time.time())
+                    Time = time.strptime(endTime, "%Y--%m--%d %H:%M:%S")
+                    Time = time.mktime(Time)
+                    nowTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(nowTime))
+                    if nowTime < endTime:
+                        Time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(Time))
+                        nowTime = datetime.datetime.strptime(nowTime, '%Y-%m-%d %H:%M:%S')
+                        Time = datetime.datetime.strptime(Time, '%Y-%m-%d %H:%M:%S')
+                        expirationDate = (Time - nowTime).days
+                    else:
+                        expirationDate = 0
 
                     uid = uid_bucket.uid.upper()
                     data = {
@@ -997,6 +1012,7 @@ class serveManagement(View):
                         'channel': uid_bucket.channel,
                         'status': uid_bucket.status,
                         'endTime': endTime,
+                        'ExpirationDate': expirationDate,
                         'addTime': time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(uid_bucket.addTime)),
                         'use_status': uid_bucket.use_status,
                         'has_unused': uid_bucket.has_unused,
@@ -1292,3 +1308,85 @@ class serveManagement(View):
         except Exception as e:
             print(e)
             return response.json(500, repr(e))
+
+    @classmethod
+    def deviceAttritionAlert(cls, request_dict, response):
+        """
+        流失预警界面
+        @param request_dict:
+        @param response:
+        """
+        pageNo = request_dict.get('pageNo', None)
+        pageSize = request_dict.get('pageSize', None)
+        use_status = request_dict.get('use_status', None)
+        if not all([pageNo, pageSize]):
+            return response.json(444)
+        page = int(pageNo)
+        line = int(pageSize)
+        nowTime = int(time.time())
+        test_list = []
+        r = 0
+        uid_buncket_qs = UID_Bucket.objects.filter(status=0).values('use_status', 'uid', 'endTime', 'addTime',
+                                                                    'use_status').annotate(count=Count('uid'))
+        if use_status:
+            uid_buncket_qs = uid_buncket_qs.filter(use_status=use_status)
+        uid_buncket_qs = uid_buncket_qs[(page - 1) * line:page * line]
+        try:
+            for uid_buncket in uid_buncket_qs:
+                data = {
+                    'uid': uid_buncket['uid'],
+                    'endTime': uid_buncket['endTime'],
+                    'addTime': uid_buncket['addTime'],
+                    'status': uid_buncket['use_status'],
+                }
+                day = 0
+                device_info = Device_Info.objects.filter(UID=uid_buncket['uid']).values('userID__username')
+                data['username'] = device_info[0]['userID__username'] if device_info.exists() else ''
+                start_time = uid_buncket['addTime']
+                start_time = datetime.datetime.fromtimestamp(int(start_time))
+                r += 1
+                if r > 1:
+                    nowTime = str(nowTime)
+                    time_tuple = time.strptime(nowTime, ('%Y-%m-%d %H:%M:%S'))
+                    nowTime = time.mktime(time_tuple) # 把格式化好的时间转换成时间戳
+                nowTime = datetime.datetime.fromtimestamp(int(nowTime))
+                time_list = CommonService.cutting_time(start_time, nowTime, 'day')
+                vod_hls_qs = VodHlsModel.objects.filter(uid=uid_buncket['uid']).values('uid')
+                #  获取自云存开通起没有上传数据天数
+                for date in time_list:
+                    vod_hls_qs = vod_hls_qs.filter(time__gte=date[0], time__lt=date[1])
+                    if not vod_hls_qs.exists():
+                        day += 1
+                        if day > 25:
+                            break
+                data['day'] = day
+                use_status = uid_buncket['use_status']
+                if use_status == 1:
+                    vod_hls_qs = VodHlsModel.objects.filter(uid=uid_buncket['uid']).values('uid')
+                    if 15<day<25:
+                        if vod_hls_qs.exists():
+                            data['level'] = '取消预警'
+                        else:
+                            data['level'] = '1号预警'
+                    else:
+                        data['level'] = '无预警'
+                    if day >25:
+                        if vod_hls_qs.exists():
+                            data['level'] = '取消预警'
+                        else:
+                            startTime = uid_buncket['addTime'] # 开始时间
+                            nowTime = str(nowTime)
+                            time_tuple = time.strptime(nowTime, ('%Y-%m-%d %H:%M:%S'))
+                            nowTime = time.mktime(time_tuple)  # 把格式化好的时间转换成时间戳
+                            startTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(startTime)) # 开始时间
+                            nowTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(nowTime)) # 结束时间
+                            startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M:%S') # 开始时间
+                            nowTime = datetime.datetime.strptime(nowTime, '%Y-%m-%d %H:%M:%S') # 结束时间
+                            data['day'] = (nowTime - startTime).days
+                            data['level'] = '2号预警'
+                else:
+                    data['level'] = '过期'
+                test_list.append(data)
+            return response.json(0, {'test_list': test_list})
+        except Exception as e:
+            return response.json(500)