Bladeren bron

查询订单成本及利润

peng 1 jaar geleden
bovenliggende
commit
a1aa125584

+ 155 - 0
AdminController/dataSystemManagement/OperatingCostsDataController.py

@@ -0,0 +1,155 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : UserDataController.py
+@Time    : 2024年6月7日09:27:28
+@Author  : peng
+@Email   : peng
+@Software: PyCharm
+"""
+
+from django.db.models import Q, Sum
+from django.views.generic.base import View
+import datetime
+import requests
+
+from Model.models import OperatingCosts, Order_Model, CountryModel, UID_Bucket
+from Service.CommonService import CommonService
+from Ansjer.config import CONFIG_EUR, CONFIG_INFO, CONFIG_CN, CONFIG_US
+from dateutil.relativedelta import relativedelta
+
+
+# 运营成本数据
+class OperatingCostsDataView(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 == 'getOperatingCosts':  # 查询订单成本利润
+            return self.get_operating_costs(request, request_dict, response)
+        else:
+            return response.json(414)
+
+    @classmethod
+    def get_operating_costs(cls, request, request_dict, response):
+        """
+        查询订单成本利润
+        @param request:请求参数
+        @param request_dict:请求参数
+        @request_dict startTime:开始时间
+        @request_dict endTime:结束时间
+        @param response:响应对象
+        @return:
+        """
+        start_time = request_dict.get('startTime', None)
+        end_time = request_dict.get('endTime', None)
+        page = request_dict.get('page', 1)
+        line = request_dict.get('line', 10)
+        if not all([page, line]):
+            return response.json(444, {'error param': 'page or line'})
+        page = int(page)
+        line = int(line)
+        params = {'page': page, 'line': line}
+        try:
+            if start_time and end_time:
+                operating_costs_qs = OperatingCosts.objects.filter(Q(time__gte=start_time), Q(time__lt=end_time))
+                params['startTime'] = start_time
+                params['endTime'] = end_time
+            else:
+                operating_costs_qs = OperatingCosts.objects.all()
+            count = operating_costs_qs.count()
+            operating_qs = operating_costs_qs.filter(~Q(order_id='')).values('order_id', 'uid', 'day_average_price',
+                                                                             'month_average_price',
+                                                                             'purchase_quantity', 'actual_storage',
+                                                                             'actual_api',
+                                                                             'monthly_income', 'settlement_days',
+                                                                             'remaining_usage_time',
+                                                                             'end_time', 'created_time',
+                                                                             'time').order_by('order_id')[
+                           (page - 1) * line:page * line]
+            res = []
+            storage_univalence = 0.023 / 30
+            api_univalence = 0.005 / 1000
+            for item in operating_qs:
+                order_qs = Order_Model.objects.filter(orderID=item['order_id'], UID=item['uid']).values('price',
+                                                                                                        'order_type',
+                                                                                                        'fee',
+                                                                                                        'userID__region_country',
+                                                                                                        'rank__expire',
+                                                                                                        'payType')
+                if not order_qs.exists():
+                    continue
+                country_qs = CountryModel.objects.filter(id=order_qs[0]['userID__region_country']).values(
+                    'country_name')
+                country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知国家'
+                region = '国内' if CONFIG_INFO == CONFIG_CN else '国外'
+                if order_qs[0]['order_type'] in [0, 1]:
+                    order_type = '云存'
+                    order_start_time = int((datetime.datetime.fromtimestamp(item['end_time']) - relativedelta(
+                        months=order_qs[0]['rank__expire'])).timestamp())
+                    storage_cost = float(item['actual_storage']) / 1024 * storage_univalence * item['settlement_days']
+                    api_cost = int(item['actual_api']) * api_univalence
+                    if CONFIG_INFO == CONFIG_CN:  # 国内要换算汇率
+                        storage_cost = storage_cost * 7
+                        api_cost = api_cost * 7
+                        profit = round(float(item['monthly_income']) - storage_cost - api_cost, 2)
+                    else:
+                        profit = round(float(item['monthly_income']) - storage_cost - api_cost, 2)
+                    expire = str(order_qs[0]['rank__expire']) + '个月'
+                else:
+                    order_type = '4G流量'
+                    storage_cost = 0
+                    api_cost = 0
+                if order_qs[0]['payType'] in [2, 3]:
+                    fee = float(order_qs[0]['price']) * 0.0054
+                else:
+                    fee = order_qs[0]['fee']
+                res.append({
+                    'order_id': item['order_id'],
+                    'uid': item['uid'],
+                    'region': region,
+                    'country_name': country_name,
+                    'order_type': order_type,
+                    'expire': expire,
+                    'price': order_qs[0]['price'],
+                    'fee': fee,
+                    'real_income': round(float(order_qs[0]['price']) - float(order_qs[0]['fee']), 2),
+                    'day_average_price': item['day_average_price'],
+                    'month_average_price': item['month_average_price'],
+                    'purchase_quantity': item['purchase_quantity'],
+                    'start_time': order_start_time,
+                    'end_time': item['end_time'],
+                    'settlement_time': item['created_time'],
+                    'settlement_days': item['settlement_days'],
+                    'monthly_income': item['monthly_income'],
+                    'remaining_usage_time': item['remaining_usage_time'],
+                    'actual_storage': item['actual_storage'],
+                    'actual_api': item['actual_api'],
+                    'storage_cost': storage_cost,
+                    'api_cost': api_cost,
+                    'profit': profit
+                })
+            if CONFIG_INFO == CONFIG_US:
+                headers = {
+                    'Authorization': request.META.get('HTTP_AUTHORIZATION')
+                }
+                eur_response = requests.get('https://www.zositeche.com/dataManagement/costsData/getOperatingCosts',
+                                            params=params, headers=headers)
+                if eur_response.status_code == 200:
+                    eur_result = eur_response.json()
+                    if eur_result['result_code'] == 0:
+                        res += eur_result['result']['res']
+                        count += eur_result['result']['count']
+            return response.json(0, {'count': count, 'res': CommonService.list_sort_v2(res, 'order_id')})
+        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 AdminController.dataSystemManagement import UserDataController, DeviceDataController, ServiceDataController, \
-    BusinessDataController, HomeDataController, UnicomDataController
+    BusinessDataController, HomeDataController, UnicomDataController, OperatingCostsDataController
 
 urlpatterns = [
     re_path(r'^userData/(?P<operation>.*)$', UserDataController.UserDataView.as_view()),
@@ -18,4 +18,5 @@ urlpatterns = [
     re_path(r'^businessData/(?P<operation>.*)$', BusinessDataController.BusinessDataView.as_view()),
     re_path(r'^homeData/(?P<operation>.*)$', HomeDataController.HomeDataView.as_view()),
     re_path(r'^unicomData/(?P<operation>.*)$', UnicomDataController.UnicomDataView.as_view()),
+    re_path(r'^costsData/(?P<operation>.*)$', OperatingCostsDataController.OperatingCostsDataView.as_view()),
 ]

+ 21 - 20
Model/models.py

@@ -933,7 +933,7 @@ class EquipmentInfo21(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -962,7 +962,7 @@ class EquipmentInfo22(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -991,7 +991,7 @@ class EquipmentInfo23(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -1020,7 +1020,7 @@ class EquipmentInfo24(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -1049,7 +1049,7 @@ class EquipmentInfo25(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -1078,7 +1078,7 @@ class EquipmentInfo26(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -1107,7 +1107,7 @@ class EquipmentInfo27(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -1136,7 +1136,7 @@ class EquipmentInfo28(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -1165,7 +1165,7 @@ class EquipmentInfo29(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -1194,7 +1194,7 @@ class EquipmentInfo30(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -1223,7 +1223,7 @@ class EquipmentInfo31(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -1252,7 +1252,7 @@ class EquipmentInfo32(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -1281,7 +1281,7 @@ class EquipmentInfo33(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -1310,7 +1310,7 @@ class EquipmentInfo34(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -1339,7 +1339,7 @@ class EquipmentInfo35(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -1368,7 +1368,7 @@ class EquipmentInfo36(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -1397,7 +1397,7 @@ class EquipmentInfo37(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -1426,7 +1426,7 @@ class EquipmentInfo38(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -1455,7 +1455,7 @@ class EquipmentInfo39(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -1484,7 +1484,7 @@ class EquipmentInfo40(models.Model):
     # 1: 阿里云, 2: AWS
     storage_location = models.PositiveSmallIntegerField(default=1, verbose_name='存储桶位置')
     border_coords = models.TextField(default='', verbose_name='ai类型图片边框位置信息')
-    status = models.BooleanField(default=False, verbose_name='已读状态')   # 0: 未读, 1: 已读
+    status = models.BooleanField(default=False, verbose_name='已读状态')  # 0: 未读, 1: 已读
     answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     event_time = models.CharField(default='', max_length=10, db_index=True, verbose_name='上报时间')
     add_time = models.IntegerField(default=0, db_index=True, verbose_name='添加时间')
@@ -4211,6 +4211,7 @@ class OperatingCosts(models.Model):
     purchase_quantity = models.CharField(verbose_name='购买量/月', default='', max_length=8, blank=True)
     actual_storage = models.CharField(default='', verbose_name='实际存储量', max_length=16)
     actual_api = models.IntegerField(default=0, verbose_name='实际调用api次数')
+    actual_flow = models.CharField(default='', verbose_name='实际流量', max_length=16)
     monthly_income = models.CharField(verbose_name='当月结算收入', default='', max_length=16)  # 实际收入/套餐总天数*结算天数
     settlement_days = models.SmallIntegerField(verbose_name='当月结算天数', default=0)
     remaining_usage_time = models.IntegerField(default=0, verbose_name='剩余使用时间')

+ 11 - 2
Service/CommonService.py

@@ -571,7 +571,7 @@ GCqvlyw5dfxNA+EtxNE2wCW/LW7ENJlACgcfgPlBZtpLheWoZB/maw4=
         """
         根据uid查询返回完整序列号
         @param uid: uid
-        @param serial_number: 序列号
+        @param serial_number: 9位序列号
         @param device_type: 设备类型
         @return: full_serial_number
         """
@@ -678,7 +678,7 @@ GCqvlyw5dfxNA+EtxNE2wCW/LW7ENJlACgcfgPlBZtpLheWoZB/maw4=
 
         time_list = []
         while True:
-            mid_time = datetime.datetime(start_time.year, start_time.month, start_time.day)+relativedelta(days=1)
+            mid_time = datetime.datetime(start_time.year, start_time.month, start_time.day) + relativedelta(days=1)
             if mid_time < end_time:
                 time_tuple = (CommonService.str_to_timestamp(start_time.strftime('%Y-%m-%d %H:%M:%S')),
                               CommonService.str_to_timestamp(mid_time.strftime('%Y-%m-%d %H:%M:%S')))
@@ -736,6 +736,15 @@ GCqvlyw5dfxNA+EtxNE2wCW/LW7ENJlACgcfgPlBZtpLheWoZB/maw4=
         """
         return sorted(e, key=lambda item: -item['count'])
 
+    @staticmethod
+    def list_sort_v2(e, order_by):
+        """
+        列表排序
+        @param e: 列表元素
+        @param order_by: 排序对象
+        """
+        return sorted(e, key=lambda item: item[order_by])
+
     @staticmethod
     def Package_Type(order_type, content):
         """