Explorar el Código

Merge branch 'test'

lang hace 3 años
padre
commit
e171d16076

+ 479 - 0
AdminController/AiServeController.py

@@ -0,0 +1,479 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import time
+
+from django.views.generic.base import View
+from Model.models import Lang, AiStoreMeal, AiService, Order_Model
+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)
+            # ai用户信息相关
+            elif operation == 'getAiUserList':
+                return self.getAiUserList(request_dict, response)
+            # ai服务开通数量数据
+            elif operation == 'getAiDataList':
+                return self.getAiDataList(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))
+
+    def getAiUserList(self, request_dict, response):
+        username = request_dict.get('username', None)
+        NickName = request_dict.get('NickName', None)
+        uid = request_dict.get('uid', None)
+        payType = request_dict.get('payType', None)
+        status = request_dict.get('status', None)
+        use_status = request_dict.get('use_status', None)
+        addTimeRange = request_dict.getlist('addTimeRange[]', 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:
+            order_qs = Order_Model.objects.filter(
+                order_type=1).order_by('-addTime')
+            if username or NickName or uid or payType or status or use_status or addTimeRange:
+                if username:
+                    order_qs = order_qs.filter(
+                        userID__username__contains=username)
+                if NickName:
+                    order_qs = order_qs.filter(
+                        userID__NickName__contains=NickName)
+                if uid:
+                    order_qs = order_qs.filter(UID__contains=uid)
+                if payType:
+                    order_qs = order_qs.filter(payType=payType)
+                if status:
+                    order_qs = order_qs.filter(status=status)
+                if use_status:
+                    order_qs = order_qs.filter(use_status=use_status)
+                if addTimeRange:
+                    addStartTime, addEndTime = int(
+                        addTimeRange[0][:-3]), int(addTimeRange[1][:-3])
+                    order_qs = order_qs.filter(
+                        addTime__gte=addStartTime,
+                        addTime__lte=addEndTime)
+                if not order_qs.exists():
+                    return response.json(0, {'list': [], 'total': 0})
+                count = order_qs.count()
+            else:
+                count = Order_Model.objects.filter(order_type=1).count()
+            order_qs = order_qs.values(
+                'userID__username',
+                'userID__NickName',
+                'UID',
+                'channel',
+                'orderID',
+                'desc',
+                'payType',
+                'price',
+                'status',
+                'refunded_amount',
+                'addTime',
+                'updTime',
+            )[(page - 1) * line:page * line]
+            data_list = []
+            for order in order_qs:
+                data_dict = {
+                    'username': order['userID__username'],
+                    'NickName': order['userID__NickName'],
+                    'uid': order['UID'],
+                    'channel': order['channel'],
+                    'orderID': order['orderID'],
+                    'desc': order['desc'],
+                    'payType': order['payType'],
+                    'price': order['price'],
+                    'status': order['status'],
+                    'refunded_amount': order['refunded_amount'],
+                    'addTime': order['addTime'],
+                    'updTime': order['updTime'],
+                }
+                ai_service_qs = AiService.objects.filter(
+                    orders_id=order['orderID']).values(
+                    'endTime', 'use_status')
+                if ai_service_qs.exists():
+                    data_dict['endTime'] = ai_service_qs[0]['endTime']
+                    data_dict['use_status'] = ai_service_qs[0]['use_status']
+                data_list.append(data_dict)
+            return response.json(
+                0, {'list': data_list, 'total': count})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def getAiDataList(self, request_dict, response):
+        year = request_dict.get('year', None)
+        Jan = int(time.mktime(time.strptime(year + '-1-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Feb = int(time.mktime(time.strptime(year + '-2-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Mar = int(time.mktime(time.strptime(year + '-3-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Apr = int(time.mktime(time.strptime(year + '-4-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        May = int(time.mktime(time.strptime(year + '-5-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Jun = int(time.mktime(time.strptime(year + '-6-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Jul = int(time.mktime(time.strptime(year + '-7-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Aug = int(time.mktime(time.strptime(year + '-8-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Sep = int(time.mktime(time.strptime(year + '-9-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Oct = int(time.mktime(time.strptime(year + '-10-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Nov = int(time.mktime(time.strptime(year + '-11-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Dec = int(time.mktime(time.strptime(year + '-12-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Jan_next = int(time.mktime(time.strptime(str(int(year)+1) + '-1-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+
+        list_data = []
+        ai_store_meal_qs = AiStoreMeal.objects.filter(lang__lang='cn').values('id', 'lang__title', 'lang__content')
+        if not ai_store_meal_qs.exists():
+            return response.json(173)
+        try:
+            for ai_store_meal in ai_store_meal_qs:
+                name = ai_store_meal['lang__title']+'-'+ai_store_meal['lang__content']
+                order = Order_Model.objects.filter(order_type=1, status=1, ai_rank=ai_store_meal['id'])
+                if not order.exists():
+                    continue
+                Jan_count = order.filter(status=1, addTime__range=[Jan, Feb]).count()
+                Feb_count = order.filter(status=1, addTime__range=[Feb, Mar]).count()
+                Mar_count = order.filter(status=1, addTime__range=[Mar, Apr]).count()
+                Apr_count = order.filter(status=1, addTime__range=[Apr, May]).count()
+                May_count = order.filter(status=1, addTime__range=[May, Jun]).count()
+                Jun_count = order.filter(status=1, addTime__range=[Jun, Jul]).count()
+                Jul_count = order.filter(status=1, addTime__range=[Jul, Aug]).count()
+                Aug_count = order.filter(status=1, addTime__range=[Aug, Sep]).count()
+                Sep_count = order.filter(status=1, addTime__range=[Sep, Oct]).count()
+                Oct_count = order.filter(status=1, addTime__range=[Oct, Nov]).count()
+                Nov_count = order.filter(status=1, addTime__range=[Nov, Dec]).count()
+                Dec_count = order.filter(status=1, addTime__range=[Dec, Jan_next]).count()
+                data = [Jan_count, Feb_count, Mar_count, Apr_count, May_count, Jun_count, Jul_count, Aug_count, Sep_count,
+                        Oct_count, Nov_count, Dec_count]
+
+                cloud_data = {
+                    'name': name,
+                    'type': 'line',
+                    'data': data,
+                }
+                list_data.append(cloud_data)
+
+            return response.json(0, {'list': list_data})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))

+ 35 - 2
AdminController/LogManagementController.py

@@ -7,7 +7,7 @@ from django.views.generic.base import View
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
-from Model.models import Device_Info, RequestRecordModel, iotdeviceInfoModel, Access_Log, DeviceLogModel
+from Model.models import Device_Info, RequestRecordModel, iotdeviceInfoModel, Access_Log, DeviceLogModel, LogModel
 from Ansjer.config import REGION_NAME, ACCESS_KEY_ID, SECRET_ACCESS_KEY, LOG_BUCKET
 
 
@@ -45,6 +45,9 @@ class LogManagementView(View):
                 return self.getAccessLogList(request_dict, response)
             elif operation == 'getDeviceLogList':
                 return self.getDeviceLogList(request_dict, response)
+            # 操作日志
+            elif operation == 'getOperationLogList':
+                return self.getOperationLogList(request_dict, response)
             else:
                 return response.json(404)
 
@@ -269,7 +272,8 @@ class LogManagementView(View):
             )
             for device_log in device_log_list:
                 obj = device_log['serial_number'] if device_log['serial_number'] else device_log['uid']
-                obj = 'device_log/' + obj + '/{}'.format(device_log['filename'])
+                obj = 'device_log/' + obj + \
+                    '/{}'.format(device_log['filename'])
                 download_url = aws_s3_client.generate_presigned_url(
                     ClientMethod='get_object',
                     Params={
@@ -283,3 +287,32 @@ class LogManagementView(View):
         except Exception as e:
             print(e)
             return response.json(500, repr(e))
+
+    def getOperationLogList(self, request_dict, response):
+        operation = request_dict.get('operation', None)
+        url = request_dict.get('url', 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:
+            log_qs = LogModel.objects.all()
+            if operation:
+                log_qs = log_qs.filter(operation__contains=operation)
+            if url:
+                log_qs = log_qs.filter(url__contains=url)
+            count = log_qs.count()
+            log_qs = log_qs.values(
+                'operation', 'url', 'content', 'ip', 'time')[
+                (page - 1) * line:page * line]
+            log_list = list(log_qs)
+            return response.json(
+                0, {'list': log_list, 'total': count})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(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(

+ 319 - 0
AdminController/SurveysManageController.py

@@ -0,0 +1,319 @@
+#!/usr/bin/python3.6
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2022 #
+# @Time    : 2022/3/9 9:20
+# @Author  : ming
+# @Email   : zhangdongming@asj6.wecom.work
+# @File    : SurveysManageController.py
+# @Software: PyCharm
+import json
+import time
+
+from django.db import connection
+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 Surveys, SurveysTitle, CloudVodSurveysAnswer, Device_User, SurveysUserLog
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+
+
+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):
+        token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
+        response = ResponseObject()
+        if token.code != 0:
+            return response.json(token.code)
+
+        ''' 后台管理'''
+        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)
+        if operation == 'cloud/storage/log/page':
+            return self.cloud_storage_user_log_page(request_dict, response)
+        return response.json(0)
+
+    @classmethod
+    def get_page(cls, request_dict, response):
+        pageNo = request_dict.get('pageNo', None)
+        pageSize = request_dict.get('pageSize', None)
+        if not all([pageNo, pageSize]):
+            return response.json(444)
+
+        page = int(pageNo)
+        line = int(pageSize)
+        try:
+            request_qs = 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))
+
+    @classmethod
+    def save(cls, request_dict, response):
+        no = request_dict.get('no', None)
+        if no:
+            if Surveys.objects.filter(no=no).exists():
+                return response.json(10, '已存在')
+            no = request_dict.get('no', None)
+            userType = request_dict.get('userType', None)
+            startTime = request_dict.get('dateTime[0]', None)
+            endTime = request_dict.get('dateTime[1]', None)
+            isShow = request_dict.get('isShow', None)
+            isShow = 1 if isShow == 'true' else 0
+            createdTime = int(time.time())
+            try:
+                surveys = Surveys(no=no, user_type=userType, start_time=int(startTime),
+                                  end_time=endTime, is_show=isShow, created_time=int(createdTime))
+                surveys.save()
+                return response.json(0)
+            except Exception as e:
+                print(e)
+                return response.json(500, repr(e))
+        return response.json(0)
+
+    @classmethod
+    def edit(cls, 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)
+
+    @classmethod
+    def delete(cls, 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)
+
+    @classmethod
+    def title_save(cls, 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))
+
+    @classmethod
+    def get_title_list(cls, 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})
+
+    @classmethod
+    def title_edit(cls, 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)
+
+    @classmethod
+    def title_del(cls, 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)
+
+    @classmethod
+    def cloud_surveys_answer_page(cls, request_dict, response):
+        pageNo = request_dict.get('pageNo', None)
+        pageSize = request_dict.get('pageSize', None)
+        userName = request_dict.get('userName', None)
+        countryName = request_dict.get('countryName', None)
+        timeRange = request_dict.getlist('timeRange[]', None)
+        num = request_dict.get('num', 0)
+        num = int(num)
+        optVal = request_dict.getlist('optVal', None)
+        if not all([pageNo, pageSize]):
+            return response.json(444)
+
+        page = int(pageNo)
+        line = int(pageSize)
+        try:
+            request_qs = CloudVodSurveysAnswer.objects.all()
+            if userName:
+                request_qs = request_qs.filter(user__username__contains=userName)
+            if countryName:
+                request_qs = request_qs.filter(country_name=countryName)
+            if num >= 0 and len(optVal) > 0:
+                condition = int(optVal[0])
+                if condition == 1:
+                    request_qs = request_qs.filter(answer1__gt=num)
+                elif condition == 2:
+                    request_qs = request_qs.filter(answer1__lt=num)
+                elif condition == 3:
+                    request_qs = request_qs.filter(answer1=num)
+                elif condition == 4:
+                    request_qs = request_qs.filter(answer1__gte=num)
+                elif condition == 5:
+                    request_qs = request_qs.filter(answer1__lte=num)
+
+            if timeRange:
+                startTime, endTime = int(
+                    timeRange[0][:-3]), int(timeRange[1][:-3])
+                request_qs = request_qs.filter(
+                    created_time__gte=startTime,
+                    created_time__lte=endTime)
+            if not request_qs.exists():
+                return response.json(0, [])
+            total = request_qs.count()
+            answer_page = request_qs.order_by('-created_time')[(page - 1) * line:page * line]
+            result_list = []
+            for answer in answer_page:
+                d_user = Device_User.objects.filter(userID=answer.user_id)
+                if not all(d_user):
+                    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.answer1,
+                    'answer2': answer.answer2,
+                    'answer3': answer.answer3,
+                    'answer4': answer.answer4,
+                    'answer5': answer.answer5,
+                    'answer6': answer.answer6,
+                    'country': answer.country_name,
+                    '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))
+
+    ''' 云存用户问卷调查统计 '''
+
+    @classmethod
+    def cloud_storage_user_log_page(cls, request_dict, response):
+        pageNo = request_dict.get('pageNo', None)
+        pageSize = request_dict.get('pageSize', None)
+        if not all([pageNo, pageSize]):
+            return response.json(444)
+        try:
+            page = int(pageNo)
+            size = int(pageSize)
+            cursor = connection.cursor()
+            sql = 'SELECT o.orderID,o.userID_id,ca.id,ca.country_name as countryName '
+            sql += 'FROM orders o LEFT JOIN cloud_vod_surveys_answer ca ON o.userID_id = ca.user_id '
+            sql += ' WHERE o.status = %s AND o.order_type = %s GROUP BY o.userID_id '
+            cursor.execute(sql, [1, 0, ])
+            cloud_count = cursor.fetchall()
+            total = len(cloud_count)
+            sql += 'order by ca.created_time DESC,orderID DESC LIMIT %s,%s '
+            cursor.execute(sql, [1, 0, ((page - 1) * size), size, ])
+            data_obj = cursor.fetchall()
+            cursor.close()  # 执行完,关闭
+            connection.close()
+            result_list = []
+            col_names = [desc[0] for desc in cursor.description]
+            for item in data_obj:
+                tMap = dict(zip(col_names, item))
+                user_id = tMap['userID_id']
+                d_user = Device_User.objects.filter(userID=user_id)
+                tMap['uName'] = d_user[0].username
+                tMap['nickName'] = d_user[0].NickName
+                tMap.update({"type": 1})
+                survey_log_qs = SurveysUserLog.objects.filter(user_id=user_id)
+                if survey_log_qs.exists():
+                    survey_log = survey_log_qs[0]
+                    created_time = time.localtime(survey_log.created_time)
+                    tMap.update({"type": survey_log.type})
+                    tMap.update({"isFilled": survey_log.is_filled})
+                    tMap['createdTime'] = time.strftime("%Y-%m-%d %H:%M:%S", created_time),
+                    tMap.update({"isUpgrade": 1})
+                else:
+                    tMap.update({"isFilled": 0})
+                    tMap.update({"createdTime": ''})
+                    tMap.update({"isUpgrade": 0})
+                result_list.append(tMap)
+            return response.json(0, {'list': result_list, 'total': total})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))

+ 19 - 135
AdminController/TestServeController.py

@@ -61,138 +61,22 @@ class TestServeView(View):
                 return response.json(404)
 
     def AItest(self, userID, request, request_dict, response):
-        # print("--------------request_dict")
-        # print(request_dict)
-
-        file_post_one = request_dict.get('file_one', None)
-        file_post = file_post_one.replace(' ','+')
-        # file_decode = base64.b64decode(file_post)
-
-        file_post_two = request_dict.get('file_two', None)
-        file_post_two = file_post_two.replace(' ', '+')
-        # file_decode_two = base64.b64decode(file_post_two)
-
-        now_time = int(time.time())
-        dir_path = os.path.join(BASE_DIR, 'static/ai/')
-        if not os.path.exists(dir_path):
-            os.makedirs(dir_path)
-
-        file_path_one = dir_path + 'one'+ str(now_time) + '.jpeg'
-        file_path_two = dir_path + 'two'+ str(now_time) + '.jpeg'
-
-        file_list = ['one','two']
-
-        for index in file_list:
-            file_path = dir_path + index + str(now_time) + '.jpeg'
-            with open(file_path, 'wb') as f:
-                # file_byte = file_post.encode('utf-8')
-                f.write(file_decode)
-
-
-
-
-        return HttpResponse("seccess")
-        file2 = request.FILES.get('file_one', None)
-        file3 = request.FILES.get('file_two', None)
-        file4 = request.FILES.get('file_three', None)
-
-        print('--------------------------file')
-        print(file)
-
-        print('===========================post_file')
-        print(file_post)
-
-        post_file_list = [file, file2, file3, file4]
-        file_list = []
-        for index in range(len(post_file_list)):
-            if post_file_list[index]:
-                file_list.append(post_file_list[index])
-
-        del post_file_list
-        if len(file_list) > 1:
-            merge = []
-            now_time = int(time.time())
-            dir_path = os.path.join(BASE_DIR, 'static/', str(now_time))
-            if not os.path.exists(dir_path):
-                os.makedirs(dir_path)
-            for item in file_list:
-                if hasattr(item, 'name'):
-                    file_path = os.path.join(dir_path, item.name)
-                    with open(file_path, 'wb') as f:
-                        for c in item.chunks():
-                            f.write(c)
-                            merge.append(file_path)
-
-            image_size = 500  # 每张小图片的大小
-            image_colnum = 2  # 合并成一张图后,一行有几个小图
-            MergePic.merge_images(dir_path, image_size, image_colnum)
-            # return HttpResponse(dir_path + '.jpg')
-            photo = open(dir_path + '.jpg', 'rb')
-        else:
-            photo = file_list[0]
-
-        maxLabels = int(request_dict.get('maxLabels', 10))
-        minConfidence = float(request_dict.get('minConfidence', 30))
-
-        try:
-            client = boto3.client(
-                'rekognition',
-                aws_access_key_id='AKIA2E67UIMD6JD6TN3J',
-                aws_secret_access_key='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',
-                region_name='us-east-1')
-            # doc:
-            # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rekognition.html#Rekognition.Client.detect_labels
-            rekognition_res = client.detect_labels(
-                Image={
-                    'Bytes': photo.read()},
-                MaxLabels=maxLabels,
-                MinConfidence=minConfidence)
-            print('rekognition_res: ', rekognition_res)
-            return response.json(0, {'rekognition_res': rekognition_res})
-        except Exception as e:
-            print(e)
-            return response.json(500, repr(e))
-
-
-
-
-
-
-        files1 = request.FILES.get('image1')
-        files2 = request.FILES.get('image2')
-        files3 = request.FILES.get('image3')
-        files4 = request.FILES.get('image4')
-        file_list = [files1,files2,files3,files4]
-        merge = []
-        now_time = int(time.time())
-        dir_path = os.path.join(BASE_DIR,'static/', str(now_time))
-        if not os.path.exists(dir_path):
-            os.makedirs(dir_path)
-        for item in file_list:
-            if hasattr(item,'name'):
-                file_path = os.path.join(dir_path,item.name)
-                with open(file_path, 'wb') as f:
-                    for c in item.chunks():
-                        f.write(c)
-                        merge.append(file_path)
-
-        image_size = 500  # 每张小图片的大小
-        image_colnum = 2  # 合并成一张图后,一行有几个小图
-        MergePic.merge_images(dir_path, image_size, image_colnum)
-        files = open(dir_path+'.jpg','rb')
-        # return HttpResponse(files.read())
-
-
-        labels = int(request_dict.get('labels',5))
-        minConfidence = int(request_dict.get('minConfidence',99))
-        if not files:
-            return HttpResponse('请上传图片!!!!')
-        client = boto3.client('rekognition', aws_access_key_id='AKIA2E67UIMD6JD6TN3J',aws_secret_access_key='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',region_name='us-east-1')
-        # image = open('E:/photo/a615fa40b8c476bab0f6eeb332e62a5a-1000.jpg', "rb")
-        response = client.detect_labels(Image={'Bytes':files.read()},MaxLabels=labels,MinConfidence=minConfidence)
-        # for obj in response['Labels']:
-        #     exit(obj)
-        #     if obj['Name'] == 'Person':
-        #         jsonstr = json.dumps(obj)
-        return HttpResponse(json.dumps(response, ensure_ascii=False),
-                            content_type="application/json,charset=utf-8")
+        file = request.FILES.get('file', None)
+        print('request_dict: ', request_dict)
+        maxLabels = int(request_dict.get('maxLabels', 5))
+        minConfidence = float(request_dict.get('minConfidence', 55))
+
+        client = boto3.client(
+            'rekognition',
+            aws_access_key_id='AKIA2E67UIMD6JD6TN3J',
+            aws_secret_access_key='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',
+            region_name='us-east-1')
+        # doc:
+        # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rekognition.html#Rekognition.Client.detect_labels
+        rekognition_res = client.detect_labels(
+            Image={
+                'Bytes': file.read()},
+            MaxLabels=maxLabels,
+            MinConfidence=minConfidence)
+        print('rekognition_res: ', rekognition_res)
+        return response.json(0, {'rekognition_res': rekognition_res})

+ 2 - 2
Ansjer/cn_config/test_settings.py

@@ -83,9 +83,9 @@ SERVER_HOST = 'business-server.cvp7gfpnmziz.rds.cn-northwest-1.amazonaws.com.cn'
 DATABASES_USER = 'azrds'
 DATABASES_PASS = 'UKv78ezQhiGMmSef5U5s'
 
-#推送数据库
+# 推送数据库
 DATABASE_DATA2 = 'AnsjerTest'
-SERVER_HOST2 = 'ansjerpush.clraczw4p0yj.us-west-1.rds.amazonaws.com'
+SERVER_HOST2 = 'ansjerpush.cvp7gfpnmziz.rds.cn-northwest-1.amazonaws.com.cn'
 DATABASES_USER2 = 'azrds'
 DATABASES_PASS2 = 'azrds.x.x'
 

+ 1 - 0
Ansjer/local_config/local_settings.py

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

+ 29 - 20
Ansjer/urls.py

@@ -20,8 +20,10 @@ from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppIn
     RegionController, VPGController, LanguageController, TestController, DeviceConfirmRegion, S3GetStsController, \
     DetectControllerV2, ShadowController, TestDetectController, PcInfo, PctestController, DeviceDebug, PaymentCycle, \
     DeviceLogController, CouponController, AiController
+from Controller.Surveys import CloudStorageController
 from AdminController import UserManageController, RoleController, MenuController, TestServeController, \
-    ServeManagementController, LogManagementController, DeviceManagementController, VersionManagementController
+    ServeManagementController, LogManagementController, DeviceManagementController, VersionManagementController, \
+    AiServeController, SurveysManageController
 
 urlpatterns = [
     url(r'^testApi/(?P<operation>.*)$', TestApi.testView.as_view()),
@@ -30,7 +32,7 @@ urlpatterns = [
     url(r'^v3/account/imageCodeRegister/$', UserController.Image_Code_RegisterView.as_view()),
     url(r'^account/register$', UserController.registerView.as_view()),
     url(r'^account/login$', UserController.v2LoginView.as_view()),
-	url(r'^account/logout$', UserController.LogoutView.as_view()),
+    url(r'^account/logout$', UserController.LogoutView.as_view()),
     url(r'^account/noPasslogin$', UserController.noPasslogin.as_view()),
     url(r'^account/changePwd$', UserController.ChangePwdView.as_view()),
     url(r'^account/forget$', UserController.ForgetPwdView.as_view()),
@@ -140,10 +142,10 @@ urlpatterns = [
     url(r'^account/oneClickLogin$', UserController.oneClickLoginView.as_view()),
     url(r'^account/createPwd$', UserController.createPwd.as_view()),
 
-    #用户删除/注销
+    # 用户删除/注销
     url(r'^account/delete$', UserController.deleteAccount),
 
-    #确认地区
+    # 确认地区
     url(r'^user/confirmRegion$', UserController.confirmRegion),
 
     # 验证码登录
@@ -154,7 +156,7 @@ urlpatterns = [
     url(r'^v3/account/loginByFingerprint$', UserController.v3LoginByFingerprintView.as_view()),
     url(r'^v3/account/setFingerprint$', UserController.v3SetFingerprintView.as_view()),
 
-    url(r'^detect/detect_group_push$',DetectController.NotificationView.detect_group_push),
+    url(r'^detect/detect_group_push$', DetectController.NotificationView.detect_group_push),
     url(r'^detect/add$', DetectController.PushNotificationView.as_view()),
     # 推送项目接口
     url(r'^detect/(?P<operation>.*)$', DetectController.DetectControllerView.as_view()),
@@ -236,17 +238,17 @@ urlpatterns = [
     url(r'^login/oauth/(?P<operation>.*)$', ApplicationController.AuthView.as_view()),
     url(r'^grant/code/(?P<operation>.*)$', ApplicationController.GrantCodeView.as_view()),
     url(r'^user/ex/(?P<operation>.*)$', UserExController.UserExView.as_view()),
-	url(r'^v3/equipment/(?P<operation>.*)$', EquipmentManagerV3.EquipmentManagerV3.as_view()),
-	url(r'^cloudstorage/(?P<operation>.*)$', CloudStorage.CloudStorageView.as_view()),
-    url(r'^payCycle/(?P<operation>.*)$', PaymentCycle.PaypalCycleNotify.as_view()), #周期扣款
-	url(r'^paypalCycleNotify/(?P<operation>.*)$', PaymentCycle.PaypalCycleNotify.as_view()), #paypal周期扣款订阅通知
-	url(r'^paymentCycle/(?P<operation>.*)$', PaymentCycle.payCycle.as_view()), #paypal周期扣款
+    url(r'^v3/equipment/(?P<operation>.*)$', EquipmentManagerV3.EquipmentManagerV3.as_view()),
+    url(r'^cloudstorage/(?P<operation>.*)$', CloudStorage.CloudStorageView.as_view()),
+    url(r'^payCycle/(?P<operation>.*)$', PaymentCycle.PaypalCycleNotify.as_view()),  # 周期扣款
+    url(r'^paypalCycleNotify/(?P<operation>.*)$', PaymentCycle.PaypalCycleNotify.as_view()),  # paypal周期扣款订阅通知
+    url(r'^paymentCycle/(?P<operation>.*)$', PaymentCycle.payCycle.as_view()),  # paypal周期扣款
 
-    #AI服务
+    # AI服务
     url(r'^AiService/(?P<operation>.*)$', AiController.AiView.as_view()),
     url('^ai/updateUnusedAi', AiController.updateUnusedAi),
 
-    #新增解密的接口
+    # 新增解密的接口
     url(r'^v3/account/changePwd$', UserController.v3ChangePwdView.as_view()),
     url(r'^v3/account/resetPwdByCode$', UserController.v3resetPwdByCodeView.as_view()),
     url(r'^v3/account/register$', UserController.v3registerView.as_view()),
@@ -263,7 +265,7 @@ urlpatterns = [
     url(r'^statistcs/pushDay$', StatisticsController.statistcsPushDay),
     url(r'^statistcs/pushMonth$', StatisticsController.statistcsPushMonth),
 
-    #统计alexa连接数
+    # 统计alexa连接数
     url(r'^alexa/(?P<operation>.*)$', Alexa.AlexaConnectNum.as_view()),
 
     # FAQ
@@ -296,23 +298,23 @@ urlpatterns = [
     # 云存转移功能
     url(r'^cloudTransfer/(?P<operation>.*)$', CloudTransfer.cloudTestView.as_view()),
 
-    #优惠券
+    # 优惠券
     url(r'^coupon/(?P<operation>.*)$', CouponController.CouponView.as_view()),
 
     # app 设备消息模板
     # 路由加参数参考
     # url(r'^(?P<path>.*)/(?P<UID>.*)/lls$', Test.Test.as_view(), name=u'gg'),
-    #testing....................
+    # testing....................
 
-    #云存服务统计
+    # 云存服务统计
     url(r'^Cloudsum/(?P<operation>.*)$', Cloudsum.Cloudsum.as_view()),
     # 设备ip地区统计
     url(r'^device/StatisticsIpRegion$', DeviceConfirmRegion.StatisticsIpRegion.as_view()),
 
-    #Iot Core
+    # Iot Core
     url(r'iot/(?P<operation>.*)$', IotCoreController.IotCoreView.as_view()),
 
-    #S3预签名
+    # S3预签名
     url(r's3_getsts/(?P<operation>.*)$', S3GetStsController.S3GetStsView.as_view()),
 
     # 云分配UID
@@ -333,7 +335,6 @@ urlpatterns = [
     path('vpgUid/uid', VPGController.do_upload_uid),
     re_path('language/(?P<operation>.*)', LanguageController.LanguageView.as_view()),
 
-
     re_path('test/(?P<operation>.*)', TestController.TestView.as_view()),
     # 日志管理系统
     url(r'^OperatingLogs/(?P<operation>.*)$', OperatingLogs.OperatingLogsView.as_view()),
@@ -345,9 +346,10 @@ urlpatterns = [
     # 验证验证码
     url(r'verifyCode/(?P<operation>.*$)', VerifyCodeController.VerifyCodeView.as_view()),
 
-    #设备确定分配地区
+    # 设备确定分配地区
     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>.*)$', CloudStorageController.CloudStorageView.as_view()),
+
     # 后台界面接口 -----------------------------------------------------
     # 用户登录信息等
     url(r'^login$', UserManageController.LoginView.as_view()),
@@ -381,6 +386,10 @@ 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>.*)', SurveysManageController.SurveysView.as_view()),
     # 后台界面接口 -----------------------------------------------------
 
     re_path('(?P<path>.*)', LogManager.errorPath),

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 403 - 499
Controller/AiController.py


+ 57 - 49
Controller/DetectControllerV2.py

@@ -13,7 +13,7 @@
 """
 import os
 import time
-
+import json
 import apns2
 import jpush as jpush
 import oss2
@@ -25,9 +25,11 @@ from Ansjer.config import DETECT_PUSH_DOMAIN, DETECT_PUSH_DOMAINS, DETECT_PUSH_D
                             SERVER_DOMAIN, SERVER_DOMAIN_SSL, \
                             OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, \
                             JPUSH_CONFIG, FCM_CONFIG, APNS_CONFIG, BASE_DIR, APNS_MODE,  SERVER_TYPE
-from Model.models import Device_Info, VodHlsModel, Equipment_Info, UidSetModel, UidPushModel, CompanyModel, SysMsgModel
+from Model.models import Device_Info, VodHlsModel, Equipment_Info, UidSetModel, UidPushModel, CompanyModel, SysMsgModel, \
+    AiService
 from Object.ETkObject import ETkObject
 from Object.RedisObject import RedisObject
+from django.db.models import Q
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.UidTokenObject import UidTokenObject
@@ -127,54 +129,54 @@ class DetectControllerViewV2(View):
                     return response.json(904)
             else:
                 return response.json(173)
-            dvqs = Device_Info.objects.filter(userID_id=userID, UID=uid)
-            # 获取用户区域
-            # ip = self.ip
-            # ipInfo = CommonService.getIpIpInfo(ip=ip, lang='EN')
-            # area = ipInfo['country_name']
-            # if area == 'China':
-            #     DETECT_PUSH_DOMAIN_V2 = 'cn.push.dvema.com'
-            # else:
-            #     DETECT_PUSH_DOMAIN_V2 = 'en.push.dvema.com'
 
-            nowTime = int(time.time())
-            if not dvqs.exists():
+            # 判断用户是否拥有设备
+            device_info_qs = Device_Info.objects.filter(userID_id=userID, UID=uid)
+            if not device_info_qs.exists():
                 return response.json(14)
-            # 修改状态
+
+            # 更新或创建uid_set数据
+            nowTime = int(time.time())
+            uid_set_data = {}
+
+            # 设置开关状态,0:关闭,1:开启
             if status:
-                dvqs.update(NotificationMode=int(status))
-            uid_set_qs = UidSetModel.objects.filter(uid=uid)
-            # uid配置信息是否存在
+                status = int(status)
+                uid_set_data['detect_status'] = status
+                device_info_qs.update(NotificationMode=status)
+
+            # 检测类型
+            if detect_group:
+                uid_set_data['detect_group'] = detect_group
+
+            # 设置消息推送间隔
+            if interval:
+                interval = int(interval)
+                uid_set_data['detect_interval'] = interval
+                # 开通了ai服务的设备,通过mqtt通知设备修改消息推送间隔
+                ai_service_qs = AiService.objects.filter(uid=uid, use_status=1, endTime__gte=nowTime)
+                if ai_service_qs.exists():
+                    topic_name = 'ansjer/generic/{}'.format(uid)
+                    msg = {
+                        'commandType': 'AIState',
+                        'payload': {
+                            'IntervalTime': interval
+                        }
+                    }
+                    req_success = CommonService.req_publish_mqtt_msg(uid, topic_name, msg)
+                    if not req_success:
+                        return response.json(10044)
 
+            uid_set_qs = UidSetModel.objects.filter(uid=uid)
             if uid_set_qs.exists():
                 uid_set_id = uid_set_qs[0].id
-                qs_data = {
-                    'updTime': nowTime,
-                }
-                if status:
-                    qs_data['detect_status'] = int(status)
-                if interval:
-                    qs_data['detect_interval'] = int(interval)
-                if detect_group:
-                    qs_data['detect_group'] = detect_group
-                print(qs_data)
-                uid_set_qs.update(**qs_data)
-
+                uid_set_data['updTime'] = nowTime
+                uid_set_qs.update(**uid_set_data)
             else:
-                qs_data = {
-                    'uid': uid,
-                    'addTime': nowTime,
-                    'updTime': nowTime,
-                }
-                if status:
-                    qs_data['detect_status'] = int(status)
-                if interval:
-                    qs_data['detect_interval'] = int(interval)
-                if detect_group:
-                    qs_data['detect_group'] = detect_group
-                # 添加设备配置
-                uid_set_qs = UidSetModel.objects.create(**qs_data)
-
+                uid_set_data['uid'] = uid
+                uid_set_data['addTime'] = nowTime
+                uid_set_data['updTime'] = nowTime
+                uid_set_qs = UidSetModel.objects.create(**uid_set_data)
                 uid_set_id = uid_set_qs.id
 
             # 初始化UidPushModel推送表
@@ -196,11 +198,11 @@ class DetectControllerViewV2(View):
                 UidPushModel.objects.create(**uid_push_create_dict)
                 return response.json(0)
 
-            if status == '0':
+            if status == 0:
                 # 状态为0的时候删除redis缓存数据
                 self.do_delete_redis(uid)
                 return response.json(0)
-            elif status == '1':
+            elif status == 1:
                 uid_push_qs = UidPushModel.objects.filter(userID_id=userID, m_code=m_code, uid_set__uid=uid)
 
                 if uid_push_qs.exists():
@@ -233,7 +235,7 @@ class DetectControllerViewV2(View):
                     UidPushModel.objects.create(**uid_push_create_dict)
 
                 if interval:
-                    self.do_delete_redis(uid, int(interval))
+                    self.do_delete_redis(uid, interval)
                 else:
                     self.do_delete_redis(uid)
                 # utko = UidTokenObject()
@@ -294,7 +296,12 @@ class DetectControllerViewV2(View):
         if startTime and endTime:
             qs = qs.filter(eventTime__range=(startTime, endTime))
         if eventType:
-            qs = qs.filter(eventType=eventType)
+            if ',' in eventType:   #兼容AI查询
+                eventTypeList = eventType.split(',')
+                eventTypeList = [int(i.strip()) for i in eventTypeList]
+                qs = qs.filter(eventType__in=eventTypeList)
+            else:
+                qs = qs.filter(eventType=eventType)
         uids = request_dict.get('uids', None)
         if uids:
             uid_list = uids.split(',')
@@ -312,7 +319,7 @@ class DetectControllerViewV2(View):
         if not qs.exists():
             return response.json(0, {'datas': [], 'count': 0})
         qs = qs.values('id', 'devUid', 'devNickName', 'Channel', 'eventType', 'status', 'alarm', 'eventTime',
-                       'receiveTime', 'is_st', 'addTime', 'storage_location')
+                       'receiveTime', 'is_st', 'addTime', 'storage_location', 'borderCoords')
 
         count = qs.count()
         qr = qs[(page - 1) * line:page * line]
@@ -339,6 +346,7 @@ class DetectControllerViewV2(View):
             eventTime = p['eventTime']
             channel = p['Channel']
             storage_location = p['storage_location']
+            p['borderCoords'] = '' if p['borderCoords'] =='' else json.loads(p['borderCoords'])
             if p['is_st'] == 1:
                 thumbspng = '{uid}/{channel}/{time}.jpeg'.format(uid=devUid, channel=p['Channel'], time=eventTime)
                 if storage_location == 1:   # oss
@@ -384,7 +392,7 @@ class DetectControllerViewV2(View):
                                                                      Params={'Bucket': 'foreignpush', 'Key': ts},
                                                                      ExpiresIn=3600)
                         p['img_list'] = [thumb]
-            elif p['is_st'] == 3:
+            elif p['is_st'] == 3 or p['is_st'] == 4:
                 # 列表装载回放时间戳标记
                 p['img_list'] = []
                 for i in range(p['is_st']):

+ 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': '',

+ 183 - 0
Controller/Surveys/CloudStorageController.py

@@ -0,0 +1,183 @@
+#!/usr/bin/python3.6
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2022 #
+# @Time    : 2022/3/24 20:09
+# @Author  : ming
+# @Email   : zhangdongming@asj6.wecom.work
+# @File    : CloudStorageController.py
+# @Software: PyCharm
+import logging
+import time
+
+from django.db import transaction
+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 Surveys, SurveysTitle, Order_Model, CloudVodSurveysAnswer, SurveysUserLog, \
+    CloudVodSurveysOperateLog
+from Object.utils import LocalDateTimeUtil
+
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
+
+
+class CloudStorageView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(CloudStorageView, 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, response)
+        if operation == 'cloud/answer/save':
+            ip = CommonService.get_ip_address(request)
+            return self.answer_save(userID, ip, request_dict, response)
+        if operation == "cloud/storage/icon/close":
+            self.cloud_vob_operate_log_save(status=2, userId=userID)
+        return response.json(0)
+
+    def check_stock_user(self, user_id, response):
+        order = Order_Model.objects.filter(userID=user_id, status=1, order_type=0)
+        if not order.exists() and order.count() == 0:
+            return response.json(10030)
+        try:
+            no = '01'
+            surveys = Surveys.objects.filter(no=no, user_type=1)
+            if not surveys.exists():
+                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
+            close = self.check_user_is_icon_close(userId=user_id)
+            data = {
+                'no': result.no,
+                'title': 'Zosi Cloud Storage',
+                'imageUrl': 'https://d2cjxvw3tr9apc.cloudfront.net/app/images/ansjer-cloud-surveys.png',
+                'userType': result.user_type,
+                'startTime': result.start_time,
+                'endTime': result.end_time,
+                'isShow': 0 if close else result.is_show,
+                'isSubmit': submit,
+                'page': '/surveys?token=' if result.is_show == 1 else ''
+            }
+            localTime = int(time.time())
+            if result.start_time <= localTime <= result.end_time:
+                status = True if submit == 1 else False
+                self.surveys_user_log_save(status, user_id)
+                if not submit == 1:
+                    self.cloud_vob_operate_log_save(2 if close else submit, userId=user_id)
+            return response.json(0, data)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    @classmethod
+    def surveys_user_log_save(cls, status=False, userId='', survey_type=1):
+        if userId:
+            user_log = SurveysUserLog.objects.filter(user_id=userId, type=survey_type)
+            if user_log.exists():
+                if status and user_log[0].is_filled == 0:
+                    user_log.update(is_filled=1)
+            else:
+                createdTime = int(time.time())
+                user_log = SurveysUserLog(user_id=userId, type=1, created_time=createdTime)
+                user_log.save()
+
+    @classmethod
+    def check_user_is_icon_close(cls, userId):
+        if userId:
+            start_time, end_time = LocalDateTimeUtil.get_today_date(True)
+            user_operate_log_list = CloudVodSurveysOperateLog.objects.filter(user_id=userId, status=2,
+                                                                             created_time__gte=start_time,
+                                                                             created_time__lte=end_time)
+            if user_operate_log_list.exists():
+                return True
+        return False
+
+    @classmethod
+    def cloud_vob_operate_log_save(cls, status=0, userId=''):
+        """ 保存用户操作记录 """
+        try:
+            with transaction.atomic():
+                if userId:
+                    start_time, end_time = LocalDateTimeUtil.get_today_date(True)
+                    user_operate_qs = CloudVodSurveysOperateLog.objects.filter(user_id=userId,
+                                                                               created_time__gte=start_time,
+                                                                               created_time__lte=end_time)
+                    local_time = int(time.time())
+                    if user_operate_qs.exists():
+                        operate_log = user_operate_qs.first()
+                        if not operate_log.status == status:
+                            operate_log.status = status
+                            operate_log.updated_time = local_time
+                            operate_log.save()
+                    else:
+                        operate_log = CloudVodSurveysOperateLog(user_id=userId, status=status, updated_time=local_time,
+                                                                created_time=local_time)
+                        operate_log.save()
+        except Exception as e:
+            print(e)
+
+    @classmethod
+    def answer_save(cls, 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, answer1=int(score),
+                                                   answer2=topicA,
+                                                   answer3=topicB, answer4=topicC, answer5=topicD, answer6=topicF,
+                                                   created_time=createdTime, country_name=country_name)
+                    answer.save()
+                    SurveysUserLog.objects.filter(user_id=userId, type=1).update(is_filled=1)
+                    cls.cloud_vob_operate_log_save(status=1, userId=userId)
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))

+ 9 - 0
Controller/Surveys/__init__.py

@@ -0,0 +1,9 @@
+#!/usr/bin/python3.6
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2022 #
+# @Time    : 2022/3/24 20:06
+# @Author  : ming
+# @Email   : zhangdongming@asj6.wecom.work
+# @File    : __init__.py.py
+# @Software: PyCharm

+ 9 - 2
Controller/TestApi.py

@@ -56,6 +56,7 @@ from Service.CommonService import CommonService
 from Service.ModelService import ModelService
 from Object.m3u8generate import PlaylistGenerator
 from Model.models import Device_User, Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidPushModel
+from Ansjer.config import PAYPAL_CRD,SERVER_DOMAIN,SERVER_DOMAIN_SSL,PAYPAL_WEB_HOOK_ID
 
 
 
@@ -146,7 +147,11 @@ class testView(View):
             return 123
 
     def findPaypalOrder(self,request_dict, response):
-
+        from Object.ETkObject import ETkObject
+        etkObj = ETkObject(etk='')
+        etk = etkObj.encrypt('RBF474J66TLAGHW9111A')
+        exit(etk)
+        return HttpResponse(PAYPAL_WEB_HOOK_ID)
         logger = logging.getLogger('info')
         logger.info('------记录aws bucket init时间')
         logger.info(int(time.time()))
@@ -757,8 +762,10 @@ class testView(View):
     def generate_token(self,request_dict,userID):
         # UserIdToken
         tko = TokenObject()
+        userID = request_dict.get('userID',None)
+        username = request_dict.get('username',None)
         res = tko.generate(
-            data={'userID': 162156677434713800138000, 'lang': 'cn', 'user': '3076898361@qq.com', 'm_code': '12341324321'})
+            data={'userID': userID, 'lang': 'cn', 'user': username, 'm_code': username})
         #uidToken
         # utko = UidTokenObject()
         # res = utko.generate(data={'uid': '4UZSEDP93MJ3X7YB111A','channel': 1})

+ 111 - 35
Model/models.py

@@ -327,6 +327,7 @@ class Equipment_Info(models.Model):
     userID_id = models.CharField(default='',  db_index=True, blank=True, max_length=32, verbose_name=u'用户ID')
     is_st = models.SmallIntegerField(default=0, verbose_name='是否截图')  # 0 否,1 是图,2,视频
     storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
+    borderCoords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
     # message_id = models.CharField(blank=True, max_length=32, default='', verbose_name='第三方推送服务器返回的id')
     # push_type = models.SmallIntegerField(blank=True, default=0, verbose_name='第三方推送服务器标志。0:APNS推送,1:谷歌推送,2:极光推送')
     # push_server_status = models.IntegerField(blank=True, default=200, verbose_name='是否成功推送到第三方服务器。200:成功,other:失败')
@@ -498,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')
@@ -518,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
@@ -1614,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='区号')
@@ -1817,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'职能名字')
@@ -1935,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)
@@ -1950,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)
 
@@ -1969,4 +1964,85 @@ 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 SurveysUserLog(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
+    user = models.ForeignKey(Device_User, to_field='userID', default='', on_delete=models.CASCADE,
+                             verbose_name='关联用户表ID')
+    type = models.SmallIntegerField(default=0, verbose_name='调查用户对象[1:云存储用户,2:AI用户,3:所有APP用户]')
+    is_filled = models.SmallIntegerField(default=0, verbose_name='是否填写[0:未填,1:已填]')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+
+    class Meta:
+        db_table = 'surveys_user_log'
+        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')
+    answer1 = models.SmallIntegerField(verbose_name='答案1 (分数)')
+    answer2 = models.CharField(max_length=500, blank=True, verbose_name='答案2', default='')
+    answer3 = models.CharField(max_length=500, blank=True, verbose_name='答案3', default='')
+    answer4 = models.CharField(max_length=500, blank=True, verbose_name='答案4', default='')
+    answer5 = models.CharField(max_length=500, blank=True, verbose_name='答案5', default='')
+    answer6 = 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',)
+
+
+class CloudVodSurveysOperateLog(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
+    user = models.ForeignKey(Device_User, to_field='userID', default='', on_delete=models.CASCADE,
+                             verbose_name='关联用户表ID')
+    status = models.SmallIntegerField(default=0, verbose_name='状态{0:未处理,1:提交,2:关闭}')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+
+    class Meta:
+        db_table = 'cloud_vod_surveys_operate_log'
+        verbose_name = '云存问卷调查—操作日志'
+        verbose_name_plural = verbose_name
+        ordering = ('id',)

+ 105 - 15
Object/MergePic.py

@@ -1,30 +1,41 @@
 import os
 
 import PIL.Image as Image
+from PIL import ImageDraw
 
 
 def resize_by_width(infile, image_size):
     """按照宽度进行所需比例缩放"""
     im = Image.open(infile)
-    (x, y) = im.size
-    lv = round(x / image_size, 2) + 0.01
-    x_s = int(x // lv)
-    y_s = int(y // lv)
-    print("x_s", x_s, y_s)
-    out = im.resize((x_s, y_s), Image.ANTIALIAS)
-    return out
+    if image_size != 0:
+        (x, y) = im.size
+        lv = round(x / image_size, 2) + 0.01
+        x_s = int(x // lv)
+        y_s = int(y // lv)
+        print("x_s", x_s, y_s)
+        out = im.resize((x_s, y_s), Image.ANTIALIAS)
+        return out
+    else:
+        (x_s, y_s) = im.size
+        print("x_s", x_s, y_s)
+        out = im.resize((x_s, y_s), Image.ANTIALIAS)
+        return out
 
 
 def get_new_img_xy(infile, image_size):
     """返回一个图片的宽、高像素"""
     im = Image.open(infile)
-    (x, y) = im.size
-    lv = round(x / image_size, 2) + 0.01
-    x_s = x // lv
-    y_s = y // lv
-    # print("x_s", x_s, y_s)
-    # out = im.resize((x_s, y_s), Image.ANTIALIAS)
-    return x_s, y_s
+    if image_size != 0:
+        (x, y) = im.size
+        lv = round(x / image_size, 2) + 0.01
+        x_s = x // lv
+        y_s = y // lv
+        # print("x_s", x_s, y_s)
+        # out = im.resize((x_s, y_s), Image.ANTIALIAS)
+        return x_s, y_s
+    else:   #等于0时按照原比例
+        (x_s, y_s) = im.size
+        return x_s, y_s
 
 
 # 定义图像拼接函数
@@ -82,11 +93,90 @@ def merge_images(image_dir_path,image_size,image_colnum):
     x_new = int(x_list[len(x_list) // 5 * 4])
     y_new = int(y_list[len(y_list) // 5 * 4])
     print(" x_new, y_new", x_new, y_new)
-    image_compose(image_colnum, image_size, image_rownum, image_fullpath_list, image_save_path, x_new, y_new)  # 调用函数
+    image_compose(image_colnum, image_size, image_rownum, image_fullpath_list, image_save_path, x_new, y_new)  # 调用函数.
+    return {'width':x_list[0],'height':sum(y_list),'num':len(y_list)}
     # for img_file in image_fullpath_list:
     #     resize_by_width(img_file,image_size)
 
+def pic_frame(image_path):
+    im = Image.open(image_path)
+    (x, y) = im.size
+
+    width_ratio =  0.5791387557983398
+    height_ratio = 0.23751300573349*(y*4)/y
+    # exit(height_ratio)
+    left_ratio = 0.24959583580493927
+    # exit(y*0.24852335453033447)
+    top_ratio = (y*4*0.504405677318573 - (2*y))/y
+    # exit(top_ratio)
+
+    draw = ImageDraw.Draw(im)
+    # draw.line([(10, 10), (50, 10), (50, 50), (10, 50), (10, 10)], fill=(255, 0, 0), width=5)
+
+    x1 = x*left_ratio
+    y1 = y*top_ratio
+
+    x2 = x1 + (width_ratio*x)
+    y2 = y1
+
+    x3 = x2
+    y3 = y1 + (height_ratio*y)
+
+    x4 = x1
+    y4 = y3
+
+    draw.line([(x1, y1), (x2, y2), (x3, y3), (x4, y4), (x1, y1)], fill=(255, 0, 0), width=3)
+    im.show()
+
+
 if __name__ == '__main__':
+    import PIL.Image as Image
+    from PIL import ImageDraw
+    import json
+
+    str = '[{"Width":0.07776174694299698,"Height":0.5436824560165405,"Top":0.36302846670150757,"Left":0.38370513916015625,"picName":"1647415509_0"},{"Width":0.10947742313146591,"Height":0.4826411008834839,"Top":0.4097094237804413,"Left":0.2790755331516266,"picName":"1647415509_0"},{"Width":0.2935298979282379,"Height":0.3697746992111206,"Top":0.621006965637207,"Left":0.6143953204154968,"picName":"1647415509_3"},{"Width":0.35492533445358276,"Height":0.8629811406135559,"Top":0.08606290817260742,"Left":0.3411630690097809,"picName":"1647415509_1"},{"Width":0.39604419469833374,"Height":0.38593751192092896,"Top":0.6001746654510498,"Left":0.060247838497161865,"picName":"1647415509_3"},{"Width":0.1105344295501709,"Height":0.5028191208839417,"Top":0.3258347511291504,"Left":0.0025259912945330143,"picName":"1647415509_3"},{"Width":0.13166509568691254,"Height":0.4821750223636627,"Top":0.34587907791137695,"Left":0.10105808824300766,"picName":"1647415509_3"},{"Width":0.22752150893211365,"Height":0.3825581967830658,"Top":0.5845961570739746,"Left":0.7430258989334106,"picName":"1647415509_3"},{"Width":0.1297324150800705,"Height":0.387117862701416,"Top":0.6101043224334717,"Left":0.4607183039188385,"picName":"1647415509_3"},{"Width":0.2157023847103119,"Height":0.94093257188797,"Top":0.06487464904785156,"Left":0.26413947343826294,"picName":"1647415509_2"},{"Width":0.23323440551757812,"Height":0.8104973435401917,"Top":0.18303179740905762,"Left":0.4748744070529938,"picName":"1647415509_2"},{"Width":0.31273096799850464,"Height":0.9365510940551758,"Top":0.05696296691894531,"Left":0.6696768999099731,"picName":"1647415509_2"},{"Width":0.27037277817726135,"Height":0.8783474564552307,"Top":0.12225198745727539,"Left":0.053227268159389496,"picName":"1647415509_2"},{"Width":0.5476366281509399,"Height":0.4337165951728821,"Top":0.45788294076919556,"Left":0.38325461745262146,"picName":"1647415509_0"}]'
+    str = json.loads(str)
+    for label in str:
+        im = Image.open('D:/devcode/ASJServer_test/static/ai/RBF474J66TLAGHW9111A/1647415509/'+label['picName'] + '.jpg')
+
+        (x, y) = im.size
+
+        width_ratio = label['Width']
+        height_ratio = label['Height']
+        # exit(height_ratio)
+        left_ratio = label['Left']
+        # exit(y*0.24852335453033447)
+        top_ratio = label['Top']
+        # exit(top_ratio)
+
+        draw = ImageDraw.Draw(im)
+        # draw.line([(10, 10), (50, 10), (50, 50), (10, 50), (10, 10)], fill=(255, 0, 0), width=5)
+
+        x1 = x * left_ratio
+        y1 = y * top_ratio
+
+        x2 = x1 + (width_ratio * x)
+        y2 = y1
+
+        x3 = x2
+        y3 = y1 + (height_ratio * y)
+
+        x4 = x1
+        y4 = y3
+
+        draw.line([(x1, y1), (x2, y2), (x3, y3), (x4, y4), (x1, y1)], fill=(255, 0, 0), width=3)
+        im.show()
+
+
+
+
+
+
+
+    # image_path = r'D:\devcode\ASJServer_test\static\ai\RBF474J66TLAGHW9111A\1647244844.jpg'  # 图片集地址
+    image_path = r'D:\devcode\ASJServer_test\static\ai\RBF474J66TLAGHW9111A\1647244844\1647244844_0.jpg'  # 图片集地址
+    pic_frame(image_path)
+    exit()
 
     image_dir_path = r'E:\photo\test'  # 图片集地址
     image_size = 500  # 每张小图片的大小

+ 47 - 0
Object/utils/LocalDateTimeUtil.py

@@ -0,0 +1,47 @@
+#!/usr/bin/python3.6
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2022 #
+# @Time    : 2022/3/26 16:20
+# @Author  : ming
+# @Email   : zhangdongming@asj6.wecom.work
+# @File    : LocalDateTimeUtil.py
+# @Software: PyCharm
+import datetime
+import time
+
+
+def get_last_first_date_and_last_date(n):
+    """
+    获取前n周开始时间和结束时间,参数n:代表前n周
+    """
+    now = datetime.datetime.now()
+    # 上周第一天和最后一天
+    before_n_week_start = now - datetime.timedelta(days=now.weekday() + 7 * n, hours=now.hour, minutes=now.minute,
+                                                   seconds=now.second, microseconds=now.microsecond)
+    # last_week_end = now - timedelta(days=now.weekday() + 1)
+    before_n_week_end = before_n_week_start + datetime.timedelta(days=6, hours=23, minutes=59, seconds=59)
+    return before_n_week_start, before_n_week_end
+
+
+def get_today_date(timestamp=False):
+    """
+    返回当天开始时间和结束时间
+    :param timestamp 是否返回时间戳
+    :returns: zero_today ,last_today
+    """
+
+    now = datetime.datetime.now()
+    zero_today = now - datetime.timedelta(hours=now.hour, minutes=now.minute, seconds=now.second,
+                                          microseconds=now.microsecond)
+    last_today = zero_today + datetime.timedelta(hours=23, minutes=59, seconds=59)
+    if timestamp:
+        zero_today = int(time.mktime(zero_today.timetuple()))
+        last_today = int(time.mktime(last_today.timetuple()))
+        return zero_today, last_today
+    return zero_today, last_today
+
+
+if __name__ == "__main__":
+    start_time, end_time = get_today_date(True)
+    print('--- start_time = {} end_time = {}'.format(start_time, end_time))

+ 39 - 0
Service/CommonService.py

@@ -6,6 +6,7 @@ import time
 from pathlib import Path
 from random import Random
 import ipdb
+import requests
 import simplejson as json
 from django.core import serializers
 from django.http import HttpResponseRedirect
@@ -15,6 +16,7 @@ from Ansjer.config import BASE_DIR, UNICODE_ASCII_CHARACTER_SET, SERVER_DOMAIN_S
 import OpenSSL.crypto as ct
 from base64 import encodebytes
 from Controller.CheckUserData import RandomStr
+from Model.models import iotdeviceInfoModel
 from Service.ModelService import ModelService
 
 
@@ -452,6 +454,43 @@ class CommonService:
             print(e)
             return False
 
+    @staticmethod
+    def req_publish_mqtt_msg(thing_name, topic_name, msg):
+        # 通用发布MQTT消息函数
+        if not all([thing_name, topic_name, msg]):
+            return False
+
+        try:
+            # 获取数据组织将要请求的url
+            iot = iotdeviceInfoModel.objects.filter(
+                thing_name__icontains=thing_name).values(
+                'endpoint', 'token_iot_number')
+            if not iot.exists():
+                return False
+            endpoint = iot[0]['endpoint']
+            Token = iot[0]['token_iot_number']
+
+            # api doc: https://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/http.html
+            # url: https://IoT_data_endpoint/topics/url_encoded_topic_name?qos=1
+            # post请求url发布MQTT消息
+            url = 'https://{}/topics/{}'.format(endpoint, topic_name)
+            authorizer_name = 'Ansjer_Iot_Auth'
+            signature = CommonService.rsa_sign(Token)  # Token签名
+            headers = {
+                'x-amz-customauthorizer-name': authorizer_name,
+                'Token': Token,
+                'x-amz-customauthorizer-signature': signature}
+            r = requests.post(url=url, headers=headers, json=msg, timeout=2)
+            if r.status_code == 200:
+                res = r.json()
+                if res['message'] == 'OK':
+                    return True
+                return False
+            else:
+                return False
+        except Exception as e:
+            return False
+
     @staticmethod
     def rsa_sign(Token):
         # 私钥签名Token

+ 20 - 2
Service/MiscellService.py

@@ -14,7 +14,7 @@ from Service.ModelService import ModelService
 from Service.TemplateService import TemplateService
 from Object.RedisObject import RedisObject
 from Ansjer.config import SERVER_TYPE
-from Model.models import Device_User
+from Model.models import Device_User, Device_Info
 # coding:utf-8
 from boto3 import Session
 from botocore.exceptions import ClientError
@@ -364,8 +364,25 @@ def addLog(request, status_code):
             if password is not None:
                 request_dict = dict(request_dict)
                 request_dict.pop('userPwd')
+
             content = json.dumps(request_dict)
-            print(content)
+            content = json.loads(content)
+
+            # 删除设备时记录设备UID
+            if request_path == 'equipment/delete':
+                device_id = request_dict.get('id', None)
+                if device_id:
+                    uid = Device_Info.objects.filter(id=device_id).values("UID")
+                    content['uid'] = uid[0]['UID']
+            if request_path == 'equipment/batchDelete':
+                device_ids = request_dict.get('ids', None)
+                if device_ids:
+                    uids_query = Device_Info.objects.filter(id__in=device_ids).values("UID")
+                    uids = ''
+                    for uid in uids_query:
+                        uids = uids + uid['UID'] + ','
+                    content['uids'] = uids
+            content = json.dumps(content)
             if user != '':
                 user = user
             else:
@@ -457,6 +474,7 @@ def dynamo_db_add_log_ctr(request, status_code):
     if password is not None:
         request_dict = dict(request_dict)
         request_dict.pop('userPwd')
+
     content = json.dumps(request_dict)
     addTime = int(time.time())
     if DOMAIN_HOST == 'www.zositechc.cn':

+ 1 - 0
Service/TemplateService.py

@@ -75,6 +75,7 @@ class TemplateService:
             'equipment/modifyUserEquipment',
             'equipment/add',
             'equipment/delete',
+            'equipment/batchDelete',
             'equipment/query',
             'equipment/flowUpdate',
             'v3/equipment/query',

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio