Ver Fonte

联通流量统计

peng há 2 anos atrás
pai
commit
d53ac8485b

+ 130 - 0
AdminController/dataSystemManagement/UnicomDataController.py

@@ -0,0 +1,130 @@
+# -*- 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)
+        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)
+                res = {
+                    'iccidInfo': iccid_list,
+                    'totalFlow': round(total_flow, 2),
+                    'count': count
+                }
+                return response.json(0, res)
+            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')[(page - 1) * line:page * line]
+                count = iccid_qs.count()
+                total_flow = 0
+                for item in iccid_qs:
+                    item['flow_total_usage'] = 0
+                    item['flow_info'] = []
+                    key = 'monthly' + 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)
+                        item['flow_total_usage'] = flow
+                        item['flow_info'].append({file: flow})
+                    else:
+                        flow_dict = redis_obj.get_all_hash_data(key)
+                        for k, v in flow_dict.items():
+                            item['flow_total_usage'] += float(v)
+                            item['flow_info'].append({k.decode(): float(v)})
+                    iccid_list.append(item)
+                    total_flow += float(item['flow_total_usage'])
+                res = {
+                    'iccidInfo': iccid_list,
+                    'totalFlow': round(total_flow, 2),
+                    'count': count
+                }
+                return response.json(0, res)
+            else:
+                return response.json(444)
+        except Exception as e:
+            return response.json(500, 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()),
 ]
 ]

+ 48 - 9
Controller/Cron/CronTaskController.py

@@ -21,12 +21,13 @@ 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, IcloudService, \
     CloudLogModel, UidCloudStorageCount, UserExModel, DeviceDomainRegionModel, VodHlsTag, VodHlsTagType, IcloudService, \
-    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
 
 
 
 
 class CronDelDataView(View):
 class CronDelDataView(View):
@@ -569,25 +570,33 @@ class CronUpdateDataView(View):
                 elif lang == 'en':
                 elif lang == 'en':
                     Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='1-Month plan (free trial)')
                     Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='1-Month plan (free trial)')
                 elif lang == 'es':
                 elif lang == 'es':
-                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='Plan de 1 mes (prueba gratuita)')
+                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(
+                        content='Plan de 1 mes (prueba gratuita)')
                 elif lang == 'fr':
                 elif lang == 'fr':
-                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='Forfait de 1 mois (essai gratuit)')
+                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(
+                        content='Forfait de 1 mois (essai gratuit)')
                 elif lang == 'de':
                 elif lang == 'de':
-                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='1 Monat Paket (kostenlose Testversion) ')
+                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(
+                        content='1 Monat Paket (kostenlose Testversion) ')
                 elif lang == 'cn_tw':
                 elif lang == 'cn_tw':
                     Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='一個月套餐(免費試用)')
                     Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='一個月套餐(免費試用)')
                 elif lang == 'pt':
                 elif lang == 'pt':
-                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='Plano de 1 mês (teste gratuito)')
+                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(
+                        content='Plano de 1 mês (teste gratuito)')
                 elif lang == 'ru':
                 elif lang == 'ru':
-                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='Тариф 1 месяц (бесплатный пробный период)')
+                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(
+                        content='Тариф 1 месяц (бесплатный пробный период)')
                 elif lang == 'ja':
                 elif lang == 'ja':
                     Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='1ヶ月プラン(無料試用)')
                     Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='1ヶ月プラン(無料試用)')
                 elif lang == 'it':
                 elif lang == 'it':
-                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='Pacchetto di 1 mese (prova gratuita)')
+                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(
+                        content='Pacchetto di 1 mese (prova gratuita)')
                 elif lang == 'pl':
                 elif lang == 'pl':
-                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='jednomiesięczny pakiet (bezpłatny próbny)')
+                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(
+                        content='jednomiesięczny pakiet (bezpłatny próbny)')
                 elif lang == 'nl':
                 elif lang == 'nl':
-                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='Pakket van 1 maand (gratis proefperiode)')
+                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(
+                        content='Pakket van 1 maand (gratis proefperiode)')
             VodBucketModel.objects.filter(id=meal_qs[0]['bucket']).update(content='国内存储桶免费体验30天,录像保存7天')
             VodBucketModel.objects.filter(id=meal_qs[0]['bucket']).update(content='国内存储桶免费体验30天,录像保存7天')
             meal_qs.update(expire=1)
             meal_qs.update(expire=1)
             return response.json(0)
             return response.json(0)
@@ -595,6 +604,7 @@ class CronUpdateDataView(View):
             LOGGER.info('---修改体验套餐有效期---:{}'.format(repr(e)))
             LOGGER.info('---修改体验套餐有效期---:{}'.format(repr(e)))
             return response.json(500)
             return response.json(500)
 
 
+
 class CronCollectDataView(View):
 class CronCollectDataView(View):
     def get(self, request, *args, **kwargs):
     def get(self, request, *args, **kwargs):
         request.encoding = 'utf-8'
         request.encoding = 'utf-8'
@@ -618,6 +628,8 @@ class CronCollectDataView(View):
             return self.collect_icloud_order(response)
             return self.collect_icloud_order(response)
         elif operation == 'collectDeviceInfo':  # 定时保存设备数据
         elif operation == 'collectDeviceInfo':  # 定时保存设备数据
             return self.collect_device_info(response)
             return self.collect_device_info(response)
+        elif operation == 'collectFlowInfo':  # 定时保存设备数据
+            return self.collect_flow_info(response)
         else:
         else:
             return response.json(404)
             return response.json(404)
 
 
@@ -1243,3 +1255,30 @@ class CronCollectDataView(View):
             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 collect_flow_info(response):
+        try:
+            redis_obj = RedisObject()
+            unicom_qs = UnicomComboOrderInfo.objects.filter(combo__combo_type__in=[0, 1, 2]).values('iccid')
+            unicom_api = UnicomObjeect()
+            for item in unicom_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' + item['iccid']
+                        if redis_dict:
+                            redis_obj.set_hash_data(key, redis_dict)
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, repr(e))

+ 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)