Browse Source

Merge branch 'dev' into lang

lang 4 years ago
parent
commit
c32d968236

+ 12 - 1
Ansjer/urls.py

@@ -10,7 +10,9 @@ from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppIn
     StsOssController, UIDPreview, OssCrd, SysMsg, UidUser, EquipmentManagerV2, EquipmentManagerV3, PushDeploy, \
     AppSetController, \
     ApplicationController, UserExController, CloudStorage, TestApi, UserBrandControllerV2, \
-    StatisticsController, Alexa, FAQController, AppLogController, EquipmentVersionLimit
+    StatisticsController, Alexa, FAQController, AppLogController, EquipmentVersionLimit, VoicePromptController, CDKController, \
+    DeviceTypeController
+
 
 urlpatterns = [
     url(r'^testApi/(?P<operation>.*)$', TestApi.testView.as_view()),
@@ -242,6 +244,15 @@ urlpatterns = [
 
     # 订阅邮件
     url(r'^account/subscribe$', UserController.SubscribeEmailView.as_view()),
+    url(r'^account/subscribe/download$', UserController.SubscribeEmailView.as_view()),
+
+    # 语音提示
+    url(r'^voicePrompt/(?P<operation>.*)$', VoicePromptController.VoicePromptView.as_view()),
+    # 设备类型
+    url(r'^deviceType/(?P<operation>.*)$', DeviceTypeController.DeviceTypeView.as_view()),
+
+    # cdk(激活码)
+    url(r'^cdk/(?P<operation>.*)$', CDKController.CDKView.as_view()),
 
     # app 设备消息模板
     # 路由加参数参考

+ 29 - 0
Controller/AdminManage.py

@@ -3,11 +3,15 @@ import time
 from datetime import date, timedelta, timezone as asj_timezone
 
 import boto3
+import xlwt
 from django.db.models import Count,Q
+from django.http import HttpResponse
 from django.views.decorators.csrf import csrf_exempt
 from django.views.generic import TemplateView
 from django.utils.decorators import method_decorator
 from django.contrib.auth.hashers import make_password  # 对密码加密模块
+from openpyxl import workbook
+
 from Model.models import Device_Info, Role, UserExModel, User_Brand, UidSetModel, AppFrequencyYearStatisticsModel, \
     AppFrequencyStatisticsModel, EquipmentInfoExStatisticsModel, Equipment_Info
 from Service.ModelService import ModelService
@@ -87,6 +91,8 @@ class AdminManage(TemplateView):
             return self.query_failures_push(userID, request_dict, response)
         if operation == 'getPushServerCPUUsage':
             return self.query_push_server_cpu_usage(userID, request_dict, response)
+        if operation == 'downloadSubscribeEmail':
+            return self.download_subscribe_email(userID, request_dict, response)
 
     def resetUserPwd(self, request_dict, userID, response):
         own_permission = ModelService.check_perm(userID=userID, permID=50)
@@ -633,6 +639,29 @@ class AdminManage(TemplateView):
             print(repr(e))
             return response.json(10, 'AWS Server Error')
 
+    def download_subscribe_email(self, userID, request_dict, response):
+        own_permission = ModelService.check_perm(userID=userID, permID=30)
+        if own_permission is not True:
+            return response.json(404)
+
+        user_qs = Device_User.objects.filter(subscribe_email=1).values('userEmail')
+        print(user_qs)
+        response = HttpResponse(content_type='application/vnd.ms-excel')
+        response['Content-Disposition'] = 'attachment; filename=Email' + time.strftime('-%Y-%m-%d-%H-%M-%S', time.localtime()) + '.xls'
+        workbook = xlwt.Workbook(encoding='utf-8')
+        sheet1 = workbook.add_sheet('Email Address')
+
+        num = 1
+        sheet1.write(0, 0, 'Email Address')
+        for user in user_qs:
+            email = user['userEmail']
+            if email == '':
+                continue
+            sheet1.write(num, 0, email)
+            num += 1
+        workbook.save(response)
+        return response
+
 
 def getCompareKey(item):
     return item['Timestamp']

+ 242 - 0
Controller/CDKController.py

@@ -0,0 +1,242 @@
+#!/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: 2018/12/5 9:30
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: cloudstorage.py
+@Contact: chanjunkai@163.com
+"""
+import json
+import time
+import urllib
+import uuid
+import hashlib
+
+import boto3
+import oss2
+import paypalrestsdk
+import threading
+from aliyunsdkcore import client
+from aliyunsdksts.request.v20150401 import AssumeRoleRequest
+from boto3.session import Session
+from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
+from django.views.generic.base import View
+
+from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
+    SERVER_DOMAIN_SSL
+from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel, \
+    ExperienceContextModel, CDKcontextModel
+from Object.AliPayObject import AliPayObject
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+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
+from django.http import StreamingHttpResponse
+
+SERVER_DOMAIN = 'http://test.dvema.com/'
+
+
+# 设备信息添加
+class CDKView(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.GET, request, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.POST, request, operation)
+
+    def validation(self, request_dict, request, operation):
+        response = ResponseObject()
+
+        if operation is None:
+            return response.json(444, 'error path')
+        else:
+            token = request_dict.get('token', None)
+            # 设备主键uid
+            tko = TokenObject(token)
+            response.lang = tko.lang
+            if tko.code != 0:
+                return response.json(tko.code)
+            userID = tko.userID
+            if operation == 'createCDK':
+                return self.createCDK(request_dict, response)
+            elif operation == 'deleteCDK':
+                return self.deleteCDK(request_dict, response)
+            elif operation == 'queryCDK':
+                return self.queryCDK(request_dict, response)
+            elif operation == 'saveOrEditCDKform':
+                return self.saveOrEditCDKform(request_dict, response)
+            elif operation == 'saveOrEditCDK':
+                return self.saveOrEditCDK(request_dict, response)
+            elif operation == 'downloadCDK':
+                return self.downloadCDK(response)
+
+    def createCDK(self, request_dict, response):
+        cdk_num = request_dict.get("cdknum", None)
+        rank = request_dict.get('rank', None)
+        order = request_dict.get('order', None)
+        cdk_list = []
+        for i in range(int(cdk_num)):
+            nowTime = int(time.time())
+            cdk = hashlib.md5((str(uuid.uuid1()) + str(nowTime)).encode('utf-8')).hexdigest()
+            cdk_model = CDKcontextModel(
+                cdk=cdk,
+                create_time=nowTime,
+                valid_time=0,
+                is_activate=0,
+                rank_id=rank,
+                order=order,
+            )
+            cdk_list.append(cdk_model)
+        try:
+            CDKcontextModel.objects.bulk_create(cdk_list)
+        except Exception as e:
+            print(repr(e))
+            return response.json(404, repr(e))
+        else:
+            return response.json(0)
+
+    def queryCDK(self, request_dict, response):
+        page = int(request_dict.get('page', None))
+        line = int(request_dict.get('line', None))
+        # channel = request_dict.get('channel', None)
+        cdk = request_dict.get('cdk', None)
+        order = request_dict.get('order', None)
+        is_activate = request_dict.get('is_activate', None)
+
+        searchVal = ''
+        if cdk:
+            searchVal = cdk.strip()
+        elif order:
+            searchVal = order.strip()
+        elif is_activate:
+            searchVal = is_activate.strip()
+
+        if page and line:
+            cdk_qs = CDKcontextModel.objects.filter().all()  # values('cdk','create_time','valid_time','is_activate','rank__id','order__id')
+            if searchVal:
+                if cdk:
+                    cdk_qs = cdk_qs.filter(cdk__contains=searchVal)
+                elif order:
+                    cdk_qs = cdk_qs.filter(order=searchVal)
+                elif is_activate:
+                    cdk_qs = cdk_qs.filter(is_activate=searchVal)
+            cdk_qs = cdk_qs.values('id', 'cdk', 'create_time', 'valid_time', 'is_activate', 'rank__id', 'rank__title', 'order',
+                                   'create_time')
+            cdk_qs = cdk_qs.order_by('-create_time')  # 根据CDK创建时间降序排序
+            count = cdk_qs.count()
+            cdk_qs = cdk_qs[(page - 1) * line:page * line]
+
+            # cdk_dict = {}
+            # for cdk in cdk_qs:
+            #     cdk_dict[cdk['id']] = {'id': cdk['id'], 'cdk': cdk['cdk'], 'create_time': cdk['create_time'],
+            #                            'valid_time': cdk['valid_time'], 'is_activate': cdk['is_activate'],
+            #                            'rank': cdk['rank__id'], 'order': cdk['order']}
+
+            res = {
+                'datas': list(cdk_qs),
+                'count': count
+            }
+            return response.json(0, res)
+        else:
+            return response.json(444, 'page,line')
+
+    def deleteCDK(self, request_dict, response):
+        cdk_id = request_dict.get("id", None)
+        try:
+            CDKcontextModel.objects.get(cdk=cdk_id).delete()
+        except Exception as e:
+            return response.json(500, repr(e))
+        else:
+            page = int(request_dict.get('page', None))
+            line = int(request_dict.get('line', None))
+            # channel = request_dict.get('channel', None)
+            cdk = request_dict.get('cdk', None)
+            order = request_dict.get('order', None)
+            is_activate = request_dict.get('is_activate', None)
+
+            searchVal = ''
+            if cdk:
+                searchVal = cdk.strip()
+            elif order:
+                searchVal = order.strip()
+            elif is_activate:
+                searchVal = is_activate.strip()
+
+            if page and line:
+                cdk_qs = CDKcontextModel.objects.filter().all()  # values('cdk','create_time','valid_time','is_activate','rank__id','order__id')
+                if searchVal:
+                    if cdk:
+                        cdk_qs = cdk_qs.filter(cdk__contains=searchVal)
+                    elif order:
+                        cdk_qs = cdk_qs.filter(order=searchVal)
+                    elif is_activate:
+                        cdk_qs = cdk_qs.filter(is_activate=searchVal)
+                cdk_qs = cdk_qs.values('id', 'cdk', 'create_time', 'valid_time', 'is_activate', 'rank__id',
+                                       'rank__title', 'order',
+                                       'create_time')
+                cdk_qs = cdk_qs.order_by('-create_time')  # 根据CDK创建时间降序排序
+                count = cdk_qs.count()
+                cdk_qs = cdk_qs[(page - 1) * line:page * line]
+                res = {
+                    'datas': list(cdk_qs),
+                    'count': count
+                }
+                return response.json(0, res)
+
+
+
+    def saveOrEditCDK(self, request_dict, response):
+        cdk_id = request_dict.get("id", None)
+        cdk = request_dict.get('cdk', None)
+        valid_time = request_dict.get('valid_time', None)
+        is_activate = request_dict.get('is_activate', None)
+        rank = request_dict.get('rank', None)
+
+        try:
+            if cdk_id:
+                if cdk or valid_time or is_activate or rank:
+                    update_dict = {}
+                    if cdk:
+                        update_dict['cdk'] = cdk
+                    if valid_time:
+                        update_dict['valid_time'] = valid_time
+                    if is_activate:
+                        update_dict['is_activate'] = is_activate
+                    if rank:
+                        update_dict['rank'] = rank
+                    CDKcontextModel.objects.filter(id=cdk_id).update(**update_dict)
+        except Exception as e:
+            return response.json(500, repr(e))
+        else:
+            return response.json(0)
+
+    def downloadCDK(self, response):
+        content = ''
+        cdk_inactivate_qs = CDKcontextModel.objects.filter(is_activate=0).values('cdk')
+        content += '激活码\n'
+        for cdk_inactivate in cdk_inactivate_qs:
+            content += cdk_inactivate['cdk'] + '\n'
+        print(content)
+
+        response = StreamingHttpResponse(content)
+        response['Content-Type'] = 'application/octet-stream'
+        response['Content-Disposition'] = 'attachment;filename="CDK.txt"'
+        return response
+
+
+
+
+

+ 26 - 9
Controller/CloudStorage.py

@@ -29,7 +29,8 @@ from django.views.generic.base import View
 
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
     SERVER_DOMAIN_SSL
-from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel, ExperienceContextModel, Pay_Type
+from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel, \
+    ExperienceContextModel, Pay_Type, CDKcontextModel
 from Object.AliPayObject import AliPayObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
@@ -1098,13 +1099,23 @@ class CloudStorageView(View):
         commodity_code = request_dict.get('commodity_code', None)
         pay_type = int(request_dict.get('pay_type', None))
         rank = request_dict.get('rank', None)
+        cdk = request_dict.get('cdk', None)
+
+        if cdk != None and pay_type == 11:
+            cdk_qs = CDKcontextModel.objects.filter(cdk=cdk).values('is_activate', 'rank__id', 'rank__commodity_code')
+            if not cdk_qs.exists():
+                return response.json(10, '无效激活码')
+            if cdk_qs[0]['is_activate'] == 1:
+                return response.json(10, '激活码已被使用过')
+            rank = cdk_qs[0]['rank__id']
+            commodity_code = cdk_qs[0]['rank__commodity_code']
 
         if uid == None or channel == None or commodity_code == None or pay_type == None or rank == None:
             return response.json(13, '参数有误.')
         dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False, isExist=1)
         if not dv_qs.exists():
             return response.json(12)
-        smqs = Store_Meal.objects.filter(commodity_code=commodity_code, type=pay_type). \
+        smqs = Store_Meal.objects.filter(commodity_code=commodity_code, pay_type=pay_type). \
             values('currency', 'price', 'content', 'day', 'commodity_type', 'title', 'content')
         if not smqs.exists():
             return response.json(10, '套餐不存在')
@@ -1161,13 +1172,19 @@ class CloudStorageView(View):
         order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
 
         # return response.json(0)
-
-        ExperienceContextModel.objects.create(
-            experience_type=0,
-            uid=uid,
-            do_time=nowTime
-
-        )
+        if pay_type == 10:
+            ExperienceContextModel.objects.create(
+                experience_type=0,
+                uid=uid,
+                do_time=nowTime
+
+            )
+
+        if pay_type== 11:
+            update_dict = {}
+            update_dict['is_activate'] = 1
+            update_dict['order'] = orderID
+            CDKcontextModel.objects.filter(cdk=cdk).update(**update_dict)
 
         result = "{SERVER_DOMAIN}cloudstorage/payOK".format(SERVER_DOMAIN=SERVER_DOMAIN)
         return response.json(0, result)

+ 95 - 0
Controller/DeviceTypeController.py

@@ -0,0 +1,95 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import oss2
+from django.views import View
+
+from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET
+from Model.models import DeviceTypeModel
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Service.ModelService import ModelService
+
+
+class DeviceTypeView(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        operation = kwargs.get('operation', None)
+        return self.validate(request_dict, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        operation = kwargs.get('operation', None)
+        return self.validate(request_dict, operation)
+
+    def validate(self, request_dict, operation):
+        token = request_dict.get('token', None)
+        lang = request_dict.get('lang', None)
+
+        response = ResponseObject(lang=lang)
+        token = TokenObject(token)
+        if token.code != 0:
+            return response.json(token.code)
+
+        if operation == 'add':
+            return self.do_admin_add(token.userID, request_dict, response)
+        elif operation == 'query':
+            return self.do_query(request_dict, response)
+        elif operation == 'delete':
+            return self.do_admin_delete(token.userID, request_dict, response)
+        else:
+            return response.json(404)
+
+    def do_admin_add(self, userID, request_dict, response):
+        # own_perm = ModelService.check_perm(userID, 10)
+        # if not own_perm:
+        #     return response.json(404)
+
+        name = request_dict.get('name', None)
+        model = request_dict.get('model', None)
+        type = request_dict.get('type', None)
+        ptz_type = request_dict.get('ptz_type', None)
+        icon = request_dict.get('icon', None)
+
+        if name and model and type and ptz_type and icon:
+            device_type = DeviceTypeModel()
+            device_type.name = name
+            device_type.model = model
+            device_type.type = type
+            device_type.ptz_type = ptz_type
+            device_type.icon = icon
+            device_type.save()
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def do_query(self, request_dict, response):
+        device_type_qs = DeviceTypeModel.objects.filter().values('id', 'type', 'ptz_type', 'model', 'icon', 'name')
+        res = {}
+        data = []
+        res['data'] = data
+        if device_type_qs.exists():
+            for device_type in device_type_qs:
+                auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
+                bucket = oss2.Bucket(auth, 'oss-cn-shenzhen.aliyuncs.com', 'ansjer-static-resources')
+
+                icon = device_type['icon']
+                url = 'device_type/' + icon
+                device_type['icon'] = bucket.sign_url('GET', url, 3600)
+                data.append(device_type)
+
+        return response.json(0, res)
+
+    def do_admin_delete(self, userID, request_dict, response):
+        own_perm = ModelService.check_perm(userID, 10)
+        if not own_perm:
+            return response.json(404)
+
+        id = request_dict.get('id', None)
+        if id:
+            DeviceTypeModel.objects.filter(id=id).delete()
+            return response.json(0)
+        else:
+            return response.json(444)

+ 35 - 0
Controller/FeedBack.py

@@ -56,6 +56,8 @@ class FeedBackView(View):
                 return self.do_query_by_admin(userID, request_dict, response)
             elif operation == 'deleteByAdmin':
                 return self.do_delete_by_admin(userID, request_dict, response)
+            elif operation == 'deleteImage':
+                return self.do_delete_image(userID, request_dict, response)
             else:
                 return response.json(414)
         else:
@@ -264,3 +266,36 @@ class FeedBackView(View):
                 return response.json(0)
         else:
             return response.json(404)
+
+    def do_delete_image(self, userID, request_dict, response):
+        # own_perm = ModelService.check_perm(userID, 10)
+        # if not own_perm:
+        #     return response.json(404)
+        end_time = request_dict.get('end_time', None)
+        if end_time is None:
+            return response.json(444)
+        sys_ms_qs = FeedBackModel.objects.filter(addTime__lt=end_time).order_by('id').values('id')
+        ids = []
+        for sys_ms in sys_ms_qs:
+            ids.append(sys_ms['id'])
+
+        sm_qs = StatResModel.objects.filter(feedbackmodel__id__in=ids).values('id', 'name')
+        names = []
+        time_struct = time.localtime()
+        current_year = time_struct.tm_year
+        target_year = current_year - 1
+        str_prefix = str(target_year)
+        print(str_prefix)
+        for sm in sm_qs:
+            name = sm['name']
+            if name.find(str_prefix) == 0:
+                names.append('feedback/' + name)
+
+        # auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
+        # bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
+        # bucket.batch_delete_objects(names)
+        # FeedBackModel.objects.filter(id__in=ids).delete()
+        print(names)
+        print(len(names))
+
+        return response.json(0)

+ 33 - 9
Controller/MealManage.py

@@ -18,7 +18,7 @@ from django.utils.decorators import method_decorator
 from django.views.decorators.csrf import csrf_exempt
 from django.views.generic.base import View
 
-from Model.models import Store_Meal, VodBucketModel
+from Model.models import Store_Meal, VodBucketModel, Pay_Type
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
@@ -79,7 +79,8 @@ class MealManage(View):
         day = request_dict.get('day', None)
         currency = request_dict.get('currency', None)
         bucketID = request_dict.get('bucketID', None)
-        type = request_dict.get('type', None)
+        paytype = request_dict.get('paytype', None)
+        virtual_price = request_dict.get('virtual_price', None)
         if not title or not id or not price or not day or not content:
             return response.json(444, 'title,id,price,content,day,bucketID')
         own_perm = ModelService.check_perm(userID=userID, permID=40)
@@ -90,8 +91,11 @@ class MealManage(View):
             if Store_Meal.objects.filter(id=id):
                 return response.json(10, '已存在')
             store_meal = Store_Meal(id=id, title=title, price=price, content=content, day=day, bucket_id=bucketID,
-                                    currency=currency, type=type)
+                                    currency=currency, virtual_price=virtual_price)
             store_meal.save()
+            paytype = paytype.split(',')
+            if len(paytype) > 0:
+                Store_Meal.objects.get(id=id).pay_type.set(paytype)
         except Exception:
             errorInfo = traceback.format_exc()
             print(errorInfo)
@@ -116,13 +120,26 @@ class MealManage(View):
         line = int(request_dict.get('line', None))
         if page is None or line is None:
             return response.json(444)
-        qs = Store_Meal.objects.values("id", "title", "price", "content", "day", "add_time", "update_time", "currency",
-                                       "type", "bucket_id", "bucket__bucket", "commodity_type", "commodity_code",
-                                       "bucket__storeDay")
+        qs = Store_Meal.objects.values("id", "title", "price", "content", "day", "add_time", "update_time", "currency"
+                                       , "bucket_id", "bucket__bucket", "bucket__area", "commodity_type", "commodity_code",
+                                       "bucket__storeDay", "virtual_price")
         res = {}
         if qs.exists():
-            res['count'] = qs.count()
-            res['data'] = CommonService.qs_to_list(qs[(page - 1) * line:page * line])
+            ql = list(qs)
+            from operator import itemgetter
+            from itertools import groupby
+            ql.sort(key=itemgetter('bucket__area'))
+            ql=CommonService.qs_to_list(ql[(page - 1) * line:page * line])
+            for area, items in groupby(ql, key=itemgetter('bucket__area')):
+                items_list = list(items)
+                for key, val in enumerate(items_list):
+                    pay_types = Pay_Type.objects.filter(store_meal=items_list[key]['id']).values("id", "payment")
+                    items_list[key]['pay_type'] = list(pay_types)
+
+
+                res['count'] = len(ql)
+                res['data'] = items_list
+
         return response.json(0, res)
 
     def update(self, request_dict, userID, response):
@@ -135,6 +152,7 @@ class MealManage(View):
         bucketID = request_dict.get('bucketID', None)
         commodity_type = request_dict.get('commodity_type', None)
         commodity_code = request_dict.get('commodity_code', None)
+        virtual_price = request_dict.get('virtual_price', None)
         type = request_dict.get('type', None)
         if not id or not title or not price or not content or not day or not type:
             return response.json(444, 'id, title, price, content, day,type')
@@ -150,13 +168,19 @@ class MealManage(View):
             store_meal.content = content
             store_meal.commodity_type = commodity_type
             store_meal.commodity_code = commodity_code
+            store_meal.virtual_price = virtual_price
             store_meal.day = day
-            store_meal.type = type
             if bucketID:
                 store_meal.bucket_id = bucketID
             if currency:
                 store_meal.currency = currency
             store_meal.save()
+            type = type.split(',')
+            if len(type) > 0:
+                Store_Meal.objects.get(id=id).pay_type.set(type)
+            else:
+                Store_Meal.objects.get(id=id).pay_type.clear()
+
         except Exception:
             errorInfo = traceback.format_exc()
             print(errorInfo)

+ 0 - 1
Controller/SysMsg.py

@@ -250,5 +250,4 @@ class SysMsgView(View):
                 return response.json(173)
         else:
             return response.json(444, 'sid')
-
 # 回复记录

+ 67 - 0
Controller/UidSetController.py

@@ -87,6 +87,8 @@ class UidSetView(View):
             return self.do_update_set(request, request_dict, response)
         elif operation == 'updateChannel':
             return self.do_update_channel_set(request_dict, response)
+        elif operation == 'setVoicePrompt':
+            return self.do_set_voice(userID, request_dict, response)
         # elif operation == 'test':
         #     return self.do_test(response)
         else:
@@ -410,6 +412,71 @@ class UidSetView(View):
         else:
             return response.json(0)
 
+    def do_set_voice(self, userID, request_dict, response):
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+        enter_voice = request_dict.get('enter_voice', None)
+        leave_voice = request_dict.get('leave_voice', None)
+        voice_status = request_dict.get('voice_status', None)
+        intelligent_mute = request_dict.get('intelligent_mute', None)
+        start_x = request_dict.get('start_x', None)
+        start_y = request_dict.get('start_y', None)
+        end_x = request_dict.get('end_x', None)
+        end_y = request_dict.get('end_y', None)
+        start_time = request_dict.get('start_time', None)
+        end_time = request_dict.get('end_time', None)
+
+        if uid and channel:
+            channel = int(channel)
+            if channel < 1:
+                return response.json(444, 'channel')
+            try:
+                ucs = {}
+                if enter_voice:
+                    ucs['voice_prompt_enter'] = enter_voice
+
+                if leave_voice:
+                    ucs['voice_prompt_leave'] = leave_voice
+
+                if voice_status:
+                    ucs['voice_prompt_status'] = voice_status
+
+                if intelligent_mute:
+                    ucs['voice_prompt_intelligent_mute'] = intelligent_mute
+
+                if start_x:
+                    ucs['voice_start_x'] = start_x
+
+                if start_y:
+                    ucs['voice_start_y'] = start_y
+
+                if end_x:
+                    ucs['voice_end_x'] = end_x
+
+                if end_y:
+                    ucs['voice_end_y'] = end_y
+
+                if start_time:
+                    ucs['voice_start_time'] = start_time
+
+                if end_time:
+                    ucs['voice_end_time'] = end_time
+
+                uid_channel_set_qs = UidChannelSetModel.objects.filter(uid__uid=uid, channel=channel)
+                if not uid_channel_set_qs.exists():
+                    uidObject = UidSetModel.objects.filter(uid=uid)
+                    ucs['channel'] = channel
+                    ucs['uid'] = uidObject[0]
+                    UidChannelSetModel.objects.create(**ucs)
+                else:
+                    uid_channel_set_qs.update(**ucs)
+
+            except Exception as e:
+                return response.json(177, repr(e))
+            else:
+                return response.json(0)
+
+
     # def do_test(self, response):
     #     di_qs = Device_Info.objects.values('Type').annotate(c=Count('UID', distinct=True)).order_by()
     #     for di in di_qs:

+ 223 - 0
Controller/VoicePromptController.py

@@ -0,0 +1,223 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import time
+
+import oss2
+from django.views import View
+
+from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET
+from Model.models import VoicePromptModel, UidChannelSetModel, Device_Info
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
+from Service.ModelService import ModelService
+
+
+class VoicePromptView(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        operation = kwargs.get('operation', None)
+        return self.validate(request_dict, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        operation = kwargs.get('operation', None)
+        return self.validate(request_dict, operation)
+
+    def validate(self, request_dict, operation):
+        token = request_dict.get('token', None)
+        lang = request_dict.get('lang', None)
+        response = ResponseObject(lang=lang)
+
+        token = TokenObject(token)
+        if token.code != 0:
+            return response.json(token.code)
+
+        if operation == 'getUploadUrl':
+            return self.get_upload_url(request_dict, response)
+        elif operation == 'add':
+            return self.do_add(request_dict, response)
+        elif operation == 'delete':
+            return self.do_delete(token.userID, request_dict, response)
+        elif operation == 'query':
+            return self.do_query(request_dict, response)
+        elif operation == 'adminAdd':
+            return self.do_admin_add(request_dict, response)
+        else:
+            return response.json(404)
+
+    def get_upload_url(self, request_dict, response):
+        upload_type = request_dict.get('upload_type', None)
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+
+        if upload_type and uid and channel:
+            count = VoicePromptModel.objects.filter(uid=uid, channel=channel).count()
+            if count >= 3:
+                return response.json(201)
+
+            auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
+            bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
+            name = CommonService.createOrderID()
+            filename = str(name) + '.' + upload_type
+            obj = 'voice_prompt/{uid}/{channel}/'.format(uid=uid, channel=channel) + filename
+
+            url = bucket.sign_url('PUT', obj, 7200)
+            return response.json(0, {'put_url': url, 'filename': filename})
+        else:
+            return response.json(444)
+
+    def do_add(self, request_dict, response):
+        filename = request_dict.get('filename', None)
+        title = request_dict.get('title', None)
+        type = request_dict.get('type', None)
+        lang = request_dict.get('lang', '')
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+
+        if filename and title and type and uid and channel:
+            voice_prompt = VoicePromptModel()
+            voice_prompt.filename = filename
+            voice_prompt.title = title
+            voice_prompt.type = type
+            voice_prompt.language = lang
+            voice_prompt.classification = 1
+            voice_prompt.uid = uid
+            voice_prompt.channel = channel
+            voice_prompt.add_time = int(time.time())
+            voice_prompt.save()
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def do_delete(self, userID, request_dict, response):
+        id = request_dict.get('id', None)
+        if id:
+            voice_qs = VoicePromptModel.objects.filter(id=id)
+            if voice_qs.exists():
+                uid = voice_qs[0].uid
+                device_qs = Device_Info.objects.filter(UID=uid, userID=userID)
+                if device_qs.exists():
+                    voice_qs.delete()
+                    auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
+                    bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
+                    obj = 'voice_prompt/{uid}/{channel}/'.format(uid=uid, channel=voice_qs[0].channel) + voice_qs[0].filename
+                    bucket.delete_object(obj)
+                    return response.json(0)
+                else:
+                    return response.json(404)
+        else:
+            return response.json(444)
+
+    def do_query(self, request_dict, response):
+        lang = request_dict.get('lang', None)
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+
+        if uid and channel and lang:
+            voice_qs = VoicePromptModel.objects.filter(uid=uid, channel=channel, classification=1)
+            system_qs = VoicePromptModel.objects.filter(classification=0, language=lang)
+            channel_qs = UidChannelSetModel.objects.filter(uid__uid=uid, channel=channel)
+
+            res = {
+                'enter_voice': {},
+                'leave_voice': {},
+                'voice_status': 0,
+                'voice_mute': 0
+            }
+            if channel_qs.exists():
+                channel_qs = channel_qs.values('voice_prompt_enter', 'voice_prompt_leave', 'voice_prompt_status',
+                                               'voice_prompt_intelligent_mute', 'voice_start_x', 'voice_start_y',
+                                               'voice_end_x', 'voice_end_y', 'voice_start_time', 'voice_end_time')
+                print(channel_qs)
+                res['enter_voice'] = channel_qs[0]['voice_prompt_enter']
+                res['leave_voice'] = channel_qs[0]['voice_prompt_leave']
+                res['voice_status'] = channel_qs[0]['voice_prompt_status']
+                res['voice_mute'] = channel_qs[0]['voice_prompt_intelligent_mute']
+                res['start_x'] = channel_qs[0]['voice_start_x']
+                res['start_y'] = channel_qs[0]['voice_start_y']
+                res['end_x'] = channel_qs[0]['voice_end_x']
+                res['end_y'] = channel_qs[0]['voice_end_y']
+                res['start_time'] = channel_qs[0]['voice_start_time']
+                res['end_time'] = channel_qs[0]['voice_end_time']
+
+            enter_systems = []
+            leave_systems = []
+            enter_customs = []
+            leave_customs = []
+
+            res['system'] = {}
+            res['custom'] = {}
+            auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
+            bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
+            if system_qs.exists():
+                system_qs = system_qs.values('id', 'title', 'filename', 'type')
+                for system in system_qs:
+                    filename = system['filename']
+                    obj = 'voice_prompt/' + uid + '/' + channel + '/' + filename
+                    url = bucket.sign_url('GET', obj, 3600)
+                    system['url'] = url
+                    del system['filename']
+                    if system['type'] == 1:
+                        enter_systems.append(system)
+                        if res['enter_voice'] == system['id']:
+                            res['enter_voice'] = system
+
+                    elif system['type'] == 2:
+                        leave_systems.append(system)
+                        if res['leave_voice'] == system['id']:
+                            res['leave_voice'] = system
+
+            if voice_qs.exists():
+                voice_qs = voice_qs.values('id', 'title', 'filename', 'type')
+
+                for voice in voice_qs:
+                    filename = voice['filename']
+                    obj = 'voice_prompt/' + uid + '/' + channel + '/' + filename
+                    url = bucket.sign_url('GET', obj, 3600)
+                    voice['url'] = url
+                    del voice['filename']
+                    if voice['type'] == 1:
+                        enter_customs.append(voice)
+                        if res['enter_voice'] == voice['id']:
+                            res['enter_voice'] = voice
+                    elif voice['type'] == 2:
+                        leave_customs.append(voice)
+                        if res['leave_voice'] == voice['id']:
+                            res['leave_voice'] = voice
+
+            res['system']['enter'] = enter_systems
+            res['system']['leave'] = leave_systems
+            res['custom']['enter'] = enter_customs
+            res['custom']['leave'] = leave_customs
+
+            return response.json(0, res)
+
+        else:
+            return response.json(444)
+
+    def do_admin_add(self, request_dict, response):
+        filename = request_dict.get('filename', None)
+        title = request_dict.get('title', None)
+        type = request_dict.get('type', None)
+        lang = request_dict.get('lang', '')
+
+        # own_perm = ModelService.check_perm(userID, 10)
+        # if not own_perm:
+        #     return response.json(404)
+
+        if filename and title and type:
+            voice_prompt = VoicePromptModel()
+            voice_prompt.filename = filename
+            voice_prompt.title = title
+            voice_prompt.type = type
+            voice_prompt.language = lang
+            voice_prompt.classification = 0
+            voice_prompt.add_time = int(time.time())
+            voice_prompt.save()
+            return response.json(0)
+        else:
+            return response.json(444)

+ 64 - 2
Model/models.py

@@ -148,8 +148,8 @@ class Device_User(AbstractBaseUser):
     phone = models.CharField(max_length=16, verbose_name=u'手机号', default='', blank=True)
     fingerprint_enable = models.SmallIntegerField(default=0, verbose_name=u'是否开启了指纹登录') # 0:未开启,1:已开启
     fingerprint_key = models.CharField(max_length=128, default='', verbose_name=u'客户端用于解码的密钥等信息')
-    is_local = models.BooleanField(blank=True, default=False, verbose_name=u'是否是本地登录用户')
-    subscribe_email = models.SmallIntegerField(default=0, verbose_name=u'是否订阅营销邮件')  # 0:未订阅,1:订阅,2:不订阅
+    is_local = models.BooleanField(blank=True, default=False, verbose_name=u'是否是本地登录用户') # False:账号登录,1:本地登录
+    subscribe_email = models.SmallIntegerField(default=0, verbose_name=u'是否订阅营销邮件') # 0:未订阅,1:订阅,2:不订阅
     objects = UserManager()
 
     USERNAME_FIELD = 'userID'  # 必须有一个唯一标识
@@ -710,6 +710,7 @@ class UidSetModel(models.Model):
     isDetector = models.SmallIntegerField(default=0, verbose_name=u'侦测开关0:关闭,1:开启')
     DetectorRank = models.IntegerField(default=0, verbose_name=u'侦测灵敏度 0:低,1:中,2:高,3:最高')
 
+
     class Meta:
         db_table = 'uid_set'
         verbose_name = u'设备配置表'
@@ -757,6 +758,17 @@ class UidChannelSetModel(models.Model):
     light_alarm_man_en = models.IntegerField(default=0, verbose_name='人为告警状态')  # 0:关,1:开
     light_alarm_vol = models.IntegerField(default=0, verbose_name='报警音量')  # 音量值0-100
     light_long_light = models.IntegerField(default=0, verbose_name='长亮')
+    voice_prompt_status = models.SmallIntegerField(default=0, verbose_name='个性语音提示快关。0:关闭,1:开启')
+    voice_prompt_enter = models.IntegerField(default=0, verbose_name='进入铃声id')
+    voice_prompt_leave = models.IntegerField(default=0, verbose_name='离开铃声id')
+    voice_prompt_intelligent_mute = models.SmallIntegerField(default=0, verbose_name='智能静音。0:关闭,1:开启')
+    voice_start_x = models.FloatField(default=0, verbose_name='起始坐标的x')
+    voice_start_y = models.FloatField(default=0, verbose_name='起始坐标的y')
+    voice_end_x = models.FloatField(default=0, verbose_name='结束坐标的x')
+    voice_end_y = models.FloatField(default=0, verbose_name='结束坐标的y')
+    voice_start_time = models.IntegerField(default=0, verbose_name='语音执行的起始时间')
+    voice_end_time = models.IntegerField(default=0, verbose_name='语音执行的结束时间')
+    voice_repeat_day = models.IntegerField(default=0, verbose_name='语音执行的日期,周几')
 
     class Meta:
         db_table = 'uid_channel'
@@ -1044,6 +1056,7 @@ class CountryIPModel(models.Model):
         verbose_name = 'ip-国家统计表'
         verbose_name_plural = verbose_name
 
+
 class ZositechHelpModel(models.Model):
     id = models.AutoField(primary_key=True)
     locale = models.CharField(default='', db_index=True, max_length=50, verbose_name='语言')
@@ -1070,6 +1083,7 @@ class ZositechHelpModel(models.Model):
         verbose_name = '周视使用帮助表'
         verbose_name_plural = verbose_name
 
+
 class EquipmentVersionLimitModel(models.Model):
     id = models.AutoField(primary_key=True)
     type = models.SmallIntegerField(default=0, verbose_name='限制类型')
@@ -1084,6 +1098,7 @@ class EquipmentVersionLimitModel(models.Model):
         verbose_name = '设备版本信息限制表'
         verbose_name_plural = verbose_name
 
+
 class ExperienceContextModel(models.Model):
     id = models.AutoField(primary_key=True)
     experience_type = models.SmallIntegerField(default=0,verbose_name='体验类型') # 0: 免费体验套餐, 1: 激活码
@@ -1096,3 +1111,50 @@ class ExperienceContextModel(models.Model):
         verbose_name = '设备体验表'
         verbose_name_plural = verbose_name
 
+class CDKcontextModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    cdk = models.CharField(max_length=50,unique=True,verbose_name='激活码')
+    create_time = models.IntegerField(default=0, verbose_name='创建时间')
+    valid_time = models.IntegerField(default=0, verbose_name='有效期间')  #超过有效期激活码不可在激活 ,0:永久
+    is_activate = models.SmallIntegerField(default=0, verbose_name='是否已激活') #0 未激活  1 已激活
+    rank = models.ForeignKey(Store_Meal, to_field='id', default='', on_delete=models.CASCADE, verbose_name='套餐类型')
+    # order = models.ForeignKey(Order_Model, blank=True, max_length=20, to_field='orderID', on_delete=models.CASCADE, verbose_name='订单id', unique=True)
+    order = models.CharField(max_length=20, blank=True, unique=True, verbose_name='订单id')
+
+    class Meta:
+        db_table = 'cdk_context'
+        verbose_name = '激活码表'
+        verbose_name_plural = verbose_name
+
+
+class VoicePromptModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    title = models.CharField(max_length=128, default='', verbose_name='语音标题')
+    type = models.SmallIntegerField(default=0, verbose_name='语音类型。1:进入语音,2:离开语音')
+    filename = models.CharField(max_length=120, default='', verbose_name='文件名')
+    language = models.CharField(max_length=16, default='', verbose_name='语言类型')
+    classification = models.SmallIntegerField(default=1, verbose_name='语音分类。0:系统,1:自定义')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+    uid = models.CharField(max_length=20, default='0', verbose_name='关联设备UID')
+    channel = models.IntegerField(default=0, verbose_name='通道号')
+
+    class Meta:
+        db_table = 'voice_prompt'
+        verbose_name = '语音提示表'
+        verbose_name_plural = verbose_name
+
+
+class DeviceTypeModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    name = models.CharField(max_length=64, default='', verbose_name='设备名称')
+    model = models.SmallIntegerField(default=0, verbose_name='设备大类。1:dvr,2:ipc')
+    type = models.IntegerField(default=0, verbose_name='设备类型')
+    ptz_type = models.IntegerField(default=0, verbose_name='ptz类型。1:dvr球机,2:IPCPTZ,3:同轴菜单')
+    icon = models.CharField(max_length=120, default='', verbose_name='文件名')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+    update_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'device_type'
+        verbose_name = '设备类型表'
+        verbose_name_plural = verbose_name

+ 2 - 0
Object/ResponseObject.py

@@ -41,6 +41,7 @@ class ResponseObject(object):
             177: 'Update error',
             178: 'ADD error',
             179: 'Nickname repeated',
+            201: 'You can only add 3 custom voice at most',
             306: 'The link has expired!',
             309: 'Please ReLogin! errmsg token',
             404: 'You don not have permission to access this!',
@@ -108,6 +109,7 @@ class ResponseObject(object):
             177: '更新错误',
             178: '增加错误',
             179: '名称不能重复',
+            201: '最多只能添加3条自定义语音',
             306: '链接已超过有效期!',
             309: '请重新登录!',
             404: '您没有访问的权限!',