Browse Source

联通流量统计后台管理

peng 2 years ago
parent
commit
1093ad0cf5

+ 167 - 0
AdminController/dataSystemManagement/UnicomDataController.py

@@ -0,0 +1,167 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : UserDataController.py
+@Time    : 2023/6/29 14:56
+@Author  : peng
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+
+from django.db.models import Q, Sum
+from django.views.generic.base import View
+
+from Model.models import UnicomDeviceInfo, UnicomComboOrderInfo
+from Service.CommonService import CommonService
+from Object.RedisObject import RedisObject
+
+
+class UnicomDataView(View):
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.GET, request, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.POST, request, operation)
+
+    def validation(self, request_dict, request, operation):
+        token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
+        if token_code != 0:
+            return response.json(token_code)
+        if operation == 'getFlowInfo':  # 查询流量使用情况
+            return self.get_flow_info(request_dict, response)
+        elif operation == 'getMonthlyFlowInfo':  # 查询流量使用情况
+            return self.get_monthly_flow_info(request_dict, response)
+        else:
+            return response.json(414)
+
+    @classmethod
+    def get_flow_info(cls, request_dict, response):
+        """
+        查询流量使用情况
+        @param request_dict: 请求数据
+        @request_dict year: 年
+        @request_dict month: 月
+        @request_dict query_type: 查询流量类型
+        @request_dict iccid: 卡号
+        @request_dict user_id: 用户id
+        @request_dict page: 查询分页数
+        @request_dict line: 查询条数
+        @param response:响应对象
+        @return:
+        """
+        query_type = request_dict.get('query_type', None)
+        iccid = request_dict.get('iccid', None)
+        user_id = request_dict.get('user_id', None)
+        year = request_dict.get('year', None)
+        month = request_dict.get('month', None)
+        page = request_dict.get('page', None)
+        line = request_dict.get('line', None)
+        if not all([query_type, page, line]):
+            return response.json(444)
+        page = int(page)
+        line = int(line)
+        redis_obj = RedisObject()
+        iccid_list = []
+        try:
+            iccid_qs = UnicomComboOrderInfo.objects.all()
+            if query_type == '1':  # 查询联通测试流量信息
+                iccid_qs = iccid_qs.filter(combo__combo_type=1)
+                if user_id:
+                    user_qs = UnicomDeviceInfo.objects.filter(user_id=user_id).values('iccid')
+                    if not user_qs.exists():
+                        return response.json(173)
+                    iccid_qs = iccid_qs.filter(iccid=user_qs[0]['iccid'])
+                if iccid:
+                    iccid_qs = iccid_qs.filter(iccid=iccid)
+                iccid_qs = iccid_qs.values('iccid', 'flow_total_usage')
+                total_flow = iccid_qs.aggregate(total=Sum('flow_total_usage'))['total']
+                count = iccid_qs.count()
+                iccid_qs = iccid_qs[(page - 1) * line:page * line]
+                for item in iccid_qs:
+                    user_qs = UnicomDeviceInfo.objects.filter(iccid=item['iccid']).values('user_id')
+                    item['user_id'] = user_qs[0]['user_id'] if user_qs.exists() else ''
+                    iccid_list.append(item)
+            elif query_type == '2':  # 查询联通月度流量信息
+                iccid_qs = iccid_qs.filter(combo__combo_type__in=[0, 1, 2])
+                if iccid:
+                    iccid_qs = iccid_qs.filter(iccid=iccid)
+                if user_id:
+                    user_qs = UnicomDeviceInfo.objects.filter(user_id=user_id).values('iccid')
+                    if not user_qs.exists():
+                        return response.json(173)
+                    iccid_qs = iccid_qs.filter(iccid=user_qs[0]['iccid'])
+                iccid_qs = iccid_qs.values('iccid').distinct().order_by('iccid')
+                count = iccid_qs.count()
+                iccid_qs = iccid_qs[(page - 1) * line:page * line]
+                total_flow = 0
+                for item in iccid_qs:
+                    item['flow_total_usage'] = 0
+                    key = 'monthly_flow_' + item['iccid']
+                    user_qs = UnicomDeviceInfo.objects.filter(iccid=item['iccid']).values('user_id')
+                    item['user_id'] = user_qs[0]['user_id'] if user_qs.exists() else ''
+                    if year and month:
+                        file = year + '-' + month
+                        flow = redis_obj.get_hash_data(key, file)[0]
+                        flow = float(flow.decode()) if flow else 0
+                        item['flow_total_usage'] = flow
+                    else:
+                        flow_dict = redis_obj.get_all_hash_data(key)
+                        for k, v in flow_dict.items():
+                            item['flow_total_usage'] += float(v)
+                    iccid_list.append(item)
+                    item['flow_total_usage'] = round(item['flow_total_usage'], 2)
+                    total_flow += float(item['flow_total_usage'])
+            else:
+                return response.json(444)
+            res = {
+                'iccidInfo': iccid_list,
+                'totalFlow': round(total_flow, 2),
+                'count': count
+            }
+            return response.json(0, res)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @classmethod
+    def get_monthly_flow_info(cls, request_dict, response):
+        """
+        查询月度流量使用情况
+        @param request_dict: 请求数据
+        @request_dict year: 年
+        @request_dict month: 月
+        @request_dict iccid: 卡号
+        @param response:响应对象
+        @return:
+        """
+        iccid = request_dict.get('iccid', None)
+        year = request_dict.get('year', None)
+        month = request_dict.get('month', None)
+        page = request_dict.get('page', None)
+        line = request_dict.get('line', None)
+        redis_obj = RedisObject()
+        data_list = []
+        if not all([iccid, page, line]):
+            return response.json(444)
+        page = int(page)
+        line = int(line)
+        try:
+            key = 'monthly_flow_' + iccid
+            if year and month:
+                file = year + '-' + month
+                flow = redis_obj.get_hash_data(key, file)[0]
+                flow = flow.decode() if flow else 0
+                data_list.append({file: flow})
+            else:
+                flow_dict = redis_obj.get_all_hash_data(key)
+                for k, v in flow_dict.items():
+                    data_list.append({k.decode(): float(v)})
+            res = {
+                'list': data_list[(page - 1) * line:page * line],
+                'count': len(data_list)
+            }
+            return response.json(0, res)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 2 - 1
Ansjer/server_urls/datasystem_url.py

@@ -9,7 +9,7 @@
 from django.urls import re_path
 from django.urls import re_path
 
 
 from AdminController.dataSystemManagement import UserDataController, DeviceDataController, ServiceDataController, \
 from AdminController.dataSystemManagement import UserDataController, DeviceDataController, ServiceDataController, \
-    BusinessDataController, HomeDataController
+    BusinessDataController, HomeDataController, UnicomDataController
 
 
 urlpatterns = [
 urlpatterns = [
     re_path(r'^userData/(?P<operation>.*)$', UserDataController.UserDataView.as_view()),
     re_path(r'^userData/(?P<operation>.*)$', UserDataController.UserDataView.as_view()),
@@ -17,4 +17,5 @@ urlpatterns = [
     re_path(r'^serviceData/(?P<operation>.*)$', ServiceDataController.ServiceDataView.as_view()),
     re_path(r'^serviceData/(?P<operation>.*)$', ServiceDataController.ServiceDataView.as_view()),
     re_path(r'^businessData/(?P<operation>.*)$', BusinessDataController.BusinessDataView.as_view()),
     re_path(r'^businessData/(?P<operation>.*)$', BusinessDataController.BusinessDataView.as_view()),
     re_path(r'^homeData/(?P<operation>.*)$', HomeDataController.HomeDataView.as_view()),
     re_path(r'^homeData/(?P<operation>.*)$', HomeDataController.HomeDataView.as_view()),
+    re_path(r'^unicomData/(?P<operation>.*)$', UnicomDataController.UnicomDataView.as_view()),
 ]
 ]

+ 40 - 4
Controller/Cron/CronTaskController.py

@@ -8,9 +8,9 @@
 # @File    : CronTaskController.py
 # @File    : CronTaskController.py
 # @Software: PyCharm
 # @Software: PyCharm
 import datetime
 import datetime
-import logging
+import threading
 import time
 import time
-
+import logging
 import requests
 import requests
 from django.db import connection, connections, transaction
 from django.db import connection, connections, transaction
 from django.db.models import Q, Sum, Count
 from django.db.models import Q, Sum, Count
@@ -22,16 +22,16 @@ from Model.models import Device_User, Device_Info, UidSetModel, UID_Bucket, Unus
     VodHlsModel, ExperienceContextModel, AiService, VodHlsSummary, VideoPlaybackTimeModel, DeviceUserSummary, \
     VodHlsModel, ExperienceContextModel, AiService, VodHlsSummary, VideoPlaybackTimeModel, DeviceUserSummary, \
     CountryModel, DeviceTypeModel, OrdersSummary, DeviceInfoSummary, CompanySerialModel, \
     CountryModel, DeviceTypeModel, OrdersSummary, DeviceInfoSummary, CompanySerialModel, \
     CloudLogModel, UidCloudStorageCount, UserExModel, DeviceDomainRegionModel, VodHlsTag, VodHlsTagType, \
     CloudLogModel, UidCloudStorageCount, UserExModel, DeviceDomainRegionModel, VodHlsTag, VodHlsTagType, \
-    Store_Meal, Lang, VodBucketModel
+    Store_Meal, Lang, VodBucketModel, UnicomComboOrderInfo
 from Object.RedisObject import RedisObject
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.utils import LocalDateTimeUtil
 from Object.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
 from Service.VodHlsService import SplitVodHlsObject
 from Service.VodHlsService import SplitVodHlsObject
+from Object.UnicomObject import UnicomObjeect
 
 
 LOGGER = logging.getLogger('info')
 LOGGER = logging.getLogger('info')
 
 
-
 class CronDelDataView(View):
 class CronDelDataView(View):
     def get(self, request, *args, **kwargs):
     def get(self, request, *args, **kwargs):
         request.encoding = 'utf-8'
         request.encoding = 'utf-8'
@@ -1069,6 +1069,42 @@ class CronCollectDataView(View):
                                                      unicom_service=active_device_unicom_dict,
                                                      unicom_service=active_device_unicom_dict,
                                                      device_type=active_device_type_dict)
                                                      device_type=active_device_type_dict)
 
 
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def collect_flow_info(response):
+        try:
+            unicom_qs = UnicomComboOrderInfo.objects.filter(combo__combo_type__in=[0, 1, 2]).values(
+                'iccid').distinct().order_by('iccid')
+            asy = threading.Thread(target=CronCollectDataView.thread_collect_flow, args=(unicom_qs,))
+            asy.start()
             return response.json(0)
             return response.json(0)
         except Exception as e:
         except Exception as e:
             return response.json(500, repr(e))
             return response.json(500, repr(e))
+
+    @staticmethod
+    def thread_collect_flow(qs):
+        try:
+            unicom_api = UnicomObjeect()
+            redis_obj = RedisObject()
+            for item in qs:
+                res = unicom_api.query_device_usage_history(**item)
+                if res.status_code == 200:
+                    res_json = res.json()
+                    if res_json['code'] == 0:
+                        redis_dict = {}
+                        for data in res_json['data']['deviceUsageHistory']:
+                            year = data.get('year', None)
+                            month = data.get('month', None)
+                            flow = data.get('flowTotalUsage', None)
+                            if not all([year, month, flow]):
+                                continue
+                            file = str(year) + '-' + str(month)
+                            redis_dict[file] = flow
+                        key = 'monthly_flow_' + item['iccid']
+                        if redis_dict:
+                            redis_obj.set_hash_data(key, redis_dict)
+        except Exception as e:
+            LOGGER.info('统计联通流量失败,时间为:{}'.format(int(time.time())))

+ 9 - 0
Object/RedisObject.py

@@ -92,3 +92,12 @@ class RedisObject:
             return False
             return False
         else:
         else:
             return True
             return True
+
+    def set_hash_data(self, key, kwargs):
+        self.CONN.hmset(key, kwargs)
+
+    def get_hash_data(self, key, file):
+        return self.CONN.hmget(key, file)
+
+    def get_all_hash_data(self, key):
+        return self.CONN.hgetall(key)