Browse Source

Merge branch 'test' of http://192.168.136.99:3000/servers/ASJServer into test

lang 3 years ago
parent
commit
a427f4831f

+ 194 - 0
AdminController/SerialManageController.py

@@ -0,0 +1,194 @@
+#!/usr/bin/python3.6
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2022 #
+# @Time    : 2022/3/9 9:20
+# @Author  : ming
+# @Email   : zhangdongming@asj6.wecom.work
+# @File    : SurveysManageController.py
+# @Software: PyCharm
+
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from django.views.generic.base import View
+
+from Model.models import CompanyModel, SerialNumberModel, VPGModel, UIDModel, UIDCompanySerialModel, CompanySerialModel
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+
+
+class SerialView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(SerialView, self).dispatch(*args, **kwargs)
+
+    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 = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
+        response = ResponseObject()
+        if token.code != 0:
+            return response.json(token.code)
+        response = ResponseObject(returntype='pc')
+        if operation == 'company-page':
+            return self.company_page(request_dict, response)
+        if operation == 'number/page':
+            return self.serial_page(request_dict, response)
+        if operation == 'vpg-info/page':
+            return self.vpg_page(request_dict, response)
+        if operation == 'uid-info/page':
+            return self.uid_page(request_dict, response)
+        return response.json(0)
+
+    @classmethod
+    def company_page(cls, request_dict, response):
+        pageNo = request_dict.get('pageNo', None)
+        pageSize = request_dict.get('pageSize', None)
+        if not all([pageNo, pageSize]):
+            return response.json(444)
+
+        page = int(pageNo)
+        line = int(pageSize)
+        try:
+            request_qs = CompanyModel.objects.all()
+            if not request_qs.exists():
+                return response.json(0, {'list': '', 'total': 0})
+            total = request_qs.count()
+            company_page = request_qs.order_by('-add_time')[(page - 1) * line:page * line].values()
+            return response.json(0, {'list': list(company_page), 'total': total})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    @classmethod
+    def serial_page(cls, request_dict, response):
+        pageNo = request_dict.get('pageNo', None)
+        pageSize = request_dict.get('pageSize', None)
+        serial_number = request_dict.get('serialNumber', None)
+        status = request_dict.get('status', None)
+        use_status = request_dict.get('useStatus', None)
+        if not all([pageNo, pageSize]):
+            return response.json(444)
+        page = int(pageNo)
+        line = int(pageSize)
+        try:
+            query = SerialNumberModel.objects.filter()
+            if serial_number:
+                query = query.filter(serial_number__contains=serial_number)
+            if status:
+                status = int(status)
+                query = query.filter(status=status)
+            if use_status:
+                use_status = int(use_status)
+                query = query.filter(use_status=use_status)
+            if not query.exists():
+                return response.json(0, {'list': '', 'total': 0})
+            total = query.count()
+            serial_number_page = query.order_by('-add_time')[(page - 1) * line:page * line].values()
+            if serial_number_page.exists():
+                return response.json(0, {'list': list(serial_number_page), 'total': total})
+            return response.json(173)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    @classmethod
+    def vpg_page(cls, request_dict, response):
+        pageNo = request_dict.get('pageNo', None)
+        pageSize = request_dict.get('pageSize', None)
+        if not all([pageNo, pageSize]):
+            return response.json(444)
+        page = int(pageNo)
+        line = int(pageSize)
+        try:
+            query = VPGModel.objects.filter()
+            if not query.exists():
+                return response.json(0, {'list': '', 'total': 0})
+            total = query.count()
+            vpg_page = query.order_by('-add_time')[(page - 1) * line:page * line] \
+                .values('id', 'name',
+                        'region__name',
+                        'region_id',
+                        'company__name',
+                        'add_time',
+                        'update_time',
+                        'company__secret',
+                        'uid_count')
+            if vpg_page.exists():
+                return response.json(0, {'list': list(vpg_page), 'total': total})
+            return response.json(173)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    @classmethod
+    def uid_page(cls, request_dict, response):
+        pageNo = request_dict.get('pageNo', None)
+        pageSize = request_dict.get('pageSize', None)
+        status = request_dict.get('status', None)
+        serial_number = request_dict.get('serialNumber', None)
+        uid = request_dict.get('uid', None)
+        p2p_type = request_dict.get('p2pType', None)
+        if not all([pageNo, pageSize]):
+            return response.json(444)
+        page = int(pageNo)
+        line = int(pageSize)
+        try:
+            query = UIDModel.objects.filter()
+            if serial_number:
+                company_serial_qs = CompanySerialModel.objects.filter(serial_number=serial_number).values()
+                if company_serial_qs.exists():
+                    cs_id = str(company_serial_qs[0]['id'])
+                    uid_company_serial_qs = UIDCompanySerialModel.objects.filter(company_serial_id=cs_id).values(
+                        'uid_id')
+                    if uid_company_serial_qs.exists():
+                        uid_id = uid_company_serial_qs[0]['uid_id']
+                        query = query.filter(id=uid_id)
+            if status:
+                query = query.filter(status=int(status))
+            if uid:
+                query = query.filter(uid__contains=uid)
+            if p2p_type:
+                query = query.filter(p2p_type=int(p2p_type))
+            if not query.exists():
+                return response.json(0, {'list': '', 'total': 0})
+            total = query.count()
+            uid_page = query.order_by('-add_time')[(page - 1) * line:page * line]
+            result_list = []
+            if not uid_page.exists():
+                return response.json(0, {'list': '', 'total': 0})
+            for vo in uid_page:
+                uid_company_serial_qs = UIDCompanySerialModel.objects.filter(uid_id=vo.id).values('uid_id',
+                                                                                                  'company_serial_id')
+                serial = None
+                if uid_company_serial_qs.exists():
+                    company_serial_id = uid_company_serial_qs[0]['company_serial_id']
+                    company_serial_qs = CompanySerialModel.objects.filter(id=company_serial_id).values()
+                    if company_serial_qs.exists():
+                        serial = str(company_serial_qs[0]['serial_number'])
+                result_list.append({
+                    'id': vo.id,
+                    'uid': vo.uid,
+                    'mac': vo.mac,
+                    'extra': vo.uid_extra,
+                    'serial': serial,
+                    'status': vo.status,
+                    'area': vo.area,
+                    'p2pType': vo.p2p_type,
+                    'fullUidCode': vo.full_uid_code,
+                    'updateTime': vo.update_time,
+                    'addTime': vo.add_time
+                })
+            return response.json(0, {'list': result_list, 'total': total})
+
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))

+ 60 - 61
AdminController/SurveysManageController.py

@@ -75,9 +75,9 @@ class SurveysView(View):
         try:
             request_qs = Surveys.objects.all()
             total = request_qs.count()
-            surveys_list = request_qs.filter().order_by('-created_time')[(page - 1) * line:page * line]
+            surveys_page = request_qs.filter().order_by('-created_time')[(page - 1) * line:page * line]
             result_list = []
-            for surveys in surveys_list:
+            for surveys in surveys_page:
                 start_time = time.localtime(surveys.start_time)
                 endT_time = time.localtime(surveys.end_time)
                 created_time = time.localtime(surveys.created_time)
@@ -98,25 +98,25 @@ class SurveysView(View):
     @classmethod
     def save(cls, request_dict, response):
         no = request_dict.get('no', None)
-        if no:
-            if Surveys.objects.filter(no=no).exists():
-                return response.json(10, '已存在')
-            no = request_dict.get('no', None)
-            userType = request_dict.get('userType', None)
-            startTime = request_dict.get('dateTime[0]', None)
-            endTime = request_dict.get('dateTime[1]', None)
-            isShow = request_dict.get('isShow', None)
-            isShow = 1 if isShow == 'true' else 0
-            createdTime = int(time.time())
-            try:
-                surveys = Surveys(no=no, user_type=userType, start_time=int(startTime),
-                                  end_time=endTime, is_show=isShow, created_time=int(createdTime))
-                surveys.save()
-                return response.json(0)
-            except Exception as e:
-                print(e)
-                return response.json(500, repr(e))
-        return response.json(0)
+        if not no:
+            return response.json(0)
+        if Surveys.objects.filter(no=no).exists():
+            return response.json(10, '已存在')
+        no = request_dict.get('no', None)
+        user_type = request_dict.get('userType', None)
+        start_time = request_dict.get('dateTime[0]', None)
+        end_time = request_dict.get('dateTime[1]', None)
+        is_show = request_dict.get('isShow', None)
+        is_show = 1 if is_show == 'true' else 0
+        createdTime = int(time.time())
+        try:
+            surveys = Surveys(no=no, user_type=user_type, start_time=int(start_time),
+                              end_time=end_time, is_show=is_show, created_time=int(createdTime))
+            surveys.save()
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
 
     @classmethod
     def edit(cls, request_dict, response):
@@ -124,15 +124,14 @@ class SurveysView(View):
         if not sur_id:
             return response.json(10, 'id不存在')
 
-        userType = request_dict.get('userType', None)
-        startTime = request_dict.get('dateTime[0]', None)
-        endTime = request_dict.get('dateTime[1]', None)
-        isShow = request_dict.get('isShow', None)
-        isShow = 1 if isShow == 'true' else 0
-        print(endTime)
-        Surveys.objects.filter(id=int(sur_id)).update(user_type=int(userType), start_time=int(startTime),
-                                                      end_time=int(endTime),
-                                                      is_show=int(isShow))
+        user_type = request_dict.get('userType', None)
+        start_time = request_dict.get('dateTime[0]', None)
+        end_time = request_dict.get('dateTime[1]', None)
+        is_show = request_dict.get('isShow', None)
+        is_show = 1 if is_show == 'true' else 0
+        Surveys.objects.filter(id=int(sur_id)).update(user_type=int(user_type), start_time=int(start_time),
+                                                      end_time=int(end_time),
+                                                      is_show=int(is_show))
         return response.json(0)
 
     @classmethod
@@ -145,18 +144,18 @@ class SurveysView(View):
 
     @classmethod
     def title_save(cls, request_dict, response):
-        surveyId = request_dict.get('surveyId', None)
-        if not surveyId:
+        survey_id = request_dict.get('surveyId', None)
+        if not survey_id:
             return response(10, 'surveyId is null')
         t_id = request_dict.get('id', None)
         content = request_dict.get('content', None)
-        createdTime = int(time.time())
+        created_time = int(time.time())
         try:
             title = SurveysTitle.objects.filter(id=t_id)
             if title.exists():
                 title.update(title_content=content)
             else:
-                surveys_title = SurveysTitle(surveys_id=surveyId, title_content=content, created_time=createdTime)
+                surveys_title = SurveysTitle(surveys_id=survey_id, title_content=content, created_time=created_time)
                 surveys_title.save()
             return response.json(0)
         except Exception as e:
@@ -165,11 +164,11 @@ class SurveysView(View):
 
     @classmethod
     def get_title_list(cls, request_dict, response):
-        surveyId = request_dict.get('surveyId', None)
+        survey_id = request_dict.get('surveyId', None)
         info = request_dict.get('info', None)
-        if not surveyId:
+        if not survey_id:
             return response.json(10, '问卷id不存在')
-        title_list = SurveysTitle.objects.filter(surveys_id=surveyId).order_by('-created_time')
+        title_list = SurveysTitle.objects.filter(surveys_id=survey_id).order_by('-created_time')
         if not title_list.exists():
             if info:
                 return response.json(0, {'id': None, 'content': None})
@@ -202,12 +201,12 @@ class SurveysView(View):
     def cloud_surveys_answer_page(cls, request_dict, response):
         pageNo = request_dict.get('pageNo', None)
         pageSize = request_dict.get('pageSize', None)
-        userName = request_dict.get('userName', None)
-        countryName = request_dict.get('countryName', None)
-        timeRange = request_dict.getlist('timeRange[]', None)
+        user_name = request_dict.get('userName', None)
+        country_name = request_dict.get('countryName', None)
+        time_range = request_dict.getlist('timeRange[]', None)
         num = request_dict.get('num', 0)
         num = int(num)
-        optVal = request_dict.getlist('optVal', None)
+        opt_val = request_dict.getlist('optVal', None)
         if not all([pageNo, pageSize]):
             return response.json(444)
 
@@ -215,12 +214,12 @@ class SurveysView(View):
         line = int(pageSize)
         try:
             request_qs = CloudVodSurveysAnswer.objects.all()
-            if userName:
-                request_qs = request_qs.filter(user__username__contains=userName)
-            if countryName:
-                request_qs = request_qs.filter(country_name=countryName)
-            if num >= 0 and len(optVal) > 0:
-                condition = int(optVal[0])
+            if user_name:
+                request_qs = request_qs.filter(user__username__contains=user_name)
+            if country_name:
+                request_qs = request_qs.filter(country_name=country_name)
+            if num >= 0 and len(opt_val) > 0:
+                condition = int(opt_val[0])
                 if condition == 1:
                     request_qs = request_qs.filter(answer1__gt=num)
                 elif condition == 2:
@@ -232,28 +231,25 @@ class SurveysView(View):
                 elif condition == 5:
                     request_qs = request_qs.filter(answer1__lte=num)
 
-            if timeRange:
-                startTime, endTime = int(
-                    timeRange[0][:-3]), int(timeRange[1][:-3])
-                request_qs = request_qs.filter(
-                    created_time__gte=startTime,
-                    created_time__lte=endTime)
+            if time_range:
+                startTime, endTime = int(time_range[0][:-3]), int(time_range[1][:-3])
+                request_qs = request_qs.filter(created_time__gte=startTime, created_time__lte=endTime)
             if not request_qs.exists():
-                return response.json(0, [])
+                return response.json(0)
             total = request_qs.count()
             answer_page = request_qs.order_by('-created_time')[(page - 1) * line:page * line]
             result_list = []
             for answer in answer_page:
-                d_user = Device_User.objects.filter(userID=answer.user_id)
-                if not all(d_user):
+                d_user_qs = Device_User.objects.filter(userID=answer.user_id)
+                if not all(d_user_qs):
                     return response.json(173)
-                d_user = d_user[0]
+                d_user_qs = d_user_qs[0]
                 created_time = time.localtime(answer.created_time)
                 result_list.append({
                     'id': answer.id,
-                    'uId': d_user.userID,
-                    'uName': d_user.username,
-                    'nickName': d_user.NickName,
+                    'uId': d_user_qs.userID,
+                    'uName': d_user_qs.username,
+                    'nickName': d_user_qs.NickName,
                     'answer1': answer.answer1,
                     'answer2': answer.answer2,
                     'answer3': answer.answer3,
@@ -286,6 +282,8 @@ class SurveysView(View):
             cursor.execute(sql, [1, 0, ])
             cloud_count = cursor.fetchall()
             total = len(cloud_count)
+            readCount = SurveysUserLog.objects.count()
+            unreadCount = total - readCount
             sql += 'order by ca.created_time DESC,orderID DESC LIMIT %s,%s '
             cursor.execute(sql, [1, 0, ((page - 1) * size), size, ])
             data_obj = cursor.fetchall()
@@ -313,7 +311,8 @@ class SurveysView(View):
                     tMap.update({"createdTime": ''})
                     tMap.update({"isUpgrade": 0})
                 result_list.append(tMap)
-            return response.json(0, {'list': result_list, 'total': total})
+            return response.json(0, {'list': result_list, 'total': total, 'readCount': readCount,
+                                     'unreadCount': unreadCount})
         except Exception as e:
             print(e)
             return response.json(500, repr(e))

+ 2 - 2
AdminController/UserManageController.py

@@ -615,9 +615,9 @@ class UserManagement(View):
         print('request_dict: ', request_dict)
         platform = request_dict.get('platform', None)
 
-        if platform == 'android':
+        if platform == 'ios':
             app_type = [1]
-        elif platform == 'ios':
+        elif platform == 'android':
             app_type = [2]
         else:
             app_type = [1, 2]

+ 1 - 1
Ansjer/test/postest.py

@@ -20,7 +20,7 @@ data['appBundleId'] = 'com.ansjer.zccloud_ab'
 data['tz'] = '+08.00'
 data['uid'] = 'HLK7EJ2VYLNHHUMG111A'
 data['status'] = '1'
-data['m_code'] = 'AN02000025070000001207.zccloud_ab'
+data['m_code'] = 'AN025070000001207.zccloud_ab'
 data['token'] = 'local'
 data['lang'] = 'cn'
 data['app_type'] = '2'

+ 11 - 9
Ansjer/urls.py

@@ -21,9 +21,10 @@ from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppIn
     DetectControllerV2, ShadowController, TestDetectController, PcInfo, PctestController, DeviceDebug, PaymentCycle, \
     DeviceLogController, CouponController, AiController
 from Controller.Surveys import CloudStorageController
+from Controller.Cron import CronTaskController
 from AdminController import UserManageController, RoleController, MenuController, TestServeController, \
     ServeManagementController, LogManagementController, DeviceManagementController, VersionManagementController, \
-    AiServeController, SurveysManageController
+    AiServeController, SurveysManageController, SerialManageController
 
 urlpatterns = [
     url(r'^testApi/(?P<operation>.*)$', TestApi.testView.as_view()),
@@ -127,6 +128,7 @@ urlpatterns = [
     url(r'^dlotapack/(?P<fullPath>[0-9\w/.\-]+)', OTAEquipment.downloadOTAInterfaceV2),
     url(r'^OTA/getDownLoadOTApackUrl$', OTAEquipment.getDownLoadOTApackUrl),
     url(r'^OTA/checkMaxVersion$', OTAEquipment.checkMaxVersion),
+    url(r'^v2/OTA/checkMaxVersion$', OTAEquipment.checkMaxVersionV2),
 
     # h获取验证码    # v2接口
     url(r'^v2/account/authcode$', UserController.v2authCodeView.as_view()),
@@ -166,7 +168,7 @@ urlpatterns = [
     url(r'^deviceShadow/update$', ShadowController.update_device_shadow),
     url(r'^deviceShadow/generateUTK$', ShadowController.generate_utk),
     url(r'^test/notify/push$', TestDetectController.NotificationView.as_view()),
-    url(r'^eq/del$', EquipmentInfo.deleteExpireEquipmentInfo),
+
     # 新增
     url(r'^cloudVod/(?P<operation>.*)$', CloudVod.CloudVodView.as_view()),
     url(r'^meal/(?P<operation>.*)$', MealManage.MealView.as_view()),
@@ -209,12 +211,6 @@ urlpatterns = [
     url(r'^oauth/perfect', UserController.OauthPerfectView.as_view()),
     url(r'^oauth/unbunding', UserController.UnbundingWXView.as_view()),
 
-    # 删除云存视频
-    # path('cv/del', CloudVod.deleteVodHls),
-    path('cv/del', CloudStorage.deleteVodHls),
-    path('cv/delCloudLog', CloudStorage.deleteCloudLog),
-    path('cv/updateExpiredUidBucket', CloudStorage.updateExpiredUidBucket),
-    path('cv/updateUnusedUidBucket', CloudStorage.updateUnusedUidBucket),
     url(r'^equipment/judge', EquipmentManager.judgeInterface),
 
     # ap模式,新增设备表
@@ -246,7 +242,6 @@ urlpatterns = [
 
     # AI服务
     url(r'^AiService/(?P<operation>.*)$', AiController.AiView.as_view()),
-    url('^ai/updateUnusedAi', AiController.updateUnusedAi),
 
     # 新增解密的接口
     url(r'^v3/account/changePwd$', UserController.v3ChangePwdView.as_view()),
@@ -390,8 +385,15 @@ urlpatterns = [
     re_path('aiServe/(?P<operation>.*)', AiServeController.AiServeView.as_view()),
     # 问卷调查管理
     url(r'surveys/(?P<operation>.*)', SurveysManageController.SurveysView.as_view()),
+    # 序列号管理
+    url(r'serial/(?P<operation>.*)', SerialManageController.SerialView.as_view()),
     # 后台界面接口 -----------------------------------------------------
 
+    # 定时删除任务接口
+    url(r'^cron/del/(?P<operation>.*)', CronTaskController.CronDelDataView.as_view()),
+    # 定时更新任务接口
+    url(r'^cron/update/(?P<operation>.*)', CronTaskController.CronUpdateDataView.as_view()),
+
     re_path('(?P<path>.*)', LogManager.errorPath),
 
 ]

+ 1 - 17
Controller/AiController.py

@@ -996,20 +996,4 @@ class AiView(View):
             print(e)
             return response.json(500, repr(e))
 
-# 如果ai套餐过期,更新未使用的关联套餐
-def updateUnusedAi(request):
-    now_time = int(time.time())
-    ai_service_qs = AiService.objects.filter(endTime__lte=now_time, use_status=1).values('id', 'uid')[0:200]
-    for ai_service in ai_service_qs:
-        try:
-            with transaction.atomic():
-                AiService.objects.filter(id=ai_service['id']).update(use_status=2)      # 更新过期ai订单状态
-                # 如果存在未使用套餐,更新为使用
-                unused_ai_service = AiService.objects.filter(uid=ai_service['uid'], use_status=0).order_by('addTime')[:1].values('id', 'endTime')
-                if unused_ai_service.exists():
-                    effective_day = unused_ai_service[0]['endTime']     # 未使用套餐的endTime在购买的时候保存为有效时间
-                    endTime = now_time + effective_day
-                    AiService.objects.filter(id=unused_ai_service[0]['id']).update(use_status=1, endTime=endTime, updTime=now_time)
-        except Exception as e:
-            continue
-    return HttpResponse()
+

+ 35 - 96
Controller/CloudStorage.py

@@ -905,8 +905,11 @@ class CloudStorageView(View):
 
                     order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id, promotion_rule_id=promotion_rule_id)
                     datetime = time.strftime("%Y-%m-%d", time.localtime())
-                    sys_msg_text_list = ['温馨提示:尊敬的客户,您的'+UID+'设备在'+datetime+'已成功购买云存套餐', 'Dear customer,you already subscribed the cloud storage package successfully for device ' + UID + ' on '+ time.strftime("%b %dth,%Y", time.localtime())]
-                    self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list, 'SMS_219738485')
+                    # 如果存在序列号,消息提示用序列号
+                    device_name = CommonService.query_serial_with_uid(uid=UID)
+
+                    sys_msg_text_list = ['温馨提示:尊敬的客户,您的'+device_name+'设备在'+datetime+'已成功购买云存套餐', 'Dear customer,you already subscribed the cloud storage package successfully for device ' + device_name + ' on '+ time.strftime("%b %dth,%Y", time.localtime())]
+                    self.do_vod_msg_Notice(device_name, channel, userid, lang, sys_msg_text_list, 'SMS_219738485')
                     red_url = "{SERVER_DOMAIN_SSL}web/paid2/success.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
                     if lang != 'cn':
                         red_url = "{SERVER_DOMAIN_SSL}web/paid2/en_success.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
@@ -1049,11 +1052,14 @@ class CloudStorageView(View):
 
                 order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id, promotion_rule_id=promotion_rule_id)
                 datetime = time.strftime("%Y-%m-%d", time.localtime())
-                sys_msg_text_list = ['温馨提示:尊敬的客户,您的' + UID + '设备在' + datetime + '已成功购买云存套餐',
-                                     'Dear customer,you already subscribed the cloud storage package successfully for device ' + UID + ' on ' + time.strftime(
+                # 如果存在序列号,消息提示用序列号
+                device_name = CommonService.query_serial_with_uid(uid=UID)
+
+                sys_msg_text_list = ['温馨提示:尊敬的客户,您的' + device_name + '设备在' + datetime + '已成功购买云存套餐',
+                                     'Dear customer,you already subscribed the cloud storage package successfully for device ' + device_name + ' on ' + time.strftime(
                                          "%b %dth,%Y", time.localtime())]
 
-                self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list, 'SMS_219738485')
+                self.do_vod_msg_Notice(device_name, channel, userid, lang, sys_msg_text_list, 'SMS_219738485')
 
                 # return response.json(0)
                 red_url = "{SERVER_DOMAIN_SSL}web/paid2/success.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
@@ -1175,10 +1181,13 @@ class CloudStorageView(View):
 
                     order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id, promotion_rule_id=promotion_rule_id)
                     datetime = time.strftime("%Y-%m-%d", time.localtime())
-                    sys_msg_text_list = ['温馨提示:尊敬的客户,您的' + UID + '设备在' + datetime + '已成功购买云存套餐',
-                                         'Dear customer,you already subscribed the cloud storage package successfully for device ' + UID + ' on ' + time.strftime(
+                    # 如果存在序列号,消息提示用序列号
+                    device_name = CommonService.query_serial_with_uid(uid=UID)
+
+                    sys_msg_text_list = ['温馨提示:尊敬的客户,您的' + device_name + '设备在' + datetime + '已成功购买云存套餐',
+                                         'Dear customer,you already subscribed the cloud storage package successfully for device ' + device_name + ' on ' + time.strftime(
                                              "%b %dth,%Y", time.localtime())]
-                    self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list, 'SMS_219738485')
+                    self.do_vod_msg_Notice(device_name, channel, userid, lang, sys_msg_text_list, 'SMS_219738485')
                     redisObj.del_data(key=orderID + 'do_notify')
                     return HttpResponse("<xml>\
                       <return_code><![CDATA[SUCCESS]]></return_code>\
@@ -1518,11 +1527,12 @@ class CloudStorageView(View):
                 #     UIDMainUser.objects.create(**uid_main_dict)
                 sms = 'SMS_219738485'
                 datetime = time.strftime("%Y-%m-%d", time.localtime())
-                sys_msg_text_list = ['温馨提示:尊敬的客户,您的' + uid + '设备在' + datetime + '已成功购买云存套餐',
-                                     'Dear customer,you already subscribed the cloud storage package successfully for device ' + uid + ' on ' + time.strftime(
+                # 如果存在序列号,消息提示用序列号
+                device_name = CommonService.query_serial_with_uid(uid=uid)
+                sys_msg_text_list = ['温馨提示:尊敬的客户,您的' + device_name + '设备在' + datetime + '已成功购买云存套餐',
+                                     'Dear customer,you already subscribed the cloud storage package successfully for device ' + device_name + ' on ' + time.strftime(
                                          "%b %dth,%Y", time.localtime())]
 
-                # return response.json(0)
                 returnurl = "{SERVER_DOMAIN_SSL}cloudstorage/payOK?lang={lang}".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL,lang=lang)
                 if pay_type == 10:
                     ExperienceContextModel.objects.create(
@@ -1532,8 +1542,8 @@ class CloudStorageView(View):
                     )
                     returnurl = "{SERVER_DOMAIN_SSL}cloudstorage/payOK?paytype=10&lang={lang}".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL,lang=lang)
                     datetime = time.strftime("%Y-%m-%d", time.localtime())
-                    sys_msg_text_list = ['温馨提示:尊敬的客户,您的' + uid + '设备在' + datetime + '已成功开通云存体验套餐',
-                                         'Dear customer,you already subscribed the free trial cloud storage service successfully for device ' + uid + ' on '+ time.strftime("%b %dth,%Y", time.localtime())]
+                    sys_msg_text_list = ['温馨提示:尊敬的客户,您的' + device_name + '设备在' + datetime + '已成功开通云存体验套餐',
+                                         'Dear customer,you already subscribed the free trial cloud storage service successfully for device ' + device_name + ' on '+ time.strftime("%b %dth,%Y", time.localtime())]
                     sms = 'SMS_222870823'
                 if pay_type == 11:
                     update_dict = {}
@@ -1543,11 +1553,11 @@ class CloudStorageView(View):
                     returnurl = "{SERVER_DOMAIN_SSL}cloudstorage/payOK?paytype=11&lang={lang}".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL,lang=lang)
 
                     datetime = time.strftime("%Y-%m-%d", time.localtime())
-                    sys_msg_text_list = ['温馨提示:尊敬的客户,您的' + uid + '设备在' + datetime + '已成功兑换云存套餐',
-                                         'Dear customer, you already redeemed for the cloud storage package successfully for device ' +uid +' on '+time.strftime("%b %dth,%Y", time.localtime())]
+                    sys_msg_text_list = ['温馨提示:尊敬的客户,您的' + device_name + '设备在' + datetime + '已成功兑换云存套餐',
+                                         'Dear customer, you already redeemed for the cloud storage package successfully for device ' +device_name +' on '+time.strftime("%b %dth,%Y", time.localtime())]
                     sms = 'SMS_219748439'
 
-                self.do_vod_msg_Notice(uid, channel, userID, lang, sys_msg_text_list, sms)
+                self.do_vod_msg_Notice(uid, channel, userID, lang, sys_msg_text_list, sms, device_name)
                 result = returnurl
                 redisObj.del_data(key=uid+'do_experience_order')
                 return response.json(0, result)
@@ -1730,7 +1740,7 @@ class CloudStorageView(View):
             return response.json(500, repr(e))
 
     # 云存操作系统消息
-    def do_vod_msg_Notice(self, uid, channel, userID, lang, sys_msg_text_list, sms):
+    def do_vod_msg_Notice(self, uid, channel, userID, lang, sys_msg_text_list, sms, device_name):
         try:
             logger = logging.getLogger('log')
             logger.info('进来了')
@@ -1753,7 +1763,8 @@ class CloudStorageView(View):
                 if data_valid.email_validate(username):
                     S3Email().faEmail(sys_msg_text, username)
                 elif data_valid.mobile_validate(username):
-                    params = u'{"devname":"' + uid + '","submittime":"' + time.strftime("%Y-%m-%d",time.localtime()) + '"}'
+                    device_id = device_name if device_name else uid
+                    params = u'{"devname":"' + device_id + '","submittime":"' + time.strftime("%Y-%m-%d",time.localtime()) + '"}'
                     self.sendMessage(username, params, sms)
 
                 self.pushApp(nowTime, uid, channel, sys_msg_text)
@@ -1790,10 +1801,12 @@ class CloudStorageView(View):
         for ub in list:
             for oo in oqlist:
                 if ub['id'] == oo['uid_bucket_id']:
+                    # 如果存在序列号,消息提示用序列号
+                    device_name = CommonService.query_serial_with_uid(uid=ub['uid'])
                     if ub['bucket__area'] == 'cn':
-                        sys_msg_text = "温馨提示:尊敬的客户,您" + ub['uid'] + "设备的云存套餐将在" + time.strftime("%Y-%m-%d", time.localtime(ub['endTime'])) + "到期"
+                        sys_msg_text = "温馨提示:尊敬的客户,您" + device_name + "设备的云存套餐将在" + time.strftime("%Y-%m-%d", time.localtime(ub['endTime'])) + "到期"
                     else:
-                        sys_msg_text = 'Dear customer,the cloud storage package for your device '+ub['uid']+' will expire on '+time.strftime('%m-%d-%y',time.localtme(ub['endTime']))
+                        sys_msg_text = 'Dear customer,the cloud storage package for your device '+device_name+' will expire on '+time.strftime('%m-%d-%y',time.localtime(ub['endTime']))
                     uq_list.append(SysMsgModel(
                         userID_id=oo['userID_id'],
                         addTime=now_time,
@@ -1813,7 +1826,8 @@ class CloudStorageView(View):
                         if data_valid.email_validate(username):
                             S3Email().faEmail(sys_msg_text, username)
                         elif data_valid.mobile_validate(username):
-                            params = u'{"devname":"' + ub['uid'] + '","submittime":"' + time.strftime("%Y-%m-%d",
+                            device_id = device_name if device_name else ub['uid']
+                            params = u'{"devname":"' + device_id + '","submittime":"' + time.strftime("%Y-%m-%d",
                                                                                                       time.localtime(ub['endTime'])) + '"}'
                             self.sendMessage(username, params, 'SMS_219748440')
 
@@ -2034,78 +2048,3 @@ class CloudStorageView(View):
             return response.json(500, repr(e))
 
 
-# 删除过期云存播放列表
-def deleteVodHls(request):
-    # UID = 'DSXG7481JVA2JM94111A'
-    # channel = 1
-    # ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel). \
-    #     values("bucket_id", "endTime", "bucket__storeDay")
-    # nowTime = int(time.time())
-    # if ubqs.exists():
-    #     ubqs_count = ubqs.count()
-    #     ubq = ubqs[ubqs_count - 1, ubqs_count]
-    #     new_starTime = ubq['endTime'] + 1
-    #     print(new_starTime)
-    #     exit()
-    #
-    #     # ub_cqs = UID_Bucket.objects.create(uid=UID, channel=channel, bucket_id=bucketId,
-    #     #                                    endTime=new_starTime + addTime)
-    #     # uid_bucket_id = ub_cqs.id
-    # exit()
-
-    response = ResponseObject()
-    i = int(request.GET.get('i', 5))
-    nowTime = int(time.time()) - 3 * 30 * 24 * 60 * 60  # 保留3个月的数据
-    for i in range(i):
-        vh_qs = VodHlsModel.objects.filter(endTime__lte=str(nowTime))[0:10000]
-        id_list = vh_qs.values_list("id", flat=True)
-        print(id_list)
-        VodHlsModel.objects.filter(id__in=list(id_list)).delete()
-    return response.json(0)
-
-
-# 更新过期云存关联套餐
-def updateExpiredUidBucket(request):
-    response = ResponseObject()
-    now_time = int(time.time())
-    expired_uid_bucket = UID_Bucket.objects.filter(endTime__lte=now_time)
-    id_list = expired_uid_bucket.values_list("id", flat=True)
-    UID_Bucket.objects.filter(id__in=list(id_list)).update(use_status=2)  # 更新过期云存关联套餐状态
-    return response.json(0)
-
-# 如果云存关联套餐过期,更新未使用的关联套餐
-def updateUnusedUidBucket(request):
-    response = ResponseObject()
-    now_time = int(time.time())
-    expired_uid_buckets = UID_Bucket.objects.filter(endTime__lte=now_time,has_unused=1).values("id","uid")[0:1000]
-    for expired_uid_bucket in expired_uid_buckets:
-        unuseds = Unused_Uid_Meal.objects.filter(uid=expired_uid_bucket['uid']).values("id","uid","channel","addTime","expire",
-                                                                  "num","bucket_id").order_by('addTime')[0:1]
-        if not unuseds.exists():
-            continue
-        unused = unuseds[0]
-        try:
-            with transaction.atomic():
-                count_unused = Unused_Uid_Meal.objects.filter(uid=expired_uid_bucket['uid']).count()
-                has_unused = 1 if count_unused>1 else 0
-                endTime = CommonService.calcMonthLater(unused['expire'] * unused['num'])
-                UID_Bucket.objects.filter(uid=expired_uid_bucket['uid']).update(channel=unused['channel'],endTime=endTime,bucket_id=unused['bucket_id']
-                                                          ,updateTime=now_time,use_status=1,
-                                                          has_unused=has_unused)
-                Unused_Uid_Meal.objects.filter(id=unused['id']).delete()
-                StsCrdModel.objects.filter(uid=expired_uid_bucket['uid']).delete()  # 删除sts记录
-                # VodHlsModel.objects.filter(uid=expired_uid_bucket['uid']).delete()  # 删除播放列表,后期数据量多时应该考虑延后删除
-        except Exception:
-            continue
-    # UID_Bucket.objects.filter(id__in=list(id_list)).update(use_status=2)  # 更新过期云存关联套餐状态
-    return response.json(0)
-
-# 删除三个月之前的cloud_log数据
-def deleteCloudLog(request):
-    response = ResponseObject()
-    delTime = int(time.time()) - 3 * 30 * 24 * 60 * 60  # 保留3个月的数据
-    for i in range(5):
-        cloud_log_qs = CloudLogModel.objects.filter(time__lte=delTime)[0:10000]
-        id_list = cloud_log_qs.values_list('id', flat=True)
-        CloudLogModel.objects.filter(id__in=list(id_list)).delete()
-    return response.json(0)

+ 256 - 0
Controller/Cron/CronTaskController.py

@@ -0,0 +1,256 @@
+#!/usr/bin/python3.6
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2022 #
+# @Time    : 2022/4/1 11:27
+# @Author  : ming
+# @Email   : zhangdongming@asj6.wecom.work
+# @File    : CronTaskController.py
+# @Software: PyCharm
+import time
+
+from django.db import connection, connections, transaction
+from django.views import View
+
+from Model.models import Device_User, Device_Info, UidSetModel, UID_Bucket, Unused_Uid_Meal, Order_Model, StsCrdModel, \
+    VodHlsModel, ExperienceContextModel, AiService
+from Object.ResponseObject import ResponseObject
+from Object.utils import LocalDateTimeUtil
+from Service import CommonService
+
+
+class CronDelDataView(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):
+        response = ResponseObject()
+        if operation == 'delAccessLog':   # 定时删除访问接口数据
+            return self.delAccessLog(response)
+        elif operation == 'delPushInfo':  # 定时删除推送数据
+            return self.delPushInfo(response)
+        elif operation == 'delVodHls':  # 定时删除云存播放列表
+            return self.delVodHls(response)
+        elif operation == 'delCloudLog':  # 定时删除云存接口数据
+            return self.delCloudLog(response)
+        elif operation == 'delTesterDevice':  # 定时删除测试账号下的设备数据
+            return self.delTesterDevice(response)
+        else:
+            return response.json(404)
+
+    @staticmethod
+    def delAccessLog(response):
+        try:
+            cursor = connection.cursor()
+            # 删除一个月前的数据
+            last_month = LocalDateTimeUtil.get_last_month()
+            sql = 'DELETE FROM access_log WHERE time < %s limit %s'
+            cursor.execute(sql, [last_month, 10000])
+            # 关闭游标
+            cursor.close()
+            connection.close()
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, repr(e))
+
+    @staticmethod
+    def delPushInfo(response):
+        nowTime = int(time.time())
+        cursor = connections['mysql02'].cursor()
+        try:
+            for i in range(5):
+                # 删除7天前的数据
+                sql = "DELETE FROM `equipment_info` WHERE addTime<={} LIMIT 10000".format(
+                    nowTime - 3600 * 24 * 7)
+                cursor.execute(sql)
+            # 关闭游标
+            cursor.close()
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, repr(e))
+
+    @staticmethod
+    def delVodHls(response):
+        nowTime = int(time.time())
+        cursor = connection.cursor()
+        try:
+            # 删除3个月前的数据
+            sql = "DELETE FROM `vod_hls` WHERE endTime<={} LIMIT 50000".format(
+                nowTime - 3 * 30 * 24 * 60 * 60)
+            cursor.execute(sql)
+            # 关闭游标
+            cursor.close()
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, repr(e))
+
+    @staticmethod
+    def delCloudLog(response):
+        nowTime = int(time.time())
+        cursor = connection.cursor()
+        try:
+            # 删除3个月前的数据
+            sql = "DELETE FROM `cloud_log` WHERE time<={} LIMIT 50000".format(
+                nowTime - 3 * 30 * 24 * 60 * 60)
+            cursor.execute(sql)
+            # 关闭游标
+            cursor.close()
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, repr(e))
+
+    @staticmethod
+    def delTesterDevice(response):
+        try:
+            userID_list = [
+                'tech01@ansjer.com',
+                'tech02@ansjer.com',
+                'tech03@ansjer.com',
+                'tech04@ansjer.com',
+                'tech05@ansjer.com',
+                'tech06@ansjer.com',
+                'tech07@ansjer.com',
+                'tech08@ansjer.com',
+                'tech09@ansjer.com',
+                'tech10@ansjer.com',
+                'fix01@ansjer.com',
+                'fix02@ansjer.com',
+                'fix03@ansjer.com',
+                'fix04@ansjer.com',
+                'fix05@ansjer.com']
+            device_user = Device_User.objects.filter(username__in=userID_list)
+            device_info_qs = Device_Info.objects.filter(
+                userID__in=device_user).values('UID')
+            uid_list = []
+            for device_info in device_info_qs:
+                uid_list.append(device_info['UID'])
+            with transaction.atomic():
+                # 删除设备云存相关数据
+                UidSetModel.objects.filter(uid__in=uid_list).delete()
+                UID_Bucket.objects.filter(uid__in=uid_list).delete()
+                Unused_Uid_Meal.objects.filter(uid__in=uid_list).delete()
+                Order_Model.objects.filter(UID__in=uid_list).delete()
+                StsCrdModel.objects.filter(uid__in=uid_list).delete()
+                VodHlsModel.objects.filter(uid__in=uid_list).delete()
+                ExperienceContextModel.objects.filter(
+                    uid__in=uid_list).delete()
+                Device_Info.objects.filter(userID__in=device_user).delete()
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, repr(e))
+
+
+class CronUpdateDataView(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):
+        response = ResponseObject()
+        if operation == 'expiredUidBucket':   # 定时更新过期云存套餐状态
+            return self.expiredUidBucket(response)
+        elif operation == 'updateUnusedUidBucket':   # 定时更新过期云存关联的未使用套餐状态
+            return self.updateUnusedUidBucket(response)
+        elif operation == 'updateUnusedAiService':   # 定时更新过期ai关联的未使用套餐状态
+            return self.updateUnusedAiService(response)
+        else:
+            return response.json(404)
+
+    @staticmethod
+    def expiredUidBucket(response):
+        now_time = int(time.time())
+        expired_uid_bucket = UID_Bucket.objects.filter(endTime__lte=now_time)
+        id_list = expired_uid_bucket.values_list('id', flat=True)
+        UID_Bucket.objects.filter(id__in=list(id_list)).update(use_status=2)
+        return response.json(0)
+
+    @staticmethod
+    def updateUnusedUidBucket(response):
+        now_time = int(time.time())
+        expired_uid_buckets = UID_Bucket.objects.filter(
+            endTime__lte=now_time,
+            has_unused=1).values(
+            "id",
+            "uid")[
+            0:1000]
+        for expired_uid_bucket in expired_uid_buckets:
+            unuseds = Unused_Uid_Meal.objects.filter(
+                uid=expired_uid_bucket['uid']).values(
+                "id",
+                "uid",
+                "channel",
+                "addTime",
+                "expire",
+                "num",
+                "bucket_id").order_by('addTime')[
+                0:1]
+            if not unuseds.exists():
+                continue
+            unused = unuseds[0]
+            try:
+                with transaction.atomic():
+                    count_unused = Unused_Uid_Meal.objects.filter(
+                        uid=expired_uid_bucket['uid']).count()
+                    has_unused = 1 if count_unused > 1 else 0
+                    endTime = CommonService.calcMonthLater(
+                        unused['expire'] * unused['num'])
+                    UID_Bucket.objects.filter(
+                        uid=expired_uid_bucket['uid']).update(
+                        channel=unused['channel'],
+                        endTime=endTime,
+                        bucket_id=unused['bucket_id'],
+                        updateTime=now_time,
+                        use_status=1,
+                        has_unused=has_unused)
+                    Unused_Uid_Meal.objects.filter(id=unused['id']).delete()
+                    StsCrdModel.objects.filter(
+                        uid=expired_uid_bucket['uid']).delete()  # 删除sts记录
+            except Exception:
+                continue
+        return response.json(0)
+
+    @staticmethod
+    def updateUnusedAiService(response):
+        now_time = int(time.time())
+        ai_service_qs = AiService.objects.filter(
+            endTime__lte=now_time,
+            use_status=1).values(
+            'id',
+            'uid')[
+            0:200]
+        for ai_service in ai_service_qs:
+            try:
+                with transaction.atomic():
+                    AiService.objects.filter(
+                        id=ai_service['id']).update(
+                        use_status=2)      # 更新过期ai订单状态
+                    # 如果存在未使用套餐,更新为使用
+                    unused_ai_service = AiService.objects.filter(
+                        uid=ai_service['uid'],
+                        use_status=0).order_by('addTime')[
+                        :1].values(
+                        'id',
+                        'endTime')
+                    if unused_ai_service.exists():
+                        # 未使用套餐的endTime在购买的时候保存为有效时间
+                        effective_day = unused_ai_service[0]['endTime']
+                        endTime = now_time + effective_day
+                        AiService.objects.filter(
+                            id=unused_ai_service[0]['id']).update(
+                            use_status=1, endTime=endTime, updTime=now_time)
+            except Exception:
+                continue
+        return response.json(0)

+ 0 - 17
Controller/EquipmentInfo.py

@@ -290,23 +290,6 @@ class EquipmentInfo(View):
 use information_schema;
 select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables where table_schema='Ansjer81';
 '''
-# 定时删除推送数据
-def deleteExpireEquipmentInfo(request):
-    response = ResponseObject()
-    import time
-    nowTime = int(time.time())
-    cursor = connections['mysql02'].cursor()
-    try:
-        for i in range(10):
-            # 删除7天前的数据
-            sql = "DELETE FROM `equipment_info` WHERE addTime<={} LIMIT 10000".format(nowTime - 3600 * 24 * 7)
-            cursor.execute(sql)
-        # 关闭游标
-        cursor.close()
-        return response.json(0)
-    except Exception as e:
-        return response.json(500, repr(e))
-
 
 # 按季度删除访问日志
 def deleteExpireEquipmentInfoById(request):

+ 67 - 1
Controller/OTAEquipment.py

@@ -14,7 +14,7 @@ from django.views.generic import TemplateView
 from Ansjer.config import BASE_DIR
 from Ansjer.config import SERVER_DOMAIN
 from Ansjer.config import SERVER_TYPE
-from Model.models import Device_User, EquipmentVersionLimitModel, CountryIPModel
+from Model.models import Device_User, EquipmentVersionLimitModel, CountryIPModel, DeviceOTAUpgradeRecord
 from Model.models import Equipment_Version
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
@@ -753,6 +753,72 @@ def checkMaxVersion(request):
     res = {
         'url': url,
     }
+    # 记录设备OTA升级
+    createdTime = int(time.time())
+    # deviceOTA_UpgradeRecord = DeviceOTAUpgradeRecord({
+    #     Equipment_package=equipmentVersion[0].eid, created_time=createdTime, oldVersion=now_version, newVersion=softwareVersion})
+    # deviceOTA_UpgradeRecord.save()
+    DeviceOTAUpgradeRecord.objects.create(
+        equipment_package=equipmentVersion[0],
+        created_time=createdTime,
+        old_version=version,
+        new_version=equipmentVersion[0].version,
+    )
     return response.json(0, res)
 
+@csrf_exempt
+def checkMaxVersionV2(request):
+    # QT检查ota设备软件版本是否需要更新
+    response = ResponseObject()
+    if request.method == "POST":
+        request_dict = request.POST
+    elif request.method == "GET":
+        request_dict = request.GET
+    else:
+        return response.json(444)
+    deviceType = request_dict.get('deviceType', None)
+    version = request_dict.get('version', None)  # 设备版本:当前版本+设备规格代码
+    lang = request_dict.get('lang', None)  # 'zh-Hans','en'
+    uid = request_dict.get('uid','null')
+    serial_number = request_dict.get('serial_number','null')
+
+
+    token = request_dict.get('token',None)
+    token_object = TokenObject(token)
+    if token_object.code != 0:
+        return response.json(token_object.code)
+    user_id = token_object.userID
+
+    if not deviceType or not version:
+        return response.json(444, 'deviceType or version')
+    now_version = version[1:version.rindex('.')]  # 去掉V
+    code = version[version.rindex('.') + 1:]
+    equipmentVersion = Equipment_Version.objects.filter(mci=deviceType, code=code, lang=lang,
+                                                        status=1)  # order by data_joined
+    # 判断是否有该版本存在
+    if not equipmentVersion.exists():
+        return response.json(907)
 
+    filePath = equipmentVersion[0].filePath
+    softwareVersion = equipmentVersion[0].softwareVersion  # 可用最新版本的版本号
+    maxVersion = equipmentVersion[0].max_ver
+    if now_version >= softwareVersion:
+        # 当前版本大于等于最新版本,不需要更新
+        return response.json(902)
+    url = SERVER_DOMAIN + 'OTA/downloadsPack/' + filePath  # 复用app下载ota包的方式
+    res = {
+        'url': url,
+    }
+    # 记录设备OTA升级
+    createdTime = int(time.time())
+    DeviceOTAUpgradeRecord.objects.create(
+        equipment_package=equipmentVersion[0],
+        created_time=createdTime,
+        old_version=version,
+        new_version=equipmentVersion[0].version,
+        user_id=user_id,
+        serial_number=serial_number,
+        uid=uid,
+    )
+    print('执行成功%s' % DeviceOTAUpgradeRecord.id)
+    return response.json(0, res)

+ 21 - 9
Controller/SerialNumberController.py

@@ -12,7 +12,8 @@ from django.views import View
 from Controller.DetectController import DetectControllerView
 from Controller.DeviceConfirmRegion import Device_Region
 from Model.models import SerialNumberModel, CompanySerialModel, UIDCompanySerialModel, CompanyModel, RegionModel, \
-    CountryModel, UIDModel, Device_Info, iotdeviceInfoModel, UidPushModel, LogModel, MacModel, UidSetModel
+    CountryModel, UIDModel, Device_Info, iotdeviceInfoModel, UidPushModel, LogModel, MacModel, UidSetModel, UID_Bucket, \
+    Unused_Uid_Meal, Order_Model, StsCrdModel, VodHlsModel, ExperienceContextModel, Equipment_Info, UidUserModel
 from Object.RedisObject import RedisObject
 from Object.uidManageResponseObject import uidManageResponseObject
 from Object.TokenObject import TokenObject
@@ -151,13 +152,6 @@ class SerialNumberView(View):
         if serial_number[9:10]:
             p2p_type = serial_number[9:10]
 
-        # redis加锁,防止同一个序列号重复绑定
-        redisObj = RedisObject()
-        isLock = redisObj.CONN.setnx(serial + 'do_attach_uid', 1)
-        redisObj.CONN.expire(serial + 'do_attach_uid', 60)
-        if not isLock:
-            return response.json(5)
-
         try:
             if not country_id:
                 # 设备模拟国外环境测试
@@ -180,6 +174,13 @@ class SerialNumberView(View):
             if company_serial.status == 0:  # 该序列号未绑定企业
                 return response.json(173)
             elif company_serial.status == 1:    # 绑定uid
+                # redis加锁,防止同一个序列号重复绑定
+                key = serial + 'do_attach_uid'
+                redisObj = RedisObject()
+                isLock = redisObj.CONN.setnx(key, 1)
+                redisObj.CONN.expire(key, 60)
+                if not isLock:
+                    return response.json(5)
                 with transaction.atomic():
                     count = 0
                     while count < 3:
@@ -244,6 +245,7 @@ class SerialNumberView(View):
                             assert update_success
                         except AssertionError:
                             return response.json(378)
+                        redisObj.del_data(key=key)
                         return response.json(0, res)
                     return response.json(5)
             elif company_serial.status == 2:   # 返回uid
@@ -331,11 +333,21 @@ class SerialNumberView(View):
             with transaction.atomic():
                 uid = uid_serial.uid.uid
                 company_serial_qs.update(status=1)      # 更新序列号状态
-                # 删除设备相关数据
+                # 删除设备相关数据,参考后台的设备重置删除的数据
                 Device_Info.objects.filter(UID=uid).delete()
                 UidSetModel.objects.filter(uid=uid).delete()
+                UidUserModel.objects.filter(UID=uid).delete()
+                Equipment_Info.objects.filter(devUid=uid).delete()
                 iotdeviceInfoModel.objects.filter(serial_number=serial).delete()
 
+                # 重置设备云存
+                UID_Bucket.objects.filter(uid=uid).delete()
+                Unused_Uid_Meal.objects.filter(uid=uid).delete()
+                Order_Model.objects.filter(UID=uid).delete()
+                StsCrdModel.objects.filter(uid=uid).delete()
+                VodHlsModel.objects.filter(uid=uid).delete()
+                ExperienceContextModel.objects.filter(uid=uid).delete()
+
                 # 修改其他数据库的序列号使用状态为已使用
                 update_success = self.update_serial_status(serial=serial, status=1)
                 try:

+ 0 - 29
Controller/TestApi.py

@@ -133,8 +133,6 @@ class testView(View):
         elif operation == 'rekognition':
             userID = '158943604783713800138000'
             return self.testRekognition(request,request_dict)
-        elif operation == 'deleteDevice':
-            return self.delete_device(response)
         elif operation == 'ip':
             return self.ip(response)
         elif operation == 'configType':
@@ -827,33 +825,6 @@ class testView(View):
         return HttpResponse(json.dumps(response, ensure_ascii=False),
                             content_type="application/json,charset=utf-8")
 
-    def delete_device(self, response):
-        # 定时删除测试账号下的设备数据
-        try:
-            userID_list = ['tech01@ansjer.com', 'tech02@ansjer.com', 'tech03@ansjer.com', 'tech04@ansjer.com',
-                           'tech05@ansjer.com', 'tech06@ansjer.com', 'tech07@ansjer.com', 'tech08@ansjer.com',
-                           'tech09@ansjer.com', 'tech10@ansjer.com', 'fix01@ansjer.com', 'fix02@ansjer.com',
-                           'fix03@ansjer.com', 'fix04@ansjer.com', 'fix05@ansjer.com']
-            device_user = Device_User.objects.filter(username__in=userID_list)
-            device_info_qs = Device_Info.objects.filter(userID__in=device_user).values('UID')
-            uid_list = []
-            for device_info in device_info_qs:
-                uid_list.append(device_info['UID'])
-            with transaction.atomic():
-                # 删除设备云存相关数据
-                UidSetModel.objects.filter(uid__in=uid_list).delete()
-                UID_Bucket.objects.filter(uid__in=uid_list).delete()
-                Unused_Uid_Meal.objects.filter(uid__in=uid_list).delete()
-                Order_Model.objects.filter(UID__in=uid_list).delete()
-                StsCrdModel.objects.filter(uid__in=uid_list).delete()
-                VodHlsModel.objects.filter(uid__in=uid_list).delete()
-                ExperienceContextModel.objects.filter(uid__in=uid_list).delete()
-                Device_Info.objects.filter(userID__in=device_user).delete()
-
-            return response.json(0)
-        except Exception as e:
-            return response.json(500, repr(e))
-
     def ip(self, response):
         ip = '67.220.90.13'
         country_id = Device_Region().get_device_region(ip)

+ 17 - 0
Model/models.py

@@ -2043,3 +2043,20 @@ class CloudVodSurveysOperateLog(models.Model):
         verbose_name = '云存问卷调查—操作日志'
         verbose_name_plural = verbose_name
         ordering = ('id',)
+
+class DeviceOTAUpgradeRecord(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
+    equipment_package = models.ForeignKey(Equipment_Version, to_field='eid', default='', on_delete=models.CASCADE,
+                             verbose_name='关联设备OTA包ID')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    old_version = models.CharField(max_length=22, blank=True, verbose_name='原版本号', default='')
+    new_version = models.CharField(max_length=22, blank=True, verbose_name='升级后版本号', default='')
+    user_id = models.CharField(max_length=32, blank=True, verbose_name='用户ID', default='')
+    serial_number = models.CharField(max_length=11, blank=True, verbose_name='序列号', default='')
+    uid = models.CharField(max_length=22, blank=True, verbose_name='设备UID', default='')
+
+    class Meta:
+        db_table = 'device_OTA_upgrade_record'
+        verbose_name = '设备OTA升级记录'
+        verbose_name_plural = verbose_name
+        ordering = ('id',)

+ 1 - 1
Object/AWS/ElasticTranscoder.py

@@ -34,7 +34,7 @@ class ElasticTranscoder:
             Outputs=[
                 {
                     'Key': OutputKey,
-                    'PresetId': '1351620000001-200010',
+                    'PresetId': '13516001-200010',
                     'SegmentDuration': '2',
                 }
             ]

+ 16 - 2
Object/utils/LocalDateTimeUtil.py

@@ -27,8 +27,10 @@ def get_last_first_date_and_last_date(n):
 def get_today_date(timestamp=False):
     """
     返回当天开始时间和结束时间
-    :param timestamp 是否返回时间戳
-    :returns: zero_today ,last_today
+    Args:
+        timestamp 是否返回时间戳
+    returns:
+        zero_today ,last_today
     """
 
     now = datetime.datetime.now()
@@ -42,6 +44,18 @@ def get_today_date(timestamp=False):
     return zero_today, last_today
 
 
+def get_last_month():
+    """
+    获取前一个月时间
+    returns:
+        last_month_date
+    """
+    today = datetime.date.today()  # 1. 获取「今天」
+    last_month = today.replace(month=today.month - 1)  # 2.获取前一个月
+    last_month_date = last_month.strftime("%Y-%m-%d %H:%M:%S")
+    return last_month_date
+
+
 if __name__ == "__main__":
     start_time, end_time = get_today_date(True)
     print('--- start_time = {} end_time = {}'.format(start_time, end_time))

+ 10 - 1
Service/CommonService.py

@@ -16,7 +16,7 @@ from Ansjer.config import BASE_DIR, UNICODE_ASCII_CHARACTER_SET, SERVER_DOMAIN_S
 import OpenSSL.crypto as ct
 from base64 import encodebytes
 from Controller.CheckUserData import RandomStr
-from Model.models import iotdeviceInfoModel
+from Model.models import iotdeviceInfoModel, Device_Info
 from Service.ModelService import ModelService
 
 
@@ -542,3 +542,12 @@ GCqvlyw5dfxNA+EtxNE2wCW/LW7ENJlACgcfgPlBZtpLheWoZB/maw4=
         pay_failed_url = "{}web/paid2/{}".format(SERVER_DOMAIN_SSL, file_name)
         return pay_failed_url
 
+    # 根据uid查询序列号,存在则返回序列号,否则返uid
+    @staticmethod
+    def query_serial_with_uid(uid):
+        device_info_qs = Device_Info.objects.filter(UID=uid).values('serial_number')
+        if device_info_qs.exists():
+            serial_number = device_info_qs[0]['serial_number']
+            if serial_number:
+                return serial_number
+        return uid

+ 11 - 11
Service/DeviceOperation.py

@@ -31,7 +31,7 @@ class DeviceOperation:
             "0x10019": 'LOG_TYPE_MANUAL_SNAP_FAIL',  # 手动抓图失败
 
             # setup 系统配置
-            "0x20000": 'LOG_TYPE_CONFIG',
+            "0x": 'LOG_TYPE_CONFIG',
             "0x20001": 'LOG_TYPE_CHGE_VIDEO_FORMAT',  # 改变视频制式
             "0x20002": 'LOG_TYPE_CHGE_VGA_RESOLUTION',  # 改变显示器分辨率
             "0x20003": 'LOG_TYPE_CHGE_LANGUAGE',  # 调整语言
@@ -136,14 +136,14 @@ class DeviceOperation:
             "0x100009": 'LOG_TYPE_UNLOCK_PICTURE',  # 解锁图片
 
             # 查看信息(Check Infomantion)
-            "0x200000": 'LOG_TYPE_VIEW_INFO',  # 查看系统信息
-            "0x200001": 'LOG_TYPE_VIEW_SYSTEM',  # 查看系统信息
-            "0x200002": 'LOG_TYPE_VIEW_EVENT',  # 查看事件
-            "0x200003": 'LOG_TYPE_VIEW_LOG',  # 查看日志
-            "0x200004": 'LOG_TYPE_VIEW_NETWORK',  # 查看网络状态
-            "0x200005": 'LOG_TYPE_VIEW_ONLINE_USER',  # 查看在线用户
-            "0x200006": 'LOG_TYPE_VIEW_EXPORT_LOG',  # 导出日志
-            "0x200007": 'LOG_TYPE_VIEW_EXPORT_EVENT',  # 导出事件
+            "0x0": 'LOG_TYPE_VIEW_INFO',  # 查看系统信息
+            "0x1": 'LOG_TYPE_VIEW_SYSTEM',  # 查看系统信息
+            "0x2": 'LOG_TYPE_VIEW_EVENT',  # 查看事件
+            "0x3": 'LOG_TYPE_VIEW_LOG',  # 查看日志
+            "0x4": 'LOG_TYPE_VIEW_NETWORK',  # 查看网络状态
+            "0x5": 'LOG_TYPE_VIEW_ONLINE_USER',  # 查看在线用户
+            "0x6": 'LOG_TYPE_VIEW_EXPORT_LOG',  # 导出日志
+            "0x7": 'LOG_TYPE_VIEW_EXPORT_EVENT',  # 导出事件
 
             # 异常信息(Error)
             "0x400000": 'LOG_TYPE_ERROR_INFO',  # 网络地址冲突
@@ -178,11 +178,11 @@ class DeviceOperation:
     def getODla(search_class):
         data = {
             'Operation': ['0x10000', '0x10019'], #操作
-            'Setup': ['0x20000', '0x20048'], #系统配置
+            'Setup': ['0x', '0x20048'], #系统配置
             'Playback': ['0x40000', '0x40008'], #录像回放
             'Backup': ['0x80000', '0x80004'], #数据备份
             'Search': ['0x100001', '0x100009'], #录像检索
-            'Check Infomantion': ['0x200000', '0x200007'], #查看信息
+            'Check Infomantion': ['0x0', '0x7'], #查看信息
             'Error': ['0x400000', '0x40000C'], #异常信息
             'Event': ['0x800000', '0x800010'], #事件信息
         }