Browse Source

新增流失导出功能;优化流失查询功能

guanhailong 2 years ago
parent
commit
f7aeae0d1a
1 changed files with 111 additions and 22 deletions
  1. 111 22
      AdminController/ServeManagementController.py

+ 111 - 22
AdminController/ServeManagementController.py

@@ -43,6 +43,8 @@ class serveManagement(View):
             return self.getCloudDataList(request_dict, response)
         elif operation == 'vodOrderReconcile':
             return self.vodOrderReconcile(request, request_dict, response)
+        elif operation == 'cloudDataExport':  # 导出流失预警
+            return self.cloudDataExport(request, response)
         else:
             tko = TokenObject(
                 request.META.get('HTTP_AUTHORIZATION'),
@@ -93,9 +95,9 @@ class serveManagement(View):
             elif operation == 'getCloudUserList':  # 获取云存用户信息
                 return self.getCloudUserList(request_dict, response)
             elif operation == 'deviceAttritionAlert':  # 流失预警
-                return self.deviceAttritionAlert(request_dict, response)
+                return self.deviceAttritionAlert(request_dict, response, request)
             elif operation == 'deactivationPackage':  # 停用套餐
-                return self.deactivationPackage(userID, request_dict, response)
+                return self.deactivationPackage(request_dict, response)
             else:
                 return response.json(404)
 
@@ -1013,17 +1015,6 @@ 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 = {
@@ -1032,7 +1023,6 @@ 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,
@@ -1330,7 +1320,7 @@ class serveManagement(View):
             return response.json(500, repr(e))
 
     @classmethod
-    def deviceAttritionAlert(cls, request_dict, response):
+    def deviceAttritionAlert(cls, request_dict, response, request):
         """
         流失预警界面
         @param request_dict:
@@ -1349,21 +1339,28 @@ class serveManagement(View):
         # 获取云存套餐信息表内的设备uid
         page = int(pageNo)
         line = int(pageSize)
+        if userName == '' or uid == '' or grade == '':  # 判断是否为空
+            if userName == '':
+                userName = None
+            if uid == '':
+                uid = None
+            if grade == '':
+                grade = None
         para_list = [userName, uid, grade]
         not_upload_list = []
         para_count = para_list.count(None)
         try:
             # 筛选数据
             cursor = connection.cursor()
-            sql = "SELECT t1.userID_id, du.username, t1.uid, t1.addTime, t1.use_status, t1.`day`, t1.grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day`, t1.grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day`,(CASE WHEN t1.`day` >= '15' AND t1.`day` < '25' THEN '一号预警' WHEN t1.use_status = '1' AND t1.`day` >= '25' THEN '二号预警' WHEN t1.use_status = 2 AND t1.`day` >= '25' THEN '八号预警' ELSE '预警取消' END ) AS grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day` FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, TIMESTAMPDIFF(DAY,FROM_UNIXTIME(t1.addTime, '%Y-%m-%d' ),DATE_FORMAT( NOW(), '%Y-%m-%d' )) AS 'day' FROM (SELECT di.userID_id, vub.uid, vub.addTime, vub.use_status FROM vod_uid_bucket AS vub, device_info AS di WHERE vub.uid = di.UID AND vub.addTime > '1669824000' GROUP BY di.userID_id) AS t1 WHERE t1.uid NOT IN (SELECT uid FROM uid_cloud_storage_count)) AS t1 WHERE t1.`day`>='15' AND t1.userID_id is NOT NULL) AS t1 ORDER BY t1.userID_id)AS t1 WHERE t1.userID_id NOT IN (SELECT di.userID_id FROM `uid_cloud_storage_count` AS vcsc LEFT JOIN device_info AS di ON vcsc.uid = di.UID WHERE di.userID_id is NOT NULL))AS t1 LEFT JOIN device_user AS du ON t1.userID_id = du.userID"
+            sql = "SELECT t1.userID_id, du.username, t1.uid, t1.addTime, t1.use_status, t1.`day`, t1.grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day`, t1.grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day`,(CASE WHEN t1.`day` >= '15' AND t1.`day` < '25' THEN '一号预警' WHEN t1.use_status = '1' AND t1.`day` >= '25' THEN '二号预警' WHEN t1.use_status = 2 AND t1.`day` >= '25' THEN '八号预警' ELSE '预警取消' END ) AS grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day` FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, TIMESTAMPDIFF(DAY,FROM_UNIXTIME(t1.addTime, '%Y-%m-%d' ),DATE_FORMAT( NOW(), '%Y-%m-%d' )) AS 'day' FROM (SELECT di.userID_id, vub.uid, vub.addTime, vub.use_status FROM vod_uid_bucket AS vub, device_info AS di WHERE vub.uid = di.UID AND vub.addTime > '1669824000' GROUP BY di.userID_id) AS t1 WHERE t1.uid NOT IN (SELECT uid FROM uid_cloud_storage_count)) AS t1 WHERE t1.`day`>='15' AND t1.userID_id is NOT NULL) AS t1 ORDER BY t1.userID_id)AS t1 WHERE t1.userID_id NOT IN (SELECT di.userID_id FROM `uid_cloud_storage_count` AS vcsc LEFT JOIN device_info AS di ON vcsc.uid = di.UID WHERE di.userID_id is NOT NULL))AS t1 LEFT JOIN device_user AS du ON t1.userID_id = du.userID order by t1.addTime "
             cursor.execute(sql)
             uid_type_tuple = cursor.fetchall()
             total = len(uid_type_tuple)
             cursor.close()  # 执行完,关闭
             connection.close()
             result_list = []
-            more_list = []  # 多个参数查结果
-            new_list = []  # 单独一个参数查结果
+            more_list = []  # 多个参数查结果
+            new_list = []  # 单独一个参数查结果
             col_names = [desc[0] for desc in cursor.description]
             for uid_type in uid_type_tuple:
                 uid_dict = dict(zip(col_names, uid_type))
@@ -1385,7 +1382,7 @@ class serveManagement(View):
                     for result in result_list:
                         if result['username'] == userName and result['uid'] == uid and result['grade'] == grade:
                             more_list.append(result)
-                result_list = more_list[(page - 1) * line:page * line]
+                result_list = more_list
             if para_count == 2:  # 一个参数进行筛查
                 if userName:
                     for result in result_list:
@@ -1399,9 +1396,10 @@ class serveManagement(View):
                     for result in result_list:
                         if result['grade'] == grade:
                             new_list.append(result)
-                result_list = new_list[(page - 1) * line:page * line]
+                result_list = new_list
             else:
-                result_list = result_list[(page - 1) * line:page * line]
+                result_list = result_list
+            result_list = result_list[(page - 1) * line:page * line]
             for item in result_list:  # 获取账号下的云存设备数量
                 userID_id = item['userID_id']
                 device_info_qs = Device_Info.objects.filter(userID_id=userID_id).annotate(count=Count('UID')).values(
@@ -1433,7 +1431,7 @@ class serveManagement(View):
             meg = '异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e))
             return response.json(500, meg)
 
-    def deactivationPackage(self, userID, request_dict, response):
+    def deactivationPackage(self, request_dict, response):
         """
         停用套餐
         @param request_dict:
@@ -1506,3 +1504,94 @@ class serveManagement(View):
         except Exception as e:
             print(e)
             return response.json(500, repr(e))
+
+    def cloudDataExport(self, request_dict, response):
+        """
+        流失预警导出功能
+        """
+        cursor = connection.cursor()
+        sql = "SELECT t1.userID_id, du.username, t1.uid, t1.addTime, t1.use_status, t1.`day`, t1.grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day`, t1.grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day`,(CASE WHEN t1.`day` >= '15' AND t1.`day` < '25' THEN '一号预警' WHEN t1.use_status = '1' AND t1.`day` >= '25' THEN '二号预警' WHEN t1.use_status = 2 AND t1.`day` >= '25' THEN '八号预警' ELSE '预警取消' END ) AS grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day` FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, TIMESTAMPDIFF(DAY,FROM_UNIXTIME(t1.addTime, '%Y-%m-%d' ),DATE_FORMAT( NOW(), '%Y-%m-%d' )) AS 'day' FROM (SELECT di.userID_id, vub.uid, vub.addTime, vub.use_status FROM vod_uid_bucket AS vub, device_info AS di WHERE vub.uid = di.UID AND vub.addTime > '1669824000' GROUP BY di.userID_id) AS t1 WHERE t1.uid NOT IN (SELECT uid FROM uid_cloud_storage_count)) AS t1 WHERE t1.`day`>='15' AND t1.userID_id is NOT NULL) AS t1 ORDER BY t1.userID_id)AS t1 WHERE t1.userID_id NOT IN (SELECT di.userID_id FROM `uid_cloud_storage_count` AS vcsc LEFT JOIN device_info AS di ON vcsc.uid = di.UID WHERE di.userID_id is NOT NULL))AS t1 LEFT JOIN device_user AS du ON t1.userID_id = du.userID order by t1.addTime "
+        cursor.execute(sql)
+        uid_type_tuple = cursor.fetchall()
+        cursor.close()  # 执行完,关闭
+        connection.close()
+        result_list = []
+        not_upload_list = []
+        try:
+            with transaction.atomic():
+                col_names = [desc[0] for desc in cursor.description]
+                for uid_type in uid_type_tuple:
+                    uid_dict = dict(zip(col_names, uid_type))
+                    result_list.append(uid_dict)
+                for item in result_list:  # 获取账号下的云存设备数量
+                    device_info_qs = Device_Info.objects.filter(userID_id=item['userID_id']).values('UID')
+                    count = device_info_qs.count()
+                    if count == 1 or count == 0:
+                        item['device_number'] = count
+                    else:
+                        device_number = 0
+                        for device_info in device_info_qs:
+                            uid_set_qs = UidSetModel.objects.filter(uid=device_info['UID']).values('ucode',
+                                                                                                   'device_type')
+                            device_type_qs = DeviceTypeModel.objects.filter(type=uid_set_qs[0]['device_type']).values(
+                                'model')
+                            model = device_type_qs[0]['model'] if device_type_qs.exists() else ''
+                            #  判断设备是否为ipc设备和是否支持云存
+                            if model == 2:
+                                if len(uid_set_qs[0]['ucode']) > 4:
+                                    number = uid_set_qs[0]['ucode'][-4]
+                                else:
+                                    continue
+                                if number in ['4', '5']:
+                                    device_number += 1
+                            else:
+                                continue
+                        item['device_number'] = device_number
+                    item['other_device'] = 0
+                    not_upload_list.append(item)
+                #  创建Excel,导出所有流失预警数据
+                file_name = "流失预警.xls"
+                if not_upload_list:
+                    ws = xlwt.Workbook(encoding="UTF-8")
+                    w = ws.add_sheet('流失预警', cell_overwrite_ok=True)
+                    w.write(0, 0, u'用户名')
+                    w.write(0, 1, u'用户ID')
+                    w.write(0, 2, u'设备UID')
+                    w.write(0, 3, u'设备自云存开通起多少天没有上传数据')
+                    w.write(0, 4, u'设备数量')
+                    w.write(0, 5, u'用户有无上传过数据')
+                    w.write(0, 6, u'是否有有效期内的付费套餐')
+                    w.write(0, 7, u'预警级别')
+                    excel_row = 1
+                    for obj in not_upload_list:
+                        data_username = obj['username']
+                        data_userID_id = obj['userID_id']
+                        data_uid = obj['uid']
+                        data_day = obj['day']
+                        data_device_number = obj['device_number']
+                        if data_device_number == 1:
+                            data_device_number = 'N/A'
+                        data_use_status = obj['use_status']
+                        if data_use_status == 1:
+                            data_use_status = '有'
+                        else:
+                            data_use_status = '无'
+                        data_other_device = '无'
+                        data_grade = obj['grade']
+                        w.write(excel_row, 0, data_username)
+                        w.write(excel_row, 1, data_userID_id)
+                        w.write(excel_row, 2, data_uid)
+                        w.write(excel_row, 3, data_day)
+                        w.write(excel_row, 4, data_device_number)
+                        w.write(excel_row, 5, data_other_device)
+                        w.write(excel_row, 6, data_use_status)
+                        w.write(excel_row, 7, data_grade)
+                        excel_row += 1
+                    # 生成相应格式给前端
+                    res = HttpResponse(content_type='application/vnd.ms-excel')
+                    res['Content-Disposition'] = 'attachment; filename={}'.format(escape_uri_path(file_name))
+                    ws.save(res)
+                    return res
+        except Exception as e:
+            meg = '异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e))
+            return response.json(500, meg)