|
|
@@ -16,7 +16,7 @@ import xlrd
|
|
|
import xlwt
|
|
|
from django.core.paginator import Paginator
|
|
|
from django.db import transaction, connection
|
|
|
-from django.db.models import F, Sum, Count, Q
|
|
|
+from django.db.models import F, Count, Q, OuterRef, Subquery
|
|
|
from django.http import HttpResponse, StreamingHttpResponse
|
|
|
from django.utils.encoding import escape_uri_path
|
|
|
from django.views.generic.base import View
|
|
|
@@ -1869,111 +1869,123 @@ class serveManagement(View):
|
|
|
addTime__gte=endStartTime,
|
|
|
addTime__lte=endEndTime)
|
|
|
|
|
|
- uid_list = []
|
|
|
+ if not uid_bucket_qs.exists():
|
|
|
+ return response.json(0, {'list': [], 'total': 0})
|
|
|
+
|
|
|
+ bucket_ids = uid_bucket_qs.values_list('id', flat=True)
|
|
|
+ order_qs = Order_Model.objects.filter(uid_bucket_id__in=bucket_ids).select_related('userID')
|
|
|
+
|
|
|
+ if username:
|
|
|
+ order_qs = order_qs.filter(userID__username=username)
|
|
|
+ if phone:
|
|
|
+ order_qs = order_qs.filter(userID__phone__contains=phone)
|
|
|
+ if userEmail:
|
|
|
+ order_qs = order_qs.filter(userID__userEmail__contains=userEmail)
|
|
|
+ if payType:
|
|
|
+ order_qs = order_qs.filter(payType=int(payType))
|
|
|
+
|
|
|
+ if logTimeRange and len(logTimeRange) == 2:
|
|
|
+ logStartTime = int(logTimeRange[0][:-3]) if logTimeRange[0] else None
|
|
|
+ logEndTime = int(logTimeRange[1][:-3]) if logTimeRange[1] else None
|
|
|
+ if logStartTime and logEndTime:
|
|
|
+ log_uids = CloudLogModel.objects.filter(
|
|
|
+ operation='cloudstorage/queryvodlist',
|
|
|
+ time__gte=logStartTime,
|
|
|
+ time__lte=logEndTime
|
|
|
+ ).values_list('uid', flat=True)
|
|
|
+
|
|
|
+ filtered_buckets = uid_bucket_qs.filter(uid__in=log_uids)
|
|
|
+ order_qs = order_qs.filter(uid_bucket_id__in=filtered_buckets.values_list('id', flat=True))
|
|
|
+
|
|
|
+
|
|
|
uid_set_dict = {}
|
|
|
if ucode and ucode != ['']:
|
|
|
uid_set_qs = UidSetModel.objects.filter(ucode__in=ucode).values('uid', 'ucode', 'version').distinct()
|
|
|
- for uid_set in uid_set_qs:
|
|
|
- uid_list.append(uid_set['uid'])
|
|
|
- uid_set_dict[uid_set['uid']] = {
|
|
|
- 'ucode': uid_set['ucode'],
|
|
|
- 'version': uid_set['version']
|
|
|
- }
|
|
|
- uid_bucket_qs = uid_bucket_qs.filter(uid__in=uid_list)
|
|
|
else:
|
|
|
- uid_set_qs = UidSetModel.objects.filter().values('uid', 'ucode', 'version').distinct()
|
|
|
- for uid_set in uid_set_qs:
|
|
|
- uid_list.append(uid_set['uid'])
|
|
|
- uid_set_dict[uid_set['uid']] = {
|
|
|
- 'ucode': uid_set['ucode'],
|
|
|
- 'version': uid_set['version']
|
|
|
- }
|
|
|
+ uid_set_qs = UidSetModel.objects.all().values('uid', 'ucode', 'version').distinct()
|
|
|
|
|
|
- if not uid_bucket_qs.exists():
|
|
|
- return response.json(0, [])
|
|
|
+ for uid_set in uid_set_qs:
|
|
|
+ uid_set_dict[uid_set['uid']] = {
|
|
|
+ 'ucode': uid_set['ucode'],
|
|
|
+ 'version': uid_set['version']
|
|
|
+ }
|
|
|
|
|
|
- order_qs = Order_Model.objects.filter(uid_bucket_id__in=uid_bucket_qs.values('id'))
|
|
|
- if username or phone or userEmail or payType:
|
|
|
- if username:
|
|
|
- order_qs = order_qs.filter(userID__username=username)
|
|
|
- if phone:
|
|
|
- order_qs = order_qs.filter(userID__phone__contains=phone)
|
|
|
- if userEmail:
|
|
|
- order_qs = order_qs.filter(
|
|
|
- userID__userEmail__contains=userEmail)
|
|
|
- if payType:
|
|
|
- order_qs = order_qs.filter(payType=int(payType))
|
|
|
- # 过滤套餐关联的UID_Bucket数据
|
|
|
- uid_bucket_qs = uid_bucket_qs.filter(
|
|
|
- id__in=order_qs.values_list(
|
|
|
- 'uid_bucket_id', flat=True))
|
|
|
+ total_count = order_qs.count()
|
|
|
|
|
|
- cg_qs = CloudLogModel.objects.filter(
|
|
|
- operation='cloudstorage/queryvodlist')
|
|
|
- if logTimeRange:
|
|
|
- logStartTime, logEndTime = int(
|
|
|
- logTimeRange[0][:-3]), int(logTimeRange[1][:-3])
|
|
|
- cg_qs = cg_qs.filter(
|
|
|
- time__gte=logStartTime,
|
|
|
- time__lte=logEndTime)
|
|
|
- # 过滤套餐关联的UID_Bucket数据
|
|
|
- uid_bucket_qs = uid_bucket_qs.filter(
|
|
|
- uid__in=cg_qs.values('uid'))
|
|
|
+ paginated_orders = order_qs.order_by('-updTime')[(page - 1) * line:page * line]
|
|
|
+
|
|
|
+ # --- 批量取 UID_Bucket ---
|
|
|
+ paginated_bucket_ids = [o.uid_bucket_id for o in paginated_orders]
|
|
|
+ bucket_map = {b.id: b for b in UID_Bucket.objects.filter(id__in=paginated_bucket_ids)}
|
|
|
+
|
|
|
+ # --- 批量取 uid 列表 ---
|
|
|
+ paginated_uids = [bucket_map[i].uid for i in paginated_bucket_ids if i in bucket_map]
|
|
|
+
|
|
|
+ # --- 批量查询存储桶位置 ---
|
|
|
+ bucket_subquery = VodBucketModel.objects.filter(id=OuterRef('bucket_id')).values('vod_location')[:1]
|
|
|
+ sts_crd_qs = StsCrdModel.objects.filter(uid__in=paginated_uids).annotate(
|
|
|
+ bucket_location=Subquery(bucket_subquery)
|
|
|
+ )
|
|
|
+ sts_crd_map = {i.uid: (i.bucket_location or 0) for i in sts_crd_qs}
|
|
|
|
|
|
list_data = []
|
|
|
- count = uid_bucket_qs.count()
|
|
|
- uid_bucket_qs = uid_bucket_qs.order_by('-addTime')[(page - 1) * line:page * line]
|
|
|
|
|
|
- for uid_bucket in uid_bucket_qs:
|
|
|
- for order in order_qs.filter(uid_bucket_id=uid_bucket.id) \
|
|
|
- .values('orderID', 'uid_bucket_id', 'desc', 'userID__userID',
|
|
|
- 'UID', 'price', 'payType', 'userID__username', 'userID__phone',
|
|
|
- 'userID__userEmail', 'userID__data_joined', 'agreement_id'):
|
|
|
- # 套餐到期时间累加未使用套餐
|
|
|
- unused_qs = Unused_Uid_Meal.objects.filter(uid=uid_bucket.uid).values('expire')
|
|
|
- if unused_qs.exists():
|
|
|
- addMonth = 0
|
|
|
- for unused in unused_qs:
|
|
|
- addMonth += unused['expire']
|
|
|
- endTime = CommonService.calcMonthLater(addMonth, uid_bucket.endTime)
|
|
|
- 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))
|
|
|
- uid = uid_bucket.uid.upper()
|
|
|
- data = {
|
|
|
+ for order in paginated_orders:
|
|
|
+ uid_bucket = bucket_map.get(order.uid_bucket_id)
|
|
|
+ if not uid_bucket:
|
|
|
+ continue
|
|
|
+
|
|
|
+ uid = uid_bucket.uid.upper()
|
|
|
+
|
|
|
+ # 套餐到期时间
|
|
|
+ unused_qs = Unused_Uid_Meal.objects.filter(uid=uid_bucket.uid).values('expire')
|
|
|
+ if unused_qs.exists():
|
|
|
+ addMonth = sum(x['expire'] for x in unused_qs)
|
|
|
+ endTime = CommonService.calcMonthLater(addMonth, uid_bucket.endTime)
|
|
|
+ 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))
|
|
|
+
|
|
|
+ device_info = Device_Info.objects.filter(UID=uid).first()
|
|
|
+ serial_number = device_info.serial_number if (device_info and device_info.serial_number) else 'N/A'
|
|
|
+
|
|
|
+ # 计算播放次数
|
|
|
+ playcount = CloudLogModel.objects.filter(
|
|
|
+ operation='cloudstorage/queryvodlist', uid=uid_bucket.uid
|
|
|
+ ).count()
|
|
|
+
|
|
|
+ data = {
|
|
|
'id': uid_bucket.id,
|
|
|
- 'orderId': order['orderID'],
|
|
|
+ 'orderId': order.orderID,
|
|
|
'uid': uid,
|
|
|
- 'agreementId': order['agreement_id'] if order['agreement_id'] else 'N/A',
|
|
|
+ 'agreementId': order.agreement_id if order.agreement_id else 'N/A',
|
|
|
'channel': uid_bucket.channel,
|
|
|
'status': uid_bucket.status,
|
|
|
'endTime': endTime,
|
|
|
'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,
|
|
|
- 'desc': order['desc'],
|
|
|
- 'payType': order['payType'],
|
|
|
- 'price': order['price'],
|
|
|
- 'username': order['userID__username'],
|
|
|
- 'phone': order['userID__phone'],
|
|
|
- 'userEmail': order['userID__userEmail'],
|
|
|
- 'data_joined': order['userID__data_joined'].strftime("%Y-%m-%d %H:%M:%S"),
|
|
|
- 'playcount': cg_qs.filter(operation='cloudstorage/queryvodlist', uid=order['UID']).count(),
|
|
|
- 'serial_number': 'N/A'
|
|
|
- }
|
|
|
- device_info_qs = Device_Info.objects.filter(UID=uid).values('serial_number')
|
|
|
- if device_info_qs.exists():
|
|
|
- data['serial_number'] = device_info_qs[0]['serial_number'] if device_info_qs[0][
|
|
|
- 'serial_number'] else 'N/A'
|
|
|
- if uid in uid_set_dict:
|
|
|
- data['ucode'] = uid_set_dict[uid]['ucode']
|
|
|
- data['version'] = uid_set_dict[uid]['version']
|
|
|
-
|
|
|
- list_data.append(data)
|
|
|
- return response.json(
|
|
|
- 0, {'list': list_data, 'total': count})
|
|
|
+ 'desc': order.desc,
|
|
|
+ 'payType': order.payType,
|
|
|
+ 'price': order.price,
|
|
|
+ 'username': order.userID.username,
|
|
|
+ 'userID': order.userID.userID,
|
|
|
+ 'phone': order.userID.phone,
|
|
|
+ 'userEmail': order.userID.userEmail,
|
|
|
+ 'data_joined': order.userID.data_joined.strftime("%Y-%m-%d %H:%M:%S"),
|
|
|
+ 'playcount': playcount,
|
|
|
+ 'serial_number': serial_number,
|
|
|
+ 'bucket_location': sts_crd_map.get(uid_bucket.uid, 0),
|
|
|
+
|
|
|
+ 'ucode': uid_set_dict.get(uid, {}).get('ucode', 'N/A'),
|
|
|
+ 'version': uid_set_dict.get(uid, {}).get('version', 'N/A'),
|
|
|
+ }
|
|
|
+ list_data.append(data)
|
|
|
+
|
|
|
+ return response.json(0, {'list': list_data, 'total': total_count})
|
|
|
+
|
|
|
except Exception as e:
|
|
|
- print(e)
|
|
|
+ LOGGER.error('查询云存用户错误{}'.format(e))
|
|
|
return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
|
|
|
|
|
|
@classmethod
|