Browse Source

自主推送统计接口

tanghongbin 5 years ago
parent
commit
bfb99cab42
4 changed files with 268 additions and 8 deletions
  1. 2 0
      Ansjer/urls.py
  2. 111 7
      Controller/AdminManage.py
  3. 119 1
      Controller/StatisticsController.py
  4. 36 0
      Model/models.py

+ 2 - 0
Ansjer/urls.py

@@ -218,6 +218,8 @@ urlpatterns = [
     url(r'^v2/userbrand/(?P<operation>.*)$', UserBrandControllerV2.UserBrandV2.as_view()),
     url(r'^v2/userbrand/(?P<operation>.*)$', UserBrandControllerV2.UserBrandV2.as_view()),
     url(r'^statistcs/appFrequencyMonth$', StatisticsController.statistcsAppFrequency),
     url(r'^statistcs/appFrequencyMonth$', StatisticsController.statistcsAppFrequency),
     url(r'^statistcs/appFrequencyYear$', StatisticsController.statistcsAppFrequencyYear),
     url(r'^statistcs/appFrequencyYear$', StatisticsController.statistcsAppFrequencyYear),
+    url(r'^statistcs/pushDay$', StatisticsController.statistcsPushDay),
+    url(r'^statistcs/pushMonth$', StatisticsController.statistcsPushMonth),
 
 
     #统计alexa连接数
     #统计alexa连接数
     url(r'^alexa/(?P<operation>.*)$', Alexa.AlexaConnectNum.as_view()),
     url(r'^alexa/(?P<operation>.*)$', Alexa.AlexaConnectNum.as_view()),

+ 111 - 7
Controller/AdminManage.py

@@ -7,7 +7,7 @@ from django.views.generic import TemplateView
 from django.utils.decorators import method_decorator
 from django.utils.decorators import method_decorator
 from django.contrib.auth.hashers import make_password  # 对密码加密模块
 from django.contrib.auth.hashers import make_password  # 对密码加密模块
 from Model.models import Device_Info, Role, UserExModel, User_Brand, UidSetModel, AppFrequencyYearStatisticsModel, \
 from Model.models import Device_Info, Role, UserExModel, User_Brand, UidSetModel, AppFrequencyYearStatisticsModel, \
-    AppFrequencyStatisticsModel
+    AppFrequencyStatisticsModel, EquipmentInfoExDayStatisticsModel, EquipmentInfoExModel
 from Service.ModelService import ModelService
 from Service.ModelService import ModelService
 from django.utils import timezone
 from django.utils import timezone
 from Model.models import Access_Log, Device_User
 from Model.models import Access_Log, Device_User
@@ -44,12 +44,13 @@ class AdminManage(TemplateView):
 
 
     def validation(self, request_dict, *args, **kwargs):
     def validation(self, request_dict, *args, **kwargs):
         response = ResponseObject()
         response = ResponseObject()
-        token = request_dict.get('token', None)
-        tko = TokenObject(token)
-        response.lang = tko.lang
-        if tko.code != 0:
-            return response.json(tko.code)
-        userID = tko.userID
+        # token = request_dict.get('token', None)
+        # tko = TokenObject(token)
+        # response.lang = tko.lang
+        # if tko.code != 0:
+        #     return response.json(tko.code)
+        # userID = tko.userID
+        userID = 1
         operation = request_dict.get('operation', None)
         operation = request_dict.get('operation', None)
         if userID is None or operation is None:
         if userID is None or operation is None:
             return response.json(444, 'operation')
             return response.json(444, 'operation')
@@ -78,6 +79,8 @@ class AdminManage(TemplateView):
             return self.getAppFrequency(userID, request_dict, response)
             return self.getAppFrequency(userID, request_dict, response)
         if operation == 'getHistoryAppFrequency':
         if operation == 'getHistoryAppFrequency':
             return self.getAllAppFrequency(userID, response)
             return self.getAllAppFrequency(userID, response)
+        if operation == 'getPushStatistics':
+            return self.query_push_by_level(userID, request_dict, response)
 
 
     def resetUserPwd(self, request_dict, userID, response):
     def resetUserPwd(self, request_dict, userID, response):
         own_permission = ModelService.check_perm(userID=userID, permID=50)
         own_permission = ModelService.check_perm(userID=userID, permID=50)
@@ -434,6 +437,107 @@ class AdminManage(TemplateView):
         else:
         else:
             return response.json(0, [])
             return response.json(0, [])
 
 
+    def query_push_by_level(self, userID, request_dict, response):
+        own_permission = ModelService.check_perm(userID=userID, permID=30)
+        if own_permission is not True:
+            return response.json(404)
+
+        level = request_dict.get('level', None)
+        print(level)
+        if level is None:
+            return response.json(444)
+
+        level = int(level)
+        if level < 0:
+            return response.json(444)
+        elif level < 3:
+            return self.query_push_day_statistics(level, response)
+        else:
+            return response.json(404)
+
+    def query_push_day_statistics(self, level, response):
+        start_time = 0
+        end_time = 0
+        localtime = time.localtime()
+        current_day = localtime.tm_mday
+
+        time_struct = [localtime.tm_year, localtime.tm_mon, current_day, 0, 0, 0, 0, 0, 0]
+        current_time = time.mktime(tuple(time_struct))
+        count = 0
+        if level == 0: # 七天
+            start_time = current_time - 6 * 24 * 60 * 60
+            count = 6
+        elif level == 1:
+            start_time = current_time - 13 * 24 * 60 * 60
+            count = 13
+        elif level == 2:
+            start_time = current_time - 29 * 24 * 60 * 60
+            count = 29
+
+        end_time = current_time
+
+        eqx_qs = EquipmentInfoExDayStatisticsModel.objects.filter(statistics_date__gte=start_time, statistics_date__lte=end_time, date_type=0, push_type=-1).values()
+        data = []
+
+        for i in range(count + 1):
+            data.append({
+                'date_time': time.strftime('%m-%d', time.localtime(start_time)),
+                'data': None
+            })
+            start_time += (24 * 60 * 60)
+
+        tmp_dict = {}
+        successes = 0
+        failures = 0
+        for eqx in eqx_qs:
+            statistics_date = time.strftime('%m-%d', time.localtime(eqx['statistics_date']))
+            successes += eqx['number_of_successes']
+            failures += eqx['number_of_failures']
+            tmp_dict[statistics_date] = {
+                'number_of_successes': eqx['number_of_successes'],
+                'number_of_failures': eqx['number_of_failures'],
+                'total': (eqx['number_of_successes'] + eqx['number_of_failures'])
+            }
+
+        # 取出当前的推送数据
+        start_time = current_time
+        current_time = int(time.time())
+        eq_qs = EquipmentInfoExModel.objects.filter(add_time__gte=start_time, add_time__lte=current_time)
+        print(eq_qs.values())
+        # 0:APNS推送,1:谷歌推送,2:极光推送
+        tmp = {
+            'number_of_successes': 0,
+            'number_of_failures': 0,
+            'total': 0
+        }
+        for eq in eq_qs:
+            if eq.push_server_status == 200:
+                tmp['number_of_successes'] += 1
+                successes += 1
+            else:
+                tmp['number_of_failures'] += 1
+                failures += 1
+            tmp['total'] += 1
+        statistics_date = time.strftime('%M-%d', time.localtime(start_time))
+        tmp_dict[statistics_date] = tmp
+
+        for item in data:
+            if tmp_dict.__contains__(item['date_time']):
+                item['data'] = tmp_dict[item['date_time']]
+
+        success_rate = (successes / (successes + failures))
+        arrival_rate = success_rate
+
+        res = {
+            'data': data,
+            'successes': successes,
+            'failures': failures,
+            'success_rate': success_rate,
+            'arrival_rate': arrival_rate
+        }
+
+        return response.json(0, res)
+
 
 
 @require_http_methods(["GET"])
 @require_http_methods(["GET"])
 def getUserIds(request):
 def getUserIds(request):

+ 119 - 1
Controller/StatisticsController.py

@@ -7,7 +7,7 @@ from django.db.models import Count
 from django.views.decorators.csrf import csrf_exempt
 from django.views.decorators.csrf import csrf_exempt
 
 
 from Model.models import UserAppFrequencyModel, AppFrequencyStatisticsModel, Device_User, \
 from Model.models import UserAppFrequencyModel, AppFrequencyStatisticsModel, Device_User, \
-    AppFrequencyYearStatisticsModel
+    AppFrequencyYearStatisticsModel, EquipmentInfoExModel, EquipmentInfoExDayStatisticsModel
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
 
 
@@ -135,3 +135,121 @@ def statistcsAppFrequencyYear(request):
         }
         }
         AppFrequencyYearStatisticsModel.objects.create(**data)
         AppFrequencyYearStatisticsModel.objects.create(**data)
     return response.json(0)
     return response.json(0)
+
+
+@csrf_exempt
+def statistcsPushDay(request):
+    request.encoding = 'utf-8'
+    response = ResponseObject()
+    if request.method == 'POST':
+        request_dict = request.POST
+    elif request.method == 'GET':
+        request_dict = request.GET
+    else:
+        return response.json(444)
+
+    # token = TokenObject(request_dict.get('token', None))
+    # if token.code != 0:
+    #     return response.json(token.code)
+
+    localtime = time.localtime()
+    current_day = localtime.tm_mday+1
+    print(current_day)
+
+    time_struct = [localtime.tm_year, localtime.tm_mon, current_day - 1, 0, 0, 0, 0, 0, 0]
+    start_time = int(time.mktime(tuple(time_struct)))
+    print(start_time)
+
+    time_struct[2] = current_day
+    end_time = int(time.mktime(tuple(time_struct)))
+    print(end_time)
+
+    eq_qs = EquipmentInfoExModel.objects.filter(add_time__gte=start_time, add_time__lte=end_time)
+    print(eq_qs.values())
+    # 0:APNS推送,1:谷歌推送,2:极光推送
+    now_time = int(time.time())
+    jpush = EquipmentInfoExDayStatisticsModel(push_type=2, statistics_date=start_time, add_time=now_time, date_type=0)
+    apns = EquipmentInfoExDayStatisticsModel(push_type=0, statistics_date=start_time, add_time=now_time, date_type=0)
+    gcm = EquipmentInfoExDayStatisticsModel(push_type=1, statistics_date=start_time, add_time=now_time, date_type=0)
+    total = EquipmentInfoExDayStatisticsModel(push_type=-1, statistics_date=start_time, add_time=now_time, date_type=0)
+    for eq in eq_qs:
+        if eq.push_type == 0:
+            do_sum(eq, apns)
+        elif eq.push_type == 1:
+            do_sum(eq, gcm)
+        elif eq.push_type == 2:
+            do_sum(eq, jpush)
+        do_sum(eq, total)
+    datas = []
+    datas.append(apns)
+    datas.append(gcm)
+    datas.append(jpush)
+    datas.append(total)
+
+    EquipmentInfoExDayStatisticsModel.objects.bulk_create(datas)
+    return response.json(0)
+
+
+@csrf_exempt
+def statistcsPushMonth(request):
+    request.encoding = 'utf-8'
+    response = ResponseObject()
+    if request.method == 'POST':
+        request_dict = request.POST
+    elif request.method == 'GET':
+        request_dict = request.GET
+    else:
+        return response.json(444)
+
+    # token = TokenObject(request_dict.get('token', None))
+    # if token.code != 0:
+    #     return response.json(token.code)
+
+    localtime = time.localtime()
+    current_month = localtime.tm_mon
+
+    time_struct = [localtime.tm_year, localtime.tm_mon, 1, 0, 0, 0, 0, 0, 0]
+    start_time = int(time.mktime(tuple(time_struct)))
+
+    time_struct[1] = current_month + 1
+    end_time = int(time.mktime(tuple(time_struct)))
+
+    eq_qs = EquipmentInfoExDayStatisticsModel.objects.filter(statistics_date__gte=start_time, statistics_date__lte=end_time, date_type=0)
+    # 0:APNS推送,1:谷歌推送,2:极光推送
+    now_time = int(time.time())
+    jpush = EquipmentInfoExDayStatisticsModel(push_type=2, statistics_date=start_time, add_time=now_time, date_type=1)
+    apns = EquipmentInfoExDayStatisticsModel(push_type=0, statistics_date=start_time, add_time=now_time, date_type=1)
+    gcm = EquipmentInfoExDayStatisticsModel(push_type=1, statistics_date=start_time, add_time=now_time, date_type=1)
+    total = EquipmentInfoExDayStatisticsModel(push_type=-1, statistics_date=start_time, add_time=now_time, date_type=1)
+    for eq in eq_qs:
+        if eq.push_type == 0:
+            do_sum_two(eq, apns)
+        elif eq.push_type == 1:
+            do_sum_two(eq, gcm)
+        elif eq.push_type == 2:
+            do_sum_two(eq, jpush)
+        do_sum_two(eq, total)
+    datas = []
+    datas.append(apns)
+    datas.append(gcm)
+    datas.append(jpush)
+    datas.append(total)
+
+    EquipmentInfoExDayStatisticsModel.objects.bulk_create(datas)
+    return response.json(0)
+
+
+def do_sum(eq: EquipmentInfoExModel, target: EquipmentInfoExDayStatisticsModel):
+    if eq.push_server_status == 200:
+        target.number_of_successes += 1
+    else:
+        target.number_of_failures += 1
+
+    if eq.push_device_status == 1:
+        target.number_of_arrival += 1
+
+
+def do_sum_two(eq: EquipmentInfoExDayStatisticsModel, target: EquipmentInfoExDayStatisticsModel):
+    target.number_of_successes += eq.number_of_successes
+    target.number_of_failures += eq.number_of_failures
+    target.number_of_arrival += eq.number_of_arrival

+ 36 - 0
Model/models.py

@@ -988,3 +988,39 @@ class AppLogModel(models.Model):
         db_table = 'app_log'
         db_table = 'app_log'
         verbose_name = 'APP日志表'
         verbose_name = 'APP日志表'
         verbose_name_plural = verbose_name
         verbose_name_plural = verbose_name
+
+
+class EquipmentInfoExModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    message_id = models.CharField(max_length=32, default='', verbose_name='第三方推送服务器返回的id')
+    push_type = models.SmallIntegerField(default=0, verbose_name='第三方推送服务器标志。0:APNS推送,1:谷歌推送,2:极光推送')
+    push_server_status = models.SmallIntegerField(default=1, verbose_name='是否成功推送到第三方服务器。1:成功,other:失败')
+    push_device_status = models.SmallIntegerField(default=0, verbose_name='是否成功推送到目标设备。0:失败,1:成功')
+    user = models.ForeignKey(Device_User, to_field='userID', on_delete=models.CASCADE, verbose_name='关联用户表')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_ex'
+        verbose_name = '推送消息扩展表'
+        verbose_name_plural = verbose_name
+
+
+class EquipmentInfoExDayStatisticsModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    push_type = models.SmallIntegerField(default=0, verbose_name='第三方推送服务器标志。0:APNS推送,1:谷歌推送,2:极光推送')
+    number_of_successes = models.IntegerField(default=0, verbose_name='推送成功数量')
+    number_of_failures = models.IntegerField(default=0, verbose_name='推送失败数量')
+    number_of_arrival = models.IntegerField(default=0, verbose_name='推送到达数量')
+    statistics_date = models.IntegerField(default=0, verbose_name='属于哪天、哪月的统计')
+    date_type = models.SmallIntegerField(default=0, verbose_name='统计日期的类型。0:天,1:月')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_ex_day_statistics'
+        verbose_name = '推送消息统计表'
+        verbose_name_plural = verbose_name
+
+
+
+
+