|
@@ -43,6 +43,8 @@ class serveManagement(View):
|
|
return self.getCloudDataList(request_dict, response)
|
|
return self.getCloudDataList(request_dict, response)
|
|
elif operation == 'vodOrderReconcile':
|
|
elif operation == 'vodOrderReconcile':
|
|
return self.vodOrderReconcile(request, request_dict, response)
|
|
return self.vodOrderReconcile(request, request_dict, response)
|
|
|
|
+ elif operation == 'cloudDataExport': # 导出流失预警
|
|
|
|
+ return self.cloudDataExport(request, response)
|
|
else:
|
|
else:
|
|
tko = TokenObject(
|
|
tko = TokenObject(
|
|
request.META.get('HTTP_AUTHORIZATION'),
|
|
request.META.get('HTTP_AUTHORIZATION'),
|
|
@@ -93,9 +95,9 @@ class serveManagement(View):
|
|
elif operation == 'getCloudUserList': # 获取云存用户信息
|
|
elif operation == 'getCloudUserList': # 获取云存用户信息
|
|
return self.getCloudUserList(request_dict, response)
|
|
return self.getCloudUserList(request_dict, response)
|
|
elif operation == 'deviceAttritionAlert': # 流失预警
|
|
elif operation == 'deviceAttritionAlert': # 流失预警
|
|
- return self.deviceAttritionAlert(request_dict, response)
|
|
|
|
|
|
+ return self.deviceAttritionAlert(request_dict, response, request)
|
|
elif operation == 'deactivationPackage': # 停用套餐
|
|
elif operation == 'deactivationPackage': # 停用套餐
|
|
- return self.deactivationPackage(userID, request_dict, response)
|
|
|
|
|
|
+ return self.deactivationPackage(request_dict, response)
|
|
else:
|
|
else:
|
|
return response.json(404)
|
|
return response.json(404)
|
|
|
|
|
|
@@ -1013,17 +1015,6 @@ class serveManagement(View):
|
|
endTime = time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(endTime))
|
|
endTime = time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(endTime))
|
|
else:
|
|
else:
|
|
endTime = time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(uid_bucket.endTime))
|
|
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()
|
|
uid = uid_bucket.uid.upper()
|
|
data = {
|
|
data = {
|
|
@@ -1032,7 +1023,6 @@ class serveManagement(View):
|
|
'channel': uid_bucket.channel,
|
|
'channel': uid_bucket.channel,
|
|
'status': uid_bucket.status,
|
|
'status': uid_bucket.status,
|
|
'endTime': endTime,
|
|
'endTime': endTime,
|
|
- 'ExpirationDate': expirationDate,
|
|
|
|
'addTime': time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(uid_bucket.addTime)),
|
|
'addTime': time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(uid_bucket.addTime)),
|
|
'use_status': uid_bucket.use_status,
|
|
'use_status': uid_bucket.use_status,
|
|
'has_unused': uid_bucket.has_unused,
|
|
'has_unused': uid_bucket.has_unused,
|
|
@@ -1330,7 +1320,7 @@ class serveManagement(View):
|
|
return response.json(500, repr(e))
|
|
return response.json(500, repr(e))
|
|
|
|
|
|
@classmethod
|
|
@classmethod
|
|
- def deviceAttritionAlert(cls, request_dict, response):
|
|
|
|
|
|
+ def deviceAttritionAlert(cls, request_dict, response, request):
|
|
"""
|
|
"""
|
|
流失预警界面
|
|
流失预警界面
|
|
@param request_dict:
|
|
@param request_dict:
|
|
@@ -1349,21 +1339,28 @@ class serveManagement(View):
|
|
# 获取云存套餐信息表内的设备uid
|
|
# 获取云存套餐信息表内的设备uid
|
|
page = int(pageNo)
|
|
page = int(pageNo)
|
|
line = int(pageSize)
|
|
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]
|
|
para_list = [userName, uid, grade]
|
|
not_upload_list = []
|
|
not_upload_list = []
|
|
para_count = para_list.count(None)
|
|
para_count = para_list.count(None)
|
|
try:
|
|
try:
|
|
# 筛选数据
|
|
# 筛选数据
|
|
cursor = connection.cursor()
|
|
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)
|
|
cursor.execute(sql)
|
|
uid_type_tuple = cursor.fetchall()
|
|
uid_type_tuple = cursor.fetchall()
|
|
total = len(uid_type_tuple)
|
|
total = len(uid_type_tuple)
|
|
cursor.close() # 执行完,关闭
|
|
cursor.close() # 执行完,关闭
|
|
connection.close()
|
|
connection.close()
|
|
result_list = []
|
|
result_list = []
|
|
- more_list = [] # 多个参数筛查结果
|
|
|
|
- new_list = [] # 单独一个参数筛查结果
|
|
|
|
|
|
+ more_list = [] # 多个参数查询结果
|
|
|
|
+ new_list = [] # 单独一个参数查询结果
|
|
col_names = [desc[0] for desc in cursor.description]
|
|
col_names = [desc[0] for desc in cursor.description]
|
|
for uid_type in uid_type_tuple:
|
|
for uid_type in uid_type_tuple:
|
|
uid_dict = dict(zip(col_names, uid_type))
|
|
uid_dict = dict(zip(col_names, uid_type))
|
|
@@ -1385,7 +1382,7 @@ class serveManagement(View):
|
|
for result in result_list:
|
|
for result in result_list:
|
|
if result['username'] == userName and result['uid'] == uid and result['grade'] == grade:
|
|
if result['username'] == userName and result['uid'] == uid and result['grade'] == grade:
|
|
more_list.append(result)
|
|
more_list.append(result)
|
|
- result_list = more_list[(page - 1) * line:page * line]
|
|
|
|
|
|
+ result_list = more_list
|
|
if para_count == 2: # 一个参数进行筛查
|
|
if para_count == 2: # 一个参数进行筛查
|
|
if userName:
|
|
if userName:
|
|
for result in result_list:
|
|
for result in result_list:
|
|
@@ -1399,9 +1396,10 @@ class serveManagement(View):
|
|
for result in result_list:
|
|
for result in result_list:
|
|
if result['grade'] == grade:
|
|
if result['grade'] == grade:
|
|
new_list.append(result)
|
|
new_list.append(result)
|
|
- result_list = new_list[(page - 1) * line:page * line]
|
|
|
|
|
|
+ result_list = new_list
|
|
else:
|
|
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: # 获取账号下的云存设备数量
|
|
for item in result_list: # 获取账号下的云存设备数量
|
|
userID_id = item['userID_id']
|
|
userID_id = item['userID_id']
|
|
device_info_qs = Device_Info.objects.filter(userID_id=userID_id).annotate(count=Count('UID')).values(
|
|
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))
|
|
meg = '异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e))
|
|
return response.json(500, meg)
|
|
return response.json(500, meg)
|
|
|
|
|
|
- def deactivationPackage(self, userID, request_dict, response):
|
|
|
|
|
|
+ def deactivationPackage(self, request_dict, response):
|
|
"""
|
|
"""
|
|
停用套餐
|
|
停用套餐
|
|
@param request_dict:
|
|
@param request_dict:
|
|
@@ -1506,3 +1504,94 @@ class serveManagement(View):
|
|
except Exception as e:
|
|
except Exception as e:
|
|
print(e)
|
|
print(e)
|
|
return response.json(500, repr(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)
|