Bladeren bron

Merge branch 'ming' into dev

zhangdongming 3 jaren geleden
bovenliggende
commit
bf5f14d65a

+ 331 - 0
AdminController/AiServeController.py

@@ -0,0 +1,331 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from django.views.generic.base import View
+from Model.models import Lang, AiStoreMeal, AiService
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
+
+
+class AiServeView(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')
+        if operation == 'xxx':  # 不认证token接口
+            pass
+        else:
+            tko = TokenObject(
+                request.META.get('HTTP_AUTHORIZATION'),
+                returntpye='pc')
+            if tko.code != 0:
+                return response.json(tko.code)
+            response.lang = tko.lang
+            userID = tko.userID
+            # ai套餐信息相关
+            if operation == 'getAiStoreMealList':
+                return self.getAiStoreMealList(request_dict, response)
+            elif operation == 'addOrEditAiStoreMeal':
+                return self.addOrEditAiStoreMeal(request_dict, response)
+            elif operation == 'deleteAiStoreMeal':
+                return self.deleteAiStoreMeal(request_dict, response)
+            # ai套餐语言相关
+            elif operation == 'getAiMealLanguage':
+                return self.getAiMealLanguage(request_dict, response)
+            elif operation == 'addOrEditAiMealLanguage':
+                return self.addOrEditAiMealLanguage(request_dict, response)
+            elif operation == 'deleteAiMealLanguage':
+                return self.deleteAiMealLanguage(request_dict, response)
+            # 设备ai套餐相关
+            elif operation == 'getDeviceAiMealList':
+                return self.getDeviceAiMealList(request_dict, response)
+            else:
+                return response.json(404)
+
+    def getAiStoreMealList(self, request_dict, response):
+        # 获取ai套餐信息数据
+        print('request_dict: ', request_dict)
+
+        isSelect = request_dict.get('isSelect', None)
+        if isSelect:
+            # 获取套餐ID作为选项
+            ai_meal_qs = AiStoreMeal.objects.filter(
+                lang__lang='cn').values(
+                'id', 'lang__title')
+            return response.json(
+                0, {'list': CommonService.qs_to_list(ai_meal_qs)})
+
+        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:
+            ai_meal_qs = AiStoreMeal.objects.filter()
+            ai_meal_val = ai_meal_qs.values(
+                'id',
+                'price',
+                'virtual_price',
+                'symbol',
+                'currency',
+                'currency',
+                'is_show',
+                'is_discounts',
+                'discount_price',
+                'effective_day',
+                'add_time',
+                'update_time')
+            total = len(ai_meal_val)
+            ai_meals = ai_meal_val[(page - 1) * line:page * line]
+            ai_meal_list = []
+            for ai_meal in ai_meals:
+                # 获取支付方式列表
+                pay_type_list = [
+                    pay_type['id'] for pay_type in AiStoreMeal.objects.get(
+                        id=ai_meal['id']).pay_type.values('id')]
+                # 组织响应数据
+                ai_meal_list.append({
+                    'aiMealID': ai_meal['id'],
+                    'price': ai_meal['price'],
+                    'virtual_price': ai_meal['virtual_price'],
+                    'symbol': ai_meal['symbol'],
+                    'currency': ai_meal['currency'],
+                    'is_show': ai_meal['is_show'],
+                    'is_discounts': ai_meal['is_discounts'],
+                    'discount_price': ai_meal['discount_price'],
+                    'effective_day': ai_meal['effective_day'],
+                    'pay_type': pay_type_list,
+                    'addTime': ai_meal['add_time'].strftime("%Y-%m-%d %H:%M:%S"),
+                    'updTime': ai_meal['update_time'].strftime("%Y-%m-%d %H:%M:%S"),
+                })
+            print('store_meal_list: ', ai_meal_list)
+            return response.json(
+                0, {'list': ai_meal_list, 'total': total})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def addOrEditAiStoreMeal(self, request_dict, response):
+        # 添加/编辑套餐
+        print('request_dict: ', request_dict)
+        aiMealID = request_dict.get('aiMealID', None)
+        effective_day = int(request_dict.get('effective_day', 0))
+        price = request_dict.get('price', '')
+        virtual_price = request_dict.get('virtual_price', '')
+        currency = request_dict.get('currency', '')
+        symbol = request_dict.get('symbol', '')
+        pay_type = request_dict.get(
+            'pay_type', '')[
+            1:-1].split(',')    # '[1,2]' -> ['1','2']
+        is_discounts = int(request_dict.get('is_discounts', 0))
+        discount_price = request_dict.get('discount_price', '')
+        is_show = int(request_dict.get('is_show', 1))
+        isEdit = request_dict.get('isEdit', None)
+
+        if not all([effective_day, price, currency, symbol, pay_type]):
+            return response.json(444)
+
+        try:
+            ai_store_meal_data = {
+                'effective_day': effective_day,
+                'price': price,
+                'virtual_price': virtual_price,
+                'currency': currency,
+                'symbol': symbol,
+                'is_discounts': is_discounts,
+                'discount_price': discount_price,
+                'is_show': is_show,
+            }
+            if isEdit:
+                if not aiMealID:
+                    return response.json(444)
+                AiStoreMeal.objects.filter(
+                    id=aiMealID).update(
+                    **ai_store_meal_data)
+                AiStoreMeal.objects.get(id=aiMealID).pay_type.set(pay_type)
+            else:
+                AiStoreMeal.objects.create(
+                    **ai_store_meal_data).pay_type.set(pay_type)
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def deleteAiStoreMeal(self, request_dict, response):
+        # 删除ai套餐
+        print('request_dict: ', request_dict)
+        aiMealID = request_dict.get('aiMealID', None)
+        if not aiMealID:
+            return response.json(444)
+        try:
+            AiStoreMeal.objects.filter(id=aiMealID).delete()
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def getAiMealLanguage(self, request_dict, response):
+        # 获取ai套餐语言
+        print('request_dict: ', request_dict)
+        aiMealID = request_dict.get('aiMealID', None)
+        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:
+            if aiMealID:   # 条件查询
+                store_meal_lang_qs = AiStoreMeal.objects.filter(id=aiMealID)
+            else:   # 查询全部
+                store_meal_lang_qs = AiStoreMeal.objects.filter(
+                    lang__isnull=False)
+            ai_meal_lang_val = store_meal_lang_qs.values(
+                'id',
+                'lang__id',
+                'lang__lang',
+                'lang__title',
+                'lang__content',
+                'lang__discount_content',
+            )
+            total = len(ai_meal_lang_val)
+            ai_meal_langs = ai_meal_lang_val[(
+                page - 1) * line:page * line]
+            ai_meal_lang_list = []
+            for ai_meal_lang in ai_meal_langs:
+                ai_meal_lang_list.append({
+                    'aiMealID': ai_meal_lang['id'],
+                    'langID': ai_meal_lang['lang__id'],
+                    'lang': ai_meal_lang['lang__lang'],
+                    'title': ai_meal_lang['lang__title'],
+                    'content': ai_meal_lang['lang__content'],
+                    'discountContent': ai_meal_lang['lang__discount_content'],
+                })
+            print('ai_meal_lang_list: ', ai_meal_lang_list)
+            return response.json(
+                0, {'list': ai_meal_lang_list, 'total': total})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def addOrEditAiMealLanguage(self, request_dict, response):
+        # 添加/编辑套餐语言
+        print('request_dict: ', request_dict)
+        aiMealID = request_dict.get('aiMealID', None)
+        lang = request_dict.get('lang', None)
+        title = request_dict.get('title', None)
+        content = request_dict.get('content', None)
+        discount_content = request_dict.get('discountContent', '')
+        isEdit = request_dict.get('isEdit', None)
+
+        if not all([aiMealID, lang, title, content]):
+            return response.json(444)
+
+        try:
+            # 查询套餐是否存在
+            ai_meal_qs = AiStoreMeal.objects.get(id=aiMealID)
+            if not ai_meal_qs:
+                return response.json(173)
+            if isEdit:  # 编辑
+                langID = request_dict.get('langID', None)
+                if not langID:
+                    return response.json(444)
+                Lang.objects.filter(
+                    id=langID).update(
+                    lang=lang,
+                    title=title,
+                    content=content,
+                    discount_content=discount_content)
+            else:   # 添加
+                lang_obj = Lang.objects.filter(
+                    lang=lang,
+                    title=title,
+                    content=content,
+                    discount_content=discount_content)
+                if not lang_obj.exists():
+                    # 数据不存在,lang表创建数据
+                    Lang.objects.create(
+                        lang=lang,
+                        title=title,
+                        content=content,
+                        discount_content=discount_content)
+                    lang_obj = Lang.objects.filter(
+                        lang=lang,
+                        title=title,
+                        content=content,
+                        discount_content=discount_content)
+                ai_meal_qs.lang.add(*lang_obj)  # store_meal表添加语言数据
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def deleteAiMealLanguage(self, request_dict, response):
+        # 删除套餐语言
+        aiMealID = request_dict.get('aiMealID', None)
+        langID = request_dict.get('langID', None)
+
+        if not all([aiMealID, langID]):
+            return response.json(444)
+
+        try:
+            ai_meal_qs = AiStoreMeal.objects.get(id=aiMealID)
+            if not ai_meal_qs:
+                return response.json(173)
+            lang_qs = Lang.objects.filter(id=langID)
+            ai_meal_qs.lang.remove(*lang_qs)
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def getDeviceAiMealList(self, request_dict, response):
+        pageNo = request_dict.get('pageNo', None)
+        pageSize = request_dict.get('pageSize', None)
+        uid = request_dict.get('uid', None)
+        if not all([pageNo, pageSize]):
+            return response.json(444)
+
+        page = int(pageNo)
+        line = int(pageSize)
+        try:
+            ai_service_qs = AiService.objects.all()
+            if uid:
+                ai_service_qs = ai_service_qs.filter(uid__contains=uid)
+
+            if not ai_service_qs.exists():
+                return response.json(0, [])
+
+            count = ai_service_qs.count()
+            ai_service_qs = ai_service_qs.values(
+                'id',
+                'uid',
+                'channel',
+                'use_status',
+                'detect_status',
+                'detect_group',
+                'endTime',
+                'addTime',
+                'updTime',)
+
+            ai_service_qs = ai_service_qs[(page - 1) * line:page * line]
+            return response.json(
+                0, {'list': list(ai_service_qs), 'total': count})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))

+ 6 - 2
AdminController/DeviceManagementController.py

@@ -123,11 +123,15 @@ class DeviceManagement(View):
     # 根据id删除设备
     def deleteDevice(self, request_dict, response):
         deviceID = request_dict.get('deviceID', None)
-        if not deviceID:
+        userID = request_dict.get('userID', None)
+        uid = request_dict.get('uid', None)
+        if not all([deviceID, userID, uid]):
             return response.json(444)
 
         try:
-            Device_Info.objects.filter(id=deviceID).delete()
+            with transaction.atomic():
+                Device_Info.objects.filter(id=deviceID).delete()
+                Equipment_Info.objects.filter(userID_id=userID, devUid=uid).delete()    # 删除推送消息
             return response.json(0)
         except Exception as e:
             print(e)

+ 24 - 16
AdminController/ServeManagementController.py

@@ -788,11 +788,31 @@ class serveManagement(View):
                 uid_bucket_qs = uid_bucket_qs.filter(
                     addTime__gte=endStartTime,
                     addTime__lte=endEndTime)
+
+            uid_list = []
+            uid_set_dict = {}
+            if ucode and ucode != ['']:
+                uid_set_qs = UidSetModel.objects.filter(ucode__in=ucode).values('uid', 'ucode', 'version').distinct()
+                for uid_set in uid_set_qs:
+                    uid_list.append(uid_set['uid'])
+                    uid_set_dict[uid_set['uid']] = {
+                        'ucode': uid_set['ucode'],
+                        'version': uid_set['version']
+                    }
+                uid_bucket_qs = uid_bucket_qs.filter(uid__in=uid_list)
+            else:
+                uid_set_qs = UidSetModel.objects.filter().values('uid', 'ucode', 'version').distinct()
+                for uid_set in uid_set_qs:
+                    uid_list.append(uid_set['uid'])
+                    uid_set_dict[uid_set['uid']] = {
+                        'ucode': uid_set['ucode'],
+                        'version': uid_set['version']
+                    }
+
             if not uid_bucket_qs.exists():
                 return response.json(0, [])
 
-            order_qs = Order_Model.objects.filter(
-                uid_bucket_id__in=uid_bucket_qs.values('id'))
+            order_qs = Order_Model.objects.filter(uid_bucket_id__in=uid_bucket_qs.values('id'))
             if username or phone or userEmail or payType:
                 if username:
                     order_qs = order_qs.filter(userID__username=username)
@@ -808,14 +828,6 @@ class serveManagement(View):
                     id__in=order_qs.values_list(
                         'uid_bucket_id', flat=True))
 
-            uidset_qs = UidSetModel.objects.filter(
-                uid__in=uid_bucket_qs.values('uid'))
-            if ucode or version:
-                if ucode:
-                    uidset_qs = uidset_qs.filter(ucode=ucode)
-                if version:
-                    uidset_qs = uidset_qs.filter(version=version)
-
             cg_qs = CloudLogModel.objects.filter(
                 operation='cloudstorage/queryvodlist')
             if logTimeRange:
@@ -872,12 +884,8 @@ class serveManagement(View):
                     data['playcount'] = cg_qs.filter(
                         operation='cloudstorage/queryvodlist', uid=order['UID']).count()
 
-                for uidset in uidset_qs.filter(
-                        uid=uid_bucket.uid).values(
-                        'ucode',
-                        'version'):
-                    data['ucode'] = uidset['ucode']
-                    data['version'] = uidset['version']
+                data['ucode'] = uid_set_dict[uid_bucket.uid]['ucode']
+                data['version'] = uid_set_dict[uid_bucket.uid]['version']
 
                 list_data.append(data)
             return response.json(

+ 1 - 0
Ansjer/local_config/local_settings.py

@@ -10,6 +10,7 @@ ALLOWED_HOSTS = ['*']
 
 
 
+
 ADDR_URL = []
 ANONYMOUS_USER_ID = -1  # 支持匿名用户
 

+ 12 - 2
Ansjer/urls.py

@@ -19,9 +19,10 @@ from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppIn
     OrderTaskController, HistoryUIDController, UIDManageUserController, SerialNumberController, CompanyController, \
     RegionController, VPGController, LanguageController, TestController, DeviceConfirmRegion, S3GetStsController, \
     DetectControllerV2, ShadowController, TestDetectController, PcInfo, PctestController, DeviceDebug, PaymentCycle, \
-    DeviceLogController, CouponController, AiController
+    DeviceLogController, CouponController, AiController, SurveysController
 from AdminController import UserManageController, RoleController, MenuController, TestServeController, \
-    ServeManagementController, LogManagementController, DeviceManagementController, VersionManagementController
+    ServeManagementController, LogManagementController, DeviceManagementController, VersionManagementController, \
+    AiServeController
 
 urlpatterns = [
     url(r'^testApi/(?P<operation>.*)$', TestApi.testView.as_view()),
@@ -348,6 +349,7 @@ urlpatterns = [
     #设备确定分配地区
     url(r'^device/confirmRegion$', DeviceConfirmRegion.ConfirmRegion.as_view()),
     url(r'^device/ConfirmRegionV2$', DeviceConfirmRegion.ConfirmRegionV2.as_view()),
+    url(r'^device/confirmCountry$', DeviceConfirmRegion.confirm_country_with_ip),
 
     # pc端软件信息
     url(r'^pcInfo/(?P<operation>.*)$', PcInfo.PcInfo.as_view()),
@@ -359,6 +361,9 @@ urlpatterns = [
     # url(r'^deviceDebug/(?P<operation>.*)$', DeviceDebug.DeviceDebug.as_view()),
     re_path('deviceDebug/(?P<operation>.*)', DeviceDebug.DeviceDebug.as_view()),
 
+    # 问卷调查
+    url(r'^api/surveys/(?P<operation>.*)$', SurveysController.SurveysView.as_view()),
+
     # 后台界面接口 -----------------------------------------------------
     # 用户登录信息等
     url(r'^login$', UserManageController.LoginView.as_view()),
@@ -381,8 +386,13 @@ urlpatterns = [
     re_path('testServe/(?P<operation>.*)', TestServeController.TestServeView.as_view()),
     # 日志管理
     re_path('logManagement/(?P<operation>.*)', LogManagementController.LogManagementView.as_view()),
+    # AI服务
+    re_path('aiServe/(?P<operation>.*)', AiServeController.AiServeView.as_view()),
+    # 问卷调查管理
+    url(r'surveys/(?P<operation>.*)', SurveysController.SurveysView.as_view()),
     # 后台界面接口 -----------------------------------------------------
 
+
     re_path('(?P<path>.*)', LogManager.errorPath),
 
 ]

+ 93 - 83
Controller/AiController.py

@@ -57,7 +57,7 @@ from Object.UidTokenObject import UidTokenObject
 from Service.CommonService import CommonService
 from Object.m3u8generate import PlaylistGenerator
 from Object.WechatPayObject import WechatPayObject
-from django.db.models import Q, F, Count
+from django.db.models import Q, F, Count, Sum
 from Controller.PaymentCycle import Paypal
 from decimal import Decimal
 from Ansjer.config import SERVER_TYPE
@@ -115,7 +115,7 @@ class AiView(View):
                 return self.deleteInfo(userID, request_dict, response)
             elif operation == 'queryorderlist':  # 查询订单
                 return self.do_querylist(userID, request_dict, response)
-            elif operation == 'getUsingPackage':  # 获取设备当前使用的ai套餐
+            elif operation == 'getUsingPackage':  # 获取当前使用的ai套餐
                 return self.getUsingPackage(request_dict, userID, response)
             else:
                 return response.json(414)
@@ -128,24 +128,19 @@ class AiView(View):
         status = request_dict.get('status', None)
         m_code = request_dict.get('m_code', None)
         uid = request_dict.get('uid', None)
-        # 设备语言
         lang = request_dict.get('lang', 'en')
         tz = request_dict.get('tz', '0')
-        # 消息提醒功能新增
-
-        # 如果传空上来,就默认为0
-        if tz == '':
-            tz = 0
-        else:
-            tz = tz.replace("GMT", "")
         detect_group = request_dict.get('detect_group', None)
         interval = request_dict.get('interval', None)
+
         if not status:
             return response.json(444, 'status')
         # 关闭推送
         if not all([appBundleId, app_type, token_val, uid, m_code]):
             return response.json(444, 'appBundleId,app_type,token_val,uid,m_code')
 
+        # 如果传空上来,就默认为0
+        tz = 0 if tz == '' else tz.replace("GMT", "")
         # 判断推送类型对应key是否存在
         if push_type == '0':
             if appBundleId not in APNS_CONFIG.keys():
@@ -160,11 +155,11 @@ class AiView(View):
             return response.json(173)
 
         try:
-            hasAiService = AiService.objects.filter(uid=uid, use_status=1)
-            if not hasAiService.exists():
+            ai_service_qs = AiService.objects.filter(uid=uid, use_status=1)
+            if not ai_service_qs.exists():
                 return response.json(10053)
             nowTime = int(time.time())
-            endTime = hasAiService.values('endTime')[0]['endTime']
+            endTime = ai_service_qs.values('endTime')[0]['endTime']
             if nowTime > endTime:
                 return response.json(10054)
 
@@ -198,9 +193,10 @@ class AiView(View):
                 uid_set_qs = UidSetModel.objects.create(**qs_data)
                 uid_set_id = uid_set_qs.id
 
+            qs_data['detect_status'] = status       # ai开关状态
+            ai_service_qs.update(**qs_data)
             topic_name = 'ansjer/generic/{}'.format(uid)
             if status == 0:     # 关闭
-                hasAiService.update(**qs_data)
                 # mqtt通知设备关闭AI识别功能
                 msg = {'commandType': 'AIDisable'}
                 req_success = CommonService.req_publish_mqtt_msg(uid, topic_name, msg)
@@ -208,7 +204,6 @@ class AiView(View):
                     return response.json(10044)
                 return response.json(0)
             elif status == 1:       # 开启
-                hasAiService.update(**qs_data)
                 uid_push_qs = UidPushModel.objects.filter(userID_id=userID, m_code=m_code, uid_set__uid=uid)
 
                 if uid_push_qs.exists():
@@ -223,7 +218,6 @@ class AiView(View):
                     }
                     uid_push_qs.update(**uid_push_update_dict)
                 else:
-                    # uid_set_id = uid_set_qs[0].id
                     uid_push_create_dict = {
                         'uid_set_id': uid_set_id,
                         'userID_id': userID,
@@ -268,7 +262,7 @@ class AiView(View):
         if not uid:
             return response.json(444)
         try:
-            ai_server_qs = AiService.objects.filter(uid=uid).values('detect_status', 'detect_group')
+            ai_server_qs = AiService.objects.filter(uid=uid, use_status=1).values('detect_status', 'detect_group')
             if not ai_server_qs.exists():
                 return response.json(173)
             res = {
@@ -282,30 +276,32 @@ class AiView(View):
     def do_commodity_list(self, userID, request_dict, response):
         uid = request_dict.get('uid', None)
         lang = request_dict.get('lang', 'en')
-        nowTime = int(time.time())
-        # DVR/NVR设备暂不返回套餐列表
-        device_info_qs = Device_Info.objects.filter(Q(UID=uid), Q(Type__lte=4) | Q(Type=10001))
-        if device_info_qs.exists():
-            return response.json(0)
 
-        qs = AiStoreMeal.objects
+        try:
+            # DVR/NVR设备暂不返回套餐列表
+            device_info_qs = Device_Info.objects.filter(Q(UID=uid), Q(Type__lte=4) | Q(Type=10001))
+            if device_info_qs.exists():
+                return response.json(0)
 
-        qs = qs.filter(is_show=1)  # 过滤隐藏套餐
-        qs = qs.annotate(ai_meal_id=F('id'))
-        qs = qs.values("ai_meal_id", "title", "content", "price", "effective_day", "currency",
-                       "virtual_price", "symbol")
-        if not qs.exists():
-            return response.json(0)
+            # 查询套餐数据
+            ai_meal_qs = AiStoreMeal.objects.filter(is_show=1, lang__lang=lang).\
+                annotate(ai_meal_id=F('id'), title=F('lang__title'), content=F('lang__content')).\
+                values("ai_meal_id", "title", "content", "price", "effective_day", "currency", "virtual_price", "symbol")
+            if not ai_meal_qs.exists():
+                return response.json(0)
 
-        # 查询每种套餐的所有支付方式
-        ai_meal_list = list(qs)
-        for ai_meal in ai_meal_list:
-            pay_type_qs = Pay_Type.objects.filter(aistoremeal=ai_meal['ai_meal_id']).values('id', 'payment')
-            ai_meal['pay_type'] = list(pay_type_qs)
-        result = {
-            'meals': ai_meal_list,
-        }
-        return response.json(0, result)
+            # 查询每种套餐的所有支付方式
+            ai_meal_list = list(ai_meal_qs)
+            for ai_meal in ai_meal_list:
+                pay_type_qs = Pay_Type.objects.filter(aistoremeal=ai_meal['ai_meal_id']).values('id', 'payment')
+                ai_meal['pay_type'] = list(pay_type_qs)
+            result = {
+                'meals': ai_meal_list,
+            }
+            return response.json(0, result)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
 
     def do_querylist(self, userID, request_dict, response):
         page = request_dict.get('page', None)
@@ -314,57 +310,71 @@ class AiView(View):
         lang = request_dict.get('lang', 'en')
         if not page or not line:
             return response.json(444, 'page,line')
-        page = int(page)
-        line = int(line)
-        omqs = Order_Model.objects.filter(userID_id=userID, status=1, order_type=1)
-        # 筛选指定设备id的订单
-        if uid:
-            omqs.filter(UID=uid)
-        if not omqs.exists():
-            return response.json(173)
-        count = omqs.count()
-        omqs = omqs.annotate(rank__title=F('ai_rank__title'), rank__content=F('ai_rank__content'),
-                             rank__day=F('ai_rank__effective_day'), rank__price=F('ai_rank__price'),
-                             rank__expire=F('ai_rank__effective_day'), rank__id=F('ai_rank_id'), rank__currency=F('ai_rank__currency'))
-        order_ql = omqs[(page - 1) * line:page * line].values("orderID", "UID", "channel", "desc", "price", "currency",
-                                                              "addTime",
-                                                              "updTime", "paypal", "rank__day", "payType",
-                                                              "rank__price", "status",
-                                                              "rank__content", "rank__title", "rank__currency",
-                                                              "rank__expire", "ai_rank_id")
-        order_list = list(order_ql)
-        data = []
-        nowTime = int(time.time())
-        # 这里需要进行优化
-        uid_list = []
-        for od in order_list:
-            uid_list.append(od['UID'])
-        didqs = Device_Info.objects.filter(userID_id=userID, UID__in=uid_list).values('id', 'UID', 'Type')
-        for d in order_list:
-            if d['status'] == 0:
-                if d['addTime'] + 3600 < nowTime:
-                    d['status'] = 3
-            for did in didqs:
-                if d['UID'] == did['UID']:
-                    d['did'] = did['id']
-                    d['Type'] = did['Type']
-                    data.append(d)
-            # d['rank__lang__content'] = '月' if lang == 'cn' else 'month'
-        return response.json(0, {'data': data, 'count': count})
-
-    # 获取设备当前使用的ai套餐
+
+        try:
+            page = int(page)
+            line = int(line)
+            omqs = Order_Model.objects.filter(userID_id=userID, status=1, order_type=1, ai_rank__lang__lang=lang)
+            # 筛选指定设备id的订单
+            if uid:
+                omqs.filter(UID=uid)
+            if not omqs.exists():
+                return response.json(173)
+            count = omqs.count()
+            omqs = omqs.annotate(rank__title=F('ai_rank__lang__title'), rank__content=F('ai_rank__lang__content'),
+                                 rank__day=F('ai_rank__effective_day'), rank__price=F('ai_rank__price'),
+                                 rank__expire=F('ai_rank__effective_day'), rank__id=F('ai_rank_id'), rank__currency=F('ai_rank__currency'))
+            order_ql = omqs[(page - 1) * line:page * line].values("orderID", "UID", "channel", "desc", "price", "currency",
+                                                                  "addTime",
+                                                                  "updTime", "paypal", "rank__day", "payType",
+                                                                  "rank__price", "status",
+                                                                  "rank__content", "rank__title", "rank__currency",
+                                                                  "rank__expire", "ai_rank_id")
+            order_list = list(order_ql)
+            data = []
+            nowTime = int(time.time())
+            # 这里需要进行优化
+            uid_list = []
+            for od in order_list:
+                uid_list.append(od['UID'])
+            didqs = Device_Info.objects.filter(userID_id=userID, UID__in=uid_list).values('id', 'UID', 'Type')
+            for d in order_list:
+                if d['status'] == 0:
+                    if d['addTime'] + 3600 < nowTime:
+                        d['status'] = 3
+                for did in didqs:
+                    if d['UID'] == did['UID']:
+                        d['did'] = did['id']
+                        d['Type'] = did['Type']
+                        data.append(d)
+                # d['rank__lang__content'] = '月' if lang == 'cn' else 'month'
+            return response.json(0, {'data': data, 'count': count})
+        except Exception as e:
+            print(e)
+        return response.json(500, repr(e))
+
+    # 获取当前使用的ai套餐
     def getUsingPackage(self, request_dict, userID, response):
         uid = request_dict.get('uid', None)
         lang = request_dict.get('lang', 'en')
         # dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False, isExist=1, vodPrimaryUserID=userID)
         # if not dv_qs.exists():
         #     return response.json(12)
-        ai_service_qs = AiService.objects.filter(uid=uid, use_status=1)
-        if not ai_service_qs.exists():
-            return response.json(0, [])
-        ai_service_qs = ai_service_qs.order_by('addTime').annotate(bucket__content=F('orders__ai_rank__title')).\
-            values('uid', 'use_status', 'endTime', 'bucket__content')
-        return response.json(0, [ai_service_qs[0]])
+        try:
+            ai_service_qs = AiService.objects.filter(uid=uid, use_status=1, orders__ai_rank__lang__lang=lang)
+            if not ai_service_qs.exists():
+                return response.json(0, [])
+
+            # 计算套餐过期时间
+            sum_end_time = AiService.objects.filter(Q(uid=uid), ~Q(use_status=2)).aggregate(Sum('endTime'))['endTime__sum']
+            ai_service_qs = ai_service_qs.order_by('addTime').annotate(bucket__content=F('orders__ai_rank__lang__title')).\
+                values('uid', 'use_status', 'bucket__content')
+            ai_service_data = ai_service_qs[0]
+            ai_service_data['endTime'] = sum_end_time
+            return response.json(0, [ai_service_data])
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
 
     def do_create_pay_order(self, request_dict, request, userID, response):
         uid = request_dict.get('uid', None)

+ 24 - 0
Controller/DeviceConfirmRegion.py

@@ -189,3 +189,27 @@ class StatisticsIpRegion(TemplateView):
             print(e)
             return response.json(500, repr(e))
 
+def confirm_country_with_ip(request):
+    '''
+    根据ip统计设备所在国家的程序,
+    ip.txt放在ASJServer目录下
+    '''
+    response = ResponseObject()
+    try:
+        with open('country.txt', 'w', encoding='utf-8') as wf:
+            with open('ip.txt', 'r') as rf:
+                for ip in rf.readlines():
+                    if not ip or ip == '\n':
+                        country = 'N/A'
+                    else:
+                        if '\n' in ip:
+                            ip = ip[:-1]
+                        ipInfo = CommonService.getIpIpInfo(ip, "CN")
+                        country = ipInfo['country_name'] if ipInfo['country_name'] else 'N/A'
+                        if country == '中国':
+                            country = '美国'
+                    wf.write(country+'\n')
+        return response.json(0)
+    except Exception as e:
+        print(e)
+        return response.json(500, repr(e))

+ 4 - 1
Controller/PcInfo.py

@@ -132,7 +132,10 @@ class PcInfo(View):
             region_name='cn-northwest-1')
         version_list = []
         for i in range(2):
-            app_list = Pc_Info.objects.filter(pc_name=pc_name, bundle_version=bundle_version, pc_test=pc_test, is_update=i)
+            if pc_test == '1':      # 测试版返回所有版本中的最新版本
+                app_list = Pc_Info.objects.filter(pc_name=pc_name, bundle_version=bundle_version, is_update=i)
+            else:
+                app_list = Pc_Info.objects.filter(pc_name=pc_name, bundle_version=bundle_version, pc_test=pc_test, is_update=i)
             # 当前软件不存在强制更新(is_update=1)的版本返回空
             if not app_list.exists():
                 res = {'pc_name': '',

+ 32 - 28
Controller/SerialNumberController.py

@@ -43,9 +43,9 @@ class SerialNumberView(View):
 
         if operation == 'getUID':
             return self.do_get_uid(request_dict, response)
-        elif operation == 'attachUID':
+        elif operation == 'attachUID':      # 绑定uid
             return self.do_attach_uid(request_dict, response, request)
-        elif operation == 'detachUID':
+        elif operation == 'detachUID':      # 解绑uid
             return self.do_detach_uid(request, request_dict, response)
         elif operation == 'create':
             return self.do_create(request_dict, response)
@@ -180,13 +180,13 @@ class SerialNumberView(View):
                                                          vpg__region_id=country_id, status=0, p2p_type=p2p_type). \
                                                          order_by('id')
                         if not uid_qs.exists():
-                            return response.json(173)
+                            return response.json(375)
 
                         uid = uid_qs[0]
                         # 判断uid是否已绑定过序列号
                         uid_company_serial_qs = UIDCompanySerialModel.objects.filter(uid_id=uid.id)
                         if uid_company_serial_qs.exists():
-                            return response.json(174)
+                            return response.json(377)
 
                         result = UIDModel.objects.filter(id=uid.id, status=0).update(status=2, update_time=now_time)
                         if int(result) <= 0:    # 更新失败
@@ -231,20 +231,12 @@ class SerialNumberView(View):
                         }
                         LogModel.objects.create(**log)
                         # 修改其他数据库的序列号使用状态为已占用
-                        data = {'serial': serial, 'status': 3}
-                        if SERVER_TYPE == 'Ansjer.us_config.formal_settings':
-                            url = '{}serialNumber/changeSerialNumberStatus'.format(SERVER_DOMAIN_CN)
-                        elif SERVER_TYPE == 'Ansjer.cn_config.formal_settings':
-                            url = '{}serialNumber/changeSerialNumberStatus'.format(SERVER_DOMAIN_US)
-                        req_res = requests.post(url=url, data=data, timeout=2)
-                        if req_res.status_code != 200:
-                            raise RuntimeError('请求修改序列号状态发生异常')
-                        req_res = req_res.json()
-                        if req_res['result_code'] != 0:
-                            raise RuntimeError('请求修改序列号状态发生异常')
-
+                        update_success = self.update_serial_status(serial=serial, status=3)
+                        try:
+                            assert update_success
+                        except AssertionError:
+                            return response.json(378)
                         return response.json(0, res)
-
                     return response.json(5)
             elif company_serial.status == 2:   # 返回uid
                 uid_qs = UIDCompanySerialModel.objects.filter(company_serial_id=company_serial.id)
@@ -345,17 +337,11 @@ class SerialNumberView(View):
                             up_qs.delete()
 
                     # 修改其他数据库的序列号使用状态为已使用
-                    data = {'serial': serial, 'status': 1}
-                    if SERVER_TYPE == 'Ansjer.us_config.formal_settings':
-                        url = '{}serialNumber/changeSerialNumberStatus'.format(SERVER_DOMAIN_CN)
-                    elif SERVER_TYPE == 'Ansjer.cn_config.formal_settings':
-                        url = '{}serialNumber/changeSerialNumberStatus'.format(SERVER_DOMAIN_US)
-                    req_res = requests.post(url=url, data=data, timeout=2)
-                    if req_res.status_code != 200:
-                        raise RuntimeError('请求修改序列号状态发生异常')
-                    req_res = req_res.json()
-                    if req_res['result_code'] != 0:
-                        raise RuntimeError('请求修改序列号状态发生异常')
+                    update_success = self.update_serial_status(serial=serial, status=1)
+                    try:
+                        assert update_success
+                    except AssertionError:
+                        return response.json(378)
 
                 UIDModel.objects.filter(uid=uid).update(status=0, mac='')    # 重置uid的使用状态为未分配
                 uid_serial.delete()
@@ -379,6 +365,24 @@ class SerialNumberView(View):
             djangoLogger.exception(repr(e))
             return response.json(176, str(e))
 
+    @staticmethod
+    def update_serial_status(serial, status):
+        if SERVER_TYPE == 'Ansjer.cn_config.test_settings':   # 测试服不处理
+            return True
+        if SERVER_TYPE == 'Ansjer.us_config.formal_settings':
+            server_domain = SERVER_DOMAIN_CN
+        elif SERVER_TYPE == 'Ansjer.cn_config.formal_settings':
+            server_domain = SERVER_DOMAIN_US
+        url = server_domain + 'serialNumber/changeSerialNumberStatus'
+        data = {'serial': serial, 'status': status}
+        req_res = requests.post(url=url, data=data, timeout=2)
+        if req_res.status_code != 200:
+            return False
+        req_res = req_res.json()
+        if req_res['result_code'] != 0:
+            return False
+        return True
+
     def do_update(self, userID, request_dict, response):
         # perm = ModelService.check_perm_uid_manage(userID, 0)
         # if not perm:

+ 302 - 0
Controller/SurveysController.py

@@ -0,0 +1,302 @@
+#!/usr/bin/python3.6
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2022 #
+# @Time    : 2022/3/9 9:20
+# @Author  : ming
+# @Email   : zhangdongming@asj6.wecom.work
+# @File    : SurveysController.py
+# @Software: PyCharm
+import time
+import json
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from django.views.generic.base import View
+from Object.TokenObject import TokenObject
+from Object.ResponseObject import ResponseObject
+from Model.models import Surveys, SurveysTitle, Order_Model, CloudVodSurveysAnswer, Device_User
+from Service.CommonService import CommonService
+import logging
+
+
+class SurveysView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(SurveysView, 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):
+        logger = logging.getLogger('info')
+        token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
+        response = ResponseObject()
+        if token.code != 0:
+            return response.json(token.code)
+        userID = token.userID
+
+        ''' API '''
+        logger.info('this user id:{},dict{}'.format(userID, request_dict))
+        if operation == 'get/info':
+            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)
+
+        ''' 后台管理'''
+        response = ResponseObject(returntype='pc')
+        if operation == 'save':
+            return self.save(request_dict, response)
+        if operation == 'edit':
+            return self.edit(request_dict, response)
+        if operation == 'list':
+            return self.get_page(request_dict, response)
+        if operation == 'title/list':
+            return self.get_title_list(request_dict, response)
+        if operation == 'title/save':
+            return self.title_save(request_dict, response)
+        if operation == 'title/edit':
+            return self.title_edit(request_dict, response)
+        if operation == 'title/del':
+            return self.title_del(request_dict, response)
+        if operation == 'cloud/vod/answer/page':
+            return self.cloud_surveys_answer_page(request_dict, response)
+        return response.json(0)
+
+    def check_stock_user(self, user_id, request_dict, response):
+        order = Order_Model.objects.filter(userID=user_id, status=1, order_type=0)
+        if order.count() == 0:
+            return response.json(10030)
+        try:
+            no = '01'
+            surveys = Surveys.objects.filter(no=no, user_type=1)
+            if not all(surveys):
+                return response.json(173)
+            result = surveys[0]
+            surveys_title = SurveysTitle.objects.filter(surveys_id=result.id).order_by('-created_time')
+            submit = 0
+            if surveys_title.exists():
+                surveys_title = surveys_title[0]
+                cloud_vod = CloudVodSurveysAnswer.objects.filter(title_id=surveys_title.id, user_id=user_id)
+                if cloud_vod.exists():
+                    submit = 1
+            data = {
+                'no': result.no,
+                'title': 'Zosi Cloud Storage',
+                'img': '',
+                'userType': result.user_type,
+                'startTime': result.start_time,
+                'endTime': result.end_time,
+                'isShow': result.is_show,
+                'isSubmit': submit,
+                'page': '/surveys?token=' if result.is_show == 1 else ''
+            }
+            return response.json(0, data)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def answer_save(self, userId, ip, request_dict, response):
+        try:
+            ipInfo = CommonService.getIpIpInfo(ip, "CN")
+            country_name = ipInfo['country_name']
+            no = request_dict.get('no', None)
+            if not no:
+                return response.json(10, 'no is null')
+            survey = Surveys.objects.filter(no=no)
+            if survey.exists():
+                survey = survey[0]
+                survey_title = SurveysTitle.objects.filter(surveys=survey.id)
+                if survey_title.exists():
+                    survey_title = survey_title[0]
+                    cloud_vod = CloudVodSurveysAnswer.objects.filter(title_id=survey_title.id, user_id=userId)
+                    if cloud_vod.exists():
+                        return response.json(10, "Do not submit twice")
+                    score = request_dict.get('score', None)
+                    topicA = request_dict.get('topicA', None)
+                    topicB = request_dict.get('topicB', None)
+                    topicC = request_dict.get('topicC', None)
+                    topicD = request_dict.get('topicD', None)
+                    topicF = request_dict.get('topicF', None)
+                    createdTime = int(time.time())
+                    answer = CloudVodSurveysAnswer(title_id=survey_title.id, user_id=userId, ip=ip, answer_1=int(score),
+                                                   answer_2=topicA,
+                                                   answer_3=topicB, answer_4=topicC, answer_5=topicD, answer_6=topicF,
+                                                   created_time=createdTime, country_name=country_name)
+                    answer.save()
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def get_page(self, 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 = Surveys.objects.all()
+            total = request_qs.count()
+            surveys_list = request_qs.filter().order_by('-created_time')[(page - 1) * line:page * line]
+            result_list = []
+            for surveys in surveys_list:
+                start_time = time.localtime(surveys.start_time)
+                endT_time = time.localtime(surveys.end_time)
+                created_time = time.localtime(surveys.created_time)
+                result_list.append({
+                    'id': surveys.id,
+                    'no': surveys.no,
+                    'userType': surveys.user_type,
+                    'startTime': time.strftime("%Y-%m-%d %H:%M:%S", start_time),
+                    'endTime': time.strftime("%Y-%m-%d %H:%M:%S", endT_time),
+                    'isShow': surveys.is_show,
+                    'createdTime': time.strftime("%Y-%m-%d %H:%M:%S", created_time),
+                })
+            return response.json(0, {'list': result_list, 'total': total})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def save(self, 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)
+
+    def edit(self, request_dict, response):
+        sur_id = request_dict.get('id', None)
+        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))
+        return response.json(0)
+
+    def delete(self, request_dict, response):
+        sId = request_dict.get('id', None)
+        if not sId:
+            return response.json(10, 'id不存在')
+        Surveys.objects.filter(id=sId).delete()
+        response.json(0)
+
+    def title_save(self, request_dict, response):
+        surveyId = request_dict.get('surveyId', None)
+        if not surveyId:
+            return response(10, 'surveyId is null')
+        t_id = request_dict.get('id', None)
+        content = request_dict.get('content', None)
+        createdTime = 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.save()
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def get_title_list(self, request_dict, response):
+        surveyId = request_dict.get('surveyId', None)
+        info = request_dict.get('info', None)
+        if not surveyId:
+            return response.json(10, '问卷id不存在')
+        title_list = SurveysTitle.objects.filter(surveys_id=surveyId).order_by('-created_time')
+        if not title_list.exists():
+            if info:
+                return response.json(0, {'id': None, 'content': None})
+            return response.json(173)
+        content = title_list[0]
+        if info:
+            return response.json(0, {'id': content.id, 'content': content.title_content})
+        data = json.loads(content.title_content)
+        return response.json(0, {'answers': data})
+
+    def title_edit(self, request_dict, response):
+        title_id = request_dict.get('id', None)
+        if not title_id:
+            return response.json(10, 'id不存在')
+        content = request_dict.get('content', None)
+        surveys_title = SurveysTitle.objects.filter(surveys_id=title_id)
+        surveys_title.update(title_content=content)
+        return response.json(0)
+
+    def title_del(self, request_dict, response):
+        title_id = request_dict.get('id', None)
+        if not title_id:
+            return response.json(10, 'id不存在')
+        SurveysTitle.objects.filter(id=title_id).delete()
+        return response.json(0)
+
+    def cloud_surveys_answer_page(self, 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 = CloudVodSurveysAnswer.objects.all()
+            total = request_qs.count()
+            answer_page = request_qs.filter().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):
+                    return response.json(173)
+                d_user = d_user[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,
+                    'answer1': answer.answer_1,
+                    'answer2': answer.answer_2,
+                    'answer3': answer.answer_3,
+                    'answer4': answer.answer_4,
+                    'answer5': answer.answer_5,
+                    'answer6': answer.answer_6,
+                    'createdTime': time.strftime("%Y-%m-%d %H:%M:%S", created_time),
+                })
+            return response.json(0, {'list': result_list, 'total': total})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))

+ 82 - 35
Model/models.py

@@ -499,7 +499,7 @@ class Store_Meal(models.Model):
                                default=1, verbose_name='存储空间')
     commodity_type = models.SmallIntegerField(default=0, verbose_name='云存储套餐类型')  # 0:事件型 1:连续型
     commodity_code = models.CharField(default='', max_length=32, verbose_name='套餐规格码')
-    is_show = models.SmallIntegerField(default=0, verbose_name=u'该套餐是否隐藏 [0=否,1是]')
+    is_show = models.SmallIntegerField(default=0, verbose_name=u'是否隐藏 [0=否,1是]')
     # lang = models.CharField(default='', max_length=20, verbose_name='语言/国家')
     lang = models.ManyToManyField(to='Lang', verbose_name='套餐语言', db_table='store_meal_lang')
     cycle_config_id = models.IntegerField(null=True, verbose_name='周期付款配置表id')
@@ -519,25 +519,18 @@ class Store_Meal(models.Model):
 
 class AiStoreMeal(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增ID')
-    title = models.CharField(blank=True, max_length=32, verbose_name=u'标题')
-    currency = models.CharField(blank=True, default='$', max_length=32, verbose_name=u'货币符号')
-    symbol = models.CharField(blank=True, default='$', max_length=32, verbose_name=u'符号')
     price = models.CharField(blank=True, max_length=32, verbose_name=u'价格')
     virtual_price = models.CharField(blank=True, max_length=32, verbose_name=u'虚拟价格')
-    is_discounts = models.SmallIntegerField(default=0, verbose_name=u'该套餐是否有优惠 [0=否,1是]')   # 0没有;1有
+    symbol = models.CharField(blank=True, default='$', max_length=32, verbose_name=u'符号')
+    currency = models.CharField(blank=True, default='$', max_length=32, verbose_name=u'货币符号')
+    is_show = models.SmallIntegerField(default=0, verbose_name=u'是否显示')  # 0: 否, 1: 是
+    is_discounts = models.SmallIntegerField(default=0, verbose_name=u'是否有优惠')   # 0: 没有, 1: 有
     discount_price = models.CharField(blank=True, max_length=32, verbose_name=u'第二年优惠价格')
-    effective_day = models.IntegerField(default=0, blank=True, verbose_name=u'有效天数')   # 7,30,180,360
-    content = models.TextField(blank=True, null=True, verbose_name=u'描述')
-    add_time = models.DateTimeField(blank=True, null=True, verbose_name=u'加入时间', auto_now_add=True)
-    # type = models.SmallIntegerField(default=0, verbose_name='付款类型')  # 0是paypal,1为支付宝
+    effective_day = models.IntegerField(default=0, blank=True, verbose_name=u'有效天数')   # 7, 30
     pay_type = models.ManyToManyField(to='Pay_Type', verbose_name='付款类型', db_table='ai_store_meal_pay')
+    lang = models.ManyToManyField(to='Lang', verbose_name='套餐语言', db_table='ai_store_meal_lang')
+    add_time = models.DateTimeField(blank=True, verbose_name=u'添加时间', auto_now_add=True)
     update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True)
-    # bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE,
-    #                            default=1, verbose_name='存储空间')
-    # commodity_type = models.SmallIntegerField(default=0, verbose_name='套餐类型')  # 1:人形 2:动物 3:汽车
-    is_show = models.SmallIntegerField(default=0, verbose_name=u'该套餐是否隐藏 [0=否,1是]')
-    lang = models.CharField(default='', max_length=20, verbose_name='语言/国家')
-    # cycle_config_id = models.IntegerField(null=True, verbose_name='周期付款配置表id')
 
     def __str__(self):
         return self.id
@@ -1615,19 +1608,6 @@ class OrderTaskModel(models.Model):
         verbose_name_plural = verbose_name
 
 
-class OrderUIDModel(models.Model):
-    id = models.AutoField(primary_key=True)
-    uid = models.ForeignKey(UIDModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联uid表')
-    order = models.ForeignKey(OrderTaskModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联订单任务表')
-    add_time = models.IntegerField(default=0, verbose_name='添加时间')
-    update_time = models.IntegerField(default=0, verbose_name='更新时间')
-
-    class Meta:
-        db_table = 'order_uid'
-        verbose_name = '订单与uid关联表'
-        verbose_name_plural = verbose_name
-
-
 class CountryModel(models.Model):
     id = models.AutoField(primary_key=True)
     number = models.IntegerField(unique=True, verbose_name='区号')
@@ -1818,6 +1798,19 @@ class PctestdeviceModel(models.Model):
         ordering = ('id',)
 
 
+class OrderUIDModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    uid = models.ForeignKey(UIDModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联uid表')
+    order = models.ForeignKey(OrderTaskModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联订单任务表')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+    update_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'order_uid'
+        verbose_name = '订单与uid关联表'
+        verbose_name_plural = verbose_name
+
+
 class PctestfunctionModel(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
     functionname = models.CharField(blank=True, max_length=32, verbose_name=u'职能名字')
@@ -1936,7 +1929,7 @@ class AiService(models.Model):
     uid = models.CharField(max_length=20, verbose_name='设备UID', db_index=True)
     channel = models.SmallIntegerField(default=0, verbose_name='通道')
     orders = models.ForeignKey(Order_Model, to_field='orderID', default='', on_delete=models.CASCADE, verbose_name='关联订单表')
-    detect_status = models.SmallIntegerField(default=0, verbose_name='状态[0:开启,1:关闭]')
+    detect_status = models.SmallIntegerField(default=0, verbose_name='状态[0:关闭,1:开启]')
     endTime = models.BigIntegerField(verbose_name='套餐结束时间', db_index=True, default=0)
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     updTime = models.BigIntegerField(verbose_name='更新时间', default=0)
@@ -1951,18 +1944,19 @@ class AiService(models.Model):
         verbose_name_plural = verbose_name
         ordering = ('id',)
 
+
 class AiProcessTime(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
     msg_id = models.CharField(max_length=50, verbose_name='消息id', default=0)
-    detectTime  = models.BigIntegerField(verbose_name='设备侦测时间', default=0)
-    receiveTime  = models.BigIntegerField(verbose_name='接口调用时间', default=0)
+    detectTime = models.BigIntegerField(verbose_name='设备侦测时间', default=0)
+    receiveTime = models.BigIntegerField(verbose_name='接口调用时间', default=0)
     aiTime = models.BigIntegerField(verbose_name='ai识别上传开始时间', default=0)
     aiEndTime = models.BigIntegerField(verbose_name='ai识别结束时间', default=0)
-    pushTime  = models.BigIntegerField(verbose_name='推送开始时间', default=0)
-    pushEndTime  = models.BigIntegerField(verbose_name='推送结束时间', default=0)
+    pushTime = models.BigIntegerField(verbose_name='推送开始时间', default=0)
+    pushEndTime = models.BigIntegerField(verbose_name='推送结束时间', default=0)
     picUploadTime = models.BigIntegerField(verbose_name='图片上传开始时间', default=0)
     picUploadEndTime = models.BigIntegerField(verbose_name='图片上传结束结束时间', default=0)
-    serverCountTime  = models.BigIntegerField(verbose_name='服务器总花时间', default=0)
+    serverCountTime = models.BigIntegerField(verbose_name='服务器总花时间', default=0)
     appPushTime = models.IntegerField(verbose_name='添加时间', default=0)
     endTime = models.IntegerField(verbose_name='接口结束时间', default=0)
 
@@ -1970,4 +1964,57 @@ class AiProcessTime(models.Model):
         db_table = 'ai_process_time'
         verbose_name = 'ai设备服务表'
         verbose_name_plural = verbose_name
-        ordering = ('id',)
+        ordering = ('id',)
+
+
+class Surveys(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
+    no = models.CharField(max_length=10, unique=True, verbose_name='编号', default=0)
+    user_type = models.SmallIntegerField(default=0, verbose_name='调查用户对象[1:云存储用户,2:AI用户,3:所有APP用户]')
+    start_time = models.IntegerField(default=0, verbose_name='开始显示时间')
+    end_time = models.IntegerField(default=0, verbose_name='显示结束时间')
+    is_show = models.SmallIntegerField(default=0, verbose_name='是否显示[0:隐藏,1:显示]')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+
+    class Meta:
+        db_table = 'surveys'
+        verbose_name = '问卷调查—问卷调查表'
+        verbose_name_plural = verbose_name
+        ordering = ('id',)
+
+
+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')
+    title_content = models.TextField(blank=True, verbose_name='题目内容', default=0)
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+
+    class Meta:
+        db_table = 'surveys_title'
+        verbose_name = '问卷调查—题目表'
+        verbose_name_plural = verbose_name
+        ordering = ('id',)
+
+
+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')
+    user = models.ForeignKey(Device_User, to_field='userID', default='', on_delete=models.CASCADE,
+                             verbose_name='关联用户表ID')
+    answer_1 = models.IntegerField(verbose_name='答案1 (分数)', default='')
+    answer_2 = models.CharField(max_length=500, blank=True, verbose_name='答案2', default='')
+    answer_3 = models.CharField(max_length=500, blank=True, verbose_name='答案3', default='')
+    answer_4 = models.CharField(max_length=500, blank=True, verbose_name='答案4', default='')
+    answer_5 = models.CharField(max_length=500, blank=True, verbose_name='答案5', default='')
+    answer_6 = models.CharField(max_length=500, blank=True, verbose_name='答案6', default='')
+    answer_7 = models.CharField(max_length=500, blank=True, verbose_name='答案6', default='')
+    answer_8 = models.CharField(max_length=500, blank=True, verbose_name='答案6', default='')
+    ip = models.CharField(max_length=32, default='', db_index=True, blank=True, verbose_name=u'访问ip地址')
+    country_name = models.CharField(max_length=20, default='', verbose_name='国家名')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+
+    class Meta:
+        db_table = 'cloud_vod_surveys_answer'
+        verbose_name = '云存问卷调查—答案表'
+        verbose_name_plural = verbose_name
+        ordering = ('id',)

+ 4 - 0
Object/uidManageResponseObject.py

@@ -48,6 +48,8 @@ class uidManageResponseObject(object):
             374: '没有相应的地区',
             375: 'uid不足',
             376: 'uid数据有误',
+            377: 'uid已使用',
+            378: '更新序列号状态失败',
             404: '没有访问权限!',
             444: '请确认参数的正确性!',
             1112: '您输入的两次密码不一致!',
@@ -95,6 +97,8 @@ class uidManageResponseObject(object):
             374: 'Region does not exist',
             375: 'Insufficient uid',
             376: 'wrong uid data',
+            377: 'uid used',
+            378: 'Failed to update serial number status',
             404: 'You don not have permission to access this!',
             444: 'Please confirm the correctness of the parameters!',
             1112: 'The two passwords you entered do not match!',