peng hace 11 meses
padre
commit
c9b12b9725

+ 264 - 0
AdminController/EvaluationActivityController.py

@@ -0,0 +1,264 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: AnsjerFormal
+@software: PyCharm
+@DATE: 2024年7月29日15:51:04
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+"""
+import time
+
+from django.views.generic.base import View
+from Model.models import FreeEvaluationActivity, ActivityTime, ActivityUser, Device_User
+from Object.AWS.AmazonS3Util import AmazonS3Util
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Ansjer.config import SERVER_DOMAIN, LOGGER
+from Ansjer.cn_config.config_formal import SECRET_ACCESS_KEY, ACCESS_KEY_ID, REGION_NAME
+from django.db import transaction
+
+
+class EvaluationActivityView(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):
+        language = request_dict.get('language', 'en')
+        response = ResponseObject(language, 'pc')
+        tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'), returntpye='pc')
+        if tko.code != 0:
+            return response.json(tko.code)
+        response.lang = tko.lang
+        user_id = tko.userID
+        if operation == 'getActivity':
+            return self.get_activity(user_id, request_dict, response)
+        elif operation == 'getActivityList':
+            return self.get_activity_list(request_dict, response)
+        elif operation == 'addOrEditActivity':
+            return self.add_or_edit_activity(request, request_dict, response)
+        elif operation == 'getActivityUser':
+            return self.get_user_list(request_dict, response)
+        elif operation == 'addActivityUser':
+            return self.add_activity_user(user_id, request_dict, response)
+        elif operation == 'editActivityUser':
+            return self.edit_activity_user(request_dict, response)
+        else:
+            return response.json(404)
+
+    @staticmethod
+    def get_activity(user_id, request_dict, response):
+        try:
+            now_time = int(time.time())
+            activity_qs = FreeEvaluationActivity.objects.filter(is_show=1).values('activity_name', 'carousel_image_url',
+                                                                                  'details_image_url', 'issue', 'id',
+                                                                                  'product_number', 'original_price',
+                                                                                  'product_name')
+            if activity_qs.exists():
+                activity = activity_qs[0]
+                time_qs = ActivityTime.objects.filter(activity_id=activity['id']).values('node_content', 'start_time',
+                                                                                         'end_time').order_by('sort')
+                activity['activity_start_time'] = time_qs.first()['start_time']
+                activity['activity_end_time'] = time_qs.last()['end_time']
+                activity['activity_process'] = list(time_qs)
+                user_qs = ActivityUser.objects.filter(activity_id=activity['id'])
+                activity['user_count'] = user_qs.count()
+                if user_qs.exists():
+                    user = user_qs.filter(user_id=user_id)
+                    if user.exists():
+                        activity['activity_status'] = 2  # 1:可报名;2:已报名;3:报名截止;4:活动结束
+                    else:
+                        activity['activity_status'] = 1
+                    user_qs = user_qs.filter(is_selected=1).values('user_name', 'phone', 'user_id')
+                    for item in user_qs:
+                        users = Device_User.objects.filter(userID=item['user_id']).values('userIconPath')
+                        if users.exists():
+                            user_icon_path = str(users[0]['userIconPath'])
+                            if user_icon_path and user_icon_path.find('static/') != -1:
+                                user_icon_path = user_icon_path.replace('static/', '').replace('\\', '/')
+                                item['user_icon'] = SERVER_DOMAIN + 'account/getAvatar/' + user_icon_path
+                            else:
+                                item['user_icon'] = ''
+                        else:
+                            item['user_icon'] = ''
+                        item['phone'] = item['phone'][:3] + "****" + item['phone'][7:]
+                    activity['activity_user'] = list(user_qs)
+                else:
+                    activity['activity_status'] = 1
+                    activity['activity_user'] = []
+                if now_time > time_qs.first()['end_time']:
+                    activity['activity_status'] = 3
+                if now_time > time_qs.last()['end_time']:
+                    activity['activity_status'] = 4
+                return response.json(0, activity)
+            else:
+                return response.json(0, {})
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def add_activity_user(user_id, request_dict, response):
+        activity_id = request_dict.get('activity_id', None)
+        user_name = request_dict.get('user_name', None)
+        phone = request_dict.get('phone', None)
+        address = request_dict.get('address', None)
+        sex = request_dict.get('sex', None)
+        age = request_dict.get('age', None)
+        usage_environment = request_dict.get('usage_environment', None)
+        is_reports = request_dict.get('is_reports', None)
+
+        if not all([activity_id, user_name, phone, address, sex, age, usage_environment, is_reports]):
+            return response.json(404)
+        now_time = int(time.time())
+        try:
+            user = ActivityUser.objects.filter(user_id=user_id, activity_id=activity_id)
+            if user.exists():
+                user.update(phone=phone, address=address, sex=sex, user_name=user_name, is_reports=is_reports, age=age,
+                            usage_environment=usage_environment, update_time=now_time)
+            else:
+                ActivityUser.objects.create(activity_id=activity_id, user_id=user_id, phone=phone, address=address,
+                                            sex=sex, age=age, usage_environment=usage_environment, user_name=user_name,
+                                            is_reports=is_reports, created_time=now_time, update_time=now_time)
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def add_or_edit_activity(request, request_dict, response):
+        activity_id = request_dict.get('activity_id', None)
+        activity_name = request_dict.get('activity_name', None)
+        carousel_image = request.FILES.get('carousel_image', None)
+        details_image = request.FILES.get('details_image', None)
+        issue = request_dict.get('issue', None)
+        product_number = request_dict.get('product_number', None)
+        product_name = request_dict.get('product_name', None)
+        original_price = request_dict.get('original_price', None)
+        activity_process = request_dict.get('activity_process', None)
+        is_show = request_dict.get('is_show', None)
+
+        if not all([activity_name, issue, product_number, original_price, is_show, activity_process, product_name]):
+            return response.json(404)
+        now_time = int(time.time())
+        activity_process = eval(activity_process)
+        try:
+            bucket = "ansjerfilemanager"
+            s3_obj = AmazonS3Util(ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME)
+            s3_url = 'https://{}.s3.{}.amazonaws.com.cn/'.format(bucket, REGION_NAME)
+            if carousel_image:
+                carousel_image_path = '前端/EvaluationActivity/carousel_image_{}.jpg'.format(issue)
+                s3_obj.upload_file_obj(
+                    bucket,
+                    carousel_image_path,
+                    carousel_image,
+                    {"ContentType": carousel_image.content_type, "ACL": "public-read"},
+                )
+                carousel_image_url = s3_url + carousel_image_path
+                if activity_id:
+                    FreeEvaluationActivity.objects.filter(id=activity_id).update(carousel_image_url=carousel_image_url)
+            if details_image:
+                details_image_path = '前端/EvaluationActivity/details_image_{}.jpg'.format(issue)
+                s3_obj.upload_file_obj(
+                    bucket,
+                    details_image_path,
+                    details_image,
+                    {"ContentType": details_image.content_type, "ACL": "public-read"},
+                )
+                details_image_url = s3_url + details_image_path
+                if activity_id:
+                    FreeEvaluationActivity.objects.filter(id=activity_id).update(details_image_url=details_image_url)
+            with transaction.atomic():
+                if activity_id:  # 编辑活动
+                    FreeEvaluationActivity.objects.filter(id=activity_id).update(issue=issue, product_name=product_name,
+                                                                                 product_number=product_number,
+                                                                                 original_price=original_price,
+                                                                                 is_show=is_show, update_time=now_time,
+                                                                                 activity_name=activity_name)
+                    ActivityTime.objects.filter(activity_id=activity_id).delete()
+                    for index, item in enumerate(activity_process):
+                        ActivityTime.objects.create(activity_id=activity_id, node_content=item['node_content'],
+                                                    start_time=item['start_time'], end_time=item['end_time'],
+                                                    sort=index)
+                else:  # 增加活动
+                    if not all([carousel_image, details_image]):
+                        return response.json(404)
+                    activity_qs = FreeEvaluationActivity.objects.create(activity_name=activity_name, issue=issue,
+                                                                        product_number=product_number,
+                                                                        carousel_image_url=carousel_image_url,
+                                                                        is_show=is_show, product_name=product_name,
+                                                                        original_price=original_price,
+                                                                        details_image_url=details_image_url,
+                                                                        created_time=now_time, update_time=now_time)
+                    for index, item in enumerate(activity_process):
+                        ActivityTime.objects.create(activity_id=activity_qs.id, node_content=item['node_content'],
+                                                    start_time=item['start_time'], end_time=item['end_time'],
+                                                    sort=index)
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def get_activity_list(request_dict, response):
+        page = request_dict.get('page', None)
+        line = request_dict.get('line', None)
+        if not all([page, line]):
+            return response.json(444)
+        try:
+            page = int(page)
+            line = int(line)
+            activity_qs = FreeEvaluationActivity.objects.all()
+            count = activity_qs.count()
+            activity_qs = activity_qs.values('id', 'activity_name', 'carousel_image_url', 'details_image_url', 'issue',
+                                             'is_show', 'product_number', 'original_price', 'product_name')[
+                          (page - 1) * line: page * line]
+            for item in activity_qs:
+                time_qs = ActivityTime.objects.filter(activity_id=item['id']).values('node_content', 'start_time',
+                                                                                     'end_time').order_by('sort')
+                item['activity_process'] = list(time_qs)
+            return response.json(0, {'list': list(activity_qs), 'count': count})
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def get_user_list(request_dict, response):
+        activity_id = request_dict.get('activity_id', None)
+        user_name = request_dict.get('user_name', None)
+        phone = request_dict.get('phone', None)
+        page = request_dict.get('page', None)
+        line = request_dict.get('line', None)
+        if not all([activity_id, page, line]):
+            return response.json(444)
+        try:
+            page = int(page)
+            line = int(line)
+            user_qs = ActivityUser.objects.filter(activity_id=activity_id)
+            if user_name:
+                user_qs = user_qs.filter(user_name=user_name)
+            if phone:
+                user_qs = user_qs.filter(phone=phone)
+            count = user_qs.count()
+            user_qs = user_qs.values('id', 'user_name', 'phone', 'age', 'address', 'sex', 'is_selected', 'activity_id',
+                                     'usage_environment', 'is_reports')[(page - 1) * line:page * line]
+            return response.json(0, {'list': list(user_qs), 'count': count})
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def edit_activity_user(request_dict, response):
+        activity_id = request_dict.get('activity_id', None)
+        user_id = request_dict.get('user_id', None)
+        is_selected = request_dict.get('is_selected', None)
+        try:
+            ActivityUser.objects.filter(activity_id=activity_id, id=user_id).update(is_selected=is_selected)
+
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 5 - 6
Ansjer/urls.py

@@ -4,7 +4,7 @@ from django.urls import path, re_path
 
 from AdminController import UserManageController, RoleController, MenuController, TestServeController, \
     ServeManagementController, LogManagementController, DeviceManagementController, VersionManagementController, \
-    AiServeController, SurveysManageController, SerialManageController, MessageMangementController
+    AiServeController, SurveysManageController, SerialManageController, MessageMangementController, EvaluationActivityController
 from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppInfo, \
     Test, MealManage, DeviceManage, EquipmentStatus, SysManage, DeviceLog, LogAccess, \
     AppColophon, DateController, \
@@ -413,14 +413,13 @@ urlpatterns = [
     re_path(r'^dataManagement/', include("Ansjer.server_urls.datasystem_url")),
     # 查询消息推送模块
     re_path('messageManagement/(?P<operation>.*)', MessageMangementController.MassageView.as_view()),
+    # 新品体验官
+    re_path('activityManagement/(?P<operation>.*)', EvaluationActivityController.EvaluationActivityView.as_view()),
+    # 后台界面接口 -------------------------------------------------------------------------------------------------------
 
-    # 后台界面接口 -----------------------------------------------------
-
-    # 定时删除任务接口
+    # 定时任务接口
     re_path(r'^cron/del/(?P<operation>.*)', CronTaskController.CronDelDataView.as_view()),
-    # 定时更新任务接口
     re_path(r'^cron/update/(?P<operation>.*)', CronTaskController.CronUpdateDataView.as_view()),
-    # 定时收集数据任务接口
     re_path(r'^cron/collect/(?P<operation>.*)', CronTaskController.CronCollectDataView.as_view()),
     re_path(r'^cron/compared/(?P<operation>.*)', CronTaskController.CronComparedDataView.as_view()),
 

+ 1 - 1
Controller/UIDManageUserController.py

@@ -78,7 +78,7 @@ class UserView(View):
                 return response.json(99)
             else:
                 token = TokenObject()
-                res = token.generate({'userID': user[0].id})
+                res = token.generate(data={'userID': user[0].id})
                 res['permission'] = user[0].permission
                 res['username'] = user[0].username
                 user[0].online = 1

+ 2 - 1
Controller/UserController.py

@@ -32,7 +32,7 @@ from Controller.CheckUserData import DataValid, date_handler, RandomStr
 from Controller.UserDevice.UserSubscriptionController import UserSubscriptionControllerView
 from Model.models import Device_User, Role, UidPushModel, UserOauth2Model, UserExModel, Device_Info, UidSetModel, \
     UserAppFrequencyModel, CountryIPModel, CountryModel, UidChannelSetModel, Order_Model, UID_Bucket, Unused_Uid_Meal, \
-    GatewayPush, CountryLanguageModel, LanguageModel, VodBucketModel, LogModel, UserEmailSubscriptions
+    GatewayPush, CountryLanguageModel, LanguageModel, VodBucketModel, LogModel, UserEmailSubscriptions, TokenRecord
 from Object.AWS.AmazonS3Util import AmazonS3Util
 from Object.AWS.SesClassObject import SesClassObject
 from Object.AliSmsObject import AliSmsObject
@@ -322,6 +322,7 @@ class LogoutView(TemplateView):
         m_code = request_dict.get('m_code', None)
         try:
             with transaction.atomic():
+                TokenRecord.objects.filter(access_token=token, user_id=tko.userID).delete()
                 Device_User.objects.filter(userID=tko.userID).update(online=False)
                 Device_Info.objects.filter(userID=tko.userID).update(NotificationMode=0)
                 if m_code:

+ 110 - 37
Model/models.py

@@ -166,7 +166,8 @@ class Device_User(AbstractBaseUser):
     is_active = models.BooleanField(blank=True, default=False, verbose_name=u'用户活动状态')
     data_joined = models.DateTimeField(blank=True, verbose_name=u'加入时间', auto_now_add=True, db_index=True)
     last_login = models.DateTimeField(blank=True, verbose_name='u最后登录时间', auto_now=True, db_index=True)
-    user_isValid = models.BooleanField(blank=True, default=False, verbose_name=u'用户有效性', help_text=u'是否是认证通过的用户')
+    user_isValid = models.BooleanField(blank=True, default=False, verbose_name=u'用户有效性',
+                                       help_text=u'是否是认证通过的用户')
     online = models.BooleanField(blank=True, default=False, verbose_name=u'用户登录状态')
     machine_code = models.CharField(blank=True, max_length=128, default='', verbose_name=u'机械码')
 
@@ -263,7 +264,8 @@ class Device_Info(models.Model):
     version = models.CharField(blank=True, max_length=20, default='', verbose_name=u'版本号')
     iSNotification = models.BooleanField(blank=True, verbose_name=u'报警通知 0:关闭,1:开启)', default=False)
     isVod = models.SmallIntegerField(blank=True, default=0, verbose_name='是否支持云存')  # 是否支持云存设备
-    isExist = models.SmallIntegerField(blank=True, default=1, verbose_name='是否被删除')  # 是否被删除了(需主用户交互) 1存在,0不存在,2设备被重置
+    isExist = models.SmallIntegerField(blank=True, default=1,
+                                       verbose_name='是否被删除')  # 是否被删除了(需主用户交互) 1存在,0不存在,2设备被重置
     isCameraOpenCloud = models.SmallIntegerField(blank=True, default=1, verbose_name='是否开启云存')  # 0:不开启  1:开启
     serial_number = models.CharField(blank=True, max_length=9, default='', verbose_name='关联序列号')
     # 分享用户备注名
@@ -1530,7 +1532,8 @@ class Ai_Push_Info(models.Model):
     receiveTime = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
     userID_id = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'用户ID')
     is_st = models.SmallIntegerField(default=0, verbose_name='是否截图')  # 0 否,1 是图,2,视频
-    storage_location = models.SmallIntegerField(default=1, db_index=True, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
+    storage_location = models.SmallIntegerField(default=1, db_index=True,
+                                                verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
     # message_id = models.CharField(blank=True, max_length=32, default='', verbose_name='第三方推送服务器返回的id')
     # push_type = models.SmallIntegerField(blank=True, default=0, verbose_name='第三方推送服务器标志。0:APNS推送,1:谷歌推送,2:极光推送')
     # push_server_status = models.IntegerField(blank=True, default=200, verbose_name='是否成功推送到第三方服务器。200:成功,other:失败')
@@ -1598,7 +1601,8 @@ class User_Brand(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
     # 关联用户
     userID = models.ForeignKey(Device_User, to_field='userID', on_delete=models.CASCADE)
-    deviceSupplier = models.CharField(max_length=32, default='', verbose_name='(必填)设备供应商 string  (例:华为、小米...)')
+    deviceSupplier = models.CharField(max_length=32, default='',
+                                      verbose_name='(必填)设备供应商 string  (例:华为、小米...)')
     deviceModel = models.CharField(max_length=64, default='', verbose_name='(必填)设备型号 string @mock=HM NOTE 1TD')
     osType = models.CharField(max_length=32, default='', verbose_name='(必填)操作系统名称 string @mock=Android')
     osVersion = models.CharField(max_length=32, default='', verbose_name='(必填)操作系统版本号 string @mock=4.0')
@@ -1859,7 +1863,8 @@ class Order_Model(models.Model):
     # 1: PayPal, 2: 支付宝, 3: 微信, 5: 苹果内购, 10: 免费体验, 11: 激活码
     payType = models.SmallIntegerField(default=0, verbose_name='支付方式')
     payTime = models.IntegerField(verbose_name='支付成功时间', default=0)
-    rank = models.ForeignKey(Store_Meal, to_field='id', default='', on_delete=models.CASCADE, verbose_name='关联云存套餐表')
+    rank = models.ForeignKey(Store_Meal, to_field='id', default='', on_delete=models.CASCADE,
+                             verbose_name='关联云存套餐表')
     ai_rank = models.ForeignKey(AiStoreMeal, to_field='id', default='', on_delete=models.CASCADE,
                                 verbose_name='关联ai套餐表')
     order_type = models.SmallIntegerField(default=0, verbose_name='订单类型:0:云存,1:AI+云存,2:联通4G,3:五兴,4:云盘')
@@ -2202,7 +2207,8 @@ class UID_Bucket(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
     uid = models.CharField(max_length=20, verbose_name='设备UID', db_index=True)
     channel = models.SmallIntegerField(default=0, verbose_name='通道')
-    bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, verbose_name='存储空间')
+    bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE,
+                               verbose_name='存储空间')
     status = models.SmallIntegerField(default=0, verbose_name='状态[0:关闭,1:开启]')
     orderId = models.CharField(max_length=20, verbose_name='关联订单号', default='', db_index=True)
     endTime = models.BigIntegerField(verbose_name='套餐结束时间', db_index=True, default=0)
@@ -2222,7 +2228,8 @@ class Unused_Uid_Meal(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
     uid = models.CharField(max_length=20, verbose_name='设备UID', db_index=True)
     channel = models.SmallIntegerField(default=0, verbose_name='通道')
-    bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, verbose_name='存储空间')
+    bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE,
+                               verbose_name='存储空间')
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     expire = models.IntegerField(verbose_name='存储桶存储时长[月份]', default=0)
     is_ai = models.SmallIntegerField(verbose_name='是否开通AI服务', default=0)  # 0:不开通;1:开通
@@ -2302,7 +2309,8 @@ class UidSetModel(models.Model):
     TimeStatus = models.SmallIntegerField(default=0, verbose_name='同步手机时间开关。0:关闭,1:开启')
     SpaceUsable = models.CharField(blank=True, max_length=20, default='', verbose_name=u'可用空间')
     SpaceSum = models.CharField(blank=True, max_length=20, default='', verbose_name=u'总空间')
-    MirrorType = models.IntegerField(blank=True, default=0, verbose_name=u'镜像类型 0:关闭镜像,1:上下镜像,2:左右镜像,3:上下左右镜像')
+    MirrorType = models.IntegerField(blank=True, default=0,
+                                     verbose_name=u'镜像类型 0:关闭镜像,1:上下镜像,2:左右镜像,3:上下左右镜像')
     RecordType = models.IntegerField(blank=True, default=0, verbose_name=u'录像模式(0:关闭,1:全是录像,3:报警录像)')
     OutdoorModel = models.IntegerField(blank=True, default=0, verbose_name=u'室外模式 0:关闭,1:开启')
     WIFIName = models.CharField(blank=True, max_length=50, default='', verbose_name=u'无线名称')
@@ -2385,7 +2393,8 @@ class UidChannelSetModel(models.Model):
     pir_audio = models.SmallIntegerField(default=0, verbose_name='pir声音。0:关闭,1:开启')
     mic_audio = models.SmallIntegerField(default=0, verbose_name='mic声音。0:关闭,1:开启')
     battery_status = models.SmallIntegerField(default=0, verbose_name='低电量提醒状态。0:关闭,1:开启')
-    battery_level = models.SmallIntegerField(default=0, verbose_name='低电量提醒级别。0: 低于10%;1:低于25%;2:低于50%;3:低于75%')
+    battery_level = models.SmallIntegerField(default=0,
+                                             verbose_name='低电量提醒级别。0: 低于10%;1:低于25%;2:低于50%;3:低于75%')
     sleep_status = models.SmallIntegerField(default=0, verbose_name='是否开启【休眠通知】。0:关闭;1:开启')
     sleep_time = models.SmallIntegerField(default=0, verbose_name='摄像机进入休眠时间。0:不休眠;1:10秒;2:20秒;3:30秒')
     light_night_model = models.IntegerField(default=0, verbose_name='夜视模式')  # 0:全彩模式,1:黑白模式,2:智能夜视模式
@@ -2685,7 +2694,8 @@ class DeviceLogModel(models.Model):
 
 class EquipmentInfoExStatisticsModel(models.Model):
     id = models.AutoField(primary_key=True)
-    push_type = models.SmallIntegerField(default=0, verbose_name='第三方推送服务器标志。0:APNS推送,1:谷歌推送,2:极光推送')
+    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='推送到达数量')
@@ -2702,7 +2712,8 @@ class EquipmentInfoExStatisticsModel(models.Model):
 class CountryIPModel(models.Model):
     id = models.AutoField(primary_key=True)
     ip = models.CharField(default='', max_length=32, verbose_name='ip')
-    user_ex = models.ForeignKey(UserExModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联用户扩展信息表id')
+    user_ex = models.ForeignKey(UserExModel, to_field='id', on_delete=models.CASCADE,
+                                verbose_name='关联用户扩展信息表id')
     country = models.CharField(default='', max_length=100, verbose_name='国家')
     status = models.SmallIntegerField(default=0, verbose_name='是否已经查找,0:否,1:是')
     add_time = models.IntegerField(default=0, verbose_name='添加时间')
@@ -2996,7 +3007,8 @@ class UIDModel(models.Model):
     add_time = models.IntegerField(default=0, verbose_name='添加时间')
     update_time = models.IntegerField(default=0, verbose_name='更新时间')
     area = models.SmallIntegerField(default=0, verbose_name='区域')  # 0:国内, 1:国外
-    vpg = models.ForeignKey(VPGModel, to_field='id', default=1, on_delete=models.DO_NOTHING, verbose_name='关联VPG表的id')
+    vpg = models.ForeignKey(VPGModel, to_field='id', default=1, on_delete=models.DO_NOTHING,
+                            verbose_name='关联VPG表的id')
     p2p_type = models.IntegerField(default=1, verbose_name='p2p类型。1:宸云,2:tutk')
     full_uid_code = models.CharField(max_length=256, default='', verbose_name='宸云完整uid')
     platform = models.CharField(max_length=10, default='', verbose_name='平台')
@@ -3343,7 +3355,8 @@ class PctestlogModel(models.Model):
 class PctestjobdeviceModel(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
     job = models.ForeignKey(PctestjobModel, to_field='id', on_delete=models.DO_NOTHING, verbose_name='关联pc岗位表')
-    device = models.ForeignKey(PctestdeviceModel, to_field='id', on_delete=models.DO_NOTHING, verbose_name='关联pc测试设备表')
+    device = models.ForeignKey(PctestdeviceModel, to_field='id', on_delete=models.DO_NOTHING,
+                               verbose_name='关联pc测试设备表')
 
     class Meta:
         db_table = 'pctest_job_device'
@@ -3354,7 +3367,8 @@ class PctestjobdeviceModel(models.Model):
 
 class PctestModel(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
-    device = models.ForeignKey(PctestdeviceModel, to_field='id', on_delete=models.DO_NOTHING, verbose_name='关联pc测试设备表')
+    device = models.ForeignKey(PctestdeviceModel, to_field='id', on_delete=models.DO_NOTHING,
+                               verbose_name='关联pc测试设备表')
     function = models.ForeignKey(PctestfunctionModel, to_field='id', on_delete=models.DO_NOTHING,
                                  verbose_name='关联pc设备职能表')
 
@@ -3520,7 +3534,8 @@ class SurveysUserLog(models.Model):
 
 class SurveysTitle(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
-    surveys = models.ForeignKey(Surveys, to_field='id', default='', on_delete=models.CASCADE, verbose_name='关联问卷表ID')
+    surveys = models.ForeignKey(Surveys, to_field='id', default='', on_delete=models.CASCADE,
+                                verbose_name='关联问卷表ID')
     title_content = models.TextField(blank=True, verbose_name='题目内容', default=0)
     created_time = models.IntegerField(default=0, verbose_name='创建时间')
 
@@ -3533,7 +3548,8 @@ class SurveysTitle(models.Model):
 
 class CloudVodSurveysAnswer(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
-    title = models.ForeignKey(SurveysTitle, to_field='id', default='', on_delete=models.CASCADE, verbose_name='关联题目表ID')
+    title = models.ForeignKey(SurveysTitle, to_field='id', default='', on_delete=models.CASCADE,
+                              verbose_name='关联题目表ID')
     user = models.ForeignKey(Device_User, to_field='userID', default='', on_delete=models.CASCADE,
                              verbose_name='关联用户表ID')
     answer1 = models.SmallIntegerField(verbose_name='答案1 (分数)')
@@ -3875,7 +3891,8 @@ class UnicomComboOrderInfo(models.Model):
     flow_exceed = models.DecimalField(default=0, max_digits=10, decimal_places=2, verbose_name=u'当前套餐已超流量值MB')
     last_combo_flow_exceed = models.DecimalField(default=0, max_digits=10, decimal_places=2,
                                                  verbose_name=u'上一个流量套餐流量已超值(MB)')
-    is_flow_exceed = models.IntegerField(default=0, verbose_name=u'当前套餐是否已超流量,0:正常结算,1:已超需计入下一个流量套餐')
+    is_flow_exceed = models.IntegerField(default=0,
+                                         verbose_name=u'当前套餐是否已超流量,0:正常结算,1:已超需计入下一个流量套餐')
     sort = models.IntegerField(default=99, blank=True, verbose_name=u'排序')
     next_month_activate = models.BooleanField(blank=True, default=False, verbose_name=u'下月激活')
     activation_time = models.IntegerField(default=0, verbose_name='激活时间')
@@ -3896,7 +3913,8 @@ class UnicomDeviceInfo(models.Model):
     status = models.SmallIntegerField(default=0, verbose_name=u'状态{0:可测试,1:测试完成,2:已使用}')
     serial_no = models.CharField(default='', db_index=True, max_length=32, verbose_name=u'设备序列号')
     user_id = models.CharField(blank=True, max_length=32, verbose_name=u'用户id')
-    card_type = models.SmallIntegerField(default=0, verbose_name=u'状态{0:联通,1:五兴电信,2:移动,3:鼎芯电信,4:其它,5:鼎芯国际}')
+    card_type = models.SmallIntegerField(default=0,
+                                         verbose_name=u'状态{0:联通,1:五兴电信,2:移动,3:鼎芯电信,4:其它,5:鼎芯国际}')
     main_card = models.SmallIntegerField(default=0, verbose_name=u'SIM卡类型{0:拔插卡,1:贴片卡}')
     sim_used_flow = models.DecimalField(default=0, max_digits=10, decimal_places=2, verbose_name=u'sim卡已用总流量(MB)')
     sim_cycle_used_flow = models.DecimalField(default=0, max_digits=10, decimal_places=2,
@@ -3971,7 +3989,8 @@ class UnicomFlowPush(models.Model):
     type = models.SmallIntegerField(default=0, verbose_name='流量推送类型')
     combo_order_id = models.CharField(max_length=32, default='', verbose_name='当前订单套餐id')
     serial_no = models.CharField(max_length=32, default='', verbose_name='序列号')
-    flow_total_usage = models.DecimalField(default=0, max_digits=10, decimal_places=2, verbose_name=u'当月实际流量用量 单位(MB)')
+    flow_total_usage = models.DecimalField(default=0, max_digits=10, decimal_places=2,
+                                           verbose_name=u'当月实际流量用量 单位(MB)')
     flow_total = models.DecimalField(default=0, max_digits=10, decimal_places=2, verbose_name=u'流量总量 单位(MB)')
     status = models.SmallIntegerField(default=0, verbose_name=u'状态{0:待推送,1:已推送}')
     updated_time = models.IntegerField(default=0, verbose_name='更新时间')
@@ -4183,7 +4202,8 @@ class DeviceUserSummary(models.Model):
 class OrdersSummary(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='订单汇总列表主键')
     time = models.IntegerField(verbose_name='时间戳', default=0, db_index=True)
-    query_type = models.SmallIntegerField(verbose_name='查询类型{0:付费订单,1:免费订单,2:首次付费订单,3:复购订单}', default=0)
+    query_type = models.SmallIntegerField(verbose_name='查询类型{0:付费订单,1:免费订单,2:首次付费订单,3:复购订单}',
+                                          default=0)
     service_type = models.SmallIntegerField(verbose_name='增值服务类型{0:云存,1:AI,2:4G}', default=0)
     count = models.IntegerField(verbose_name='订单数量', default=0)
     total = models.CharField(verbose_name='销售额', default='', max_length=255)
@@ -4566,20 +4586,6 @@ class SocketSchedule(models.Model):
         verbose_name_plural = verbose_name
 
 
-class SwitchInfo(models.Model):
-    id = models.AutoField(primary_key=True, verbose_name='自增id')
-    device_id = models.CharField(max_length=32, default='', verbose_name='设备id')
-    model = models.CharField(max_length=32, default='', verbose_name='型号')
-    hardware_version = models.CharField(max_length=32, default='', verbose_name='硬件版本')
-    firmware_version = models.CharField(max_length=32, default='', verbose_name='固件版本')
-    mac = models.CharField(max_length=32, default='', verbose_name='mac地址')
-
-    class Meta:
-        db_table = 'switch_info'
-        verbose_name = '智能开关信息'
-        verbose_name_plural = verbose_name
-
-
 class SwitchDimmingSettings(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='自增id')
     device_id = models.CharField(max_length=32, default='', verbose_name='设备id')
@@ -4965,10 +4971,10 @@ class InAppPurchasePackage(models.Model):
     subscription_group_id = models.CharField(default='', max_length=64, verbose_name='内购订阅组id')
     subscription_group = models.CharField(default='', max_length=64, verbose_name='内购订阅组')
     product_id = models.CharField(default='', max_length=64, verbose_name='内购商品id')
-    package_type = models.SmallIntegerField(default=0, verbose_name='套餐类型') # 0:非订阅, 1:订阅
+    package_type = models.SmallIntegerField(default=0, verbose_name='套餐类型')  # 0:非订阅, 1:订阅
     rank = models.ForeignKey(Store_Meal, blank=True, to_field='id', null=True, on_delete=models.SET_NULL,
                              verbose_name='关联云存套餐表')
-    is_ai = models.SmallIntegerField(default=0, verbose_name='是否支持ai') # 0:不支持, 1:支持
+    is_ai = models.SmallIntegerField(default=0, verbose_name='是否支持ai')  # 0:不支持, 1:支持
     created_time = models.IntegerField(verbose_name='创建时间', default=0)
     update_time = models.IntegerField(verbose_name='更新时间', default=0)
 
@@ -4977,6 +4983,57 @@ class InAppPurchasePackage(models.Model):
         verbose_name = '苹果内购套餐表'
 
 
+class FreeEvaluationActivity(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
+    activity_name = models.CharField(default='', max_length=64, verbose_name='活动名称')
+    product_name = models.CharField(default='', max_length=20, verbose_name='产品名')
+    carousel_image_url = models.TextField(default='', verbose_name='轮播图地址')
+    details_image_url = models.TextField(default='', verbose_name='详情图地址')
+    issue = models.SmallIntegerField(default=0, verbose_name='活动期数')
+    product_number = models.SmallIntegerField(default=0, verbose_name='物品数量')
+    original_price = models.CharField(default='0', max_length=10, verbose_name='物品原价')
+    is_show = models.SmallIntegerField(default=0, verbose_name='是否展示')  # 0:不展示;1:展示
+    created_time = models.IntegerField(verbose_name='创建时间', default=0)
+    update_time = models.IntegerField(verbose_name='更新时间', default=0)
+
+    class Meta:
+        db_table = 'free_evaluation_activity'
+        verbose_name = '新品体验官'
+
+
+class ActivityTime(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
+    activity_id = models.IntegerField(default=0, verbose_name='关联活动id')
+    node_content = models.CharField(default='', max_length=10, verbose_name='节点内容')
+    start_time = models.IntegerField(verbose_name='开始时间', default=0)
+    end_time = models.IntegerField(verbose_name='结束时间', default=0)
+    sort = models.SmallIntegerField(verbose_name='排序', default=0)
+
+    class Meta:
+        db_table = 'activity_time'
+        verbose_name = '活动时间表'
+
+
+class ActivityUser(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
+    activity_id = models.IntegerField(default=0, verbose_name='关联活动id')
+    user_id = models.CharField(default='', max_length=32, verbose_name='关联用户id')
+    user_name = models.CharField(default='', max_length=15, verbose_name='用户名')
+    phone = models.CharField(default='', max_length=15, verbose_name='手机号')
+    address = models.CharField(default='', max_length=50, verbose_name='用户地址')
+    sex = models.SmallIntegerField(verbose_name='性别', default=0)  # 0:女;1:男
+    age = models.SmallIntegerField(verbose_name='年龄', default=0)
+    usage_environment = models.CharField(default='', max_length=50, verbose_name='使用环境')
+    is_reports = models.SmallIntegerField(verbose_name='是否输出过体验报告', default=0)  # 0:未输出;1:输出过
+    is_selected = models.SmallIntegerField(verbose_name='是否入选', default=0)  # 0:未入选;1:入选
+    created_time = models.IntegerField(verbose_name='创建时间', default=0)
+    update_time = models.IntegerField(verbose_name='更新时间', default=0)
+
+    class Meta:
+        db_table = 'activity_user'
+        verbose_name = '活动人员表'
+
+
 class PushLog(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='自增标记ID')
     uid = models.CharField(max_length=32, default='', db_index=True, verbose_name='设备UID')
@@ -5013,7 +5070,8 @@ class CustomCustomerDevice(models.Model):
     serial_number = models.CharField(blank=True, max_length=9, default='', verbose_name='关联序列号')
     uid = models.CharField(blank=True, max_length=32, default='', verbose_name='关联uid')
     type = models.IntegerField(default=0, blank=True, verbose_name=u'设备类型')
-    full_code = models.EmailField(max_length=64, db_index=True, verbose_name=u'完整编码(app扫的完整数据)', default='', blank=True)
+    full_code = models.EmailField(max_length=64, db_index=True, verbose_name=u'完整编码(app扫的完整数据)', default='',
+                                  blank=True)
     created_time = models.IntegerField(default=0, verbose_name='创建时间')
     updated_time = models.IntegerField(default=0, verbose_name='更新时间')
 
@@ -5021,3 +5079,18 @@ class CustomCustomerDevice(models.Model):
         db_table = 'custom_customer_device'
         verbose_name = '定制客户设备'
 
+
+class TokenRecord(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='自增标记ID')
+    user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name='用户id')
+    data = models.JSONField(verbose_name=u'加密信息', null=True)
+    access_token = models.TextField(default='', verbose_name='请求token')
+    refresh_token = models.TextField(default='', verbose_name='刷新token')
+    code = models.IntegerField(default=0, verbose_name=u'响应码')
+    error_info = models.TextField(verbose_name='报错信息', default='', )
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'token_record'
+        verbose_name = 'token记录表'

+ 29 - 5
Object/TokenObject.py

@@ -2,8 +2,12 @@ import datetime
 
 import jwt
 import time
+import requests
+
+from Model.models import TokenRecord
+from Object.RedisObject import RedisObject
 from Ansjer.config import OAUTH_ACCESS_TOKEN_SECRET, OAUTH_REFRESH_TOKEN_SECRET, OAUTH_ACCESS_TOKEN_TIME, \
-    OAUTH_REFRESH_TOKEN_TIME, CONFIG_INFO, CONFIG_TEST, CONFIG_CN
+    OAUTH_REFRESH_TOKEN_TIME, CONFIG_INFO, CONFIG_TEST, CONFIG_CN, DETECT_PUSH_DOMAINS, LOGGER
 
 
 class TokenObject:
@@ -40,13 +44,16 @@ class TokenObject:
 
         except jwt.ExpiredSignatureError as e:
             self.code = 309
+            self.update_token(repr(e))
             return
         except Exception as e:
             self.code = 309
+            self.update_token(repr(e))
             return
         else:
             if not self.userID:
                 self.code = 309
+                self.update_token('缺少用户ID')
                 return
             else:
                 if self.userID:
@@ -56,7 +63,7 @@ class TokenObject:
                     self.code = 309
                     return
 
-    def generate(self, data=None):
+    def generate(self, old_refresh_token=None, data=None):
         if data is None:
             data = {}
         try:
@@ -86,16 +93,27 @@ class TokenObject:
                 'refresh_token': refresh_token,
             }
 
-            if self.returntpye=='pc':
+            if self.returntpye == 'pc':
                 res = {
                     'token': access_token,
                     'access_expire': access_expire,
                     'refresh_expire': refresh_expire,
                     'refresh_token': refresh_token,
                 }
-
+            now_time = int(time.time())
+            if old_refresh_token:
+                token_qs = TokenRecord.objects.filter(refresh_token=old_refresh_token, user_id=data['userID'])
+                if token_qs.exists():
+                    token_qs.update(refresh_token=refresh_token, access_token=access_token, update_time=now_time)
+                else:
+                    TokenRecord.objects.create(access_token=access_token, refresh_token=refresh_token, data=data,
+                                               created_time=now_time, updated_time=now_time, user_id=data['userID'])
+            else:
+                TokenRecord.objects.create(access_token=access_token, refresh_token=refresh_token, data=data,
+                                           created_time=now_time, updated_time=now_time, user_id=data['userID'])
         except Exception as e:
             self.code = 309
+            self.update_token(repr(e))
             print(repr(e))
         else:
             self.code = 0
@@ -134,8 +152,10 @@ class TokenObject:
             print('过期')
             print(repr(e))
             self.code = 309
+            self.update_token(repr(e))
         except Exception as e:
             self.code = 309
+            self.update_token(repr(e))
             print(repr(e))
         else:
             self.code = 0
@@ -144,5 +164,9 @@ class TokenObject:
             lang = self.lang
             self.userID = userID
             self.user = user
-            refreshRes = self.generate(data={'userID': userID, 'lang': lang, 'user': user})
+            refreshRes = self.generate(self.token, data={'userID': userID, 'lang': lang, 'user': user})
             return refreshRes
+
+    def update_token(self, e):
+        TokenRecord.objects.filter(access_token=self.token).update(code=self.code, error_info=e,
+                                                                   updated_time=int(time.time()))