소스 검색

更新APP初始化红点与弹窗、云存优惠券选择指定优惠券、云存问卷返回语言、数据表

zhangdongming 2 년 전
부모
커밋
65d57cd64c

+ 175 - 100
Controller/AppSetController.py

@@ -1,24 +1,20 @@
-#!/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: 2020/2/27 9:38
-@Version: python3.6
-@MODIFY DECORD:ansjer dev
-@file: AppSetController.py
-@Contact: chanjunkai@163.com
-"""
-from Ansjer.config import SERVER_TYPE
-from Model.models import AppSetModel, PromotionRuleModel, PopupsConfig, RedDotsConfig
+import json
+import logging
+import time
+
+from django.db import transaction
 from django.views.generic.base import View
+
+from Ansjer.config import SERVER_TYPE
+from Model.models import AppSetModel, PromotionRuleModel, PopupsConfig, RedDotsConfig, Device_Info, UidSetModel, \
+    UserOperationLog, Order_Model
 from Object.RedisObject import RedisObject
+from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
+from Object.utils import LocalDateTimeUtil
 from Service.ModelService import ModelService
-import time, json
-from Object.ResponseObject import ResponseObject
+
+LOGGER = logging.getLogger('info')
 
 
 class AppSetView(View):
@@ -36,34 +32,32 @@ class AppSetView(View):
         response = ResponseObject()
         if operation == 'query':
             return self.do_query(request_dict, response)
-        if operation == 'admin_query':
-            token = request_dict.get('token', None)
-            tko = TokenObject(token)
-            if tko.code == 0:
-                userID = tko.userID
-                return self.do_admin_query(userID, request_dict, response)
-            else:
-                return response.json(tko.code)
+        token = request_dict.get('token', None)
+        tko = TokenObject(token)
+        if tko.code != 0:
+            return response.json(tko.code)
+        user_id = tko.userID
+        if operation == 'page_set':  # app弹窗标记红点设置
+            return self.do_page_set(user_id, request_dict, response)
+        elif operation == 'ai-preview':
+            return self.save_user_popups_log(user_id, request_dict, response)
+        elif operation == 'admin_query':
+            return self.do_admin_query(user_id, request_dict, response)
         elif operation == 'admin_update':
-            token = request_dict.get('token', None)
-            tko = TokenObject(token)
-            if tko.code == 0:
-                userID = tko.userID
-                return self.do_admin_update(userID, request_dict, response)
-            else:
-                return response.json(tko.code)
+            return self.do_admin_update(user_id, request_dict, response)
         else:
-            token = request_dict.get('token', None)
-            tko = TokenObject(token)
-            if tko.code == 0:
-                userID = tko.userID
-                if operation == 'page_set':  # app弹窗标记红点设置
-                    return self.do_page_set(userID, request_dict, response)
-            else:
-                return response.json(tko.code)
-
-    # 查询
-    def do_query(self, request_dict, response):
+            return response.json(414)
+
+    @staticmethod
+    def do_query(request_dict, response):
+        """
+        查询app配置
+        @param request_dict: 请求数据
+        @request_dict lang: 语言
+        @request_dict appBundleId: app包id
+        @param response: 响应
+        @return: response
+        """
         lang = request_dict.get('lang', None)
         appBundleId = request_dict.get('appBundleId', None)
         if not appBundleId:
@@ -72,6 +66,7 @@ class AppSetView(View):
         app_set_qs = AppSetModel.objects.filter(appBundleId=appBundleId).values('content')
         if not app_set_qs.exists():
             return response.json(173)
+
         try:
             if not app_set_qs[0]['content']:
                 return response.json(0)
@@ -85,39 +80,17 @@ class AppSetView(View):
                 dict_json['popupsContent'] = json.loads(promotion[0]['popups']).get(lang, '')
                 dict_json['nowTime'] = int(time.time())
             if 'editionUpgrading' in dict_json:
+                dict_json['editionUpgrading'] = ''
                 if dict_json['editionUpgrading'] == 1:
                     if lang == 'cn':
                         dict_json['editionUpgrading'] = '正在升级,请稍后登录'
                     else:
                         dict_json['editionUpgrading'] = 'Upgrading, please sign in later'
-                else:
-                    dict_json['editionUpgrading'] = ''
-
             return response.json(0, dict_json)
         except Exception as e:
-            return response.json(500, "错误行数:{errLine}, 错误信息: {errmsg}".format(errLine=e.__traceback__.tb_lineno,
+            return response.json(500, '错误行数:{errLine}, 错误信息: {errmsg}'.format(errLine=e.__traceback__.tb_lineno,
                                                                               errmsg=repr(e)))
 
-        # res = {}
-        # res['grade'] = 1
-        # #     # 用户帮助
-        # res['usingHelp'] = 0
-        # #     # AP添加方式
-        # res['apAdd'] = 1
-        # #     # AP工具
-        # res['apTool'] = 1
-        # #     # 广告模块
-        # res['ad_module'] = {
-        #     "time": 0,
-        #     "ad_path": [
-        #         "https://test.dvema.com/web/static/image/default_ad1",
-        #         "https://test.dvema.com/web/static/image/default_ad2",
-        #         "https://test.dvema.com/web/static/image/default_ad3",
-        #     ]
-        # }
-        # res['init_img'] = 'https://test.dvema.com/web/static/image/default_start'
-        # return response.json(0, res)
-
     def do_admin_query(self, userID, request_dict, response):
         # 查询和添加权限
         own_perm = ModelService.check_perm(userID, 40)
@@ -159,42 +132,144 @@ class AppSetView(View):
         else:
             return response.json(173)
 
-    def do_page_set(self, userID, request_dict, response):
-        lang = request_dict.get('lang', 'en')
-        dict_json = {}
-        now_time = int(time.time())
-        dict_json['popups'] = {
-            'title': '',
-            'content': '',
-            'status': 0,
-            'tag': 1,
-        }
-        #弹窗
-        popups_obj = PopupsConfig.objects.filter(lang=lang).values('title','content','start_time','end_time','tag')
-        if popups_obj.exists():
-            popups_status = 0
-            if now_time >= popups_obj[0]['start_time'] and now_time <= popups_obj[0]['end_time']:
-                popups_status = 1
+    @staticmethod
+    def do_page_set(userID, request_dict, response):
+        """
+        初始化加载红点以及弹窗数据
+        """
+        try:
+            lang = request_dict.get('lang', 'en')
+            dict_json = {}
+            now_time = int(time.time())
             dict_json['popups'] = {
-                'title': popups_obj[0]['title'],
-                'content': popups_obj[0]['content'],
-                'status': popups_status,
-                'tag': popups_obj[0]['tag'],
+                'title': '',
+                'content': '',
+                'status': 0,
+                'tag': 1,
             }
+            with transaction.atomic():
+                # AI弹窗
+                dict_json['aiPopups'] = AppSetView.get_ai_init_data(userID, lang)
+                # 弹窗
+                popups_obj = PopupsConfig.objects.filter(lang=lang).values('title', 'content', 'start_time', 'end_time',
+                                                                           'tag')
+                if popups_obj.exists():
+                    popups_status = 0
+                    if popups_obj[0]['start_time'] <= now_time <= popups_obj[0]['end_time']:
+                        popups_status = 1
+                    dict_json['popups'] = {
+                        'title': popups_obj[0]['title'],
+                        'content': popups_obj[0]['content'],
+                        'status': popups_status,
+                        'tag': popups_obj[0]['tag'],
+                    }
+                # 红点标记
+                dict_json['red_dots'] = []
+                red_dots_obj = RedDotsConfig.objects.values('module', 'start_time', 'end_time')
+                is_show_red_dots = AppSetView.check_user_is_show_red_dot(userID)  # 是否显示红点
+                for red_dots in red_dots_obj:
+                    red_dots_status = 0
+                    if red_dots['start_time'] <= now_time <= red_dots['end_time']:
+                        red_dots_status = 1
+                        ai_detection = red_dots['module']
+                        if ai_detection == 'ai_detects_purchases':
+                            red_dots_status = 1 if is_show_red_dots else 0
+                    dict_json['red_dots'].append({
+                        'module': red_dots['module'],
+                        'status': red_dots_status,
+                    })
+                dict_json['red_dots'] = list(dict_json['red_dots'])
+                return response.json(0, dict_json)
+        except Exception as e:
+            LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500)
 
-        #红点标记
-        dict_json['red_dots'] = []
-        red_dots_obj = RedDotsConfig.objects.values('module','start_time','end_time')
-        for red_dots in red_dots_obj:
-            red_dots_status = 0
-            if now_time >= red_dots['start_time'] and now_time <= red_dots['end_time']:
-                red_dots_status = 1
-            dict_json['red_dots'].append({
-                'module': red_dots['module'],
-                'status': red_dots_status,
-            })
+    @staticmethod
+    def get_ai_init_data(user_id, lang):
+        """
+        初始化获取AI弹窗数据
+        @param user_id: 用户id
+        @param lang: 语言
+        @return: popups_qs
+        """
+        now_time = int(time.time())
+        popups_qs = PopupsConfig.objects.filter(tag=2, lang=lang) \
+            .values('title', 'content', 'start_time', 'end_time', 'tag')
+        if not popups_qs.exists():
+            return ''
+        ai_device = AppSetView.get_user_ai_device(user_id)
+        if not ai_device:
+            return ''
+        # 当前时间小于弹窗开始时间或者大于结束时间 则返回空字符串
+        if not popups_qs[0]['start_time'] <= now_time <= popups_qs[0]['end_time']:
+            return ''
+        user_ai_log_qs = UserOperationLog.objects.filter(user_id=user_id, type=2).values('created_time')
+        user_log = {'user_id': user_id, 'status': 1, 'type': 2, 'created_time': now_time, 'updated_time': now_time}
+        popups_status = 0
+        # 用户有AI设备 没有操作过弹窗则显示
+        if not user_ai_log_qs.exists():
+            popups_status = 1
+            UserOperationLog.objects.create(**user_log)
+        else:
+            now_date = int(LocalDateTimeUtil.time_stamp_to_time(now_time, '%Y%m%d'))
+            created_date = int(LocalDateTimeUtil.time_stamp_to_time(user_ai_log_qs[0]['created_time'], '%Y%m%d'))
+            if user_ai_log_qs.count() == 1 and now_date > created_date:
+                popups_status = 1
+                UserOperationLog.objects.create(**user_log)
+        return {
+            'title': popups_qs[0]['title'],
+            'content': popups_qs[0]['content'],
+            'status': popups_status,
+            'tag': popups_qs[0]['tag'],
+        }
 
+    @staticmethod
+    def get_user_ai_device(user_id):
+        """
+        获取用户设备是否有有支持AI功能
+        @param user_id: 用户ID
+        @return: True|False
+        """
+        device_info = Device_Info.objects.filter(userID_id=user_id, isExist=1).values('UID')
+        if not device_info.exists():
+            return False
+        uid_list = []
+        for item in device_info:
+            uid_list.append(item['UID'])
+        uid_info_qs = UidSetModel.objects.filter(uid__in=uid_list).values('is_ai')
+        if not uid_info_qs.exists():
+            return False
+        if 1 or 0 in uid_info_qs:
+            return True
+        return False
 
+    @staticmethod
+    def check_user_is_show_red_dot(user_id):
+        """
+        获取用户是否显示红点
+        用户体验过AI免费套餐不显示 OR 用户操作记录阅读过AI介绍界面不显示
+        @param user_id: 用户ID
+        @return: True | False
+        """
+        order_qs = Order_Model.objects.filter(userID_id=user_id, order_type=2, status=1, payType=10)
+        ai_red_dot_qs = UserOperationLog.objects.filter(user_id=user_id, type=4)
+        return not ai_red_dot_qs.exists() and not order_qs.exists()
 
-        dict_json['red_dots'] = list(dict_json['red_dots'])
-        return response.json(0, dict_json)
+    @classmethod
+    def save_user_popups_log(cls, user_id, request_dict, response):
+        """
+        保存用户预览AI介绍页面记录
+        @param request_dict: type
+        @param user_id: 用户id
+        @param response: 响应对象
+        """
+        try:
+            rq_type = request_dict.get('type', 0)
+            now_time = int(time.time())
+            user_log = {'user_id': user_id, 'status': 1, 'type': int(rq_type), 'created_time': now_time,
+                        'updated_time': now_time}
+            UserOperationLog.objects.create(**user_log)
+        except Exception as e:
+            LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500)
+        return response.json(0)

+ 110 - 0
Controller/CloudPhoto/CloudServiceController.py

@@ -0,0 +1,110 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : CloudServiceController.py
+@Time    : 2022/12/8 10:23
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+import time
+
+from django.views import View
+
+from Model.models import CouponCombo, CouponModel
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+
+
+class CloudServiceController(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.GET, request, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.POST, request, operation)
+
+    def validation(self, request_dict, request, operation):
+        token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
+        lang = request_dict.get('lang', token.lang)
+        response = ResponseObject(lang)
+        if token.code != 0:
+            return response.json(token.code)
+        user_id = token.userID
+        if operation == 'save-photo':
+            return self.get_combo_list_by_coupon(user_id, response)
+        else:
+            return response.json(404)
+
+    @classmethod
+    def get_combo_list_by_coupon(cls, request_dict, response):
+        """
+        根据优惠券获取套餐列表
+        @param request_dict: couponId 优惠券ID
+        @param request_dict: couponType 优惠券类型
+        @param response: 响应结果
+        """
+        coupon_id = int(request_dict.get('couponId', 0))
+        coupon_type = int(request_dict.get('couponType', 0))
+        if coupon_id == 0:
+            return response.json(444)
+        coupon_combo_qs = CouponCombo.objects.filter(coupon_type=coupon_type, coupon_id=coupon_id).values('combo_id')
+        combo_list = []
+        if not coupon_combo_qs.exists():
+            return combo_list
+        for item in coupon_combo_qs:
+            combo_list.append(item['combo_id'])
+        return combo_list
+
+    @classmethod
+    def get_user_coupon_list(cls, user_id):
+        """
+        获取用户未使用优惠券配置ID列表
+        @param user_id:用户id
+        @return: coupon_qs
+        """
+        now_time = int(time.time())
+        coupon_qs = CouponModel.objects.filter(
+            userID=user_id,
+            use_status=0,
+            distribute_time__lte=now_time,
+            valid_time__gt=now_time
+        ).values('coupon_config__id')
+        return coupon_qs
+
+    @classmethod
+    def get_combo_list(cls, coupon_type, coupon_id):
+        """
+        根据优惠券类型与优惠券ID,获取关联套餐列表
+        @param coupon_type: 优惠券类型
+        @param coupon_id: 套餐id
+        @return: coupon_list
+        """
+        combo_qs = CouponCombo.objects.filter(coupon_type=coupon_type, coupon_id=coupon_id) \
+            .values('combo_id')
+        combo_list = []
+        if not combo_qs.exists():
+            return combo_list
+        for item in combo_qs:
+            combo_list.append(item['combo_id'])
+        return combo_list
+
+    @classmethod
+    def get_coupon_list(cls, coupon_type, combo_id):
+        """
+        根据优惠券类型与套餐ID,获取关联优惠券列表
+        @param coupon_type: 优惠券类型
+        @param combo_id: 套餐id
+        @return: coupon_list
+        """
+        coupon_combo_qs = CouponCombo.objects.filter(coupon_type=coupon_type, combo_id=combo_id) \
+            .values('coupon_id')
+        coupon_list = []
+        if not coupon_combo_qs.exists():
+            return coupon_list
+        for item in coupon_combo_qs:
+            coupon_list.append(item['coupon_id'])
+        return coupon_list

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 516 - 494
Controller/CloudStorage.py


+ 10 - 12
Controller/CouponController.py

@@ -1,16 +1,15 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
-import base64
-import json
-import os
 import time
-import math
+
+from django.db.models import F
+from django.http import HttpResponse
 from django.views.generic.base import View
-from Model.models import CouponModel, Device_User, CouponConfigModel, CouponLang
+
+from Controller.CloudPhoto.CloudServiceController import CloudServiceController
+from Model.models import CouponModel, Device_User
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
-from django.db.models import Q, F, Count
-from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
 from Service.CommonService import CommonService
 
 
@@ -67,7 +66,7 @@ class CouponView(View):
             CouponModel.objects.create(
                 use_status=0,
                 distribute_time=now_time,
-                valid_time=now_time+10000000,
+                valid_time=now_time + 10000000,
                 userID=userID,
                 coupon_config_id=coupon_config_id,
                 update_time=now_time,
@@ -81,10 +80,6 @@ class CouponView(View):
     def query_user_coupon(self, request_dict, userID, response):  # 用户优惠券列表
         now_time = int(time.time())
         lang = request_dict.get('lang', 'en')
-        # couponObj = CouponModel.objects.filter(userID_id=userID, use_status=0, distributeTime__lte=now_time,
-        #                                        valid_time__gt=now_time).annotate(coupon_id=F('id')).values(
-        #     "coupon_id", "type", "coupon_discount", "valid_time")
-
         coupon_obj = CouponModel.objects.filter(
             userID=userID,
             use_status=0,
@@ -99,6 +94,7 @@ class CouponView(View):
             remark=F('coupon_config__lang__remark'),
             quota=F('coupon_config__lang__quota'),
             unit=F('coupon_config__lang__unit'),
+            config_id=F('coupon_config_id')
         ).values(
             "coupon_id",
             "type",
@@ -108,10 +104,12 @@ class CouponView(View):
             "remark",
             "quota",
             "unit",
+            "config_id"
         )
 
         for couponList in coupon_obj:
             couponList['valid_time'] = CommonService.timestamp_to_str(couponList['valid_time'])
+            couponList['comboList'] = CloudServiceController.get_combo_list(0, couponList['config_id'])
 
         result = {
             'count': coupon_obj.count(),

+ 9 - 4
Controller/FeedBack.py

@@ -338,6 +338,7 @@ class FeedBackView(View):
         event_type = request_dict.get('event_type', None)
         event_time = request_dict.get('event_time', None)
         channel = request_dict.get('channel', None)
+        tag = request_dict.get('tag', None)
         if not all([equipment_info_id, uid, is_st, event_type, event_time, channel]):
             return response.json(444)
 
@@ -361,10 +362,14 @@ class FeedBackView(View):
                                                                                    event_time=event_time,
                                                                                    index=index)
                     s3.copy_obj(PUSH_BUCKET, PUSH_INACCURATE_BUCKET, file_path)
-            PushInaccurateFeedback.objects.create(equipment_info_id=equipment_info_id,
-                                                  user_id=user_id, event_type=event_type,
-                                                  uid=uid, channel=channel, add_time=now_time,
-                                                  is_st=is_st, event_time=event_time)
+            push_inaccurate_feedback_qs = PushInaccurateFeedback.objects.create(equipment_info_id=equipment_info_id,
+                                                                                user_id=user_id, event_type=event_type,
+                                                                                uid=uid, channel=channel,
+                                                                                add_time=now_time,
+                                                                                is_st=is_st, event_time=event_time)
+            if tag:
+                push_inaccurate_feedback_qs.tag = tag
+                push_inaccurate_feedback_qs.save()
             return response.json(0)
         except Exception as e:
             return response.json(500, repr(e))

+ 31 - 4
Controller/Surveys/CloudStorageController.py

@@ -50,19 +50,22 @@ class CloudStorageView(View):
         ''' API '''
         logger.info('---- this user id:{},dict{}'.format(userID, request_dict))
         if operation == 'get/info':
-            return self.check_stock_user(userID, response)
+            return self.check_stock_user(userID, request_dict, response)
         if operation == 'cloud/answer/save':
             ip = CommonService.get_ip_address(request)
             return self.answer_save(userID, ip, request_dict, response)
         if operation == "cloud/storage/icon/close":
             self.cloud_vob_operate_log_save(status=2, userId=userID)
+        if operation == "entrance/cloud/storage/icon":
+            return self.entrance_cloud_storage_icon(userID, request_dict, response)
         return response.json(0)
 
-    def check_stock_user(self, user_id, response):
+    def check_stock_user(self, user_id, request_dict, response):
         order = Order_Model.objects.filter(userID=user_id, status=1, order_type=0)
         if not order.exists() and order.count() == 0:
             return response.json(10030)
         try:
+            lang = request_dict.get('lang', 'en')
             no = '01'
             surveys = Surveys.objects.filter(no=no, user_type=1)
             if not surveys.exists():
@@ -86,7 +89,7 @@ class CloudStorageView(View):
                 'endTime': result.end_time,
                 'isShow': 0 if close else result.is_show,
                 'isSubmit': submit,
-                'page': '/surveys?token=' if result.is_show == 1 else ''
+                'page': '/surveys?lang=' + lang + '&token=' if result.is_show == 1 else ''
             }
             localTime = int(time.time())
             if result.start_time <= localTime <= result.end_time:
@@ -148,6 +151,7 @@ class CloudStorageView(View):
 
     @classmethod
     def answer_save(cls, userId, ip, request_dict, response):
+        logger = logging.getLogger('info')
         try:
             ipInfo = CommonService.getIpIpInfo(ip, "CN")
             country_name = ipInfo['country_name']
@@ -178,6 +182,29 @@ class CloudStorageView(View):
                     SurveysUserLog.objects.filter(user_id=userId, type=1).update(is_filled=1)
                     cls.cloud_vob_operate_log_save(status=1, userId=userId)
             return response.json(0)
+        except Exception as e:
+            logger.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(200, repr(e))
+
+    @classmethod
+    def entrance_cloud_storage_icon(cls, userID, request_dict, response):
+        status = request_dict.get('status', None)
+        if not status:
+            return response.json(444, 'status')
+        status = int(status)
+        start_time, end_time = LocalDateTimeUtil.get_today_date(True)
+        local_time = int(time.time())
+        try:
+            if status == 3:  #
+                cloud_vod_surveys_Operate_qs = CloudVodSurveysOperateLog.objects.filter(user_id=userID, status=status,
+                                                                                        created_time__gte=start_time,
+                                                                                        created_time__lte=end_time)
+                if not cloud_vod_surveys_Operate_qs.exists():  # 判断用户当天是否查阅问卷
+                    cls.cloud_vob_operate_log_save(status=status, userId=userID)
+                else:
+                    user_record_qs = cloud_vod_surveys_Operate_qs.first()
+                    user_record_qs.updated_time = local_time
+                    user_record_qs.save()
+            return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, repr(e))

+ 24 - 2
Controller/UnicomCombo/UnicomComboController.py

@@ -14,6 +14,7 @@ import traceback
 from decimal import Decimal
 
 from django.db import transaction
+from django.db.models import Q
 from django.http import HttpResponse, JsonResponse
 from django.views.generic.base import View
 
@@ -43,6 +44,8 @@ class UnicomComboView(View):
         response = ResponseObject('cn')
         if operation == 'query-usage-history':
             return self.query_device_usage_history(request_dict, response)
+        elif operation == 'sim-order':  # 用户套餐信息查询
+            return self.create_experience_order(response)
         elif operation == 'test-notify':
             order_id = request_dict.get('orderId', None)
             activate_type = request_dict.get('activateType', 0)
@@ -147,9 +150,10 @@ class UnicomComboView(View):
             return response.json(177, e)
 
     @classmethod
-    def experience_order_4G(cls, icc_id, serial_no, user_id):
+    def experience_order_4G(cls, icc_id, serial_no, user_id, is_user=True):
         """
         保存订单信息
+        @param is_user: 是否真实用户
         @param icc_id: SIM卡20位iccid
         @param serial_no: 序列号
         @param user_id: userID
@@ -185,7 +189,8 @@ class UnicomComboView(View):
                 if not order_qs.exists():
                     Order_Model.objects.create(**order_dict)
                     combo_order_qs.update(order_id=order_id)
-                UnicomDeviceInfo.objects.filter(iccid=icc_id).update(user_id=user_id, updated_time=n_time)
+                if is_user:
+                    UnicomDeviceInfo.objects.filter(iccid=icc_id).update(user_id=user_id, updated_time=n_time)
                 return True
         except Exception as e:
             print('生成4G体验订单异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
@@ -891,3 +896,20 @@ class UnicomComboView(View):
         now_time = int(time.time())
         sign = CommonService.encode_data(str(now_time))
         return response.json(0, {'sign': sign, 'timeStamp': now_time})
+
+    @classmethod
+    def create_experience_order(cls, response):
+        """
+        创建体验订单
+        """
+        u_order_qs = UnicomComboOrderInfo.objects.filter(Q(order_id__isnull=True) | Q(order_id=''))
+        u_order_qs = u_order_qs.filter(combo__combo_type=1).values('id', 'iccid')
+        if not u_order_qs.exists():
+            return response.json(0)
+        for item in u_order_qs:
+            u_device_qs = UnicomDeviceInfo.objects.filter(iccid=item['iccid'], status=2) \
+                .values('serial_no', 'user_id')
+            if not u_device_qs.exists() or not u_device_qs[0]['user_id']:
+                continue
+            cls.experience_order_4G(item['iccid'], u_device_qs[0]['serial_no'], u_device_qs[0]['user_id'], False)
+        return response.json(0)

+ 118 - 13
Model/models.py

@@ -4,7 +4,6 @@ from django.contrib.auth.models import BaseUserManager, AbstractBaseUser
 from django.db import models
 from django.utils import six
 from django.utils import timezone
-from django.utils.encoding import python_2_unicode_compatible
 from imagekit.models import ProcessedImageField
 from imagekit.processors import ResizeToFill
 
@@ -59,7 +58,6 @@ class UserManager(BaseUserManager):
                                 user_isValid, **extra_fields)
 
 
-@python_2_unicode_compatible
 class Permissions(models.Model):
     permName = models.CharField(blank=True, null=True, max_length=32, unique=True, verbose_name=u'权限名称')
     description = models.CharField(blank=True, null=True, max_length=128, verbose_name=u'描述信息', default='')
@@ -575,6 +573,7 @@ class PushInaccurateFeedback(models.Model):
     event_time = models.CharField(default='', max_length=16, verbose_name='事件时间')
     is_st = models.SmallIntegerField(default=0, verbose_name='是否多图')  # 1:单图, 3:多图
     add_time = models.IntegerField(default=0, verbose_name='添加时间')
+    tag = models.CharField(default='', max_length=128, verbose_name='标签')
 
     class Meta:
         db_table = 'push_inaccurate_feedback'
@@ -994,6 +993,21 @@ class CouponModel(models.Model):
         verbose_name_plural = verbose_name
 
 
+class CouponCombo(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='主键')
+    coupon_id = models.IntegerField(default=0, verbose_name='优惠券id')
+    combo_id = models.IntegerField(default=0, verbose_name='套餐id')
+    # 0:云存,1:AI,2:4G
+    coupon_type = models.SmallIntegerField(verbose_name='类型', default=0)
+    update_time = models.IntegerField(verbose_name='更新时间', default=0)
+    create_time = models.IntegerField(verbose_name='添加时间', default=0)
+
+    class Meta:
+        db_table = 'coupon_combo'
+        verbose_name = u'优惠券关联套餐'
+        verbose_name_plural = verbose_name
+
+
 class PayCycleConfigModel(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='主键')
     # name = models.CharField(default='',max_length=200, verbose_name='计划名字')
@@ -1014,16 +1028,19 @@ class PayCycleConfigModel(models.Model):
 
 class PromotionRuleModel(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='主键')
-    ruleName = models.TextField(default='', verbose_name='规则名字')  # json格式, 例: {"cn":"黑色星期五","en":"Black Friday"}
-    ruleDesc = models.TextField(default='',
-                                verbose_name='规则描述')  # json格式,   例:  {"cn":"买一送一","en":"buy one get one free"}
-    ruleConfig = models.CharField(max_length=2000, default='', verbose_name='规则配置')  # json格式, 例: {"buy": 1, "get": 1}
-    startTime = models.IntegerField(verbose_name='促销活动开始时间', default=0)
-    endTime = models.IntegerField(verbose_name='促销活动结束时间', default=0)
-    status = models.SmallIntegerField(default=0, verbose_name='活动状态:0未进行;1进行中')
+    # json格式, 例: {"cn": "黑色星期五", "en": "Black Friday"}
+    ruleName = models.TextField(default='', verbose_name='规则名字')
+    # json格式, 例: {"cn": "买一送一","en": "buy one get one free"}
+    ruleDesc = models.TextField(default='', verbose_name='规则描述')
+    # json格式, 例: {"buy": 1, "get": 1}
+    ruleConfig = models.CharField(max_length=2000, default='', verbose_name='规则配置')
+    startTime = models.IntegerField(default=0, verbose_name='促销活动开始时间')
+    endTime = models.IntegerField(default=0, verbose_name='促销活动结束时间')
+    # 0: 未进行, 1: 进行中
+    status = models.SmallIntegerField(default=0, verbose_name='活动状态')
     remark = models.CharField(max_length=50, default='', verbose_name='备注')
-    popups = models.CharField(max_length=2000, default='',
-                              verbose_name='app弹窗消息')  # json格式 ,例: {"cn":"买一送一","en":"buy one get one free"}
+    # json格式, 例: {"cn": "买一送一", "en": "buy one get one free"}
+    popups = models.CharField(max_length=2000, default='', verbose_name='app弹窗消息')
 
     def __str__(self):
         return self.id
@@ -2424,7 +2441,7 @@ class CloudVodSurveysOperateLog(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
     user = models.ForeignKey(Device_User, to_field='userID', default='', on_delete=models.CASCADE,
                              verbose_name='关联用户表ID')
-    status = models.SmallIntegerField(default=0, verbose_name='状态{0:未处理,1:提交,2:关闭}')
+    status = models.SmallIntegerField(default=0, verbose_name='状态{0:未处理,1:提交,2:关闭,3:未提交}')
     updated_time = models.IntegerField(default=0, verbose_name='更新时间')
     created_time = models.IntegerField(default=0, verbose_name='创建时间')
 
@@ -2704,7 +2721,7 @@ class UnicomCombo(models.Model):
     package_id = models.CharField(default='', max_length=32, verbose_name=u'联通套餐id')
     combo_name = models.CharField(default='', max_length=32, verbose_name=u'套餐名称')
     status = models.SmallIntegerField(default=0, verbose_name='状态{0:开启,1:停用}')
-    # 套餐类型 0:商用,1:初始化赠送
+    # 套餐类型 0:商用,1:初始化赠送,2:赠送套餐
     combo_type = models.SmallIntegerField(default=0, verbose_name='套餐类型')
     flow_total = models.IntegerField(default=0, blank=True, verbose_name=u'流量总量值 单位(MB)')
     expiration_days = models.IntegerField(default=0, blank=True, verbose_name=u'有效期天数')
@@ -3011,3 +3028,91 @@ class DeviceInfoSummary(models.Model):
         db_table = 'device_info_summary'
         verbose_name = u'设备汇总信息表'
         verbose_name_plural = verbose_name
+
+
+class KVS(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='主键')
+    stream_name = models.CharField(default='', max_length=128, verbose_name='视频流名称')  # 视频流名称,为序列号
+    stream_arn = models.CharField(default='', max_length=128, verbose_name='视频流ARN')
+    data_retention_in_hours = models.PositiveSmallIntegerField(default=0, verbose_name='数据保留时间')  # 单位: 小时
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'kvs'
+        verbose_name = 'kvs表'
+        verbose_name_plural = verbose_name
+
+
+class DeviceCloudPhotoInfo(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='主键')
+    status = models.SmallIntegerField(default=0, verbose_name=u'状态{0:关闭,1:开启}')
+    user_id = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'用户id')
+    uid = models.CharField(blank=True, db_index=True, max_length=32, verbose_name=u'设备UID')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'device_cloud_photo'
+        verbose_name = '设备云相册信息'
+        verbose_name_plural = verbose_name
+
+
+class DevicePicturePushInfo(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='主键')
+    type = models.SmallIntegerField(default=0, verbose_name=u'状态{0:图片,1:视频}')
+    user_id = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'用户id')
+    uid = models.CharField(blank=True, db_index=True, max_length=32, verbose_name=u'设备UID')
+    device_nick_name = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称')
+    channel = models.IntegerField(default=1, blank=True, verbose_name=u'设备通道')
+    event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'device_picture_push_info'
+        verbose_name = '设备图片推送信息'
+        verbose_name_plural = verbose_name
+
+
+class CloudPhotoBGM(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='主键')
+    is_show = models.SmallIntegerField(default=1, verbose_name=u'是否显示')  # 0: 否, 1: 是
+    name = models.CharField(default='', max_length=128, verbose_name=u'音乐名称')
+    link = models.CharField(default='', max_length=255, verbose_name=u'音乐链接')
+    sort = models.IntegerField(default=99, blank=True, verbose_name=u'排序,越小越靠前')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+
+    class Meta:
+        db_table = 'cloud_photo_bgm'
+        verbose_name = '云相册背景音乐'
+        verbose_name_plural = verbose_name
+
+
+class UserOperationLog(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
+    user_id = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'用户id')
+    uid = models.CharField(blank=True, db_index=True, max_length=32, verbose_name=u'设备UID')
+    type = models.SmallIntegerField(default=0, verbose_name='类型[1:云存储弹窗,2:AI弹窗,3:4G,4:AI红点]')
+    status = models.SmallIntegerField(default=0, verbose_name='0:未读/未操作,1:已读/已操作')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'user_operation_log'
+        verbose_name = '用户操作日志记录'
+        verbose_name_plural = verbose_name
+
+
+class UidCloudStorageCount(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
+    uid = models.CharField(blank=True, db_index=True, max_length=32, verbose_name=u'设备UID')
+    count = models.IntegerField(default=0, blank=True, verbose_name=u'当日上传次数')
+    type = models.SmallIntegerField(default=0, verbose_name='0:云存视频')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'uid_cloud_storage_count'
+        verbose_name = '云存储uid日上传次数统计'
+        verbose_name_plural = verbose_name

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.