소스 검색

Merge branch 'master' of http://192.168.136.99:3000/servers/ASJServer into cheng

 Conflicts:
	AdminController/AiServeController.py
	AdminController/DeviceManagementController.py
	AdminController/LogManagementController.py
	AdminController/ServeManagementController.py
	AdminController/UnicomManageController.py
	AdminController/UserManageController.py
	AdminController/VersionManagementController.py
	AdminController/dataSystemManagement/HomeDataController.py
	AdminController/dataSystemManagement/ServiceDataController.py
	Ansjer/cn_config/config_test.py
	Ansjer/cn_config/formal_settings.py
	Ansjer/eur_config/config_formal.py
	Ansjer/eur_config/formal_settings.py
	Ansjer/server_urls/loocam_url.py
	Ansjer/urls.py
	Controller/AWS/KVSController.py
	Controller/AiController.py
	Controller/AlgorithmShop/AlgorithmShopController.py
	Controller/AppAccountManagement.py
	Controller/CloudStorage.py
	Controller/CloudTransfer.py
	Controller/CloudVod.py
	Controller/Cron/CronTaskController.py
	Controller/DetectController.py
	Controller/DetectControllerV2.py
	Controller/EquipmentManager.py
	Controller/EquipmentManagerV3.py
	Controller/FeedBack.py
	Controller/PaymentCycle.py
	Controller/RegionController.py
	Controller/SensorGateway/GatewayDeviceController.py
	Controller/SensorGateway/SmartSceneController.py
	Controller/SensorGateway/SmartSocketController.py
	Controller/SerialNumberController.py
	Controller/ShadowController.py
	Controller/SysMsg.py
	Controller/TestApi.py
	Controller/UnicomCombo/UnicomComboController.py
	Controller/UnicomCombo/WXTechController.py
	Controller/UserController.py
	Controller/UserDevice/UserDeviceShareController.py
	Controller/UserManger.py
	Model/models.py
	Object/AWS/AmazonS3Util.py
	Object/UnicomObject.py
	Object/WXTechObject.py
	Service/CommonService.py
	requirements.txt
keiSenFront 2 년 전
부모
커밋
1969c6f123
49개의 변경된 파일1573개의 추가작업 그리고 2244개의 파일을 삭제
  1. 13 48
      AdminController/AiServeController.py
  2. 60 35
      AdminController/DeviceManagementController.py
  3. 7 7
      AdminController/LogManagementController.py
  4. 9 4
      AdminController/ServeManagementController.py
  5. 148 29
      AdminController/UnicomManageController.py
  6. 13 13
      AdminController/UserManageController.py
  7. 81 93
      AdminController/VersionManagementController.py
  8. 38 38
      AdminController/dataSystemManagement/HomeDataController.py
  9. 18 24
      AdminController/dataSystemManagement/ServiceDataController.py
  10. 2 2
      Ansjer/cn_config/config_test.py
  11. 2 2
      Ansjer/cn_config/formal_settings.py
  12. 2 2
      Ansjer/eur_config/config_formal.py
  13. 2 2
      Ansjer/eur_config/formal_settings.py
  14. 1 3
      Ansjer/server_urls/loocam_url.py
  15. 327 226
      Ansjer/urls.py
  16. 3 3
      Controller/AWS/KVSController.py
  17. 18 17
      Controller/AiController.py
  18. 2 2
      Controller/AlgorithmShop/AlgorithmShopController.py
  19. 1 1
      Controller/AppAccountManagement.py
  20. 73 408
      Controller/CloudStorage.py
  21. 3 3
      Controller/CloudTransfer.py
  22. 6 24
      Controller/CloudVod.py
  23. 67 231
      Controller/Cron/CronTaskController.py
  24. 4 3
      Controller/DetectController.py
  25. 18 43
      Controller/DetectControllerV2.py
  26. 40 43
      Controller/EquipmentManager.py
  27. 10 26
      Controller/EquipmentManagerV3.py
  28. 6 6
      Controller/FeedBack.py
  29. 32 53
      Controller/PaymentCycle.py
  30. 0 2
      Controller/RegionController.py
  31. 63 144
      Controller/SensorGateway/GatewayDeviceController.py
  32. 54 90
      Controller/SensorGateway/SmartSceneController.py
  33. 7 7
      Controller/SensorGateway/SmartSocketController.py
  34. 56 0
      Controller/SensorGateway/SubDeviceController.py
  35. 125 24
      Controller/SerialNumberController.py
  36. 15 14
      Controller/ShadowController.py
  37. 3 11
      Controller/SysMsg.py
  38. 83 119
      Controller/TestApi.py
  39. 41 21
      Controller/UnicomCombo/UnicomComboController.py
  40. 47 22
      Controller/UnicomCombo/WXTechController.py
  41. 25 50
      Controller/UserController.py
  42. 2 2
      Controller/UserDevice/UserDeviceShareController.py
  43. 4 13
      Controller/UserManger.py
  44. 12 201
      Model/models.py
  45. 0 94
      Object/AWS/AmazonS3Util.py
  46. 17 13
      Object/UnicomObject.py
  47. 9 0
      Object/WXTechObject.py
  48. 4 26
      Service/CommonService.py
  49. BIN
      requirements.txt

+ 13 - 48
AdminController/AiServeController.py

@@ -5,7 +5,7 @@ import time
 from django.db.models import F
 from django.views.generic.base import View
 
-from Model.models import Lang, AiStoreMeal, AiService, Order_Model, Device_User, CountryModel, UidSetModel, Device_Info
+from Model.models import Lang, AiStoreMeal, AiService, Order_Model, Device_User, CountryModel, UidSetModel
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
@@ -123,7 +123,7 @@ class AiServeView(View):
                 0, {'list': ai_meal_list, 'total': total})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def addOrEditAiStoreMeal(self, request_dict, response):
         # 添加/编辑套餐
@@ -169,7 +169,7 @@ class AiServeView(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def deleteAiStoreMeal(self, request_dict, response):
         # 删除ai套餐
@@ -182,7 +182,7 @@ class AiServeView(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def getAiMealLanguage(self, request_dict, response):
         # 获取ai套餐语言
@@ -228,7 +228,7 @@ class AiServeView(View):
                 0, {'list': ai_meal_lang_list, 'total': total})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def addOrEditAiMealLanguage(self, request_dict, response):
         # 添加/编辑套餐语言
@@ -270,8 +270,7 @@ class AiServeView(View):
                         lang=lang,
                         title=title,
                         content=content,
-                        discount_content=discount_content,
-                        type=1)
+                        discount_content=discount_content)
                     lang_obj = Lang.objects.filter(
                         lang=lang,
                         title=title,
@@ -281,7 +280,7 @@ class AiServeView(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def deleteAiMealLanguage(self, request_dict, response):
         # 删除套餐语言
@@ -300,13 +299,12 @@ class AiServeView(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(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)
-        serialNumber = request_dict.get('serialNumber', None)
         if not all([pageNo, pageSize]):
             return response.json(444)
 
@@ -316,10 +314,6 @@ class AiServeView(View):
             ai_service_qs = AiService.objects.all()
             if uid:
                 ai_service_qs = ai_service_qs.filter(uid__contains=uid)
-            if serialNumber:
-                device_info_qs = Device_Info.objects.filter(serial_number=serialNumber).values('UID')
-                uid = device_info_qs[0]['UID'] if device_info_qs.exists() else 'N/A'
-                ai_service_qs = ai_service_qs.filter(uid__icontains=uid)
 
             if not ai_service_qs.exists():
                 return response.json(0, [])
@@ -337,30 +331,11 @@ class AiServeView(View):
                 'addTime',
                 'updTime', 'user_name').order_by('-addTime')
             ai_service_qs = ai_service_qs[(page - 1) * line:page * line]
-            ai_service_list = []
-            for ai_service in ai_service_qs:
-                data = {
-                    'id': ai_service['id'],
-                    'uid': ai_service['uid'],
-                    'channel': ai_service['channel'],
-                    'use_status': ai_service['use_status'],
-                    'detect_status': ai_service['detect_status'],
-                    'detect_group': ai_service['detect_group'],
-                    'endTime': ai_service['endTime'],
-                    'addTime': ai_service['addTime'],
-                    'updTime': ai_service['updTime'],
-                    'user_name': ai_service['user_name'],
-                    'serial_number': 'N/A'
-                }
-                device_info_qs = Device_Info.objects.filter(UID=ai_service['uid']).values('serial_number')
-                if device_info_qs.exists():
-                    data['serial_number'] = device_info_qs[0]['serial_number'] if device_info_qs[0]['serial_number'] else 'N/A'
-                ai_service_list.append(data)
             return response.json(
-                0, {'list': ai_service_list, 'total': count})
+                0, {'list': list(ai_service_qs), 'total': count})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def getAiUserList(self, request_dict, response):
         username = request_dict.get('username', None)
@@ -369,7 +344,6 @@ class AiServeView(View):
         payType = request_dict.get('payType', None)
         status = request_dict.get('status', None)
         use_status = request_dict.get('use_status', None)
-        serialNumber = request_dict.get('serialNumber', None)
         addTimeRange = request_dict.getlist('addTimeRange[]', None)
 
         pageNo = request_dict.get('pageNo', None)
@@ -382,7 +356,7 @@ class AiServeView(View):
         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 or serialNumber:
+            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)
@@ -397,10 +371,6 @@ class AiServeView(View):
                     order_qs = order_qs.filter(status=status)
                 if use_status:
                     order_qs = order_qs.filter(use_status=use_status)
-                if serialNumber:
-                    device_info_qs = Device_Info.objects.filter(serial_number=serialNumber).values('UID')
-                    uid = device_info_qs[0]['UID'] if device_info_qs.exists() else 'N/A'
-                    order_qs = order_qs.filter(UID=uid)
                 if addTimeRange:
                     addStartTime, addEndTime = int(
                         addTimeRange[0][:-3]), int(addTimeRange[1][:-3])
@@ -460,17 +430,12 @@ class AiServeView(View):
                 if ai_service_qs.exists():
                     data_dict['endTime'] = ai_service_qs[0]['endTime']
                     data_dict['use_status'] = ai_service_qs[0]['use_status']
-                data_dict['serial_number'] = 'N/A'
-                device_info_qs = Device_Info.objects.filter(UID=order['UID']).values('serial_number')
-                if device_info_qs.exists():
-                    data_dict['serial_number'] = device_info_qs[0]['serial_number'] if device_info_qs[0][
-                        'serial_number'] else 'N/A'
                 data_list.append(data_dict)
             return response.json(
                 0, {'list': data_list, 'total': count})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def get_device_country(ip):
@@ -537,4 +502,4 @@ class AiServeView(View):
             return response.json(0, {'list': list_data})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))

+ 60 - 35
AdminController/DeviceManagementController.py

@@ -3,6 +3,7 @@
 import json
 import operator
 import time
+from bisect import bisect_left
 
 import oss2
 from django.db import transaction
@@ -122,7 +123,7 @@ class DeviceManagement(View):
                 if UID:
                     device_info_qs = Device_Info.objects.filter(UID__icontains=UID)
                 if serialNumber:
-                    device_info_qs = Device_Info.objects.filter(serial_number__icontains=serialNumber)
+                    device_info_qs = Device_Info.objects.filter(serial_number__icontains=serialNumber[:9])
                 if NickName:
                     device_info_qs = Device_Info.objects.filter(NickName__icontains=NickName)
                 if username:
@@ -161,17 +162,14 @@ class DeviceManagement(View):
                             device_info_list["datas"][k]['fields']['Type'] = device_type_qs[0]['name']
                         uid_set_qs = UidSetModel.objects.filter(
                             uid=device_info_list["datas"][k]['fields']['UID']).values('is_alexa', 'ip', 'version',
-                                                                                      'is_ai', 'is_human', 'cloud_vod',
-                                                                                      'ucode', 'device_type')
+                                                                                      'is_ai', 'is_human', 'cloud_vod')
                         if uid_set_qs.exists():
                             isAlexa = '是' if uid_set_qs[0]['is_alexa'] else '否'
                             isHuman = '是' if uid_set_qs[0]['is_human'] else '否'
-                            cloud_vod = CommonService.is_cloud_device(uid_set_qs[0]['ucode'],
-                                                                      uid_set_qs[0]['device_type'])
-                            if cloud_vod:
-                                cloud_vod = '支持'
-                            else:
+                            if uid_set_qs[0]['cloud_vod'] == 2:
                                 cloud_vod = '不支持'
+                            else:
+                                cloud_vod = '支持'
                             if uid_set_qs[0]['is_ai'] == 2:
                                 isAI = '不支持'
                             elif uid_set_qs[0]['is_ai'] == 1:
@@ -201,7 +199,7 @@ class DeviceManagement(View):
             return response.json(0, {'list': device_info_list, 'total': total})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     # 根据id删除设备
     def deleteDevice(self, request_dict, response):
@@ -222,7 +220,7 @@ class DeviceManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     # 重置设备主用户
     def resetPrimaryUser(self, request, request_dict, response):
@@ -246,7 +244,7 @@ class DeviceManagement(View):
             Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     # 重置设备云存
     def resetVod(self, request, request_dict, response):
@@ -271,9 +269,7 @@ class DeviceManagement(View):
                 # 删除和更新设备云存相关数据
                 UID_Bucket.objects.filter(uid=uid).delete()
                 Unused_Uid_Meal.objects.filter(uid=uid).delete()
-                AiService.objects.filter(uid=uid).delete()
                 Order_Model.objects.filter(UID=uid, order_type=0).delete()
-                Order_Model.objects.filter(UID=uid, order_type=1).delete()
                 StsCrdModel.objects.filter(uid=uid).delete()
                 VodHlsModel.objects.filter(uid=uid).delete()
                 # 删除vod_hls分表数据
@@ -284,7 +280,7 @@ class DeviceManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def reset_ai(request, request_dict, response):
@@ -312,7 +308,7 @@ class DeviceManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     # 获取设备类型数据
     def getDeviceTypeList(self, request_dict, response):
@@ -346,7 +342,7 @@ class DeviceManagement(View):
             return response.json(0, {'list': device_type_list, 'total': total})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     # 删除设备类型
     def deleteDeviceType(self, request_dict, response):
@@ -358,7 +354,7 @@ class DeviceManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     # 添加设备类型
     def addDeviceType(self, request, request_dict, response):
@@ -386,7 +382,7 @@ class DeviceManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def del_device_data(request_dict, response):
@@ -413,6 +409,7 @@ class DeviceManagement(View):
                 # 根据删除项删除相关数据
                 if '设备信息数据' in delDataOptions:
                     Device_Info.objects.filter(UID__in=uidList).delete()
+                    UidPushModel.objects.filter(uid_set__uid__in=uidList).delete()
                 if '设备配置数据' in delDataOptions:
                     UidSetModel.objects.filter(uid__in=uidList).delete()
                 if '设备推送数据' in delDataOptions:
@@ -512,7 +509,7 @@ class DeviceManagement(View):
             return response.json(0, {'list': app_device_type_list, 'total': total})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def get_app_bundle_id_list(response):
@@ -522,7 +519,7 @@ class DeviceManagement(View):
             return response.json(0, {'list': appBundleIdList})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def edit_app_device_type(request_dict, response):
@@ -547,7 +544,7 @@ class DeviceManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def delete_app_device_type(request_dict, response):
@@ -562,7 +559,7 @@ class DeviceManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def reset_all(request, request_dict, response):
@@ -580,7 +577,6 @@ class DeviceManagement(View):
                 UID_Bucket.objects.filter(uid=uid).delete()
                 Unused_Uid_Meal.objects.filter(uid=uid).delete()
                 Order_Model.objects.filter(UID=uid, order_type=0).delete()
-                Order_Model.objects.filter(UID=uid, order_type=1).delete()
                 StsCrdModel.objects.filter(uid=uid).delete()
                 VodHlsModel.objects.filter(uid=uid).delete()
                 # 删除vod_hls分表数据
@@ -700,11 +696,35 @@ class DeviceManagement(View):
             #  判断版本是否存在, 不存在则获取输入版本范围内最接近的输入版本
             version_number_list = []
             app_bundle_list = []
+            id_list = []
             for version in app_bundle_qs:
                 version = version['app_device_type__app_version_number_id']
-                version_parts = list(map(int, version.split('.')))
-                if version_parts <= version_number:
-                    version_number_list.append(version)
+                # 必须是版本号
+                if len(version) > 3:
+                    version_parts = list(map(int, version.split('.')))
+                    if version_parts <= version_number:
+                        version_number_list.append(version)
+                else:
+                    id_list.append(int(version))
+            # app_device_type__app_version_number_id为AppVersionNumber的主键时
+            version_list = []
+            if len(version_number_list) == 0:
+                version_qs = AppVersionNumber.objects.filter(
+                    id__in=id_list).values('version_number').distinct()
+                for version in version_qs:
+                    version_qs = AppVersionNumber.objects.filter(version_number=version['version_number'],
+                                                                 app_bundle__app_bundle_id=app_bundle_id).values('id')
+                    if not version_qs.exists():
+                        continue
+                    version_number_data = {
+                        version_qs[0]['id']: version['version_number']
+                    }
+                    version_list.append(version_number_data)
+                for version in version_list:
+                    for k, v in version.items():
+                        version_parts = list(map(int, v.split('.')))
+                        if version_parts <= version_number:
+                            version_number_list.append(k)
             # 版本号对应的设备信息图标
             for version_number in version_number_list:
                 app_bundle_qs = AppBundle.objects.filter(app_bundle_id=app_bundle_id,
@@ -718,17 +738,22 @@ class DeviceManagement(View):
                                                                                               'name', 'sort',
                                                                                               'app_device_type__app_version_number_id')
                 for app_bundle in app_bundle_qs:
-                    app_bundle_list.append({
-                        'model': app_bundle['model'],
-                        'type': app_bundle['type'],
-                        'icon': app_bundle['icon'],
-                        'name': app_bundle['name'],
-                        'sort': app_bundle['sort'],
-                        'app_device_type__app_version_number_id': app_bundle['app_device_type__app_version_number_id'],
-                    })
+                    device_type = any(item['type'] == app_bundle['type'] for item in app_bundle_list)
+                    if device_type:
+                        break
+                    else:
+                        app_bundle_list.append({
+                            'model': app_bundle['model'],
+                            'type': app_bundle['type'],
+                            'icon': app_bundle['icon'],
+                            'name': app_bundle['name'],
+                            'sort': app_bundle['sort'],
+                            'app_device_type__app_version_number_id': app_bundle[
+                                'app_device_type__app_version_number_id'],
+                        })
+            # 去重
             dvr_list = [app_bundle for app_bundle in app_bundle_list if app_bundle['model'] == 1]
             ipc_list = [app_bundle for app_bundle in app_bundle_list if app_bundle['model'] == 2]
-            print(dvr_list, ipc_list)
             res = {
                 'deviceDvr': sorted(dvr_list, key=operator.itemgetter('sort')),
                 'deviceIpc': sorted(ipc_list, key=operator.itemgetter('sort')),

+ 7 - 7
AdminController/LogManagementController.py

@@ -100,7 +100,7 @@ class LogManagementView(View):
                 0, {'list': qs_list, 'total': count})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def getDeviceIotInfoList(self, request_dict, response):
         serial_number = request_dict.get('serial_number', None)
@@ -153,7 +153,7 @@ class LogManagementView(View):
                 0, {'list': iot_device_info_list, 'total': total})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     # 通用发布MQTT通知
     @staticmethod
@@ -171,7 +171,7 @@ class LogManagementView(View):
                 return response.json(10044)
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def getAccessLogList(self, request_dict, response):
         user = request_dict.get('user', None)
@@ -210,7 +210,7 @@ class LogManagementView(View):
             return response.json(0, {'list': access_log_list, 'total': total})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def getDeviceLogList(self, request_dict, response):
         uid = request_dict.get('uid', None)
@@ -266,7 +266,7 @@ class LogManagementView(View):
             return response.json(0, {'list': device_log_list, 'total': total})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def getOperationLogList(self, request_dict, response):
         operation = request_dict.get('operation', None)
@@ -295,7 +295,7 @@ class LogManagementView(View):
                 0, {'list': log_list, 'total': count})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def getAppLogList(self, request_dict, response):
         """
@@ -351,4 +351,4 @@ class LogManagementView(View):
             return response.json(0, {'list': app_log_list, 'total': count})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))

+ 9 - 4
AdminController/ServeManagementController.py

@@ -20,7 +20,7 @@ from Controller.Cron.CronTaskController import CronUpdateDataView
 from Controller.UnicomCombo.UnicomComboTaskController import UnicomComboTaskView
 from Model.models import VodBucketModel, CDKcontextModel, Store_Meal, Order_Model, \
     UID_Bucket, ExperienceContextModel, Lang, CloudLogModel, UidSetModel, Unused_Uid_Meal, \
-    Device_Info, DeviceTypeModel, UnicomComboOrderInfo, AiService
+    Device_Info, DeviceTypeModel, UnicomComboOrderInfo, AiService, CountryModel
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.UnicomObject import UnicomObjeect
@@ -728,10 +728,15 @@ class serveManagement(View):
             order_ql = omqs.values("orderID", "UID", "userID__username", "userID__NickName", "channel", "desc", "price",
                                    "refunded_amount", "currency", "addTime", "updTime", "paypal", "payType",
                                    "rank__day", "rank__price", "status", "order_type", "paymentID", "trade_no",
-                                   "payTime")
+                                   "payTime", "userID__region_country")
             order_ql = order_ql.order_by('-addTime')  # 根据CDK创建时间降序排序
             order_ql = order_ql[(page - 1) * line:page * line]
             for order in order_ql:
+                # 查询国家信息
+                country = 'N/A'
+                country_qs = CountryModel.objects.filter(id=order['userID__region_country']).values('country_name')
+                if country_qs.exists():
+                    country = country_qs[0]['country_name']
                 serialNumber = CommonService.query_serial_with_uid(order['UID'])
                 data = {
                     'orderID': order['orderID'],
@@ -752,7 +757,8 @@ class serveManagement(View):
                     'status': order['status'],
                     'order_type': order['order_type'],
                     'payTime': order['payTime'] if order['payTime'] else 'N/A',
-                    'serialNumber': 'N/A' if serialNumber == order['UID'] else serialNumber
+                    'serialNumber': 'N/A' if serialNumber == order['UID'] else serialNumber,
+                    'country': country
                 }
                 #  订单显示(或不显示)停用/退款功能
                 if order['order_type'] == 0 or order['order_type'] == 1:  # 云存
@@ -976,7 +982,6 @@ class serveManagement(View):
                 eq.delete()
                 Order_Model.objects.filter(uid_bucket_id=bid).delete()
                 ubq.delete()
-                AiService.objects.filter(uid=ubq[0].uid).delete()
                 return response.json(0)
             else:
                 return response.json(10007)

+ 148 - 29
AdminController/UnicomManageController.py

@@ -4,24 +4,29 @@
 # @Email   : Guanhailogn@asj6.wecom.work
 # @File    : UnicomManageController.py
 # @Software: PyCharm
+import datetime
 import hashlib
 import json
 import time
 import uuid
-from Ansjer.config import CONFIG_INFO
+from decimal import Decimal
+
 import openpyxl
 import requests
 from django.db import transaction, connection
 from django.http import HttpResponse
 from django.views.generic.base import View
 
+from Ansjer.config import CONFIG_INFO
 from Ansjer.config import LOGGER
 from Controller.UnicomCombo.UnicomComboController import UnicomComboView
 from Model.models import UnicomDeviceInfo, UnicomCombo, Pay_Type, UnicomComboOrderInfo, Device_User, Order_Model, \
     ExchangeCode, UnicomFlowPush, SysMsgModel, UnicomComboExperienceHistory, LogModel
+from Object.Enums.WXOperatorEnum import WXOperatorEnum
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.UnicomObject import UnicomObjeect
+from Object.WXTechObject import WXTechObject
 from Service.CommonService import CommonService
 
 
@@ -82,6 +87,8 @@ class UnicomManageControllerView(View):
                 return self.create_package_cdk(request_dict, response)
             elif operation == 'resetCardPackage':
                 return self.reset_card_package(request, request_dict, response)
+            elif operation == 'getPackageDetails':
+                return self.get_package_details(request_dict, response)
             else:
                 return response.json(404)
 
@@ -95,8 +102,14 @@ class UnicomManageControllerView(View):
             now_time = int(time.time())
             if device_info_qs.exists():  # 首先查询SIM卡绑定信息是否存在
                 iccid = device_info_qs.first().iccid
-                if device_info_qs.first().card_type == 1:
-                    return response.json(0)
+                if device_info_qs.first().card_type == 1:  # 五兴电信
+                    data = {'iccids': iccid, 'operator': WXOperatorEnum.TELECOM.value}
+                    wx_tech = WXTechObject()
+                    res = wx_tech.delete_card_package(**data)
+                    if res['code'] == '0':
+                        UnicomComboExperienceHistory.objects.filter(iccid=iccid).delete()
+                        return response.json(0)
+                    return response.json(176)
                 flow_push_qs = UnicomFlowPush.objects.filter(serial_no=serial_number)
                 if flow_push_qs.exists():  # 删除流量预警推送
                     flow_push_qs.delete()
@@ -111,7 +124,7 @@ class UnicomManageControllerView(View):
                 combo_experience_history_qs = UnicomComboExperienceHistory.objects.filter(iccid=iccid)
                 if combo_experience_history_qs.exists():
                     combo_experience_history_qs.delete()
-                UnicomObjeect().change_device_to_activate(iccid)
+                UnicomObjeect().change_device_to_disable(iccid)  # 重置流量停用设备
                 ip = CommonService.get_ip_address(request)
                 describe = '重置4G流量序列号{},iccid:{}'.format(serial_number, iccid)
                 cls.generate_card_package_order(iccid, serial_number)
@@ -220,16 +233,11 @@ class UnicomManageControllerView(View):
             unicom_device_qs = unicom_device_qs[(page - 1) * line:page * line]
             list_data = []
             for unicom_device in unicom_device_qs:
-                data = {
-                    'iccid': unicom_device.iccid,
-                    'serialNo': unicom_device.serial_no,
-                    'userID': unicom_device.user_id,
-                    'cardType': unicom_device.card_type,
-                    'status': unicom_device.status,
-                    'mainCard': unicom_device.main_card,
-                    'createdTime': unicom_device.created_time,
-                    'updatedTime': unicom_device.updated_time
-                }
+                data = {'iccid': unicom_device.iccid, 'serialNo': unicom_device.serial_no,
+                        'userID': unicom_device.user_id, 'cardType': unicom_device.card_type,
+                        'status': unicom_device.status, 'mainCard': unicom_device.main_card,
+                        'createdTime': unicom_device.created_time, 'updatedTime': unicom_device.updated_time,
+                        'cardStatus': self.get_device_status_by_iccid(unicom_device.iccid, unicom_device.card_type)}
                 device_user_qs = Device_User.objects.filter(userID=unicom_device.user_id).values('username', 'NickName',
                                                                                                  'phone')
                 data['userName'] = device_user_qs[0]['username'] if device_user_qs.exists() else ''
@@ -249,8 +257,7 @@ class UnicomManageControllerView(View):
         """
         sql = 'SELECT '
         sql += 'du.username,du.phone,o.UID as uid,o.`status`,udi.serial_no as serialNo,o.orderID,o.`desc`, '
-        sql += 'o.price,uo.next_month_activate as nextActivate,uo.iccid,uo.`status` as useStatus, ' \
-               'uo.`flow_total_usage` as flowTotal, '
+        sql += 'o.price,uo.next_month_activate as nextActivate,uo.iccid,uo.`status` as useStatus,uo.`flow_total_usage`,'
         sql += 'uo.updated_time as upTime, uo.activation_time as acTime,uo.expire_time as epTime '
         sql += 'FROM orders o '
         sql += 'LEFT JOIN unicom_combo_order_info uo ON o.orderID = uo.order_id '
@@ -299,15 +306,7 @@ class UnicomManageControllerView(View):
             col_names = [desc[0] for desc in cursor.description]
             for item in data_obj:
                 order_dict = dict(zip(col_names, item))
-                if order_dict['status'] == 1:
-                    total_flow = UnicomObjeect.current_sim_traffic_usage_details(order_dict['iccid'])  # 4G总值
-                    flow_total_usage = order_dict['flowTotal']  # 激活时当月已用流量
-                    if flow_total_usage == '':  # 判断数值是否为空
-                        flow_total_usage = 0
-                    flow_total_usage = float(flow_total_usage)
-                    order_dict['using_total'] = total_flow - flow_total_usage
-                else:
-                    order_dict['using_total'] = 0
+                order_dict['using_total'] = 0
                 result_list.append(order_dict)
             return response.json(0, {'orderList': result_list, 'total': total})
         except Exception as e:
@@ -697,7 +696,7 @@ class UnicomManageControllerView(View):
             combo = combo_qs.first()
             exchange_code_list = []
             now_time = int(time.time())
-            if combo.combo_type == 3:
+            if combo.combo_type == 3:  # 五兴电信
                 for i in range(int(quantity)):
                     # 10位兑换码 后面两位为标识代表五兴电信
                     code = cls.generate_code() + 'WD'
@@ -706,10 +705,19 @@ class UnicomManageControllerView(View):
                                                            expire_time=0,
                                                            created_time=now_time,
                                                            updated_time=now_time))
-                if exchange_code_list:
-                    ExchangeCode.objects.bulk_create(exchange_code_list)
+            elif combo.combo_type == 0:  # 珠海联通
+                for i in range(int(quantity)):
+                    # 10位兑换码 后面两位为标识代表五兴电信
+                    code = cls.generate_code() + 'ZL'
+                    exchange_code_list.append(ExchangeCode(code=code, status=False, is_down=0,
+                                                           package_type=0, package_id=combo.id,
+                                                           expire_time=0,
+                                                           created_time=now_time,
+                                                           updated_time=now_time))
+            if exchange_code_list:
+                ExchangeCode.objects.bulk_create(exchange_code_list)
                 return response.json(0)
-            return response.json(0)
+            return response.json(178)
         except Exception as e:
             LOGGER.info('*****UnicomManageController.create_package_cdk:errLine:{}, errMsg:{}'
                         .format(e.__traceback__.tb_lineno, repr(e)))
@@ -726,3 +734,114 @@ class UnicomManageControllerView(View):
         # 取哈希值的前8位,并将其转换为大写字母
         code = sha1.hexdigest()[:8].upper()
         return code
+
+    @classmethod
+    def get_package_details(cls, request_dict, response):
+        """
+        根据序列号获取套餐包列表
+        """
+        serial_number = request_dict.get('serialNumber', None)
+        if not serial_number:
+            return response.json(444)
+        ud_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number) \
+            .values('iccid', 'card_type')
+        package_list = []
+        if not ud_qs.exists():
+            return response.json(0, {'packageList': package_list})
+        iccid = ud_qs[0]['iccid']
+        card_type = ud_qs[0]['card_type']
+        if card_type == 0:
+            o_qs = UnicomComboOrderInfo.objects.filter(iccid=iccid) \
+                .values('status', 'flow_total_usage', 'flow_exceed', 'activation_time', 'expire_time',
+                        'combo__combo_name', 'combo__flow_total', 'updated_time') \
+                .order_by('created_time')
+            if not o_qs:
+                return response.json(0, {'packageList': package_list})
+            return response.json(0, {'package_list': cls.get_unicom_package_list(iccid, o_qs)})
+        if card_type == 1:
+            data = {'iccid': iccid, 'operator': 3}
+            return response.json(0, {'package_list': cls.get_wx_package_list(**data)})
+
+    @staticmethod
+    def get_unicom_package_list(iccid, o_qs):
+        package_list = []
+        unicom_api = UnicomObjeect()
+        for i, item in enumerate(o_qs):
+            package_status = item['status']
+            flow_total = item['combo__flow_total']
+            flow_total_usage = float(unicom_api.get_flow_usage_total(iccid))
+            activate_flow = float(item['flow_total_usage']) if item['flow_total_usage'] else 0
+            used = 0
+            if package_status == 1:
+                used = flow_total_usage - activate_flow  # 已用流量
+            elif package_status == 2:
+                index = i + 1
+                if index < len(o_qs) and o_qs[index]['flow_total_usage']:
+                    package_used_flow = float(o_qs[i + 1]['flow_total_usage'])
+                    used = package_used_flow - activate_flow
+                else:
+                    used = flow_total_usage - activate_flow
+            status_dict = {0: "待使用", 1: "使用中", 2: "已失效"}
+            status = status_dict.get(item['status'])
+            package_list.append({
+                'packageName': item['combo__combo_name'],
+                'status': status,
+                'flowTotal': flow_total,
+                'used': Decimal(used).quantize(Decimal('0.00')),
+                'activationTime': datetime.datetime.fromtimestamp(item['activation_time']).strftime(
+                    '%Y-%m-%d %H:%M:%S'),
+                'expireTime': datetime.datetime.fromtimestamp(item['expire_time']).strftime('%Y-%m-%d %H:%M:%S'),
+                'updatedTime': datetime.datetime.fromtimestamp(item['updated_time']).strftime('%Y-%m-%d %H:%M:%S')
+            })
+        return package_list
+
+    @staticmethod
+    def get_wx_package_list(**data):
+        """
+        获取五兴套餐订购记录
+        @param data: iccid,operator
+        @return: 订购记录结果
+        """
+        try:
+            package_list = []
+            wx_tech = WXTechObject()
+            result = wx_tech.get_package_order_record(**data)
+            if not result:
+                return package_list
+            status_dict = {0: "待使用", 1: "使用中", 2: "已完成", 3: "已退订", 4: "已失效", 5: "已删除"}
+            for item in result['data']:
+                used_flow = float(item['flowTotal']) - float(item['flowRemain'])
+                package_list.append({
+                    'packageName': item['packageName'],
+                    'status': status_dict.get(int(item['state'])),
+                    'flowTotal': item['flowTotal'],
+                    'used': Decimal(used_flow).quantize(Decimal('0.00')),
+                    'activationTime': item['startDate'],
+                    'expireTime': item['endDate'],
+                    'updatedTime': ''
+                })
+            return package_list
+        except Exception as e:
+            print(repr(e))
+            return []
+
+    @staticmethod
+    def get_device_status_by_iccid(iccid, card_type):
+        try:
+            re_data = {'iccid': iccid}
+            if card_type == 0:
+                status_dict = {1: '已激活', 2: '可激活', 3: '已停用', 4: '已失效', 5: '可测试', 6: '库存', 7: '已更换', 8: '已清除'}
+                result = UnicomObjeect().query_device_status(**re_data)
+                res_dict = UnicomObjeect().get_text_dict(result)
+                return status_dict.get(int(res_dict['data']['status']), 'N/A')
+            elif card_type == 1:
+                status_dict = {1: '库存', 2: '可激活', 3: '已激活', 4: '已停用', 5: '已失效', 6: '强制停机'}
+                data = {'iccid': iccid, 'operator': 3}
+                wx_tech = WXTechObject()
+                result = wx_tech.get_cards_info(**data)
+                return status_dict.get(int(result['data']['cardStatusCode']), 'N/A')
+            else:
+                return 'N/A'
+        except Exception as e:
+            print(repr(e))
+            return 'N/A'

+ 13 - 13
AdminController/UserManageController.py

@@ -383,7 +383,7 @@ class UserManagement(View):
             return response.json(0, {'list': user_list, 'total': total})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def AddOrEditAccount(self, userID, request_dict, response):
         """
@@ -450,7 +450,7 @@ class UserManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def doDelete(self, request_dict, response):
         userID = request_dict.get('userID', '')
@@ -461,7 +461,7 @@ class UserManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def resetPassword(self, request_dict, response):
         userID = request_dict.get('userID', None)
@@ -476,7 +476,7 @@ class UserManagement(View):
                 return response.json(177)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def getFeedbackList(self, request_dict, response):
         """
@@ -550,7 +550,7 @@ class UserManagement(View):
             return response.json(0, {'list': feed_back_list, 'total': total})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def replyFeedBack(self, request_dict, response):
         feedBackID = request_dict.get('feedBackID', None)
@@ -572,7 +572,7 @@ class UserManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def sendSysMsgToUser(self, request_dict, response):
         """
@@ -595,7 +595,7 @@ class UserManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def deleteFeedBack(self, request_dict, response):
         feedBackID = request_dict.get('feedBackID', None)
@@ -609,7 +609,7 @@ class UserManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def getSysMessageList(self, request_dict, response):
         # 功能群发查询
@@ -632,7 +632,7 @@ class UserManagement(View):
             return response.json(0, {'list': list(sys_mass_qs), 'total': total})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def getAppDataList(self, request_dict, response):
         print('request_dict: ', request_dict)
@@ -653,7 +653,7 @@ class UserManagement(View):
             return response.json(0, {'appBundleId_list': appBundleId_list})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def sendSysMessage(self, request_dict, response):
         print('request_dict: ', request_dict)
@@ -694,7 +694,7 @@ class UserManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def collectFeedBack(self, request_dict, response):
         """收藏或取消收藏用户反馈信息"""
@@ -817,7 +817,7 @@ class UserManagement(View):
                 return response.json(177)
         except Exception as e:
             print('修改状态异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def getDeviceSuperPassword(self, request_dict, response):
         """
@@ -863,7 +863,7 @@ class UserManagement(View):
             return response.json(0, {'list': list(device_super_password_qs), 'count': count})
         except Exception as e:
             print('查询异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def deleteInformation(self, request_dict, response):
         """

+ 81 - 93
AdminController/VersionManagementController.py

@@ -3,13 +3,11 @@
 import os
 import hashlib
 import time
-import math
 
 import boto3
 import botocore
 from django.db import transaction
 from django.views.generic.base import View
-from Ansjer.config import LOGGER
 
 from Ansjer.config import BASE_DIR, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
 from Object.TokenObject import TokenObject
@@ -103,7 +101,7 @@ class VersionManagement(View):
             return response.json(0, {'list': equipment_version_list, 'total': total})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def upLoadFile(self, request, request_dict, response):
         file = request.FILES.get('file', None)
@@ -115,68 +113,64 @@ class VersionManagement(View):
         resolutionRatio = request_dict.get('resolutionRatio', '')
         Description = request_dict.get('Description', '')
         status = request_dict.get('status', 0)
-        isPopup = request_dict.get('isPopup', 0)
 
         if not all([file, mci, lang, ESN, max_ver, channel, resolutionRatio]):
             return response.json(444)
 
         try:
-            with transaction.atomic():
-                nowTime = CommonService.timestamp_to_str(timestamp=int(time.time()))
-                channel = int(channel)
-                resolutionRatio = int(resolutionRatio)
-                status = int(status)
-                isPopup = int(isPopup)
-                # 文件名为设备版本,最后一个'.'的前面为软件版本,后面为设备规格名称
-                # V2.2.4.16E201252CA,软件版本:2.2.4,设备规格名称:16E201252CA
-                # V1.7.2.36C11680X30411F000600000150001Z,软件版本:1.7.2,设备规格名称:36C11680X30411F000600000150001Z
-                file_name = str(file)  # 文件名
-                # .img和.tar.gz文件
-                file_type_index = file_name.find('.img')
+            nowTime = CommonService.timestamp_to_str(timestamp=int(time.time()))
+            channel = int(channel)
+            resolutionRatio = int(resolutionRatio)
+            status = int(status)
+            # 文件名为设备版本,最后一个'.'的前面为软件版本,后面为设备规格名称
+            # V2.2.4.16E201252CA,软件版本:2.2.4,设备规格名称:16E201252CA
+            # V1.7.2.36C11680X30411F000600000150001Z,软件版本:1.7.2,设备规格名称:36C11680X30411F000600000150001Z
+            file_name = str(file)  # 文件名
+            # .img和.tar.gz文件
+            file_type_index = file_name.find('.img')
+            if file_type_index == -1:
+                file_type_index = file_name.find('.tar')
                 if file_type_index == -1:
-                    file_type_index = file_name.find('.tar')
-                    if file_type_index == -1:
-                        return response.json(903)
-                version = file_name[:file_type_index]  # 设备版本
-                version_index = version.rindex('.')
-                softwareVersion = version[1:version_index]  # 软件版本
-                code = version[version_index + 1:]  # 设备规格名称
-                chipModelList2Code = code[:4]  # 主芯片
-                type = code[8:10]  # 设备机型
-                companyCode = code[-1:]  # 公司代码
-                fileSize = file.size
-                filePath = '/'.join(('static/otapack', mci, lang, file_name))
-                file_data = file.read()
-                fileMd5 = hashlib.md5(file_data).hexdigest()
-                data_dict = {'mci': mci, 'lang': lang, 'ESN': ESN, 'max_ver': max_ver, 'channel': channel,
-                             'resolutionRatio': resolutionRatio, 'Description': Description, 'status': status,
-                             'is_popup': isPopup, 'version': version, 'softwareVersion': softwareVersion, 'code': code,
-                             'chipModelList2Code': chipModelList2Code, 'type': type, 'companyCode': companyCode,
-                             'fileSize': fileSize, 'filePath': filePath, 'fileMd5': fileMd5, 'update_time': nowTime}
-                # Equipment_Version表创建或更新数据
-                equipment_version_qs = Equipment_Version.objects.filter(code=code, lang=lang)
-                if not equipment_version_qs.exists():
-                    Equipment_Version.objects.create(eid=CommonService.getUserID(getUser=False, setOTAID=True),
-                                                     **data_dict)
-                else:
-                    equipment_version_qs.update(**data_dict)
-
-                # 上传文件到服务器
-                upload_path = '/'.join((BASE_DIR, 'static/otapack', mci, lang)).replace('\\', '/') + '/'
-                if not os.path.exists(upload_path):  # 上传目录不存在则创建
-                    os.makedirs(upload_path)
-                # 文件上传
-                full_name = upload_path + file_name
-                if os.path.exists(full_name):  # 删除同名文件
-                    os.remove(full_name)
-                with open(full_name, 'wb+') as write_file:
-                    for chunk in file.chunks():
-                        write_file.write(chunk)
-                LOGGER.info('versionManagement/upLoadFile成功上传{}'.format(file_name))
-                return response.json(0)
+                    return response.json(903)
+            version = file_name[:file_type_index]  # 设备版本
+            version_index = version.rindex('.')
+            softwareVersion = version[1:version_index]  # 软件版本
+            code = version[version_index + 1:]  # 设备规格名称
+            chipModelList2Code = code[:4]  # 主芯片
+            type = code[8:10]  # 设备机型
+            companyCode = code[-1:]  # 公司代码
+            fileSize = file.size
+            filePath = '/'.join(('static/otapack', mci, lang, file_name))
+            file_data = file.read()
+            fileMd5 = hashlib.md5(file_data).hexdigest()
+            data_dict = {'mci': mci, 'lang': lang, 'ESN': ESN, 'max_ver': max_ver, 'channel': channel,
+                         'resolutionRatio': resolutionRatio, 'Description': Description, 'status': status,
+                         'version': version, 'softwareVersion': softwareVersion, 'code': code,
+                         'chipModelList2Code': chipModelList2Code, 'type': type, 'companyCode': companyCode,
+                         'fileSize': fileSize, 'filePath': filePath, 'fileMd5': fileMd5, 'update_time': nowTime}
+            # Equipment_Version表创建或更新数据
+            equipment_version_qs = Equipment_Version.objects.filter(code=code, lang=lang)
+            if not equipment_version_qs.exists():
+                Equipment_Version.objects.create(eid=CommonService.getUserID(getUser=False, setOTAID=True),
+                                                 **data_dict)
+            else:
+                equipment_version_qs.update(**data_dict)
+
+            # 上传文件到服务器
+            upload_path = '/'.join((BASE_DIR, 'static/otapack', mci, lang)).replace('\\', '/') + '/'
+            if not os.path.exists(upload_path):  # 上传目录不存在则创建
+                os.makedirs(upload_path)
+            # 文件上传
+            full_name = upload_path + file_name
+            if os.path.exists(full_name):   # 删除同名文件
+                os.remove(full_name)
+            with open(full_name, 'wb+') as write_file:
+                for chunk in file.chunks():
+                    write_file.write(chunk)
+            return response.json(0)
         except Exception as e:
-            LOGGER.info('versionManagement/upLoadFile接口异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            print(e)
+            return response.json(500, repr(e))
 
     def editVersionInformation(self, request_dict, response):
         eid = request_dict.get('eid', None)
@@ -200,7 +194,7 @@ class VersionManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def deleteEquipmentVersion(self, request_dict, response):
         eid = request_dict.get('eid', None)
@@ -219,7 +213,7 @@ class VersionManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def getAppVersionList(self, request_dict, response):
         app_type = request_dict.get('app_type', None)
@@ -255,7 +249,7 @@ class VersionManagement(View):
             return response.json(0, {'list': app_info_list, 'total': total})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def addOrEditAppInfo(self, request_dict, response):
         id = request_dict.get('id', None)
@@ -273,9 +267,9 @@ class VersionManagement(View):
             data_dict = {'appName': appName, 'appBundleId': appBundleId, 'bundleVersion': bundleVersion,
                          'newAppversion': newAppversion, 'minAppversion': minAppversion, 'content': content,
                          'app_type': app_type, 'downloadLink': downloadLink}
-            if not id:  # 添加
+            if not id:      # 添加
                 App_Info.objects.create(**data_dict)
-            else:  # 编辑
+            else:           # 编辑
                 app_info_qs = App_Info.objects.filter(id=id)
                 if not app_info_qs.exists():
                     return response.json(173)
@@ -283,7 +277,7 @@ class VersionManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def deleteAppVersion(self, request_dict, response):
         appBundleId = request_dict.get('appBundleId', None)
@@ -297,7 +291,7 @@ class VersionManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def getAppSet(self, request_dict, response):
         appBundleId = request_dict.get('appBundleId', None)
@@ -320,7 +314,7 @@ class VersionManagement(View):
                 return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def editAppSet(self, request_dict, response):
         appBundleId = request_dict.get('appBundleId', None)
@@ -334,7 +328,7 @@ class VersionManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def getAppRecordList_1(self, request_dict, response):
         app_type = request_dict.get('app_type', 'IOS')
@@ -355,15 +349,13 @@ class VersionManagement(View):
                     app_type = 2
                 else:
                     app_type = 3
-            app_colophon_qs = App_Colophon.objects.filter(app_id__app_type=app_type).order_by('app_id').values_list(
-                'app_id__appBundleId', flat=True).distinct()
+            app_colophon_qs = App_Colophon.objects.filter(app_id__app_type=app_type).order_by('app_id').values_list('app_id__appBundleId', flat=True).distinct()
             if not app_colophon_qs.exists():
                 return response.json(173)
             total = app_colophon_qs.count()
             app_colophon_list = list(app_colophon_qs[(page - 1) * line:page * line])
-            app_info_qs = App_Colophon.objects.filter(app_id__appBundleId__in=app_colophon_list). \
-                values("id", "lang", "newApp_version", "content", "version_time", "app_id__appBundleId",
-                       "app_id__appName", "app_id__app_type")
+            app_info_qs = App_Colophon.objects.filter(app_id__appBundleId__in=app_colophon_list).\
+                values("id", "lang", "newApp_version", "content","version_time", "app_id__appBundleId", "app_id__appName", "app_id__app_type")
             app_info_list = list(app_info_qs)
             data_dict = {}
             # 组装数据
@@ -385,7 +377,7 @@ class VersionManagement(View):
             return response.json(0, res)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def getAppRecordList(self, request_dict, response):
         app_type = request_dict.get('appType', 'IOS')
@@ -407,18 +399,16 @@ class VersionManagement(View):
                 app_type = 2
             else:
                 app_type = 3
-            app_colophon_qs = App_Colophon.objects.filter(app_id__app_type=app_type).order_by('app_id').values_list(
-                'app_id__appBundleId', flat=True).distinct()
+            app_colophon_qs = App_Colophon.objects.filter(app_id__app_type=app_type).order_by('app_id').values_list('app_id__appBundleId', flat=True).distinct()
             if not app_colophon_qs.exists():
                 return response.json(173)
             total = app_colophon_qs.count()
             app_colophon_list = list(app_colophon_qs[(page - 1) * line:page * line])
-            app_info_qs = App_Colophon.objects.filter(app_id__appBundleId__in=app_colophon_list). \
-                values("id", "lang", "newApp_version", "content", "version_time", "app_id__appBundleId",
-                       "app_id__appName", "app_id__app_type")
+            app_info_qs = App_Colophon.objects.filter(app_id__appBundleId__in=app_colophon_list).\
+                values("id", "lang", "newApp_version", "content", "version_time", "app_id__appBundleId", "app_id__appName", "app_id__app_type")
             app_info_list = list(app_info_qs)
-            app_record_list = []  # 响应的app record数据
-            appBundleId_list = []  # 记录已添加过的appBundleId
+            app_record_list = []    # 响应的app record数据
+            appBundleId_list = []   # 记录已添加过的appBundleId
             # 组装数据
             for app_info in app_info_list:
                 version = app_info['lang'] + app_info['newApp_version']
@@ -438,8 +428,7 @@ class VersionManagement(View):
                     if queryVersion and queryVersion == version and queryAppBundleId == app_info['app_id__appBundleId']:
                         app_record_dict['id'] = app_info['id']
                         app_record_dict['content'] = app_info['content']
-                        app_record_dict['version_time'] = time.strftime("%Y-%m-%d",
-                                                                        time.localtime(app_info['version_time']))
+                        app_record_dict['version_time'] = time.strftime("%Y-%m-%d", time.localtime(app_info['version_time']))
 
                     app_record_list.append(app_record_dict)
                 else:
@@ -450,8 +439,7 @@ class VersionManagement(View):
                         # app_record_list里对应字典插入值
                         app_record_list[index]['id'] = app_info['id']
                         app_record_list[index]['content'] = app_info['content']
-                        app_record_list[index]['version_time'] = time.strftime("%Y-%m-%d",
-                                                                               time.localtime(app_info['version_time']))
+                        app_record_list[index]['version_time'] = time.strftime("%Y-%m-%d", time.localtime(app_info['version_time']))
                         app_record_list[index]['version'] = version
                         app_record_list[index]['newApp_version_list'].insert(0, newApp_version_list)
                     else:
@@ -464,7 +452,7 @@ class VersionManagement(View):
             return response.json(0, res)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def getAppBundleIdList(self, request_dict, response):
         print('request_dict:', request_dict)
@@ -482,7 +470,7 @@ class VersionManagement(View):
             return response.json(0, {'appBundleIdList': appBundleIdList})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def addOrEditAppRecord(self, request_dict, response):
         print('request_dict:', request_dict)
@@ -499,13 +487,13 @@ class VersionManagement(View):
 
         try:
             version_time = int(time.mktime(time.strptime(version_time, '%Y-%m-%d')))  # 字符串转时间戳
-            if app_colophon_id:  # 编辑
+            if app_colophon_id:     # 编辑
                 # 编辑获取的版本信息前两位为语言
                 lang = newApp_version[:2]
                 newApp_version = newApp_version[2:]
                 App_Colophon.objects.filter(id=app_colophon_id).update(lang=lang, newApp_version=newApp_version,
                                                                        content=content, version_time=version_time)
-            else:  # 添加
+            else:   # 添加
                 app_info_qs = App_Info.objects.filter(appBundleId=appBundleId).values('id')
                 if not app_info_qs.exists():
                     return response.json(173)
@@ -527,7 +515,7 @@ class VersionManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def deleteAppRecord(self, request_dict, response):
         print('request_dict:', request_dict)
@@ -543,7 +531,7 @@ class VersionManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def getPcInfoList(self, request_dict, response):
         print('request_dict:', request_dict)
@@ -569,7 +557,7 @@ class VersionManagement(View):
             return response.json(0, {'list': pc_info_list, 'total': total})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def editPcVersion(self, request_dict, response):
         pc_info_id = request_dict.get('id', None)
@@ -613,7 +601,7 @@ class VersionManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def deletePcInfo(self, request_dict, response):
         print('request_dict:', request_dict)
@@ -642,4 +630,4 @@ class VersionManagement(View):
                 return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))

+ 38 - 38
AdminController/dataSystemManagement/HomeDataController.py

@@ -130,7 +130,7 @@ class HomeDataView(View):
                 usd_total = round(usd_total + temp_total.get('USD', 0), 2)
             order_total = {'cnyTotal': cny_total, 'usdTotal': usd_total}
             # 昨日云存订单销售额
-            vod_order_total = order_qs.filter(service_type__in=[0, 1])
+            vod_order_total = order_qs.filter(service_type=0)
             vod_cny_total = 0
             vod_usd_total = 0
             for item in vod_order_total:
@@ -138,17 +138,17 @@ class HomeDataView(View):
                 vod_cny_total = round(vod_cny_total + temp_total.get('CNY', 0), 2)
                 vod_usd_total = round(vod_usd_total + temp_total.get('USD', 0), 2)
             vod_order_total = {'cnyTotal': vod_cny_total, 'usdTotal': vod_usd_total}
-            # 昨日云盘订单销售额
-            icloud_order_total = order_qs.filter(service_type=4)
-            icloud_cny_total = 0
-            icloud_usd_total = 0
-            for item in icloud_order_total:
+            # 昨日AI订单销售额
+            ai_order_total = order_qs.filter(service_type=1)
+            ai_cny_total = 0
+            ai_usd_total = 0
+            for item in ai_order_total:
                 temp_total = eval(item['total'])
-                icloud_cny_total = round(icloud_cny_total + temp_total.get('CNY', 0), 2)
-                icloud_usd_total = round(icloud_usd_total + temp_total.get('USD', 0), 2)
-            icloud_order_total = {'cnyTotal': icloud_cny_total, 'usdTotal': icloud_usd_total}
+                ai_cny_total = round(ai_cny_total + temp_total.get('CNY', 0), 2)
+                ai_usd_total = round(ai_usd_total + temp_total.get('USD', 0), 2)
+            ai_order_total = {'cnyTotal': ai_cny_total, 'usdTotal': ai_usd_total}
             # 昨日联通订单销售额
-            unicom_order_total = order_qs.filter(service_type__in=[2, 3])
+            unicom_order_total = order_qs.filter(service_type=2)
             unicom_cny_total = 0
             unicom_usd_total = 0
             for item in unicom_order_total:
@@ -166,7 +166,7 @@ class HomeDataView(View):
                 usd_all_total = round(usd_all_total + temp_total.get('USD', 0), 2)
             order_all_total = {'cnyTotal': cny_all_total, 'usdTotal': usd_all_total}
             # 所有云存订单销售额
-            vod_order_all_total = order_all_qs.filter(service_type__in=[0, 1])
+            vod_order_all_total = order_all_qs.filter(service_type=0)
             vod_cny_all_total = 0
             vod_usd_all_total = 0
             for item in vod_order_all_total:
@@ -174,15 +174,15 @@ class HomeDataView(View):
                 vod_cny_all_total = round(vod_cny_all_total + temp_total.get('CNY', 0), 2)
                 vod_usd_all_total = round(vod_usd_all_total + temp_total.get('USD', 0), 2)
             vod_order_all_total = {'cnyTotal': vod_cny_all_total, 'usdTotal': vod_usd_all_total}
-            # 所有云盘订单销售额
-            icloud_order_all_total = order_all_qs.filter(service_type=4)
-            icloud_cny_all_total = 0
-            icloud_usd_all_total = 0
-            for item in icloud_order_all_total:
+            # 所有AI订单销售额
+            ai_order_all_total = order_all_qs.filter(service_type=1)
+            ai_cny_all_total = 0
+            ai_usd_all_total = 0
+            for item in ai_order_all_total:
                 temp_total = eval(item['total'])
-                icloud_cny_all_total = round(icloud_cny_all_total + temp_total.get('CNY', 0), 2)
-                icloud_usd_all_total = round(icloud_usd_all_total + temp_total.get('USD', 0), 2)
-            icloud_order_all_total = {'cnyTotal': icloud_cny_all_total, 'usdTotal': icloud_usd_all_total}
+                ai_cny_all_total = round(ai_cny_all_total + temp_total.get('CNY', 0), 2)
+                ai_usd_all_total = round(ai_usd_all_total + temp_total.get('USD', 0), 2)
+            ai_order_all_total = {'cnyTotal': ai_cny_all_total, 'usdTotal': ai_usd_all_total}
             # 所有联通订单销售额
             unicom_order_all_total = order_all_qs.filter(service_type=2)
             unicom_cny_all_total = 0
@@ -201,18 +201,18 @@ class HomeDataView(View):
                 'deviceAllCount': device_all_count,
                 'orderTotal': order_total,
                 'vodOrderTotal': vod_order_total,
-                'icloudOrderTotal': icloud_order_total,
+                'aiOrderTotal': ai_order_total,
                 'unicomOrderTotal': unicom_order_total,
                 'orderAllTotal': order_all_total,
                 'vodOrderAllTotal': vod_order_all_total,
-                'icloudOrderAllTotal': icloud_order_all_total,
+                'aiOrderAllTotal': ai_order_all_total,
                 'unicomOrderAllTotal': unicom_order_all_total,
                 'userIncreaseRegion': user_increase_region_list,
                 'userAllRegion': user_all_region_list
             }
             return response.json(0, res)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def query_sales_volume_data(cls, request_dict, response):
@@ -254,7 +254,7 @@ class HomeDataView(View):
                 order_list.append(res)
             return response.json(0, order_list)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def query_global_all_data(cls, request, request_dict, response):
@@ -278,11 +278,11 @@ class HomeDataView(View):
             device_all_count = 0
             order_total = {'cnyTotal': 0, 'usdTotal': 0}
             vod_order_total = {'cnyTotal': 0, 'usdTotal': 0}
-            icloud_order_total = {'cnyTotal': 0, 'usdTotal': 0}
+            ai_order_total = {'cnyTotal': 0, 'usdTotal': 0}
             unicom_order_total = {'cnyTotal': 0, 'usdTotal': 0}
             order_all_total = {'cnyTotal': 0, 'usdTotal': 0}
             vod_order_all_total = {'cnyTotal': 0, 'usdTotal': 0}
-            icloud_order_all_total = {'cnyTotal': 0, 'usdTotal': 0}
+            ai_order_all_total = {'cnyTotal': 0, 'usdTotal': 0}
             unicom_order_all_total = {'cnyTotal': 0, 'usdTotal': 0}
             user_increase_temp_list = []
             user_increase_list = []
@@ -309,10 +309,10 @@ class HomeDataView(View):
                         vod_order_total['cnyTotal'] + result['result']['vodOrderTotal']['cnyTotal'], 2)
                     vod_order_total['usdTotal'] = round(
                         vod_order_total['usdTotal'] + result['result']['vodOrderTotal']['usdTotal'], 2)
-                    icloud_order_total['cnyTotal'] = round(
-                        icloud_order_total['cnyTotal'] + result['result']['icloudOrderTotal']['cnyTotal'], 2)
-                    icloud_order_total['usdTotal'] = round(
-                        icloud_order_total['usdTotal'] + result['result']['icloudOrderTotal']['usdTotal'], 2)
+                    ai_order_total['cnyTotal'] = round(
+                        ai_order_total['cnyTotal'] + result['result']['aiOrderTotal']['cnyTotal'], 2)
+                    ai_order_total['usdTotal'] = round(
+                        ai_order_total['usdTotal'] + result['result']['aiOrderTotal']['usdTotal'], 2)
                     unicom_order_total['cnyTotal'] = round(
                         unicom_order_total['cnyTotal'] + result['result']['unicomOrderTotal']['cnyTotal'], 2)
                     unicom_order_total['usdTotal'] = round(
@@ -325,10 +325,10 @@ class HomeDataView(View):
                         vod_order_all_total['cnyTotal'] + result['result']['vodOrderAllTotal']['cnyTotal'], 2)
                     vod_order_all_total['usdTotal'] = round(
                         vod_order_all_total['usdTotal'] + result['result']['vodOrderAllTotal']['usdTotal'], 2)
-                    icloud_order_all_total['cnyTotal'] = round(
-                        icloud_order_all_total['cnyTotal'] + result['result']['icloudOrderAllTotal']['cnyTotal'], 2)
-                    icloud_order_all_total['usdTotal'] = round(
-                        icloud_order_all_total['usdTotal'] + result['result']['icloudOrderAllTotal']['usdTotal'], 2)
+                    ai_order_all_total['cnyTotal'] = round(
+                        ai_order_all_total['cnyTotal'] + result['result']['aiOrderAllTotal']['cnyTotal'], 2)
+                    ai_order_all_total['usdTotal'] = round(
+                        ai_order_all_total['usdTotal'] + result['result']['aiOrderAllTotal']['usdTotal'], 2)
                     unicom_order_all_total['cnyTotal'] = round(
                         unicom_order_all_total['cnyTotal'] + result['result']['unicomOrderAllTotal']['cnyTotal'], 2)
                     unicom_order_all_total['usdTotal'] = round(
@@ -394,18 +394,18 @@ class HomeDataView(View):
                 'deviceAllCount': device_all_count,
                 'orderTotal': order_total,
                 'vodOrderTotal': vod_order_total,
-                'icloudOrderTotal': icloud_order_total,
+                'aiOrderTotal': ai_order_total,
                 'unicomOrderTotal': unicom_order_total,
                 'orderAllTotal': order_all_total,
                 'vodOrderAllTotal': vod_order_all_total,
-                'icloudOrderAllTotal': icloud_order_all_total,
+                'aiOrderAllTotal': ai_order_all_total,
                 'unicomOrderAllTotal': unicom_order_all_total,
                 'userIncreaseRegion': user_increase_list,
                 'userAllRegion': user_all_list
             }
             return response.json(0, res)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def query_global_sales_volume_data(cls, request, request_dict, response):
@@ -441,7 +441,7 @@ class HomeDataView(View):
                     return response.json(result['result_code'], result['result'])
             return response.json(0, order_list)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def export_data(cls, request_dict, response):
@@ -475,4 +475,4 @@ class HomeDataView(View):
             #     res['Content-Disposition'] = 'attachment;filename="{}"'.format(file_name)
             return res
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))

+ 18 - 24
AdminController/dataSystemManagement/ServiceDataController.py

@@ -71,12 +71,10 @@ class ServiceDataView(View):
         if not all([start_time, end_time, time_unit, store_meal_type]):
             return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
         try:
-            store_meal_type = store_meal_type.split(',')
+            store_meal_type = int(store_meal_type)
             order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time, query_type=0,
-                                                    service_type__in=store_meal_type).values('count', 'country',
-                                                                                             'total',
-                                                                                             'device_type',
-                                                                                             'store_meal')
+                                                    service_type=store_meal_type).values('count', 'country', 'total',
+                                                                                         'device_type', 'store_meal')
             all_order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time).filter(
                 Q(query_type=0) | Q(query_type=1)).values('total', 'count')
             all_order_count = 0
@@ -207,7 +205,7 @@ class ServiceDataView(View):
             }
             return response.json(0, res)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def query_free_order(cls, request_dict, response):
@@ -228,10 +226,10 @@ class ServiceDataView(View):
         if not all([start_time, end_time, time_unit, store_meal_type]):
             return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
         try:
-            store_meal_type = store_meal_type.split(',')
+            store_meal_type = int(store_meal_type)
             order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time, query_type=1,
-                                                    service_type__in=store_meal_type).values('count', 'country',
-                                                                                             'device_type')
+                                                    service_type=store_meal_type).values('count', 'country',
+                                                                                         'device_type')
             free_order_count = order_qs.aggregate(count=Sum('count'))['count']
             free_order_count = free_order_count if free_order_count else 0  # 免费订单数量
             all_order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time).filter(
@@ -316,7 +314,7 @@ class ServiceDataView(View):
             }
             return response.json(0, res)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def query_first_pay_order(cls, request_dict, response):
@@ -337,11 +335,9 @@ class ServiceDataView(View):
         if not all([start_time, end_time, time_unit, store_meal_type]):
             return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
         try:
-            store_meal_type = store_meal_type.split(',')
             order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time, query_type=2,
-                                                    service_type__in=store_meal_type).values('count', 'country',
-                                                                                             'total',
-                                                                                             'device_type')
+                                                    service_type=store_meal_type).values('count', 'country', 'total',
+                                                                                         'device_type')
             all_order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time).filter(
                 Q(query_type=0) | Q(query_type=1)).values('total', 'count')
             all_order_count = 0
@@ -445,7 +441,7 @@ class ServiceDataView(View):
             }
             return response.json(0, res)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def query_repeat_pay_order(cls, request_dict, response):
@@ -466,11 +462,9 @@ class ServiceDataView(View):
         if not all([start_time, end_time, time_unit, store_meal_type]):
             return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
         try:
-            store_meal_type = store_meal_type.split(',')
             order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time, query_type=3,
-                                                    service_type__in=store_meal_type).values('count', 'country',
-                                                                                             'total',
-                                                                                             'device_type')
+                                                    service_type=store_meal_type).values('count', 'country', 'total',
+                                                                                         'device_type')
             repeat_pay_order_count = order_qs.aggregate(count=Sum('count'))['count']
             repeat_pay_order_count = repeat_pay_order_count if repeat_pay_order_count else 0
             all_order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time).filter(
@@ -578,7 +572,7 @@ class ServiceDataView(View):
             }
             return response.json(0, res)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def query_global_pay_order(cls, request, request_dict, response):
@@ -697,7 +691,7 @@ class ServiceDataView(View):
             }
             return response.json(0, res)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def query_global_free_order(cls, request, request_dict, response):
@@ -776,7 +770,7 @@ class ServiceDataView(View):
             }
             return response.json(0, res)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def query_global_first_pay_order(cls, request, request_dict, response):
@@ -871,7 +865,7 @@ class ServiceDataView(View):
             }
             return response.json(0, res)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def query_global_repeat_pay_order(cls, request, request_dict, response):
@@ -972,4 +966,4 @@ class ServiceDataView(View):
             }
             return response.json(0, res)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))

+ 2 - 2
Ansjer/cn_config/config_test.py

@@ -27,8 +27,8 @@ LOG_BUCKET = 'ansjer-statres'                       # 日志存储桶
 PUSH_CLOUD_PHOTO = 'push-cloud-photo'               # 推送云相册存储桶
 
 # redis节点
-SERVER_HOST = '127.0.0.1'
-PUSH_REDIS_ADDRESS = '127.0.0.1'
+SERVER_HOST = 'backendserver.3xavzq.0001.cnw1.cache.amazonaws.com.cn'
+PUSH_REDIS_ADDRESS = 'pushredis.3xavzq.0001.cnw1.cache.amazonaws.com.cn'
 # ======================================================================================================================
 
 # 域名

+ 2 - 2
Ansjer/cn_config/formal_settings.py

@@ -95,7 +95,7 @@ DATABASES = {
         'HOST': SERVER_HOST,
         'PORT': '3306',
         'AUTOCOMMIT': True,
-        # 'CONN_MAX_AGE': 1,
+        'CONN_MAX_AGE': 60,
         'OPTIONS': {
             'charset': 'utf8mb4',
             'use_unicode': True,
@@ -110,7 +110,7 @@ DATABASES = {
         'HOST': SERVER_HOST2,
         'PORT': '3306',
         'AUTOCOMMIT': True,
-        # 'CONN_MAX_AGE': 1,
+        'CONN_MAX_AGE': 60,
         'OPTIONS': {
             'charset': 'utf8mb4',
             'use_unicode': True,

+ 2 - 2
Ansjer/eur_config/config_formal.py

@@ -44,8 +44,8 @@ PAYPAL_CRD = {
     "client_id": "AdSRd6WBn-qLl9OiQHQuNYTDFSx0ZX0RUttqa58au8bPzoGYQUrt8bc6591RmH8_pEAIPijdvVYSVXyI",
     "client_secret": "ENT-J08N3Fw0B0uAokg4RukljAwO9hFHPf8whE6-Dwd8oBWJO8AWMgpdTKpfB1pOy89t4bsFEzMWDowm"
 }
-PAYPAL_WEB_HOOK_ID = '3YH86681TH784461T'
-PAYPAL_WEB_HOOK_ID_TWO = '7TN87895N70389928'
+PAYPAL_WEB_HOOK_ID = '3T5610747S126314V'
+PAYPAL_WEB_HOOK_ID_TWO = '4VS84179T6193840G'
 
 # 数据库dyanamo品牌日志数据库
 USER_BRAND = 'user_brand'

+ 2 - 2
Ansjer/eur_config/formal_settings.py

@@ -92,7 +92,7 @@ DATABASES = {
         'HOST': SERVER_HOST,
         'PORT': '3306',
         'AUTOCOMMIT': True,
-        'CONN_MAX_AGE': 60,
+        # 'CONN_MAX_AGE': 1,
         'OPTIONS': {
             'charset': 'utf8mb4',
             'use_unicode': True,
@@ -107,7 +107,7 @@ DATABASES = {
         'HOST': SERVER_HOST2,
         'PORT': '3306',
         'AUTOCOMMIT': True,
-        'CONN_MAX_AGE': 60,
+        # 'CONN_MAX_AGE': 1,
         'OPTIONS': {
             'charset': 'utf8mb4',
             'use_unicode': True,

+ 1 - 3
Ansjer/server_urls/loocam_url.py

@@ -9,8 +9,7 @@
 from django.urls import re_path
 
 from Controller.SensorGateway import GatewayFamilyRoomController, SubDeviceController, GatewayFamilyMemberController, \
-    EquipmentFamilyController, GatewayDeviceController, SmartSceneController, SmartSocketController, \
-    SmartSwitchController
+    EquipmentFamilyController, GatewayDeviceController, SmartSceneController, SmartSocketController
 
 urlpatterns = [
     re_path(r'^sensor/gateway/(?P<operation>.*)$', EquipmentFamilyController.EquipmentFamilyView.as_view()),
@@ -21,5 +20,4 @@ urlpatterns = [
     re_path(r'^gateway/device/info/(?P<operation>.*)$', GatewayDeviceController.GatewayDeviceView.as_view()),
     re_path(r'^smartscene/(?P<operation>.*)$', SmartSceneController.SmartSceneView.as_view()),
     re_path(r'^open/socket/(?P<operation>.*)$', SmartSocketController.SmartSocketView.as_view()),
-    re_path(r'^smartswitch/(?P<operation>.*)$', SmartSwitchController.SmartSwitchView.as_view()),
 ]

+ 327 - 226
Ansjer/urls.py

@@ -1,10 +1,10 @@
+from django.conf.urls import url
 from django.contrib import admin
-from django.urls import include
-from django.urls import re_path
+from django.urls import path, re_path
 
 from AdminController import UserManageController, RoleController, MenuController, TestServeController, \
     ServeManagementController, LogManagementController, DeviceManagementController, VersionManagementController, \
-    AiServeController, SurveysManageController, SerialManageController, IcloudManagementController
+    AiServeController, SurveysManageController, SerialManageController
 from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppInfo, \
     Test, MealManage, DeviceManage, EquipmentStatus, SysManage, DeviceLog, LogAccess, \
     AppColophon, DateController, \
@@ -25,252 +25,353 @@ from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppIn
     DeviceLogController, CouponController, AiController, ShadowController, AppAccountManagement, InitController
 from Controller.Cron import CronTaskController
 from Controller.MessagePush import EquipmentMessagePush
-from Controller.SensorGateway import SensorGatewayController, EquipmentFamilyController
 from Controller.Surveys import CloudStorageController
+from Controller.SensorGateway import SensorGatewayController, EquipmentFamilyController
+from django.urls import include
+
 from Controller.UserDevice import UserDeviceShareController
-from Controller.VseesWeb import VseesController
 
 urlpatterns = [
     re_path(r'init/(?P<operation>.*)', InitController.InitView.as_view()),
     re_path(r'^testApi/(?P<operation>.*)', TestApi.testView.as_view()),
     re_path(r'^account/authcode', UserController.authCodeView.as_view()),
     re_path(r'^v3/account/generatepictureCodeView/$', UserController.generatePictureCodeView.as_view()),
-    re_path(r'^v3/account/imageCodeRegister/$', UserController.Image_Code_RegisterView.as_view()),
-    re_path(r'^account/register$', UserController.registerView.as_view()),
-    re_path(r'^account/login$', UserController.v2LoginView.as_view()),
-    re_path(r'^account/logout$', UserController.LogoutView.as_view()),
-    re_path(r'^account/noPasslogin$', UserController.noPasslogin.as_view()),
-    re_path(r'^account/changePwd$', UserController.ChangePwdView.as_view()),
-    re_path(r'^account/forget$', UserController.ForgetPwdView.as_view()),
-    re_path(r'^account/email-re-pwd$', UserController.EmailResetPwdView.as_view()),
-    re_path(r'^account/refreshTk$', UserController.refreshTokenView.as_view()),
-    re_path(r'^v3/account/refreshTk$', UserController.refreshTokenViewV3.as_view()),
-    re_path(r'^v3/account/deleteUser$', UserController.DeleteUser.as_view()),
-    re_path(r'^favicon.ico$', UserManger.success, name=u'favicon.ico'),
-    re_path(r'^account/showUserMore$', UserManger.showUserMoreView.as_view()),
-    re_path(r'^account/perfectUserInfo$', UserManger.perfectUserInfoView.as_view()),
-    re_path(r'^account/getAvatar/(?P<filePath>.*)$', UserManger.getAvatarView.as_view()),
-    re_path(r'^account/delUser$', UserManger.delUserInterface),
-    re_path(r'^account/setUserValid$', UserManger.setUserValidView.as_view()),
-    re_path(r'^account/showAllUser$', UserManger.showAllUserInterface),
-    re_path(r'^account/help$', LogManager.HelpView.as_view()),
-    re_path(r'^account/searchUser$', shareUserPermission.searchUserView.as_view()),
-    re_path('accounts', AdminManage.search_user_by_content),  # 多条件搜索用户信息admin
-    re_path(r'^account/shareUserEquipment$', shareUserPermission.shareUserEquipmentView.as_view()),
-    re_path(r'^account/unsharedUserEquipment$', shareUserPermission.unsharedUserEquipmentView.as_view()),
-    re_path(r'^response/success$', UserManger.success),
-    re_path(r'^equipment/queryUserEquipment$', EquipmentManager.queryUserEquipmentInterface),
-    re_path(r'^equipment/addNewUserEquipment$', EquipmentManager.addNewUserEquipmentInterface),
-    re_path(r'^equipment/delUserEquipment$', EquipmentManager.delUserEquipmentInterface),
-    re_path(r'^equipment/modifyUserEquipment$', EquipmentManager.modifyUserEquipmentInterface),
-    re_path(r'^equipment/showAllUserEquipment$', EquipmentManager.showAllUserEquipmentInterface),
-    re_path(r'^equipment/findEquipmentInfo$', EquipmentManager.findEquipmentInfoInterface),
-    re_path(r'^equipment/delete', EquipmentManager.deleteInterface),
-    re_path(r'^equipment/batchDelete', EquipmentManager.batchDeleteInterface),
-    re_path(r'^equipment/add', EquipmentManager.addInterface),
-    re_path(r'^equipment/admin_add', EquipmentManager.admin_addInterface),
-    re_path(r'^equipment/admin_modify', EquipmentManager.admin_modifyInterface),
-    re_path(r'^equipment/query', EquipmentManager.queryInterface),
-    re_path(r'^equipment/flow$', EquipmentManager.uid_status),
-    re_path(r'^OTA/uploads$', OTAEquipment.getUploadFiletoDirView.as_view()),
-    re_path(r'^OTA/download$', OTAEquipment.downloadUpdataFileUrl),
-    re_path(r'^OTA/downloads/(\w+)/(\w+[\w+]*.+[^_w]*.\w+)$', OTAEquipment.downloadUpdataFileUrlInterface),
-    re_path(r'^OTA/getEquipmentVersion$', OTAEquipment.getEquipmentVersionInterface),
-    re_path(r'^OTA/getUpdataFileUrl$', OTAEquipment.getUpdataFileUrlInterface),
-    re_path(r'^OTA/addNewEquipmentVersion$', OTAEquipment.addNewEquipmentVersionInterface),
-    re_path(r'^roles/addNewRole$', PermissionManager.addNewRoleView.as_view()),
-    re_path(r'^roles/queryRole$', PermissionManager.queryRoleView.as_view()),
-    re_path(r'^roles/delRole$', PermissionManager.delRoleView.as_view()),
-    re_path(r'^roles/modifyRole$', PermissionManager.modifyRoleView.as_view()),
-    re_path(r'^perms/addNewPerms$', PermissionManager.addNewPermsView.as_view()),
-    re_path(r'^perms/delPerms$', PermissionManager.delPermsView.as_view()),
-    re_path(r'^perms/queryPerms$', PermissionManager.queryPermsView.as_view()),
-    re_path(r'^perms/modifyPerms$', PermissionManager.modifyPermsView.as_view()),
-    re_path(r'^permsManager/queryRolePerms$', PermissionManager.queryRolePermsView.as_view()),
-    re_path(r'^uploads/upgrade$', OTAEquipment.getUploadFiletoDirView.as_view()),
-    re_path(r'^upgrade/download/(\w+.[^_w]*\w+.\w+)$', CheckUserData.download_file),
-    re_path(r'^downloads/upgrade/(\w+)/(\w+.[^_w]*\w+.\w+)$', OTAEquipment.downloadUpdataFileUrlInterface),
-    re_path(r'^getOTAurl/getUpdataFileUrl$', OTAEquipment.getUpdataFileUrlInterface),
-    re_path(r'^equipment/info', EquipmentInfo.EquipmentInfo.as_view()),
-    re_path(r'^adminManage/manage', AdminManage.AdminManage.as_view()),
-    re_path(r'^equipment/OTA', EquipmentOTA.EquipmentOTA.as_view()),
-    re_path(r'^userbrandinfo/(?P<operation>.*)$', UserBrandController.UserBrandInfo.as_view()),
-    re_path(r'^uidset/(?P<operation>.*)$', UidSetController.UidSetView.as_view()),
-    re_path(r'^appInfo', AppInfo.AppInfo.as_view()),
-    re_path(r'^meal/manage', MealManage.MealManage.as_view()),
-    re_path(r'^device/manage$', DeviceManage.DeviceManage.as_view()),
-    re_path(r'^device/online$', EquipmentStatus.EquipmentOnline),
-    re_path(r'^device/offline$', EquipmentStatus.EquipmentOffline),
-    re_path(r'^device/updateIP$', EquipmentStatus.updateIP),
-    re_path(r'^sys/updateLog', SysManage.updateLog),
-    re_path(r'^devices/(\w+)/logs$', DeviceLog.DeviceLog),
-    re_path(r'^devices/(\w+)$', DeviceManage.Devices),
-    re_path(r'^LogAccess$', LogAccess.LogAccess),
-    re_path(r'^HelpCHM/upload$', LogManager.upload_help_chm),
-    re_path(r'^admin/userIDs$', AdminManage.getUserIds),
-    re_path('eq/delById', EquipmentInfo.deleteExpireEquipmentInfoById),
-    re_path(r'^OTA/getNewVer', OTAEquipment.getNewVerInterface),
-    re_path(r'^OTA/uploadsPack$', OTAEquipment.uploadOTAInterfaceView.as_view()),
-    re_path(r'^OTA/downloadsPack/(?P<fullPath>[0-9\w/.\-]+)', OTAEquipment.downloadOTAInterface),
-    re_path(r'^dlotapack/(?P<fullPath>[0-9\w/.\-]+)', OTAEquipment.downloadOTAInterfaceV2),
-    re_path(r'^OTA/getDownLoadOTApackUrl$', OTAEquipment.getDownLoadOTApackUrl),
-    re_path(r'^OTA/checkMaxVersion$', OTAEquipment.checkMaxVersion),
-    re_path(r'^v2/account/authcode$', UserController.v2authCodeView.as_view()),
-    re_path(r'^v2/account/register$', UserController.v2registerView.as_view()),
-    re_path(r'^v2/account/forgetCode$', UserController.v2forgetPwdCodeView.as_view()),
-    re_path(r'^v2/account/resetPwdByCode$', UserController.v2resetPwdByCodeView.as_view()),
-    re_path(r'^v2/authcode/verify$', UserController.verifyAuthcode.as_view()),
-    re_path(r'^v2/account/logout$', UserController.V2LogoutView.as_view()),
-    re_path(r'^v2/account/login$', UserController.v3LoginView.as_view()),
-    re_path(r'^v3/account/login$', UserController.v3LoginView.as_view()),
-    re_path(r'^account/oneClickLogin$', UserController.oneClickLoginView.as_view()),
-    re_path(r'^account/createPwd$', UserController.createPwd.as_view()),
-    re_path(r'^account/delete$', UserController.deleteAccount),
-    re_path(r'^user/confirmRegion$', UserController.confirmRegion),
-    re_path(r'^account/loginCode$', UserController.loginCodeView.as_view()),
-    re_path(r'^v3/account/loginByCode$', UserController.v3LoginByCodeView.as_view()),
-    re_path(r'^v3/account/loginByFingerprint$', UserController.v3LoginByFingerprintView.as_view()),
-    re_path(r'^v3/account/setFingerprint$', UserController.v3SetFingerprintView.as_view()),
-    re_path(r'^detect/(?P<operation>.*)$', DetectController.DetectControllerView.as_view()),
-    re_path(r'^detectV2/(?P<operation>.*)$', DetectControllerV2.DetectControllerViewV2.as_view()),
-    re_path(r'^cloudVod/(?P<operation>.*)$', CloudVod.CloudVodView.as_view()),
-    re_path(r'^meal/(?P<operation>.*)$', MealManage.MealView.as_view()),
-    re_path(r'^order/(?P<operation>.*)$', OrderContrller.OrderView.as_view()),
-    re_path(r'^appCol/(?P<operation>.*)$', AppColophon.AppColView.as_view()),
-    re_path(r'^vodBucket/(?P<operation>.*)$', VodBucket.VodBucketView.as_view()),
-    re_path(r'^UIDBucket/(?P<operation>.*)$', VodBucket.UidBucketView.as_view()),
-    re_path(r'^EquipmentVersion/(?P<operation>.*)$', EquipmentOTA.EquipmentVersionView.as_view()),
-    re_path(r'^deviceShare/(?P<operation>.*)$', DeviceShare.DeviceShareView.as_view()),
-    re_path(r'^appVer/views$', AppInfo.AppVersionView.as_view()),
-    re_path(r'^user/initInfo$', UserController.InitInfoView.as_view()),
-    re_path(r'^user/information/(?P<operation>.*)$', UserController.InitUserInformationView.as_view()),
-    re_path(r'^getTZ$', EquipmentStatus.getTZ),
-    re_path(r'^stsOss/(?P<operation>.*)$', StsOssController.StsOssView.as_view()),
-    re_path(r'^feedback/(?P<operation>.*)$', FeedBack.FeedBackView.as_view()),
-    re_path(r'^uidpreview/(?P<operation>.*)$', UIDPreview.UIDPreview.as_view()),
-    re_path(r'^sysmsg/(?P<operation>.*)$', SysMsg.SysMsgView.as_view()),
-    re_path(r'^sysfile/(?P<filePath>.*)$', SysManage.getStatView.as_view()),
-    re_path(r'^equipment/flowUpdate', EquipmentManager.update_uid_set),
-    re_path(r'^log/getUploadUrl', EquipmentStatus.getUploadLogUrl),
-    re_path(r'^app/getIdData', AppInfo.AppIdDataView.as_view()),
-    re_path(r'^wechat/authsign', UserController.wxAuthSignView.as_view()),
-    re_path(r'^wechat/perfect', UserController.wxPerfectView.as_view()),
-    re_path(r'^Test', Test.Test.as_view()),
-    re_path(r'^oauth/authcode', UserController.OauthAuthCodeView.as_view()),
-    re_path(r'^oauth/perfect', UserController.OauthPerfectView.as_view()),
-    re_path(r'^oauth/unbunding', UserController.UnbundingWXView.as_view()),
-    re_path(r'^equipment/judge', EquipmentManager.judgeInterface),
-    re_path(r'^uiduser/add', UidUser.addInterface),
-    re_path(r'^uiduser/query', UidUser.queryInterface),
-    re_path(r'^uiduser/update', UidUser.updateInterface),
-    re_path(r'^uiduser/delete', UidUser.deleteInterface),
-    re_path(r'^uid_user/(?P<operation>.*)$', UidUser.UidUserView.as_view()),
-    re_path(r'^v2/equipment/(?P<operation>.*)$', EquipmentManagerV2.EquipmentManagerV2.as_view()),
-    re_path(r'^msg/init', SysManage.initMsgFunc),
-    re_path(r'^oss_crd/(?P<operation>.*)$', OssCrd.OssCrdView.as_view()),
-    re_path(r'^push_deploy/(?P<operation>.*)$', PushDeploy.PushDeployView.as_view()),
-    re_path(r'^oalexa/auth', UserController.alexaAuthView.as_view()),
-    re_path(r'^oalexa/discoveryuid', UserController.alexaUidView.as_view()),
+    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/noPasslogin$', UserController.noPasslogin.as_view()),
+    url(r'^account/changePwd$', UserController.ChangePwdView.as_view()),
+    url(r'^account/forget$', UserController.ForgetPwdView.as_view()),
+    url(r'^account/email-re-pwd$', UserController.EmailResetPwdView.as_view()),
+    url(r'^account/refreshTk$', UserController.refreshTokenView.as_view()),
+    url(r'^v3/account/refreshTk$', UserController.refreshTokenViewV3.as_view()),
+    url(r'^v3/account/deleteUser$', UserController.DeleteUser.as_view()),
+    url(r'^favicon.ico$', UserManger.success, name=u'favicon.ico'),
+    url(r'^account/showUserMore$', UserManger.showUserMoreView.as_view()),
+    url(r'^account/perfectUserInfo$', UserManger.perfectUserInfoView.as_view()),
+    url(r'^account/getAvatar/(?P<filePath>.*)$', UserManger.getAvatarView.as_view()),
+    url(r'^account/delUser$', UserManger.delUserInterface),
+    url(r'^account/setUserValid$', UserManger.setUserValidView.as_view()),
+    url(r'^account/showAllUser$', UserManger.showAllUserInterface),
+    url(r'^account/help$', LogManager.HelpView.as_view()),
+    url(r'^account/searchUser$', shareUserPermission.searchUserView.as_view()),
+    path('accounts', AdminManage.search_user_by_content),  # 多条件搜索用户信息admin
+    url(r'^account/shareUserEquipment$', shareUserPermission.shareUserEquipmentView.as_view()),
+    url(r'^account/unsharedUserEquipment$', shareUserPermission.unsharedUserEquipmentView.as_view()),
+    url(r'^response/success$', UserManger.success),
+    url(r'^equipment/queryUserEquipment$', EquipmentManager.queryUserEquipmentInterface),
+    url(r'^equipment/addNewUserEquipment$', EquipmentManager.addNewUserEquipmentInterface),
+    url(r'^equipment/delUserEquipment$', EquipmentManager.delUserEquipmentInterface),
+    url(r'^equipment/modifyUserEquipment$', EquipmentManager.modifyUserEquipmentInterface),
+    url(r'^equipment/showAllUserEquipment$', EquipmentManager.showAllUserEquipmentInterface),
+    url(r'^equipment/findEquipmentInfo$', EquipmentManager.findEquipmentInfoInterface),
+    # 新删除设备接口
+    url(r'^equipment/delete', EquipmentManager.deleteInterface),
+    url(r'^equipment/batchDelete', EquipmentManager.batchDeleteInterface),
+    url(r'^equipment/add', EquipmentManager.addInterface),
+    url(r'^equipment/admin_add', EquipmentManager.admin_addInterface),
+    url(r'^equipment/admin_modify', EquipmentManager.admin_modifyInterface),
+
+    url(r'^equipment/query', EquipmentManager.queryInterface),
+    # 获取设备影子信息接口
+    url(r'^equipment/flow$', EquipmentManager.uid_status),
+
+    url(r'^OTA/uploads$', OTAEquipment.getUploadFiletoDirView.as_view()),
+    url(r'^OTA/download$', OTAEquipment.downloadUpdataFileUrl),
+    url(r'^OTA/downloads/(\w+)/(\w+[\w+]*.+[^_w]*.\w+)$', OTAEquipment.downloadUpdataFileUrlInterface),
+    url(r'^OTA/getEquipmentVersion$', OTAEquipment.getEquipmentVersionInterface),
+    url(r'^OTA/getUpdataFileUrl$', OTAEquipment.getUpdataFileUrlInterface),
+    url(r'^OTA/addNewEquipmentVersion$', OTAEquipment.addNewEquipmentVersionInterface),
+
+    url(r'^roles/addNewRole$', PermissionManager.addNewRoleView.as_view()),
+    url(r'^roles/queryRole$', PermissionManager.queryRoleView.as_view()),
+    url(r'^roles/delRole$', PermissionManager.delRoleView.as_view()),
+    url(r'^roles/modifyRole$', PermissionManager.modifyRoleView.as_view()),
+    url(r'^perms/addNewPerms$', PermissionManager.addNewPermsView.as_view()),
+    url(r'^perms/delPerms$', PermissionManager.delPermsView.as_view()),
+    url(r'^perms/queryPerms$', PermissionManager.queryPermsView.as_view()),
+    url(r'^perms/modifyPerms$', PermissionManager.modifyPermsView.as_view()),
+    url(r'^permsManager/queryRolePerms$', PermissionManager.queryRolePermsView.as_view()),
+    url(r'^uploads/upgrade$', OTAEquipment.getUploadFiletoDirView.as_view()),
+    url(r'^upgrade/download/(\w+.[^_w]*\w+.\w+)$', CheckUserData.download_file),
+    url(r'^downloads/upgrade/(\w+)/(\w+.[^_w]*\w+.\w+)$', OTAEquipment.downloadUpdataFileUrlInterface),
+    url(r'^getOTAurl/getUpdataFileUrl$', OTAEquipment.getUpdataFileUrlInterface),
+    url(r'^equipment/info', EquipmentInfo.EquipmentInfo.as_view()),
+    url(r'^adminManage/manage', AdminManage.AdminManage.as_view()),  # 管理员专属view
+    url(r'^equipment/OTA', EquipmentOTA.EquipmentOTA.as_view()),  # OTA重构类
+    url(r'^userbrandinfo/(?P<operation>.*)$', UserBrandController.UserBrandInfo.as_view()),  # 用户登录的手机端品牌记录统计信息表
+
+    url(r'^uidset/(?P<operation>.*)$', UidSetController.UidSetView.as_view()),
+    url(r'^appInfo', AppInfo.AppInfo.as_view()),  # app版本信息
+
+    url(r'^meal/manage', MealManage.MealManage.as_view()),
+    url(r'^device/manage$', DeviceManage.DeviceManage.as_view()),
+    # 设备在线
+    url(r'^device/online$', EquipmentStatus.EquipmentOnline),
+    # 设备离线
+    url(r'^device/offline$', EquipmentStatus.EquipmentOffline),
+    # 设备离线
+    url(r'^device/updateIP$', EquipmentStatus.updateIP),
+    # 系统ctr
+    url(r'^sys/updateLog', SysManage.updateLog),
+    url(r'^devices/(\w+)/logs$', DeviceLog.DeviceLog),
+    url(r'^devices/(\w+)$', DeviceManage.Devices),
+    # 访问日志 mongodb版
+    url(r'^LogAccess$', LogAccess.LogAccess),
+    # 上传操作文档
+    url(r'^HelpCHM/upload$', LogManager.upload_help_chm),
+    url(r'^admin/userIDs$', AdminManage.getUserIds),
+    path('eq/delById', EquipmentInfo.deleteExpireEquipmentInfoById),
+    # 新需求ota接口
+    url(r'^OTA/getNewVer', OTAEquipment.getNewVerInterface),
+    url(r'^OTA/uploadsPack$', OTAEquipment.uploadOTAInterfaceView.as_view()),
+    url(r'^OTA/downloadsPack/(?P<fullPath>[0-9\w/.\-]+)', OTAEquipment.downloadOTAInterface),
+    url(r'^dlotapack/(?P<fullPath>[0-9\w/.\-]+)', OTAEquipment.downloadOTAInterfaceV2),
+    url(r'^OTA/getDownLoadOTApackUrl$', OTAEquipment.getDownLoadOTApackUrl),
+    url(r'^OTA/checkMaxVersion$', OTAEquipment.checkMaxVersion),
+
+    # h获取验证码    # v2接口
+    url(r'^v2/account/authcode$', UserController.v2authCodeView.as_view()),
+    url(r'^v2/account/register$', UserController.v2registerView.as_view()),
+    url(r'^v2/account/forgetCode$', UserController.v2forgetPwdCodeView.as_view()),
+    url(r'^v2/account/resetPwdByCode$', UserController.v2resetPwdByCodeView.as_view()),
+
+    # 重置密码验证码校验
+    url(r'^v2/authcode/verify$', UserController.verifyAuthcode.as_view()),
+    url(r'^v2/account/logout$', UserController.V2LogoutView.as_view()),
+    url(r'^v2/account/login$', UserController.v3LoginView.as_view()),
+    url(r'^v3/account/login$', UserController.v3LoginView.as_view()),
+    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),
+
+    # 验证码登录
+    url(r'^account/loginCode$', UserController.loginCodeView.as_view()),
+    url(r'^v3/account/loginByCode$', UserController.v3LoginByCodeView.as_view()),
+
+    # 指纹登录
+    url(r'^v3/account/loginByFingerprint$', UserController.v3LoginByFingerprintView.as_view()),
+    url(r'^v3/account/setFingerprint$', UserController.v3SetFingerprintView.as_view()),
+
+    # 推送项目接口
+    url(r'^detect/(?P<operation>.*)$', DetectController.DetectControllerView.as_view()),
+    url(r'^detectV2/(?P<operation>.*)$', DetectControllerV2.DetectControllerViewV2.as_view()),
+
+    # 新增
+    url(r'^cloudVod/(?P<operation>.*)$', CloudVod.CloudVodView.as_view()),
+    url(r'^meal/(?P<operation>.*)$', MealManage.MealView.as_view()),
+    url(r'^order/(?P<operation>.*)$', OrderContrller.OrderView.as_view()),
+    url(r'^appCol/(?P<operation>.*)$', AppColophon.AppColView.as_view()),
+    url(r'^vodBucket/(?P<operation>.*)$', VodBucket.VodBucketView.as_view()),
+    url(r'^UIDBucket/(?P<operation>.*)$', VodBucket.UidBucketView.as_view()),
+    url(r'^EquipmentVersion/(?P<operation>.*)$', EquipmentOTA.EquipmentVersionView.as_view()),
+
+    url(r'^deviceShare/(?P<operation>.*)$', DeviceShare.DeviceShareView.as_view()),
+    url(r'^appVer/views$', AppInfo.AppVersionView.as_view()),
+
+    # 屏蔽
+    url(r'^user/initInfo$', UserController.InitInfoView.as_view()),
+    url(r'^user/information/(?P<operation>.*)$', UserController.InitUserInformationView.as_view()),
+    # 获取时区相关信息
+    url(r'^getTZ$', EquipmentStatus.getTZ),
+
+    # oss授权
+    url(r'^stsOss/(?P<operation>.*)$', StsOssController.StsOssView.as_view()),
+
+    # 用户反馈信息
+    url(r'^feedback/(?P<operation>.*)$', FeedBack.FeedBackView.as_view()),
+    url(r'^uidpreview/(?P<operation>.*)$', UIDPreview.UIDPreview.as_view()),
+    url(r'^sysmsg/(?P<operation>.*)$', SysMsg.SysMsgView.as_view()),
+    url(r'^sysfile/(?P<filePath>.*)$', SysManage.getStatView.as_view()),
+
+    url(r'^equipment/flowUpdate', EquipmentManager.update_uid_set),
+
+    url(r'^log/getUploadUrl', EquipmentStatus.getUploadLogUrl),
+    url(r'^app/getIdData', AppInfo.AppIdDataView.as_view()),
+    url(r'^wechat/authsign', UserController.wxAuthSignView.as_view()),
+    url(r'^wechat/perfect', UserController.wxPerfectView.as_view()),
+    # 分区分流
+    path('Test', Test.Test.as_view()),
+    # 微信绑定的用户获取验证码
+    url(r'^oauth/authcode', UserController.OauthAuthCodeView.as_view()),
+    url(r'^oauth/perfect', UserController.OauthPerfectView.as_view()),
+    url(r'^oauth/unbunding', UserController.UnbundingWXView.as_view()),
+
+    url(r'^equipment/judge', EquipmentManager.judgeInterface),
+
+    # ap模式,新增设备表
+    url(r'^uiduser/add', UidUser.addInterface),
+    url(r'^uiduser/query', UidUser.queryInterface),
+    url(r'^uiduser/update', UidUser.updateInterface),
+    url(r'^uiduser/delete', UidUser.deleteInterface),
+    url(r'^uid_user/(?P<operation>.*)$', UidUser.UidUserView.as_view()),
+    # add query update delete
+    url(r'^v2/equipment/(?P<operation>.*)$', EquipmentManagerV2.EquipmentManagerV2.as_view()),
+
+    url(r'^msg/init', SysManage.initMsgFunc),
+
+    url(r'^oss_crd/(?P<operation>.*)$', OssCrd.OssCrdView.as_view()),
+    url(r'^push_deploy/(?P<operation>.*)$', PushDeploy.PushDeployView.as_view()),
+    url(r'^oalexa/auth', UserController.alexaAuthView.as_view()),
+    url(r'^oalexa/discoveryuid', UserController.alexaUidView.as_view()),
     re_path(r'^oalexa/discoveryswitch', UserController.alexaSwitchView.as_view()),
     re_path('appset/(?P<operation>.*)', AppSetController.AppSetView.as_view()),
-    re_path(r'^application/(?P<operation>.*)$', ApplicationController.ApplicationView.as_view()),
-    re_path(r'^login/oauth/(?P<operation>.*)$', ApplicationController.AuthView.as_view()),
-    re_path(r'^grant/code/(?P<operation>.*)$', ApplicationController.GrantCodeView.as_view()),
-    re_path(r'^user/ex/(?P<operation>.*)$', UserExController.UserExView.as_view()),
-    re_path(r'^v3/equipment/(?P<operation>.*)$', EquipmentManagerV3.EquipmentManagerV3.as_view()),
-    re_path(r'^cloudstorage/(?P<operation>.*)$', CloudStorage.CloudStorageView.as_view()),
-    re_path(r'^payCycle/(?P<operation>.*)$', PaymentCycle.PaypalCycleNotify.as_view()),
-    re_path(r'^paypalCycleNotify/(?P<operation>.*)$', PaymentCycle.PaypalCycleNotify.as_view()),
-    re_path(r'^paymentCycle/(?P<operation>.*)$', PaymentCycle.payCycle.as_view()),
-    re_path(r'^AiService/(?P<operation>.*)$', AiController.AiView.as_view()),
-    re_path(r'^app/setting/notification/(?P<operation>.*)$', EquipmentMessagePush.EquipmentMessagePushView.as_view()),
-    re_path(r'^v3/account/changePwd$', UserController.v3ChangePwdView.as_view()),
-    re_path(r'^v3/account/resetPwdByCode$', UserController.v3resetPwdByCodeView.as_view()),
-    re_path(r'^v3/account/register$', UserController.v3registerView.as_view()),
-    re_path(r'^v3/uiduser/add', UidUser.v3addInterface),
-    re_path(r'^v3/uiduser/query', UidUser.v3queryInterface),
-    re_path(r'^date/(?P<operation>.*)$', DateController.DateConView.as_view()),
-    re_path(r'^equipment/flow_test$', EquipmentManager.uid_status_test),
-    re_path(r'^account/appFrequency/(?P<operation>.*)$', UserController.UserAppFrequencyView.as_view()),
-    re_path(r'^v2/userbrand/(?P<operation>.*)$', UserBrandControllerV2.UserBrandV2.as_view()),
-    re_path(r'^statistcs/appFrequencyMonth$', StatisticsController.statistcsAppFrequency),
-    re_path(r'^statistcs/appFrequencyYear$', StatisticsController.statistcsAppFrequencyYear),
-    re_path(r'^statistcs/pushDay$', StatisticsController.statistcsPushDay),
-    re_path(r'^statistcs/pushMonth$', StatisticsController.statistcsPushMonth),
-    re_path(r'^alexa/(?P<operation>.*)$', Alexa.AlexaConnectNum.as_view()),
-    re_path(r'^faq/upload', FAQController.FAQUploadView.as_view()),
-    re_path(r'^faq/image/(?P<filePath>.*)$', FAQController.getFAQImage.as_view()),
-    re_path(r'^faq/(?P<operation>.*)$', FAQController.FAQView.as_view()),
-    re_path(r'^ios/authsign', UserController.AppleAuthLogin.as_view()),
-    re_path(r'^appLog/(?P<operation>.*)$', AppLogController.AppLogView.as_view()),
-    re_path(r'deviceLog/(?P<operation>.*)$', DeviceLogController.DeviceLogView.as_view()),
-    re_path(r'^local/(?P<operation>.*)$', UserController.LocalUserView.as_view()),
-    re_path(r'^account/updateUserCountry', UserController.updateUserCountry),
-    re_path(r'^equipmentVersionLimit/(?P<operation>.*)$', EquipmentVersionLimit.EquipmentVersionLimitView.as_view()),
-    re_path(r'^account/subscribe$', UserController.SubscribeEmailView.as_view()),
-    re_path(r'^account/subscribe/download$', UserController.SubscribeEmailView.as_view()),
-    re_path(r'^voicePrompt/(?P<operation>.*)$', VoicePromptController.VoicePromptView.as_view()),
-    re_path(r'^deviceType/(?P<operation>.*)$', DeviceTypeController.DeviceTypeView.as_view()),
-    re_path(r'^cdk/(?P<operation>.*)$', CDKController.CDKView.as_view()),
-    re_path(r'^cloudTransfer/(?P<operation>.*)$', CloudTransfer.cloudTestView.as_view()),
-    re_path(r'^coupon/(?P<operation>.*)$', CouponController.CouponView.as_view()),
-    re_path(r'^Cloudsum/(?P<operation>.*)$', Cloudsum.Cloudsum.as_view()),
-    re_path(r'^device/StatisticsIpRegion$', DeviceConfirmRegion.StatisticsIpRegion.as_view()),
+    url(r'^application/(?P<operation>.*)$', ApplicationController.ApplicationView.as_view()),
+    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周期扣款
+
+    # AI服务
+    url(r'^AiService/(?P<operation>.*)$', AiController.AiView.as_view()),
+    # 消息提醒
+    url(r'^app/setting/notification/(?P<operation>.*)$', EquipmentMessagePush.EquipmentMessagePushView.as_view()),
+
+    # 新增解密的接口
+    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()),
+    url(r'^v3/uiduser/add', UidUser.v3addInterface),
+    url(r'^v3/uiduser/query', UidUser.v3queryInterface),
+    # 判断节假日接口
+    url(r'^date/(?P<operation>.*)$', DateController.DateConView.as_view()),
+
+    url(r'^equipment/flow_test$', EquipmentManager.uid_status_test),
+    url(r'^account/appFrequency/(?P<operation>.*)$', UserController.UserAppFrequencyView.as_view()),
+    url(r'^v2/userbrand/(?P<operation>.*)$', UserBrandControllerV2.UserBrandV2.as_view()),
+    url(r'^statistcs/appFrequencyMonth$', StatisticsController.statistcsAppFrequency),
+    url(r'^statistcs/appFrequencyYear$', StatisticsController.statistcsAppFrequencyYear),
+    url(r'^statistcs/pushDay$', StatisticsController.statistcsPushDay),
+    url(r'^statistcs/pushMonth$', StatisticsController.statistcsPushMonth),
+
+    # 统计alexa连接数
+    url(r'^alexa/(?P<operation>.*)$', Alexa.AlexaConnectNum.as_view()),
+
+    # FAQ
+    url(r'^faq/upload', FAQController.FAQUploadView.as_view()),
+    url(r'^faq/image/(?P<filePath>.*)$', FAQController.getFAQImage.as_view()),
+    url(r'^faq/(?P<operation>.*)$', FAQController.FAQView.as_view()),
+
+    # 苹果登录
+    url(r'^ios/authsign', UserController.AppleAuthLogin.as_view()),
+    # app/设备上传日志接口
+    url(r'^appLog/(?P<operation>.*)$', AppLogController.AppLogView.as_view()),
+    url(r'deviceLog/(?P<operation>.*)', DeviceLogController.DeviceLogView.as_view()),
+    # 本地登录接口
+    url(r'^local/(?P<operation>.*)$', UserController.LocalUserView.as_view()),
+
+    url(r'^account/updateUserCountry', UserController.updateUserCountry),
+    url(r'^equipmentVersionLimit/(?P<operation>.*)$', EquipmentVersionLimit.EquipmentVersionLimitView.as_view()),
+
+    # 订阅邮件
+    url(r'^account/subscribe$', UserController.SubscribeEmailView.as_view()),
+    url(r'^account/subscribe/download$', UserController.SubscribeEmailView.as_view()),
+
+    # 语音提示
+    url(r'^voicePrompt/(?P<operation>.*)$', VoicePromptController.VoicePromptView.as_view()),
+    # 设备类型
+    url(r'^deviceType/(?P<operation>.*)$', DeviceTypeController.DeviceTypeView.as_view()),
+
+    # cdk(激活码)
+    url(r'^cdk/(?P<operation>.*)$', CDKController.CDKView.as_view()),
+    # 云存转移功能
+    url(r'^cloudTransfer/(?P<operation>.*)$', CloudTransfer.cloudTestView.as_view()),
+    # 优惠券
+    url(r'^coupon/(?P<operation>.*)$', CouponController.CouponView.as_view()),
+
+    # 云存服务统计
+    url(r'^Cloudsum/(?P<operation>.*)$', Cloudsum.Cloudsum.as_view()),
+    # 设备ip地区统计
+    url(r'^device/StatisticsIpRegion$', DeviceConfirmRegion.StatisticsIpRegion.as_view()),
+
+    # Iot Core
     re_path('iot/(?P<operation>.*)', IotCoreController.IotCoreView.as_view()),
-    re_path(r's3_getsts/(?P<operation>.*)$', S3GetStsController.S3GetStsView.as_view()),
-    re_path('admin/', admin.site.urls),
+
+    # S3预签名
+    url(r's3_getsts/(?P<operation>.*)$', S3GetStsController.S3GetStsView.as_view()),
+
+    # 云分配UID
+    path('admin/', admin.site.urls),
     re_path('user/(?P<operation>.*)', UIDManageUserController.UserView.as_view()),
     re_path('uid/(?P<operation>.*)', UIDController.UIDView.as_view()),
     re_path('history/(?P<operation>.*)', HistoryUIDController.HistoryUIDView.as_view()),
     re_path('^log/(?P<operation>.*)', LogController.LogView.as_view()),
     re_path('orderTask/(?P<operation>.*)', OrderTaskController.OrderTaskView.as_view()),
-    re_path('^upload', FileController.UploadUIDFileView.as_view()),
-    re_path('^download', FileController.DownloadUIDFileView.as_view()),
-    re_path('^sales', SalesController.SalesView.as_view()),
-    re_path('device/online', SalesController.DeviceOnlineView.as_view()),
+    path('upload', FileController.UploadUIDFileView.as_view()),
+    path('download', FileController.DownloadUIDFileView.as_view()),
+    path('sales', SalesController.SalesView.as_view()),
+    path('device/online', SalesController.DeviceOnlineView.as_view()),
     re_path('serialNumber/(?P<operation>.*)', SerialNumberController.SerialNumberView.as_view()),
-    re_path('deviceShadow/update', ShadowController.update_device_shadow),
+    re_path('deviceShadow/updateV2', ShadowController.update_device_shadow),
     re_path('company/(?P<operation>.*)', CompanyController.CompanyView.as_view()),
     re_path('region/(?P<operation>.*)', RegionController.RegionView.as_view()),
     re_path('vpg/(?P<operation>.*)', VPGController.VPGView.as_view()),
-    re_path('vpgUid/uid', VPGController.do_upload_uid),
+    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()),
-    re_path(r'^OperatingLogs/(?P<operation>.*)$', OperatingLogs.OperatingLogsView.as_view()),
-    re_path(r'^ProcessInfo/(?P<operation>.*)$', ProcessInfo.ProcessInfoView.as_view()),
-    re_path(r'^Cloudsum/(?P<operation>.*)$', Cloudsum.Cloudsum.as_view()),
-    re_path(r'regionCountry/(?P<operation>.*$)', RegionCountryController.RegionCountryView.as_view()),
-    re_path(r'verifyCode/(?P<operation>.*$)', VerifyCodeController.VerifyCodeView.as_view()),
-    re_path(r'^device/confirmRegion$', DeviceConfirmRegion.ConfirmRegion.as_view()),
-    re_path(r'^device/confirmRegionV2$', DeviceConfirmRegion.ConfirmRegionV2.as_view()),
-    re_path(r'^device/confirmCountry$', DeviceConfirmRegion.confirm_country_with_ip),
-    re_path(r'^pcInfo/(?P<operation>.*)$', PcInfo.PcInfo.as_view()),
-    re_path(r'^pcTest/(?P<operation>.*)$', PctestController.PcTest.as_view()),
+    # 日志管理系统
+    url(r'^OperatingLogs/(?P<operation>.*)$', OperatingLogs.OperatingLogsView.as_view()),
+    url(r'^ProcessInfo/(?P<operation>.*)$', ProcessInfo.ProcessInfoView.as_view()),
+    url(r'^Cloudsum/(?P<operation>.*)$', Cloudsum.Cloudsum.as_view()),
+
+    url(r'regionCountry/(?P<operation>.*$)', RegionCountryController.RegionCountryView.as_view()),
+
+    # 验证验证码
+    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()),
+
+    # pc端测试软件
+    url(r'^pcTest/(?P<operation>.*)$', PctestController.PcTest.as_view()),
+
+    # 设备debug
     re_path('deviceDebug/(?P<operation>.*)', DeviceDebug.DeviceDebug.as_view()),
-    re_path(r'^api/surveys/(?P<operation>.*)$', CloudStorageController.CloudStorageView.as_view()),
-    re_path(r'^api/device/share/(?P<operation>.*)$', UserDeviceShareController.UserDeviceShareView.as_view()),
-    re_path(r'^app/sensor/gateway/(?P<operation>.*)$', EquipmentFamilyController.EquipmentFamilyView.as_view()),
-    re_path(r'^loocam/', include("Ansjer.server_urls.loocam_url")),
+
+    # 问卷调查
+    url(r'^api/surveys/(?P<operation>.*)$', CloudStorageController.CloudStorageView.as_view()),
+    # 设备分享
+    url(r'^api/device/share/(?P<operation>.*)$', UserDeviceShareController.UserDeviceShareView.as_view()),
+
+    # 网关家庭模块
+    url(r'^app/sensor/gateway/(?P<operation>.*)$', EquipmentFamilyController.EquipmentFamilyView.as_view()),
+    url(r'^loocam/', include("Ansjer.server_urls.loocam_url")),
     re_path(r'^api/loocam/', include("Ansjer.server_urls.loocam_url")),
-    re_path(r'^unicom/', include("Ansjer.server_urls.unicom_url")),
-    re_path(r'^algorithm-shop/', include("Ansjer.server_urls.algorithm_shop_url")),
+    # 联通4G套餐模块
+    url(r'^unicom/', include("Ansjer.server_urls.unicom_url")),
+    # 算法小店
+    url(r'^algorithm-shop/', include("Ansjer.server_urls.algorithm_shop_url")),
     re_path(r'^api/algorithm/', include("Ansjer.server_urls.algorithm_shop_url")),
-    re_path(r'^kvs/', include("Ansjer.server_urls.kvs_url")),
-    re_path(r'^icloud/', include("Ansjer.server_urls.icloud_url")),
+    # KVS模块
+    url(r'^kvs/', include("Ansjer.server_urls.kvs_url")),
+    # 超级密码模块
     re_path('appAccout/(?P<operation>.*)', AppAccountManagement.AppAccoutView.as_view()),
+
+    # 传感器网关
     re_path('sensorGateway/(?P<operation>.*)', SensorGatewayController.SensorGateway.as_view()),
-    re_path(r'^api/surveys/(?P<operation>.*)$', CloudStorageController.CloudStorageView.as_view()),
-    re_path(r'^api/device/share/(?P<operation>.*)$', UserDeviceShareController.UserDeviceShareView.as_view()),
-    re_path(r'^server/(?P<apiVersion>[a-zA-Z0-9]+)/open/detect/(?P<operation>.*)$',
-            DetectControllerV2.DetectControllerViewV2.as_view()),
-    re_path(r'^vsees/(?P<operation>.*)', VseesController.VseesManagement.as_view()),
-
-    # 后台界面接口 -------------------------------------------------------------------------------------------------------
-    # 登录,用户信息,权限
-    re_path(r'^login$', UserManageController.LoginView.as_view()),
-    re_path(r'^noPasslogin$', UserManageController.LoginView.as_view()),
-    re_path(r'^userInfo$', UserManageController.GetPermissions.as_view()),
-    re_path(r'^router/getList$', UserManageController.GetList.as_view()),
+
+    # 后台界面接口 -----------------------------------------------------
+    # 用户登录信息等
+    url(r'^login$', UserManageController.LoginView.as_view()),
+    url(r'^noPasslogin$', UserManageController.LoginView.as_view()),
+    url(r'^userInfo$', UserManageController.GetPermissions.as_view()),
+    url(r'^router/getList$', UserManageController.GetList.as_view()),
     # 角色管理
     re_path('roleManagement/(?P<operation>.*)', RoleController.RoleView.as_view()),
     # 菜单管理
@@ -295,13 +396,13 @@ urlpatterns = [
     re_path(r'serial/(?P<operation>.*)', SerialManageController.SerialView.as_view()),
     # 数据系统模块
     re_path(r'^dataManagement/', include("Ansjer.server_urls.datasystem_url")),
-    # 数据系统模块
-    re_path(r'^icloudserve/(?P<operation>.*)', IcloudManagementController.IcloudServeView.as_view()),
-    # 后台界面接口 -------------------------------------------------------------------------------------------------------
+    # 后台界面接口 -----------------------------------------------------
 
-    # 定时任务接口
+    # 定时删除任务接口
     re_path(r'^cron/del/(?P<operation>.*)', CronTaskController.CronDelDataView.as_view()),
+    # 定时更新任务接口
     re_path(r'^cron/update/(?P<operation>.*)', CronTaskController.CronUpdateDataView.as_view()),
+    # 定时收集数据任务接口
     re_path(r'^cron/collect/(?P<operation>.*)', CronTaskController.CronCollectDataView.as_view()),
 
     # 国内域名备案网站/错误路径

+ 3 - 3
Controller/AWS/KVSController.py

@@ -372,7 +372,7 @@ class KVSView(View):
             return response.json(0, {"HlsStreamingSessionUrl": hls_streaming_session_url})
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def get_device_midea_list(request_dict, response):
@@ -430,7 +430,7 @@ class KVSView(View):
             return response.json(0, res)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def download_clip(request_dict, response):
@@ -469,4 +469,4 @@ class KVSView(View):
             return res
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))

+ 18 - 17
Controller/AiController.py

@@ -56,20 +56,20 @@ class AiView(View):
             user_id = tko.userID
 
             # 套餐相关接口
-            if operation == 'commoditylist':  # 查询套餐列表
+            if operation == 'commoditylist':        # 查询套餐列表
                 return self.commodity_list(request_dict, response)
-            elif operation == 'experienceOrder':  # 体验套餐
+            elif operation == 'experienceOrder':    # 体验套餐
                 return self.experience_order(request_dict, user_id, response)
-            elif operation == 'createpayorder':  # 创建支付订单
+            elif operation == 'createpayorder':     # 创建支付订单
                 return self.create_pay_order(request_dict, request, user_id, response)
-            elif operation == 'queryorderlist':  # 查询订单列表
+            elif operation == 'queryorderlist':     # 查询订单列表
                 return self.query_order_list(request_dict, user_id, response)
-            elif operation == 'getUsingPackage':  # 获取当前使用套餐
+            elif operation == 'getUsingPackage':    # 获取当前使用套餐
                 return self.get_using_package(request_dict, response)
             # 开关相关接口
-            elif operation == 'getAiStatus':  # 获取开关状态
+            elif operation == 'getAiStatus':        # 获取开关状态
                 return self.get_ai_status(request_dict, response)
-            elif operation == 'changeaistatus':  # 修改开关状态
+            elif operation == 'changeaistatus':     # 修改开关状态
                 return self.change_ai_status(request_dict, user_id, response)
             else:
                 return response.json(414)
@@ -118,7 +118,7 @@ class AiView(View):
             }
             return response.json(0, result)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def experience_order(request_dict, user_id, response):
@@ -209,7 +209,7 @@ class AiView(View):
                                            store_meal_name=store_meal_name, order_type=1,
                                            rank_id=1, ai_rank_id=rank, status=1)
                 # ai服务表创建数据
-                AiService.objects.create(uid=uid, channel=channel, detect_status=1, endTime=endTime,
+                AiService.objects.create(uid=uid, channel=channel, orders_id=orderID, detect_status=1, endTime=endTime,
                                          addTime=nowTime, updTime=nowTime, use_status=1)
                 logger.info('{}成功开通AI体验,结束时间{}'.format(uid, endTime))
                 if pay_type == 10:
@@ -225,8 +225,8 @@ class AiView(View):
                 pay_ok_url = "{}cloudstorage/payOK?paytype={}&lang={}".format(SERVER_DOMAIN_SSL, pay_type, lang)
                 return response.json(0, pay_ok_url)
         except Exception as e:
+            print(e)
             redisObj.del_data(key=redis_key)
-            logger.info('开通AI异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
             return response.json(474)
 
     @classmethod
@@ -323,7 +323,7 @@ class AiView(View):
             return response.json(0, res_data)
 
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def query_order_list(request_dict, user_id, response):
@@ -351,7 +351,7 @@ class AiView(View):
         try:
             order_qs = Order_Model.objects.filter(userID_id=user_id, status=1, order_type=1, ai_rank__lang__lang=lang)
 
-            if uid:  # 查询指定设备订单
+            if uid:     # 查询指定设备订单
                 order_qs.filter(UID=uid)
             if not order_qs.exists():
                 return response.json(173)
@@ -383,7 +383,7 @@ class AiView(View):
                         data.append(order)
             return response.json(0, {'data': data, 'count': count})
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def get_using_package(request_dict, response):
@@ -425,7 +425,7 @@ class AiView(View):
 
             return response.json(0, [ai_service_data])
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def get_ai_status(request_dict, response):
@@ -449,7 +449,7 @@ class AiView(View):
             }
             return response.json(0, {'data': res})
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def change_ai_status(request_dict, user_id, response):
@@ -589,7 +589,7 @@ class AiView(View):
                     return response.json(10044)
                 return response.json(0, {'aiIdentificationUrl': aiIdentificationUrl, 'endTime': endTime, 'etk': etk})
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def create_paypal_payment(lang, order_id, price, currency, content):
@@ -846,7 +846,8 @@ class AiView(View):
         effective_day = order_list[0]['ai_rank__effective_day']
 
         ai_service_qs = AiService.objects.filter(Q(uid=UID), Q(channel=channel), Q(use_status=1))
-        ai_service_dict = {'uid': UID,
+        ai_service_dict = {'orders_id': order_id,
+                           'uid': UID,
                            'channel': channel,
                            'detect_status': 1,
                            'addTime': now_time,

+ 2 - 2
Controller/AlgorithmShop/AlgorithmShopController.py

@@ -191,7 +191,7 @@ class AlgorithmShopView(View):
             return response.json(0, result_dto)
         except Exception as e:
             LOGGER.info('接口异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def get_scenario_algorithm_list(cls, request_dist, response):
@@ -269,7 +269,7 @@ class AlgorithmShopView(View):
             return response.json(0, algorithm_list)
         except Exception as e:
             print('查询算法小店列表异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def get_algorithm_details(cls, request_dict, response):

+ 1 - 1
Controller/AppAccountManagement.py

@@ -82,7 +82,7 @@ class AppAccoutView(View):
             return response.json(0)
         except Exception as e:
             print('生成验证码异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def verifyTheVerificationCode(request_dict, response, userID):

+ 73 - 408
Controller/CloudStorage.py

@@ -21,19 +21,17 @@ from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
 from django.views.generic.base import View
 
 from Ansjer.config import SERVER_DOMAIN, PAYPAL_CRD, SERVER_DOMAIN_SSL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, \
-    AWS_ARN, OAUTH_ACCESS_TOKEN_SECRET, DETECT_PUSH_DOMAINS, CONFIG_INFO, CONFIG_CN
+    AWS_ARN, OAUTH_ACCESS_TOKEN_SECRET
 from Controller.CheckUserData import DataValid
 from Controller.CloudPhoto.CloudServiceController import CloudServiceController
 from Controller.PaymentCycle import Paypal
 from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, UID_Bucket, StsCrdModel, \
     ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMsgModel, Unused_Uid_Meal, PromotionRuleModel, \
-    VideoPlaybackTimeModel, CouponModel, VodBucketModel, VodHlsSummary, AiService, UidSetModel, UidPushModel, \
-    VodHlsTagType, ICloudStoreMeal, IcloudUseDetails, IcloudService
+    VideoPlaybackTimeModel, CouponModel, VodBucketModel, VodHlsSummary, VodHlsTagType
 from Object.AWS.AmazonS3Util import AmazonS3Util
 from Object.AWS.S3Email import S3Email
 from Object.AliPayObject import AliPayObject
 from Object.AliSmsObject import AliSmsObject
-from Object.ETkObject import ETkObject
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
@@ -47,7 +45,6 @@ from Service.VodHlsService import SplitVodHlsObject
 ssl._create_default_https_context = ssl._create_unverified_context
 LOGGER = logging.getLogger('info')
 
-
 # 设备信息添加
 class CloudStorageView(View):
 
@@ -98,8 +95,6 @@ class CloudStorageView(View):
                 return self.do_create_pay_order(request_dict, user_id, ip, response)
             elif operation == 'changevodstatus':  # 修改云存状态,传送两个url,即getsignsts接口和storeplaylist接口
                 return self.do_change_vod_status(request_dict, user_id, response)
-            elif operation == 'changevodaistatus':  # 修改云存AI状态
-                return self.do_change_vod_ai_status(request_dict, user_id, response)
             elif operation == 'queryvodlist':  # 获取视频播放列表
                 return self.do_query_vod_list(request_dict, user_id, response)
             elif operation == 'commoditylist':  # 查询套餐列表
@@ -191,10 +186,7 @@ class CloudStorageView(View):
         device_info_qs = Device_Info.objects.filter(Q(UID=uid), Q(Type__lte=4) | Q(Type=10001))
         if device_info_qs.exists():
             return response.json(0)
-        uid_set_qs = UidSetModel.objects.filter(uid=uid).values('is_ai')
-        if not uid_set_qs.exists():
-            return response.json(173)
-        is_ai = uid_set_qs[0]['is_ai']
+
         store_qs = Store_Meal.objects.filter(Q(lang__lang=lang), Q(is_show=0), ~Q(pay_type='11'))  # 过滤激活码、隐藏套餐
         experience_context_qs = ExperienceContextModel.objects.filter(uid=uid, experience_type=0)
 
@@ -206,15 +198,11 @@ class CloudStorageView(View):
             store_qs = store_qs.filter(~Q(pay_type='10'))
         else:
             store_qs = store_qs.filter(pay_type='10')
-        if CONFIG_INFO != CONFIG_CN and is_ai != 2:  # 返回支持AI的套餐
-            store_qs = store_qs.filter(is_ai=1)
-        else:  # 返回不支持AI的套餐
-            store_qs = store_qs.filter(is_ai=0)
 
         store_qs = store_qs.annotate(title=F('lang__title'), content=F('lang__content'),
                                      discount_content=F('lang__discount_content'))
         store_qs = store_qs.order_by('sort').values("id", "title", "content", "price", "day", "currency",
-                                                    "bucket__storeDay", 'is_beta', 'is_ai',
+                                                    "bucket__storeDay",
                                                     "bucket__bucket", "bucket__area", "commodity_code",
                                                     "commodity_type", "is_discounts", "virtual_price", "expire",
                                                     "discount_price", "discount_content", "symbol", "cycle_config_id")
@@ -307,12 +295,11 @@ class CloudStorageView(View):
         now_time = int(time.time())
 
         split_vod_hls_obj = SplitVodHlsObject()
-        vod_hls_qs = split_vod_hls_obj.get_vod_hls_data(uid=uid, channel=channel, start_time__gte=start_time,
+        vod_hls_qs = split_vod_hls_obj.get_vod_hls_data(uid=uid, channel=channel, start_time=start_time,
                                                         end_time__gte=now_time).values("sec", "fg", "bucket_id",
-                                                                                       'start_time')[:10]
+                                                                                       'start_time')
         if not vod_hls_qs.exists():
             return response.json(173)
-        vod_hls_qs = sorted(vod_hls_qs, key=lambda item: item['start_time'])[:10]
         bucket_id = vod_hls_qs[0]['bucket_id']
         vod_bucket_qs = VodBucketModel.objects.filter(id=bucket_id).values('bucket', 'region', 'mold')
         if not vod_bucket_qs.exists():
@@ -320,6 +307,7 @@ class CloudStorageView(View):
         bucket_region = vod_bucket_qs[0]['region']
         bucket_name = vod_bucket_qs[0]['bucket']
         mold = vod_bucket_qs[0]["mold"]
+        fg = int(vod_hls_qs[0]['fg'])
         s3_obj = AmazonS3Util(
             AWS_ACCESS_KEY_ID[mold],
             AWS_SECRET_ACCESS_KEY[mold],
@@ -329,20 +317,16 @@ class CloudStorageView(View):
         playlist_entries = []
         # ts_count = fg & 0xf
         # fg 64位整型,低四位代表ts文件总数,然后进行位运算,一次移四位,每四位转为十进制即为当前ts文件的秒数
-        for item in vod_hls_qs:
-            fg = int(item['fg'])
-            temp_time = item['start_time']
-            for i in range(15):
-                shift = (i + 1) * 4
-                duration = (fg >> shift) & 0xf
-                if duration > 0:
-                    ts_file = '{uid}/vod{channel}/{time}/ts{i}.ts'.format(uid=uid, channel=channel, time=temp_time,
-                                                                          i=i)
-                    response_url = s3_obj.generate_file_obj_url(bucket_name, ts_file)
-                    playlist_entries.append({
-                        'name': response_url,
-                        'duration': duration,
-                    })
+        for i in range(15):
+            shift = (i + 1) * 4
+            duration = (fg >> shift) & 0xf
+            if duration > 0:
+                ts_file = '{uid}/vod{channel}/{time}/ts{i}.ts'.format(uid=uid, channel=channel, time=start_time, i=i)
+                response_url = s3_obj.generate_file_obj_url(bucket_name, ts_file)
+                playlist_entries.append({
+                    'name': response_url,
+                    'duration': duration,
+                })
 
         playlist = PlaylistGenerator(playlist_entries).generate()
         response = HttpResponse(playlist)
@@ -413,7 +397,7 @@ class CloudStorageView(View):
                         "Effect": "Allow",
                         "Action": "s3:*",
                         "Resource": ["{aws_arn}:::{bucket_name}/{uid_channel}*".
-                                     format(aws_arn=aws_arn, bucket_name=bucket_name, uid_channel=storage)]
+                                         format(aws_arn=aws_arn, bucket_name=bucket_name, uid_channel=storage)]
                     }
                 ]
             }
@@ -445,7 +429,7 @@ class CloudStorageView(View):
                                            addTime=now_time, type=1)
             return JsonResponse(status=200, data=res)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def do_query_vod_list(request_dict, user_id, response):  # 获取视频播放列表
@@ -477,10 +461,11 @@ class CloudStorageView(View):
             })
 
         device_info_qs = Device_Info.objects.filter(userID_id=user_id, UID=uid, isShare=False).values(
-            'vodPrimaryUserID', 'Type', 'vodPrimaryMaster')
+            'vodPrimaryUserID',
+            'vodPrimaryMaster')
         if not device_info_qs.exists():
             return response.json(12)
-        device_type = device_info_qs[0]['Type']
+
         device_info_qs_time_over = int(time.time())
         if uid == 'UWE2ZJ52SE4FX75U111A':
             logger.info({
@@ -491,10 +476,8 @@ class CloudStorageView(View):
         if device_info_qs[0]['vodPrimaryUserID'] != user_id:
             return response.json(10034)
         now_time = int(time.time())
-        if device_type == 34:  # 枪球设备开通云存不区分通道
-            uid_bucket_qs = UID_Bucket.objects.filter(uid=uid, endTime__gte=now_time)
-        else:
-            uid_bucket_qs = UID_Bucket.objects.filter(uid=uid, endTime__gte=now_time, channel=channel)
+        uid_bucket_qs = UID_Bucket.objects.filter(uid=uid, endTime__gte=now_time, channel=channel).values(
+            'bucket_id').order_by('addTime')
         if not uid_bucket_qs.exists():
             return response.json(10030)
 
@@ -662,7 +645,7 @@ class CloudStorageView(View):
             res = {'code': 0, 'msg': '存储成功'}
             return HttpResponse(json.dumps(res, ensure_ascii=False), content_type='application/json,charset=utf-8')
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def do_change_vod_status(request_dict, user_id, response):  # 修改云存状态
@@ -683,23 +666,18 @@ class CloudStorageView(View):
         if not all([uid, status, channel]):
             return response.json(444, 'uid,status,channel')
         device_info_qs = Device_Info.objects.filter(userID_id=user_id, UID=uid, isShare=False, isExist=1).values(
-            'vodPrimaryUserID', 'Type')
+            'vodPrimaryUserID')
         if not device_info_qs.exists() or device_info_qs[0]['vodPrimaryUserID'] != user_id:
             return response.json(12)
-        device_type = device_info_qs[0]['Type']
-        if device_type == 34:  # 枪球设备开通云存不区分通道
-            uid_bucket_qs = UID_Bucket.objects.filter(uid=uid)
-        else:
-            uid_bucket_qs = UID_Bucket.objects.filter(channel=channel, uid=uid)
+        uid_bucket_qs = UID_Bucket.objects.filter(channel=channel, uid=uid)
         if not uid_bucket_qs.exists():
             return response.json(10030)
         now_time = int(time.time())
         if now_time > uid_bucket_qs[0].endTime:
             return response.json(10031)
+        uid_bucket_qs.update(status=status)
         if status == 0:
-            uid_bucket_qs.update(status=status)
             return response.json(0)
-        uid_bucket_qs.update(status=status, channel=channel)
         uid_obj = UidTokenObject()
         uid_obj.generate(data={'uid': uid, 'channel': channel})
 
@@ -711,157 +689,6 @@ class CloudStorageView(View):
         store_hls_url = '{}cloudstorage/storeplaylist?uidToken={}'.format(urls, uid_obj.token)
         return response.json(0, {'uidTkUrl': uid_tk_url, 'storeHlsUrl': store_hls_url})
 
-    @staticmethod
-    def do_change_vod_ai_status(request_dict, user_id, response):  # 修改云存状态
-        """
-        修改云存状态
-        @param request_dict: 请求数据
-        @param user_id: 用户id
-        @request_dict uid: uid
-        @request_dict status: 套餐状态
-        @request_dict channel: 通道
-        @param response: 响应
-        @return: response
-        """
-        uid = request_dict.get('uid', None)
-        vod_status = request_dict.get('vod_status', None)
-        channel = request_dict.get('channel', None)
-        domain_name = request_dict.get('domain_name', None)
-        token_val = request_dict.get('token_val', None)
-        appBundleId = request_dict.get('appBundleId', None)
-        app_type = request_dict.get('app_type', None)
-        push_type = request_dict.get('push_type', None)
-        ai_status = request_dict.get('ai_status', None)
-        m_code = request_dict.get('m_code', None)
-        lang = request_dict.get('lang', 'en')
-        tz = request_dict.get('tz', '0')
-        detect_group = request_dict.get('detect_group', None)
-        interval = request_dict.get('interval', None)
-        if not all([uid, vod_status, channel]):
-            return response.json(444, 'uid,vod_status,channel')
-        vod_status = int(vod_status)
-        device_info_qs = Device_Info.objects.filter(userID_id=user_id, UID=uid, isShare=False, isExist=1).values(
-            'vodPrimaryUserID', 'Type')
-        if not device_info_qs.exists() or device_info_qs[0]['vodPrimaryUserID'] != user_id:
-            return response.json(12)
-        device_type = device_info_qs[0]['Type']
-        uid_set_qs = UidSetModel.objects.filter(uid=uid)
-        if not uid_set_qs.exists():
-            return response.json(12)
-        if device_type == 34:  # 枪球设备开通云存不区分通道
-            uid_bucket_qs = UID_Bucket.objects.filter(uid=uid)
-        else:
-            uid_bucket_qs = UID_Bucket.objects.filter(channel=channel, uid=uid)
-        if not uid_bucket_qs.exists():
-            return response.json(10030)
-        now_time = int(time.time())
-        end_time = uid_bucket_qs[0].endTime
-        if now_time > end_time:
-            return response.json(10031)
-        try:
-            with transaction.atomic():
-                if vod_status == 0:
-                    uid_bucket_qs.update(status=vod_status)
-                    ai_status = '0'
-                    if uid_set_qs[0].is_ai == 2:
-                        return response.json(0)
-                uid_bucket_qs.update(status=vod_status, channel=channel)
-                uid_obj = UidTokenObject()
-                uid_obj.generate(data={'uid': uid, 'channel': channel})
-
-                # 欧洲域名固定返回欧洲域名
-                urls = SERVER_DOMAIN_SSL
-                if domain_name in ['api.zositeche.com', 'api.loocam3.com', 'common.neutral3.com']:
-                    urls = 'https://api.zositeche.com/'
-                uid_tk_url = '{}cloudstorage/getsignsts?uidToken={}'.format(urls, uid_obj.token)
-                store_hls_url = '{}cloudstorage/storeplaylist?uidToken={}'.format(urls, uid_obj.token)
-                if uid_set_qs[0].is_ai != 2 and CONFIG_INFO != CONFIG_CN:
-                    if not all([appBundleId, app_type, token_val, uid, m_code, ai_status]):
-                        return response.json(444, 'appBundleId, app_type, token_val, uid,m_code, ai_status')
-
-                    # 如果传空上来,就默认为0
-                    tz = '0' if tz == '' else tz.replace('GMT', '')
-                    ai_status = int(ai_status)
-                    ai_service_qs = AiService.objects.filter(uid=uid, use_status=1)
-                    if not ai_service_qs.exists():
-                        return response.json(10053)
-
-                    uid_set_id = uid_set_qs[0].id
-                    interval = uid_set_qs[0].new_detect_interval if not interval else interval
-                    qs_data = {
-                        'updTime': now_time,
-                    }
-                    if interval:
-                        qs_data['detect_interval'] = int(interval)
-                        qs_data['detect_group'] = detect_group if detect_group else ''
-                    uid_set_qs.update(**qs_data)
-
-                    qs_data['detect_status'] = ai_status  # ai开关状态
-                    qs_data['endTime'] = end_time
-                    ai_service_qs.update(**qs_data)
-                    thing_name = CommonService.query_serial_with_uid(uid)  # 存在序列号则为使用序列号作为物品名
-                    topic_name = 'ansjer/generic/{}'.format(thing_name)
-
-                    if ai_status == 0:  # 关闭
-                        # mqtt通知设备关闭AI识别功能
-                        msg = {'commandType': 'AIDisable'}
-                        req_success = CommonService.req_publish_mqtt_msg(thing_name, topic_name, msg)
-                        if not req_success:
-                            return response.json(10044)
-                        if vod_status == 0:
-                            return response.json(0)
-                        return response.json(0, {'uidTkUrl': uid_tk_url, 'storeHlsUrl': store_hls_url})
-                    elif ai_status == 1:  # 开启
-                        # 更新或创建uid_push数据
-                        uid_push_qs = UidPushModel.objects.filter(userID_id=user_id, m_code=m_code, uid_set__uid=uid)
-                        uid_push_data = {
-                            'appBundleId': appBundleId,
-                            'app_type': app_type,
-                            'push_type': push_type,
-                            'token_val': token_val,
-                            'updTime': now_time,
-                            'lang': lang,
-                            'tz': tz
-                        }
-
-                        if uid_push_qs.exists():
-                            uid_push_qs.update(**uid_push_data)
-                        else:
-                            uid_push_data['uid_set_id'] = uid_set_id
-                            uid_push_data['userID_id'] = user_id
-                            uid_push_data['m_code'] = m_code
-                            uid_push_data['addTime'] = now_time
-                            UidPushModel.objects.create(**uid_push_data)
-                        if appBundleId == 0 or appBundleId == '0':
-                            LOGGER.info('cloudstorage/changevodaistatus接口推送数据{}'.format(request_dict))
-                        etkObj = ETkObject(etk='')
-                        etk = etkObj.encrypt(uid)
-
-                        # mqtt通知设备开启AI识别功能
-                        push_url = DETECT_PUSH_DOMAINS
-                        # 欧洲域名固定返回欧洲域名
-                        if domain_name in ['api.zositeche.com', 'api.loocam3.com', 'common.neutral3.com']:
-                            push_url = 'https://push.zositeche.com/'
-                        aiIdentificationUrl = '{}AiService/identification'.format(push_url)
-                        msg = {
-                            'commandType': 'AIEnable',
-                            'payload': {
-                                'etk': etk,
-                                'endTime': end_time,
-                                'aiIdentificationUrl': aiIdentificationUrl,
-                            }
-                        }
-                        req_success = CommonService.req_publish_mqtt_msg(thing_name, topic_name, msg)
-                        if not req_success:
-                            return response.json(10044)
-                        return response.json(0, {'uidTkUrl': uid_tk_url, 'storeHlsUrl': store_hls_url,
-                                                 'aiIdentificationUrl': aiIdentificationUrl, 'endTime': end_time,
-                                                 'etk': etk})
-
-                return response.json(0, {'uidTkUrl': uid_tk_url, 'storeHlsUrl': store_hls_url})
-        except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
-
     @staticmethod
     def do_pay_error():
         response = HttpResponse()
@@ -928,19 +755,13 @@ class CloudStorageView(View):
                 channel = order_list[0]['channel']
                 rank = order_list[0]['rank']
 
-                store_qs = Store_Meal.objects.filter(id=rank).values("day", "bucket_id", "bucket__storeDay", "expire",
-                                                                     'is_ai', 'icloud_store_meal_id')
+                store_qs = Store_Meal.objects.filter(id=rank).values("day", "bucket_id", "bucket__storeDay", "expire")
+                bucket_id = store_qs[0]['bucket_id']
                 if not store_qs.exists():
                     return response.json(173)
-                bucket_id = store_qs[0]['bucket_id']
-                uid_bucket_qs = UID_Bucket.objects.filter(uid=uid).values("id", "bucket_id", "bucket__storeDay",
+                uiu_bucket_qs = UID_Bucket.objects.filter(uid=uid).values("id", "bucket_id", "bucket__storeDay",
                                                                           "bucket__region", "endTime", "use_status")
                 expire = store_qs[0]['expire']
-                # icloud_store_meal_id = store_qs[0]['icloud_store_meal_id']
-                # icloud_meal_qs = ICloudStoreMeal.objects.filter(id=icloud_store_meal_id).values('size')
-                # if not icloud_meal_qs.exists():
-                #     return response.json(173)
-                # size = icloud_meal_qs[0]['size']
                 if order_list[0]['isSelectDiscounts'] == 1:
                     expire = store_qs[0]['expire'] * 2
                 # 是否有促销
@@ -950,17 +771,15 @@ class CloudStorageView(View):
                 if promotion.exists():
                     promotion_rule_id = promotion[0]['id']
                     expire = expire * 2
-                unuse_meal_flag = False  # 是否关联未使用套餐
                 with transaction.atomic():
-                    if uid_bucket_qs.exists():
-                        uid_bucket = uid_bucket_qs.first()
+                    if uiu_bucket_qs.exists():
+                        uid_bucket = uiu_bucket_qs.first()
                         if uid_bucket['use_status'] == 1 and uid_bucket['bucket_id'] == bucket_id:  # 套餐使用中并且相同套餐叠加过期时间
                             end_time = CommonService.calcMonthLater(expire, uid_bucket['endTime'])
                             UID_Bucket.objects.filter(id=uid_bucket['id']).update(uid=uid, channel=channel,
                                                                                   bucket_id=bucket_id, endTime=end_time,
                                                                                   updateTime=now_time)
                         else:  # 已过期或者不相同的套餐加入未使用的关联套餐表
-                            unuse_meal_flag = True
                             unused_uid_qs = Unused_Uid_Meal.objects.filter(uid=uid, bucket_id=bucket_id)
                             nums = 2 if order_list[0]['isSelectDiscounts'] == 1 else 1
                             if promotion.exists():
@@ -995,36 +814,6 @@ class CloudStorageView(View):
                     order_qs.update(status=1, updTime=now_time, uid_bucket_id=uid_bucket_id,
                                     promotion_rule_id=promotion_rule_id)
                     date_time = time.strftime("%Y-%m-%d", time.localtime())
-                    # 开通AI服务
-                    if store_qs[0]['is_ai'] and CONFIG_INFO != CONFIG_CN and not unuse_meal_flag:
-                        ai_service_qs = AiService.objects.filter(uid=uid, channel=channel)
-                        if ai_service_qs.exists():  # 有正在使用的套餐,套餐结束时间保存为套餐有效期
-                            ai_service_qs.update(endTime=end_time, use_status=1, updTime=now_time)
-                        else:
-                            ai_service_dict = {
-                                'uid': uid,
-                                'channel': channel,
-                                'detect_status': 1,
-                                'addTime': now_time,
-                                'updTime': now_time,
-                                'use_status': 1,
-                                'endTime': end_time
-                            }
-                            AiService.objects.create(**ai_service_dict)
-                    # 开通云盘服务
-                    # icloud_use_qs = IcloudUseDetails.objects.filter(user_id=userid).values('id')
-                    # if not icloud_use_qs.exists():
-                    #     bucket_qs = VodBucketModel.objects.filter(bucket='icloud').values('id')
-                    #     icloud_use_qs = IcloudUseDetails.objects.create(add_time=now_time, upd_time=now_time,
-                    #                                                     detect_status=1, user_id=userid,
-                    #                                                     bucket_id=bucket_qs[0]['id'])
-                    #     use_details_id = icloud_use_qs.id
-                    #     IcloudService.objects.create(add_time=now_time, upd_time=now_time, type=0,
-                    #                                  size=1, use_details_id=use_details_id)
-                    # else:
-                    #     use_details_id = icloud_use_qs[0]['id']
-                    # IcloudService.objects.create(order_id=order_id, add_time=now_time, upd_time=now_time, type=1,
-                    #                              size=size, end_time=end_time, use_details_id=use_details_id)
                     # 如果存在序列号,消息提示用序列号
                     device_info_qs = Device_Info.objects.filter(UID=uid).values('serial_number', 'Type')
                     serial_number = device_info_qs[0]['serial_number']
@@ -1120,19 +909,14 @@ class CloudStorageView(View):
             uid = order_list[0]['UID']
             channel = order_list[0]['channel']
             rank = order_list[0]['rank']
-            store_qs = Store_Meal.objects.filter(id=rank).values("day", "bucket_id", "bucket__storeDay", "expire",
-                                                                 'is_ai', 'icloud_store_meal_id')
+            store_qs = Store_Meal.objects.filter(id=rank).values("day", "bucket_id", "bucket__storeDay", "expire")
+            bucket_id = store_qs[0]['bucket_id']
             if not store_qs.exists():
                 return response.json(173)
-            bucket_id = store_qs[0]['bucket_id']
             uid_bucket_qs = UID_Bucket.objects.filter(uid=uid).values("id", "bucket_id", "bucket__storeDay",
                                                                       "bucket__region", "endTime", "use_status")
             expire = store_qs[0]['expire']
-            # icloud_store_meal_id = store_qs[0]['icloud_store_meal_id']
-            # icloud_meal_qs = ICloudStoreMeal.objects.filter(id=icloud_store_meal_id).values('size')
-            # if not icloud_meal_qs.exists():
-            #     return response.json(173)
-            # size = icloud_meal_qs[0]['size']
+
             if order_list[0]['isSelectDiscounts'] == 1:
                 expire = store_qs[0]['expire'] * 2
             # 是否有促销
@@ -1142,7 +926,6 @@ class CloudStorageView(View):
             if promotion_rule_qs.exists():
                 promotion_rule_id = promotion_rule_qs[0]['id']
                 expire = expire * 2
-            unuse_meal_flag = False  # 是否关联未使用套餐
             with transaction.atomic():
                 if uid_bucket_qs.exists():
                     uid_bucket = uid_bucket_qs.first()
@@ -1152,7 +935,6 @@ class CloudStorageView(View):
                                                                               endTime=end_time,
                                                                               bucket_id=bucket_id, updateTime=now_time)
                     else:  # 已过期或者不相同的套餐加入未使用的关联套餐表
-                        unuse_meal_flag = True
                         unused_uid_qs = Unused_Uid_Meal.objects.filter(uid=uid, bucket_id=bucket_id)
                         nums = 2 if order_list[0]['isSelectDiscounts'] == 1 else 1
                         if promotion_rule_qs.exists():
@@ -1186,36 +968,6 @@ class CloudStorageView(View):
                 order_qs.update(status=1, updTime=now_time, uid_bucket_id=uid_bucket_id,
                                 promotion_rule_id=promotion_rule_id)
                 date_time = time.strftime("%Y-%m-%d", time.localtime())
-                # 开通AI服务
-                if store_qs[0]['is_ai'] and CONFIG_INFO != CONFIG_CN and not unuse_meal_flag:
-                    ai_service_qs = AiService.objects.filter(uid=uid, channel=channel)
-                    if ai_service_qs.exists():  # 有正在使用的套餐,套餐结束时间保存为套餐有效期
-                        ai_service_qs.update(endTime=end_time, use_status=1, updTime=now_time)
-                    else:
-                        ai_service_dict = {
-                            'uid': uid,
-                            'channel': channel,
-                            'detect_status': 1,
-                            'addTime': now_time,
-                            'updTime': now_time,
-                            'use_status': 1,
-                            'endTime': end_time
-                        }
-                        AiService.objects.create(**ai_service_dict)
-                # 开通云盘服务
-                # icloud_use_qs = IcloudUseDetails.objects.filter(user_id=userid).values('id')
-                # if not icloud_use_qs.exists():
-                #     bucket_qs = VodBucketModel.objects.filter(bucket='icloud').values('id')
-                #     icloud_use_qs = IcloudUseDetails.objects.create(add_time=now_time, upd_time=now_time,
-                #                                                     detect_status=1, user_id=userid,
-                #                                                     bucket_id=bucket_qs[0]['id'])
-                #     use_details_id = icloud_use_qs.id
-                #     IcloudService.objects.create(add_time=now_time, upd_time=now_time, type=0,
-                #                                  size=1, use_details_id=use_details_id)
-                # else:
-                #     use_details_id = icloud_use_qs[0]['id']
-                # IcloudService.objects.create(order_id=order_id, add_time=now_time, upd_time=now_time, type=1,
-                #                              size=size, end_time=end_time, use_details_id=use_details_id)
                 # 如果存在序列号,消息提示用序列号
                 device_info_qs = Device_Info.objects.filter(UID=uid).values('serial_number', 'Type')
                 serial_number = device_info_qs[0]['serial_number']
@@ -1293,19 +1045,13 @@ class CloudStorageView(View):
                 uid = order_list[0]['UID']
                 channel = order_list[0]['channel']
                 rank = order_list[0]['rank']
-                store_qs = Store_Meal.objects.filter(id=rank).values("day", "bucket_id", "bucket__storeDay", "expire",
-                                                                     'is_ai', 'icloud_store_meal_id')
+                store_qs = Store_Meal.objects.filter(id=rank).values("day", "bucket_id", "bucket__storeDay", "expire")
+                bucket_id = store_qs[0]['bucket_id']
                 if not store_qs.exists():
                     return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': '套餐不存在'}))
-                bucket_id = store_qs[0]['bucket_id']
                 uid_bucket_qs = UID_Bucket.objects.filter(uid=uid).values("id", "bucket_id", "bucket__storeDay",
                                                                           "bucket__region", "endTime", "use_status")
                 expire = store_qs[0]['expire']
-                # icloud_store_meal_id = store_qs[0]['icloud_store_meal_id']
-                # icloud_meal_qs = ICloudStoreMeal.objects.filter(id=icloud_store_meal_id).values('size')
-                # if not icloud_meal_qs.exists():
-                #     return response.json(173)
-                # size = icloud_meal_qs[0]['size']
                 if order_list[0]['isSelectDiscounts'] == 1:
                     expire = store_qs[0]['expire'] * 2
                 # 是否有促销
@@ -1315,7 +1061,6 @@ class CloudStorageView(View):
                 if promotion_rule_qs.exists():
                     promotion_rule_id = promotion_rule_qs[0]['id']
                     expire = expire * 2
-                unuse_meal_flag = False  # 是否关联未使用套餐
                 with transaction.atomic():
                     if uid_bucket_qs.exists():
                         uid_bucket = uid_bucket_qs.first()
@@ -1325,7 +1070,6 @@ class CloudStorageView(View):
                                                                                   bucket_id=bucket_id,
                                                                                   endTime=end_time, updateTime=now_time)
                         else:  # 已过期或者不相同的套餐加入未使用的关联套餐表
-                            unuse_meal_flag = True
                             unused_uid_qs = Unused_Uid_Meal.objects.filter(uid=uid, bucket_id=bucket_id)
                             nums = 2 if order_list[0]['isSelectDiscounts'] == 1 else 1
                             if promotion_rule_qs.exists():
@@ -1360,36 +1104,6 @@ class CloudStorageView(View):
                     order_qs.update(status=1, updTime=now_time, uid_bucket_id=uid_bucket_id,
                                     promotion_rule_id=promotion_rule_id)
                     date_time = time.strftime("%Y-%m-%d", time.localtime())
-                    # 开通AI服务
-                    if store_qs[0]['is_ai'] and CONFIG_INFO != CONFIG_CN and not unuse_meal_flag:
-                        ai_service_qs = AiService.objects.filter(uid=uid, channel=channel)
-                        if ai_service_qs.exists():  # 有正在使用的套餐,套餐结束时间保存为套餐有效期
-                            ai_service_qs.update(endTime=end_time, use_status=1, updTime=now_time)
-                        else:
-                            ai_service_dict = {
-                                'uid': uid,
-                                'channel': channel,
-                                'detect_status': 1,
-                                'addTime': now_time,
-                                'updTime': now_time,
-                                'use_status': 1,
-                                'endTime': end_time
-                            }
-                            AiService.objects.create(**ai_service_dict)
-                    # 开通云盘服务
-                    # icloud_use_qs = IcloudUseDetails.objects.filter(user_id=userid).values('id')
-                    # if not icloud_use_qs.exists():
-                    #     bucket_qs = VodBucketModel.objects.filter(bucket='icloud').values('id')
-                    #     icloud_use_qs = IcloudUseDetails.objects.create(add_time=now_time, upd_time=now_time,
-                    #                                                     detect_status=1, user_id=userid,
-                    #                                                     bucket_id=bucket_qs[0]['id'])
-                    #     use_details_id = icloud_use_qs.id
-                    #     IcloudService.objects.create(add_time=now_time, upd_time=now_time, type=0,
-                    #                                  size=1, use_details_id=use_details_id)
-                    # else:
-                    #     use_details_id = icloud_use_qs[0]['id']
-                    # IcloudService.objects.create(order_id=order_id, add_time=now_time, upd_time=now_time, type=1,
-                    #                              size=size, end_time=end_time, use_details_id=use_details_id)
                     # 如果存在序列号,消息提示用序列号
                     device_info_qs = Device_Info.objects.filter(UID=uid).values('serial_number', 'Type')
                     serial_number = device_info_qs[0]['serial_number']
@@ -1462,7 +1176,7 @@ class CloudStorageView(View):
         now_time = int(time.time())
         store_qs = Store_Meal.objects.filter(id=rank, pay_type=pay_type, lang__lang=lang, is_show=0). \
             values('currency', 'price', 'lang__content', 'day', 'commodity_type', 'lang__title', 'expire',
-                   'commodity_code', 'discount_price', 'bucket__mold', 'cycle_config_id', 'is_ai')
+                   'commodity_code', 'discount_price', 'bucket__mold', 'cycle_config_id')
         if not store_qs.exists():
             return response.json(173)
         store_meal_qs = Store_Meal.objects.filter(id=rank, lang__lang='cn', is_show=0).values('lang__title',
@@ -1515,17 +1229,14 @@ class CloudStorageView(View):
                 sub_info = Paypal.subscriptions(store_info=store_qs[0], lang=lang, orderID=order_id, price=price)
                 if not sub_info:
                     return response.json(10048)
-                order_qs = Order_Model.objects.create(orderID=order_id, UID=uid, channel=channel, userID_id=user_id,
-                                                      desc=content, payType=pay_type, payTime=now_time,
-                                                      price=price, currency=currency, addTime=now_time,
-                                                      updTime=now_time,
-                                                      pay_url=sub_info['url'], isSelectDiscounts=is_select_discount,
-                                                      commodity_code=commodity_code, commodity_type=commodity_type,
-                                                      rank_id=rank, plan_id=sub_info['plan_id'], coupon_id=coupon_id,
-                                                      ai_rank_id=1,
-                                                      store_meal_name=store_meal_name)
-                if store_qs[0]['is_ai'] == 1:
-                    order_qs.order_type = 1
+                Order_Model.objects.create(orderID=order_id, UID=uid, channel=channel, userID_id=user_id,
+                                           desc=content, payType=pay_type, payTime=now_time,
+                                           price=price, currency=currency, addTime=now_time, updTime=now_time,
+                                           pay_url=sub_info['url'], isSelectDiscounts=is_select_discount,
+                                           commodity_code=commodity_code, commodity_type=commodity_type,
+                                           rank_id=rank, plan_id=sub_info['plan_id'], coupon_id=coupon_id, ai_rank_id=1,
+                                           store_meal_name=store_meal_name)
+
                 return response.json(0, {"redirectUrl": sub_info['url'], "orderID": order_id})
             # 正常扣款
             call_clc_url = "{}web/paid2/fail.html".format(SERVER_DOMAIN_SSL)
@@ -1552,17 +1263,13 @@ class CloudStorageView(View):
             for link in payment.links:
                 if link.rel == "approval_url":
                     approval_url = str(link.href)
-                    order_qs = Order_Model.objects.create(orderID=order_id, UID=uid, channel=channel, userID_id=user_id,
-                                                          desc=content, payType=pay_type, payTime=now_time,
-                                                          price=price, currency=currency, addTime=now_time,
-                                                          updTime=now_time,
-                                                          pay_url=approval_url, isSelectDiscounts=is_select_discount,
-                                                          commodity_code=commodity_code, commodity_type=commodity_type,
-                                                          rank_id=rank, paymentID=payment_id, coupon_id=coupon_id,
-                                                          ai_rank_id=1,
-                                                          store_meal_name=store_meal_name)
-                    if store_qs[0]['is_ai'] == 1:
-                        order_qs.order_type = 1
+                    Order_Model.objects.create(orderID=order_id, UID=uid, channel=channel, userID_id=user_id,
+                                               desc=content, payType=pay_type, payTime=now_time,
+                                               price=price, currency=currency, addTime=now_time, updTime=now_time,
+                                               pay_url=approval_url, isSelectDiscounts=is_select_discount,
+                                               commodity_code=commodity_code, commodity_type=commodity_type,
+                                               rank_id=rank, paymentID=payment_id, coupon_id=coupon_id, ai_rank_id=1,
+                                               store_meal_name=store_meal_name)
                     return response.json(0, {"redirectUrl": approval_url, "orderID": order_id})
             return response.json(10, 'generate_order_false')
         elif pay_type == 2:
@@ -1586,16 +1293,14 @@ class CloudStorageView(View):
             else:
                 if order_string:
                     redirect_url = ali_pay_obj.alipay_prefix + order_string
-                    order_qs = Order_Model.objects.create(orderID=order_id, UID=uid, channel=channel, userID_id=user_id,
-                                                          desc=content, payType=pay_type, payTime=now_time,
-                                                          price=price, currency=currency, addTime=now_time,
-                                                          updTime=now_time,
-                                                          pay_url=redirect_url, isSelectDiscounts=is_select_discount,
-                                                          commodity_code=commodity_code, commodity_type=commodity_type,
-                                                          rank_id=rank, coupon_id=coupon_id, ai_rank_id=1,
-                                                          store_meal_name=store_meal_name)
-                    if store_qs[0]['is_ai'] == 1:
-                        order_qs.order_type = 1
+                    Order_Model.objects.create(orderID=order_id, UID=uid, channel=channel, userID_id=user_id,
+                                               desc=content, payType=pay_type, payTime=now_time,
+                                               price=price, currency=currency, addTime=now_time, updTime=now_time,
+                                               pay_url=redirect_url, isSelectDiscounts=is_select_discount,
+                                               commodity_code=commodity_code, commodity_type=commodity_type,
+                                               rank_id=rank, coupon_id=coupon_id, ai_rank_id=1,
+                                               store_meal_name=store_meal_name)
+
                     return JsonResponse(status=200, data={'result_code': 0, 'reason': 'success',
                                                           'result': {"redirectUrl": redirect_url, "orderID": order_id},
                                                           'error_code': 0})
@@ -1616,15 +1321,12 @@ class CloudStorageView(View):
             if not response:
                 return response.json(10, '生成订单错误.')
             # 回调函数
-            order_qs = Order_Model.objects.create(orderID=order_id, UID=uid, channel=channel, userID_id=user_id,
-                                                  desc=content, payType=pay_type, payTime=now_time,
-                                                  price=price, currency=currency, addTime=now_time, updTime=now_time,
-                                                  pay_url=notify_url, isSelectDiscounts=is_select_discount,
-                                                  commodity_code=commodity_code, commodity_type=commodity_type,
-                                                  rank_id=rank,
-                                                  ai_rank_id=1, store_meal_name=store_meal_name)
-            if store_qs[0]['is_ai'] == 1:
-                order_qs.order_type = 1
+            Order_Model.objects.create(orderID=order_id, UID=uid, channel=channel, userID_id=user_id,
+                                       desc=content, payType=pay_type, payTime=now_time,
+                                       price=price, currency=currency, addTime=now_time, updTime=now_time,
+                                       pay_url=notify_url, isSelectDiscounts=is_select_discount,
+                                       commodity_code=commodity_code, commodity_type=commodity_type, rank_id=rank,
+                                       ai_rank_id=1, store_meal_name=store_meal_name)
             return JsonResponse(status=200, data={'result_code': 0, 'reason': 'success',
                                                   'result': response,
                                                   'orderId': order_id,
@@ -1697,24 +1399,16 @@ class CloudStorageView(View):
             return response.json(10064)
         order_id = CommonService.createOrderID()
         now_time = int(time.time())
-        order_type = 0
-        store_qs = Store_Meal.objects.filter(id=rank, lang__lang=lang, is_show=0).values("day", "bucket_id", 'is_ai',
+        store_qs = Store_Meal.objects.filter(id=rank, lang__lang=lang, is_show=0).values("day", "bucket_id",
                                                                                          "bucket__storeDay", "expire",
                                                                                          'lang__content', 'price',
-                                                                                         'currency', 'commodity_type',
-                                                                                         'icloud_store_meal_id')
+                                                                                         'currency', 'commodity_type')
         if not store_qs.exists():
             return response.json(173)
         bucket_id = store_qs[0]['bucket_id']
         uid_bucket_qs = UID_Bucket.objects.filter(uid=uid).values("id", "bucket_id", "bucket__storeDay",
                                                                   "bucket__region", "endTime", "use_status")
         expire = store_qs[0]['expire']
-        unuse_meal_flag = False  # 是否关联未使用套餐
-        # icloud_store_meal_id = store_qs[0]['icloud_store_meal_id']
-        # icloud_meal_qs = ICloudStoreMeal.objects.filter(id=icloud_store_meal_id).values('size')
-        # if not icloud_meal_qs.exists():
-        #     return response.json(173)
-        # size = icloud_meal_qs[0]['size']
         try:
             with transaction.atomic():
                 if uid_bucket_qs.exists():
@@ -1725,7 +1419,6 @@ class CloudStorageView(View):
                                                                               bucket_id=bucket_id,
                                                                               endTime=end_time, updateTime=now_time)
                     else:  # 已过期或者不相同的套餐加入未使用的关联套餐表
-                        unuse_meal_flag = True
                         unused_uid_qs = Unused_Uid_Meal.objects.filter(uid=uid, bucket_id=bucket_id)
                         nums = 1
                         if unused_uid_qs.exists():
@@ -1741,30 +1434,6 @@ class CloudStorageView(View):
                                                            endTime=end_time, addTime=now_time, updateTime=now_time,
                                                            use_status=1)
                     uid_bucket_id = uid_bucket.id
-                #  开通AI体验
-                if store_qs[0]['is_ai'] and CONFIG_INFO != CONFIG_CN and not unuse_meal_flag:
-                    order_type = 1
-                    ai_service_qs = AiService.objects.filter(uid=uid, channel=channel)
-                    if ai_service_qs.exists():
-                        ai_service_qs.update(endTime=end_time, use_status=1, updTime=now_time)
-                    else:
-                        AiService.objects.create(uid=uid, channel=channel, detect_status=1, endTime=end_time,
-                                                 addTime=now_time, updTime=now_time, use_status=1)
-                #  开通云盘体验
-                # icloud_use_qs = IcloudUseDetails.objects.filter(user_id=user_id).values('id')
-                # if not icloud_use_qs.exists():
-                #     bucket_qs = VodBucketModel.objects.filter(bucket='icloud').values('id')
-                #     icloud_use_qs = IcloudUseDetails.objects.create(add_time=now_time, upd_time=now_time,
-                #                                                     detect_status=1, user_id=user_id,
-                #                                                     bucket_id=bucket_qs[0]['id'])
-                #     use_details_id = icloud_use_qs.id
-                #     IcloudService.objects.create(add_time=now_time, upd_time=now_time, type=0,
-                #                                  size=1, use_details_id=use_details_id)
-                # else:
-                #     use_details_id = icloud_use_qs[0]['id']
-                # IcloudService.objects.create(order_id=order_id, add_time=now_time, upd_time=now_time, type=1,
-                #                              size=size, end_time=end_time, use_details_id=use_details_id)
-
                 store_meal_qs = Store_Meal.objects.filter(id=rank, lang__lang='cn', is_show=0).values('lang__title',
                                                                                                       'lang__content')
                 if store_meal_qs.exists():
@@ -1774,7 +1443,7 @@ class CloudStorageView(View):
                 Order_Model.objects.create(orderID=order_id, UID=uid, channel=channel, userID_id=user_id,
                                            desc=store_qs[0]['lang__content'], payType=pay_type, payTime=now_time,
                                            price=store_qs[0]['price'], currency=store_qs[0]['currency'],
-                                           addTime=now_time, order_type=order_type,
+                                           addTime=now_time,
                                            updTime=now_time,
                                            pay_url="体验版", store_meal_name=store_meal_name,
                                            commodity_code=commodity_code, commodity_type=store_qs[0]['commodity_type'],
@@ -1857,7 +1526,6 @@ class CloudStorageView(View):
                 experience_context_qs.delete()
                 Order_Model.objects.filter(uid_bucket_id=bucket_id).delete()
                 uid_bucket_qs.delete()
-                AiService.objects.filter(uid=uid_bucket_qs[0].uid).delete()
             else:
                 return response.json(10007)
         else:
@@ -2018,9 +1686,6 @@ class CloudStorageView(View):
                 Unused_Uid_Meal.objects.filter(id=unused_id).delete()
                 StsCrdModel.objects.filter(uid=uid).delete()  # 删除sts记录
                 # VodHlsModel.objects.filter(uid=uid).delete()  # 删除播放列表,后期数据量多时应该考虑延后删除
-                AiService.objects.filter(uid=uid, channel=unused_uid_bucket['channel']).update(endTime=end_time,
-                                                                                               updTime=now_time,
-                                                                                               use_status=1)
                 return response.json(0)
         except Exception:
             return response.json(474)
@@ -2101,7 +1766,7 @@ class CloudStorageView(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def do_vod_msg_notice(self, uid, channel, user_id, lang, sys_msg_text_list, sms):  # 云存操作系统消息
         """
@@ -2339,4 +2004,4 @@ class CloudStorageView(View):
         except Exception as e:
             logger = logging.getLogger('info')
             logger.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))

+ 3 - 3
Controller/CloudTransfer.py

@@ -144,7 +144,7 @@ class cloudTestView(View):
 
         except Exception as e:
             # print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
         else:
             return response.json(0)
 
@@ -243,7 +243,7 @@ class cloudTestView(View):
                 LogModel.objects.create(**log)
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def expireMeal(self, request_dict, response):
         UID_Bucket_id = request_dict.get("UID_Bucket_id", None)
@@ -253,7 +253,7 @@ class cloudTestView(View):
                 UID_Bucket.objects.filter(id=UID_Bucket_id).update(use_status=2)
             except Exception as e:
                 # print(e)
-                return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+                return response.json(500, repr(e))
             else:
                 return response.json(0)
         response.json(404)

+ 6 - 24
Controller/CloudVod.py

@@ -13,10 +13,9 @@ from django.utils.decorators import method_decorator
 from django.views.decorators.csrf import csrf_exempt
 from django.views.generic.base import View
 
-from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
-    CONFIG_INFO, CONFIG_CN
-from Model.models import Device_Info, Order_Model, Store_Meal, OssCrdModel, UID_Bucket, StsCrdModel, \
-    VodBucketModel, UidSetModel, AiService
+from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD
+from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel, \
+    VodBucketModel
 from Object.AliPayObject import AliPayObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
@@ -83,27 +82,11 @@ class CloudVodView(View):
         dvqs = Device_Info.objects.filter(UID=uid, isShare=False)
         if not dvqs.exists():
             return response.json(12)
-        uid_set_qs = UidSetModel.objects.filter(uid=uid).values('is_ai')
-        if not uid_set_qs.exists():
-            return response.json(12)
         ubqs = UID_Bucket.objects.filter(uid=uid). \
             values('bucket__content', 'status', 'channel', 'endTime', 'uid')
         res = []
-        for item in ubqs:
-            result = {
-                'bucket__content': item['bucket__content'],
-                'status': item['status'],
-                'channel': item['channel'],
-                'endTime': item['endTime'],
-                'uid': item['uid'],
-            }
-            if uid_set_qs[0]['is_ai'] != 2 and CONFIG_INFO != CONFIG_CN:
-                ai_server_qs = AiService.objects.filter(uid=uid, use_status=1).values('detect_status', 'detect_group')
-                if not ai_server_qs.exists():
-                    return response.json(12)
-                result['detect_status'] = ai_server_qs[0]['detect_status']
-                result['detect_group'] = ai_server_qs[0]['detect_group']
-            res.append(result)
+        if ubqs.exists():
+            res = list(ubqs)
         return response.json(0, res)
 
     def do_pay_error(self):
@@ -581,8 +564,7 @@ class CloudVodView(View):
             thumb = bucket.sign_url('GET', ts, 3600,
                                     params={'x-oss-process': 'video/snapshot,t_1000,m_fast,w_300'})
             vod_play_list.append(
-                {'name': vod['start_time'], 'sign_url': vod_play_url, 'thumb': thumb, 'sec': vod['sec'],
-                 'id': vod['id']})
+                {'name': vod['start_time'], 'sign_url': vod_play_url, 'thumb': thumb, 'sec': vod['sec'], 'id': vod['id']})
         vod_play_list = sorted(vod_play_list, key=lambda item: -item['name'])
         return response.json(0, vod_play_list)
 

+ 67 - 231
Controller/Cron/CronTaskController.py

@@ -10,18 +10,18 @@
 import datetime
 import threading
 import time
-
+import logging
 import requests
 from django.db import connection, connections, transaction
 from django.db.models import Q, Sum, Count
 from django.views import View
 
 from Ansjer.config import USED_SERIAL_REDIS_LIST, UNUSED_SERIAL_REDIS_LIST, CONFIG_INFO, CONFIG_US, \
-    RESET_REGION_ID_SERIAL_REDIS_LIST, LOGGER
+    RESET_REGION_ID_SERIAL_REDIS_LIST
 from Model.models import Device_User, Device_Info, UidSetModel, UID_Bucket, Unused_Uid_Meal, Order_Model, StsCrdModel, \
     VodHlsModel, ExperienceContextModel, AiService, VodHlsSummary, VideoPlaybackTimeModel, DeviceUserSummary, \
     CountryModel, DeviceTypeModel, OrdersSummary, DeviceInfoSummary, CompanySerialModel, \
-    CloudLogModel, UidCloudStorageCount, UserExModel, DeviceDomainRegionModel, VodHlsTag, VodHlsTagType, IcloudService, \
+    CloudLogModel, UidCloudStorageCount, UserExModel, DeviceDomainRegionModel, VodHlsTag, VodHlsTagType, \
     Store_Meal, Lang, VodBucketModel, UnicomComboOrderInfo, UnicomDeviceInfo
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
@@ -30,6 +30,7 @@ from Service.CommonService import CommonService
 from Service.VodHlsService import SplitVodHlsObject
 from Object.UnicomObject import UnicomObjeect
 
+LOGGER = logging.getLogger('info')
 
 class CronDelDataView(View):
     def get(self, request, *args, **kwargs):
@@ -73,6 +74,7 @@ class CronDelDataView(View):
         try:
             ucode_list = ['823C01552AA',
                           '823C01550AA',
+                          '823C01550XA',
                           '823C01850XA',
                           '730201350AA',
                           '730201350AA',
@@ -86,9 +88,23 @@ class CronDelDataView(View):
                           '72V201254AA']
             UidSetModel.objects.filter(ucode__in=ucode_list, is_human=0).update(is_human=1)
             UidSetModel.objects.filter(ucode='72V201254AA', mobile_4g=0).update(mobile_4g=1)
+            # 根据设备规格码定时更新默认算法类型类型
+            ucode_list = ['823C01552AA', '823C01550AA', '823C01550XA', 'C18201550KA',
+                          '823C01550TA', '823C01550VA', '823C01850XA', 'C18201850KA',
+                          '823C01850TA', '823C01850VA']
+            UidSetModel.objects.filter(ucode__in=ucode_list, ai_type=0).update(ai_type=47)
+            ucode_list = ['730201350AA', '730201450AA', '730201450MA', '730201450NA']
+            UidSetModel.objects.filter(ucode__in=ucode_list, ai_type=0).update(ai_type=7)
+
+            # 根据设备规格码更新默认个性化语音值
+            ucode_list = ['823C01552AA', '823C01550XA', 'C18201550KA', '823C01550TA',
+                          '823C01550VA', '823C01850XA', 'C18201850KA', '823C01850TA', '823C01850VA',
+                          '730201450AA', '730201450MA', '730201450NA', '72V201252AA', '72V201253AA',
+                          '72V201353AA', '72V201354AA', '72V201355AA', '72V201254AA']
+            UidSetModel.objects.filter(ucode__in=ucode_list, is_custom_voice=0).update(is_custom_voice=1)
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def delAppLog(response):
@@ -106,7 +122,7 @@ class CronDelDataView(View):
             cursor.close()
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def uid_cloud_storage_upload_count(response):
@@ -147,7 +163,7 @@ class CronDelDataView(View):
             connection.close()
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def delPushInfo(response):
@@ -186,7 +202,7 @@ class CronDelDataView(View):
             cursor.close()
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def delVodHls(response):
@@ -203,7 +219,7 @@ class CronDelDataView(View):
             split_vod_hls_obj.del_vod_hls_data(end_time__lt=month_ago_time)
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def del_vod_hls_tag():
@@ -227,7 +243,7 @@ class CronDelDataView(View):
             cursor.close()
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def delTesterDevice(response):
@@ -269,7 +285,7 @@ class CronDelDataView(View):
                 Device_Info.objects.filter(userID__in=device_user).delete()
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
 
 class CronUpdateDataView(View):
@@ -289,8 +305,6 @@ class CronUpdateDataView(View):
             return self.updateUnusedUidBucket(response)
         elif operation == 'updateUnusedAiService':  # 定时更新过期ai关联的未使用套餐状态
             return self.updateUnusedAiService(response)
-        elif operation == 'updateIcloudService':  # 定时更新过期云盘套餐使用状态
-            return self.updateIcloudService(response)
         elif operation == 'reqUpdateSerialStatus':  # 定时请求更新序列号状态
             return self.reqUpdateSerialStatus(response)
         elif operation == 'updateSerialStatus':  # 更新序列号状态
@@ -315,9 +329,9 @@ class CronUpdateDataView(View):
         expired_uid_bucket = expired_uid_bucket.filter(~Q(use_status=2)).values('id')
         if expired_uid_bucket.exists():
             expired_uid_bucket.update(use_status=2)
-        AiService.objects.filter(Q(endTime__lte=now_time), ~Q(use_status=2)).update(use_status=2)
         # 监控有未使用套餐则自动生效
-        expired_uid_buckets = UID_Bucket.objects.filter(endTime__lte=now_time, has_unused=1).values("id", "uid")[0:1000]
+        expired_uid_buckets = \
+            UID_Bucket.objects.filter(endTime__lte=now_time, has_unused=1).values("id", "uid")[0:1000]
         for expired_uid_bucket in expired_uid_buckets:
             unuseds = Unused_Uid_Meal.objects.filter(
                 uid=expired_uid_bucket['uid']).values(
@@ -327,28 +341,28 @@ class CronUpdateDataView(View):
                 "addTime",
                 "expire",
                 "num",
-                "bucket_id").order_by('addTime')
+                "bucket_id").order_by('addTime')[0:1]
             if not unuseds.exists():
                 continue
             unused = unuseds[0]
             try:
                 with transaction.atomic():
-                    count_unused = Unused_Uid_Meal.objects.filter(uid=expired_uid_bucket['uid']).count()
+                    count_unused = Unused_Uid_Meal.objects.filter(
+                        uid=expired_uid_bucket['uid']).count()
                     has_unused = 1 if count_unused > 1 else 0
-                    end_time = CommonService.calcMonthLater(unused['expire'] * unused['num'])
+                    endTime = CommonService.calcMonthLater(
+                        unused['expire'] * unused['num'])
                     UID_Bucket.objects.filter(
                         uid=expired_uid_bucket['uid']).update(
                         channel=unused['channel'],
-                        endTime=end_time,
+                        endTime=endTime,
                         bucket_id=unused['bucket_id'],
                         updateTime=now_time,
                         use_status=1,
                         has_unused=has_unused)
                     Unused_Uid_Meal.objects.filter(id=unused['id']).delete()
-                    StsCrdModel.objects.filter(uid=expired_uid_bucket['uid']).delete()  # 删除sts记录
-                    AiService.objects.filter(uid=expired_uid_bucket['uid']).update(use_status=1, endTime=end_time,
-                                                                                   updTime=now_time,
-                                                                                   channel=unused['channel'])
+                    StsCrdModel.objects.filter(
+                        uid=expired_uid_bucket['uid']).delete()  # 删除sts记录
             except Exception as e:
                 print(repr(e))
                 continue
@@ -387,44 +401,29 @@ class CronUpdateDataView(View):
                 continue
         return response.json(0)
 
-    @staticmethod
-    def updateIcloudService(response):
-        """
-        监控云盘套餐过期修改状态
-        @param response:
-        @return:
-        """
-        # 定时更新已过期套餐修改状态为2
-        now_time = int(time.time())
-        try:
-            IcloudService.objects.filter(Q(end_time__lte=now_time), ~Q(end_time=0),
-                                         ~Q(use_status=1)).update(use_status=1)
-            return response.json(0)
-        except Exception as e:
-            return response.json(500)
-
     @classmethod
     def reqUpdateSerialStatus(cls, response):
         redis_obj = RedisObject()
+        logger = logging.getLogger('info')
 
         # 更新已使用序列号其他服务器的状态
         used_serial_redis_list = redis_obj.lrange(USED_SERIAL_REDIS_LIST, 0, -1)  # 读取redis已使用序列号
         if used_serial_redis_list:
-            LOGGER.info('---请求更新已使用序列号列表---used_serial_redis_list:{}'.format(used_serial_redis_list))
+            logger.info('---请求更新已使用序列号列表---used_serial_redis_list:{}'.format(used_serial_redis_list))
             used_serial_redis_list = [str(i, 'utf-8') for i in used_serial_redis_list]
             cls.do_request_function(used_serial_redis_list, 3)
 
         # 更新未使用序列号其他服务器的状态
         unused_serial_redis_list = redis_obj.lrange(UNUSED_SERIAL_REDIS_LIST, 0, -1)  # 读取redis未使用序列号
         if unused_serial_redis_list:
-            LOGGER.info('---请求更新未使用序列号列表---unused_serial_redis_list:{}'.format(unused_serial_redis_list))
+            logger.info('---请求更新未使用序列号列表---unused_serial_redis_list:{}'.format(unused_serial_redis_list))
             unused_serial_redis_list = [str(i, 'utf-8') for i in unused_serial_redis_list]
             cls.do_request_function(unused_serial_redis_list, 1)
 
         # 重置地区id
         reset_region_id_serial_redis_list = redis_obj.lrange(RESET_REGION_ID_SERIAL_REDIS_LIST, 0, -1)  # 读取redis未使用序列号
         if reset_region_id_serial_redis_list:
-            LOGGER.info('---请求重置地区id的序列号列表---:{}'.format(reset_region_id_serial_redis_list))
+            logger.info('---请求重置地区id的序列号列表---:{}'.format(reset_region_id_serial_redis_list))
             reset_region_id_serial_redis_list = [str(i, 'utf-8') for i in reset_region_id_serial_redis_list]
             cls.do_request_reset_region_id(reset_region_id_serial_redis_list)
         return response.json(0)
@@ -443,30 +442,31 @@ class CronUpdateDataView(View):
         # 确认域名列表
         orders_domain_name_list = CommonService.get_orders_domain_name_list()
         redis_obj = RedisObject()
-        LOGGER.info('---请求更新序列号线程---data:{},orders_domain_name_list:{}'.format(data, orders_domain_name_list))
+        logger = logging.getLogger('info')
+        logger.info('---请求更新序列号线程---data:{},orders_domain_name_list:{}'.format(data, orders_domain_name_list))
         try:
             requests_failed_flag = False  # 请求失败标志位
             for domain_name in orders_domain_name_list:
                 url = '{}cron/update/updateSerialStatus'.format(domain_name)
                 response = requests.post(url=url, data=data, timeout=5)
-                LOGGER.info('---请求更新序列号响应时间---:{}'.format(response.elapsed.total_seconds()))
+                logger.info('---请求更新序列号响应时间---:{}'.format(response.elapsed.total_seconds()))
                 result = response.json()
                 if result['result_code'] != 0:  # 请求失败标志位置位
                     requests_failed_flag = True
                     break
 
                 # 状态为未使用,重置美洲服的地区id
-                if status == 1:  # 美洲服直接更新
+                if status == 1:     # 美洲服直接更新
                     if CONFIG_INFO == CONFIG_US:
-                        DeviceDomainRegionModel.objects.filter(~Q(region_id=0), serial_number__in=serial_redis_list). \
+                        DeviceDomainRegionModel.objects.filter(~Q(region_id=0), serial_number__in=serial_redis_list).\
                             update(region_id=0)
-                    else:  # 其他服请求到美洲服更新
+                    else:   # 其他服请求到美洲服更新
                         req_url = 'https://www.dvema.com/cron/update/reset-region-id'
                         req_data = {
                             'serial_redis_list': str(serial_redis_list)
                         }
                         response = requests.post(url=req_url, data=req_data, timeout=5)
-                        LOGGER.info('---请求重置地区id响应时间---:{}'.format(response.elapsed.total_seconds()))
+                        logger.info('---请求重置地区id响应时间---:{}'.format(response.elapsed.total_seconds()))
                         result = response.json()
                         if result['result_code'] != 0:  # 请求失败标志位置位
                             requests_failed_flag = True
@@ -480,7 +480,7 @@ class CronUpdateDataView(View):
                     for i in serial_redis_list:
                         redis_obj.lrem(USED_SERIAL_REDIS_LIST, 0, i)
         except Exception as e:
-            LOGGER.info('---更新序列号状态异常---:{}'.format(repr(e)))
+            logger.info('---更新序列号状态异常---:{}'.format(repr(e)))
 
     @staticmethod
     def do_request_reset_region_id(reset_region_id_serial_redis_list):
@@ -489,6 +489,7 @@ class CronUpdateDataView(View):
         @param reset_region_id_serial_redis_list: 序列号redis列表
         """
         redis_obj = RedisObject()
+        logger = logging.getLogger('info')
         requests_failed_flag = False  # 请求失败标志位
         data = {
             'serial_redis_list': str(reset_region_id_serial_redis_list),
@@ -504,7 +505,7 @@ class CronUpdateDataView(View):
                 for serial in reset_region_id_serial_redis_list:
                     redis_obj.lrem(RESET_REGION_ID_SERIAL_REDIS_LIST, 0, serial)
         except Exception as e:
-            LOGGER.info('---请求重置地区id异常---:{}'.format(repr(e)))
+            logger.info('---请求重置地区id异常---:{}'.format(repr(e)))
 
     @staticmethod
     def updateSerialStatus(request_dict, response):
@@ -517,7 +518,8 @@ class CronUpdateDataView(View):
         """
         serial_redis_list = request_dict.get('serial_redis_list', None)
         status = request_dict.get('status', None)
-        LOGGER.info('---更新序列号状态参数---serial_redis_list:{},status:{}'.format(serial_redis_list, status))
+        logger = logging.getLogger('info')
+        logger.info('---更新序列号状态参数---serial_redis_list:{},status:{}'.format(serial_redis_list, status))
         if not all([serial_redis_list, status]):
             return response.json(444)
         now_time = int(time.time())
@@ -527,7 +529,7 @@ class CronUpdateDataView(View):
                                                                                           update_time=now_time)
             return response.json(0)
         except Exception as e:
-            LOGGER.info('---更新序列号状态异常---:{}'.format(repr(e)))
+            logger.info('---更新序列号状态异常---:{}'.format(repr(e)))
             return response.json(500)
 
     @staticmethod
@@ -539,7 +541,8 @@ class CronUpdateDataView(View):
         @param response: 响应对象
         """
         serial_redis_list = request_dict.get('serial_redis_list', None)
-        LOGGER.info('---重置地区id参数---serial_redis_list:{}'.format(serial_redis_list))
+        logger = logging.getLogger('info')
+        logger.info('---重置地区id参数---serial_redis_list:{}'.format(serial_redis_list))
         if not serial_redis_list:
             return response.json(444)
         try:
@@ -547,7 +550,7 @@ class CronUpdateDataView(View):
             DeviceDomainRegionModel.objects.filter(serial_number__in=serial_redis_list).update(region_id=0)
             return response.json(0)
         except Exception as e:
-            LOGGER.info('---重置地区id异常---:{}'.format(repr(e)))
+            logger.info('---重置地区id异常---:{}'.format(repr(e)))
             return response.json(500)
 
     @staticmethod
@@ -568,33 +571,25 @@ class CronUpdateDataView(View):
                 elif lang == 'en':
                     Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='1-Month plan (free trial)')
                 elif lang == 'es':
-                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(
-                        content='Plan de 1 mes (prueba gratuita)')
+                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='Plan de 1 mes (prueba gratuita)')
                 elif lang == 'fr':
-                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(
-                        content='Forfait de 1 mois (essai gratuit)')
+                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='Forfait de 1 mois (essai gratuit)')
                 elif lang == 'de':
-                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(
-                        content='1 Monat Paket (kostenlose Testversion) ')
+                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='1 Monat Paket (kostenlose Testversion) ')
                 elif lang == 'cn_tw':
                     Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='一個月套餐(免費試用)')
                 elif lang == 'pt':
-                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(
-                        content='Plano de 1 mês (teste gratuito)')
+                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='Plano de 1 mês (teste gratuito)')
                 elif lang == 'ru':
-                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(
-                        content='Тариф 1 месяц (бесплатный пробный период)')
+                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='Тариф 1 месяц (бесплатный пробный период)')
                 elif lang == 'ja':
                     Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='1ヶ月プラン(無料試用)')
                 elif lang == 'it':
-                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(
-                        content='Pacchetto di 1 mese (prova gratuita)')
+                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='Pacchetto di 1 mese (prova gratuita)')
                 elif lang == 'pl':
-                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(
-                        content='jednomiesięczny pakiet (bezpłatny próbny)')
+                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='jednomiesięczny pakiet (bezpłatny próbny)')
                 elif lang == 'nl':
-                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(
-                        content='Pakket van 1 maand (gratis proefperiode)')
+                    Lang.objects.filter(lang=lang, store_meal__id=meal_id).update(content='Pakket van 1 maand (gratis proefperiode)')
             VodBucketModel.objects.filter(id=meal_qs[0]['bucket']).update(content='国内存储桶免费体验30天,录像保存7天')
             meal_qs.update(expire=1)
             return response.json(0)
@@ -602,7 +597,6 @@ class CronUpdateDataView(View):
             LOGGER.info('---修改体验套餐有效期---:{}'.format(repr(e)))
             return response.json(500)
 
-
 class CronCollectDataView(View):
     def get(self, request, *args, **kwargs):
         request.encoding = 'utf-8'
@@ -622,8 +616,6 @@ class CronCollectDataView(View):
             return self.collect_device_user(response)
         elif operation == 'collectOrder':  # 定时保存订单数据
             return self.collect_order(response)
-        elif operation == 'collectIcloudOrder':  # 定时保存云盘订单数据
-            return self.collect_icloud_order(response)
         elif operation == 'collectDeviceInfo':  # 定时保存设备数据
             return self.collect_device_info(response)
         elif operation == 'collectFlowInfo':  # 定时保存设备数据
@@ -662,7 +654,7 @@ class CronCollectDataView(View):
 
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def collect_device_user(response):
@@ -719,7 +711,7 @@ class CronCollectDataView(View):
 
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def collect_order(response):
@@ -760,8 +752,6 @@ class CronCollectDataView(View):
                     country_id = uid_set_qs[0]['tb_country'] if uid_set_qs.exists() else 0
                     country_name = country_dict.get(country_id, '未知国家')
                     order_type = item['order_type']
-                    if order_type == 1:
-                        order_type = 0
                     device_info_qs = Device_Info.objects.filter(UID=item['UID']).values('Type')
                     device_type_id = device_info_qs[0]['Type'] if device_info_qs.exists() else 0
                     device_type_name = device_type_dict.get(device_type_id, '未知设备')
@@ -952,161 +942,7 @@ class CronCollectDataView(View):
                                                      device_type=device_type_temp_dict, store_meal=store_meal_temp_dict)
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
-
-    @staticmethod
-    def collect_icloud_order(response):
-        try:
-            order_type = 4
-            created_time = int(time.time())
-            today = datetime.datetime.today()
-            start_time = datetime.datetime(today.year, today.month, today.day)
-            end_time = start_time + datetime.timedelta(days=1)
-            start_time = CommonService.str_to_timestamp(start_time.strftime('%Y-%m-%d %H:%M:%S'))
-            end_time = CommonService.str_to_timestamp(end_time.strftime('%Y-%m-%d %H:%M:%S'))
-            order_qs = Order_Model.objects.filter(addTime__gte=start_time, addTime__lt=end_time, order_type=order_type,
-                                                  status=1).values('userID',
-                                                                   'store_meal_name', 'price',
-                                                                   'addTime', 'currency').order_by(
-                'addTime')
-            user_list = []
-            all_order_qs = Order_Model.objects.filter(addTime__lt=start_time, status=1, order_type=order_type).values(
-                'userID')
-            for item in all_order_qs:
-                if item['userID'] not in user_list:
-                    user_list.append(item['userID'])
-            # 国家表数据
-            country_qs = CountryModel.objects.values('id', 'country_name')
-            country_dict = {}
-            for item in country_qs:
-                country_dict[item['id']] = item['country_name']
-            with transaction.atomic():
-                for item in order_qs:
-                    price = float(item['price'])
-                    currency = item['currency']
-                    user_qs = Device_User.objects.filter(userID=item['userID']).values('region_country')
-                    country_id = user_qs[0]['region_country'] if user_qs.exists() else 0
-                    country_name = country_dict.get(country_id, '未知国家')
-                    store_meal_name = item['store_meal_name']
-                    add_time_stamp = item['addTime']
-                    add_time_str = datetime.datetime.fromtimestamp(int(add_time_stamp))
-                    add_time_str = datetime.datetime(add_time_str.year, add_time_str.month, add_time_str.day)
-                    add_time_stamp = CommonService.str_to_timestamp(add_time_str.strftime('%Y-%m-%d %H:%M:%S'))
-
-                    order_summary_qs = OrdersSummary.objects.filter(time=add_time_stamp, query_type=0,
-                                                                    service_type=order_type)
-                    if item['userID'] not in user_list:
-                        pay_order_summary_qs = OrdersSummary.objects.filter(time=add_time_stamp, query_type=2,
-                                                                            service_type=order_type)
-                        query_type = 2
-                    else:
-                        pay_order_summary_qs = OrdersSummary.objects.filter(time=add_time_stamp, query_type=3,
-                                                                            service_type=order_type)
-                        query_type = 3
-                    if pay_order_summary_qs.exists():
-                        pay_order_summary = pay_order_summary_qs.first()
-                        pay_order_summary.count += 1
-                        temp_total = eval(pay_order_summary.total)
-                        if currency not in temp_total:
-                            temp_total[currency] = price
-                        else:
-                            temp_total[currency] = round(temp_total[currency] + price, 2)
-                        pay_order_summary.total = temp_total
-                        country_temp_dict = eval(pay_order_summary.country)
-                        if country_name in country_temp_dict:
-                            country_temp_dict[country_name]['数量'] += 1
-                            if currency not in country_temp_dict[country_name]:
-                                country_temp_dict[country_name][currency] = price
-                            else:
-                                country_temp_dict[country_name][currency] = round(
-                                    country_temp_dict[country_name][currency] + price, 2)
-                        else:
-                            country_temp_dict[country_name] = {'数量': 1, currency: price}
-                        pay_order_summary.country = country_temp_dict
-                        store_meal_temp_dict = eval(pay_order_summary.store_meal)
-                        if store_meal_name in store_meal_temp_dict:
-                            store_meal_temp_dict[store_meal_name]['数量'] += 1
-                            if currency not in store_meal_temp_dict[store_meal_name]:
-                                store_meal_temp_dict[store_meal_name][currency] = price
-                            else:
-                                store_meal_temp_dict[store_meal_name][currency] = round(
-                                    store_meal_temp_dict[store_meal_name][currency] + price, 2)
-                        else:
-                            store_meal_temp_dict[store_meal_name] = {'数量': 1, currency: price}
-                        pay_order_summary.store_meal = store_meal_temp_dict
-                        pay_order_summary.save()
-                    else:
-                        final_total = {currency: price}
-                        country_temp_dict = {
-                            country_name: {
-                                '数量': 1,
-                                currency: price
-                            }
-                        }
-                        store_meal_temp_dict = {
-                            store_meal_name: {
-                                '数量': 1,
-                                currency: price
-                            }
-                        }
-                        OrdersSummary.objects.create(time=add_time_stamp, count=1, query_type=query_type,
-                                                     service_type=order_type, total=final_total,
-                                                     country=country_temp_dict, created_time=created_time,
-                                                     device_type={},
-                                                     store_meal=store_meal_temp_dict)
-                    if order_summary_qs.exists():
-                        order_summary = order_summary_qs.first()
-                        order_summary.count += 1
-                        temp_total = eval(order_summary.total)
-                        if currency not in temp_total:
-                            temp_total[currency] = price
-                        else:
-                            temp_total[currency] = round(temp_total[currency] + price, 2)
-                        order_summary.total = temp_total
-                        country_temp_dict = eval(order_summary.country)
-                        if country_name in country_temp_dict:
-                            country_temp_dict[country_name]['数量'] += 1
-                            if currency not in country_temp_dict[country_name]:
-                                country_temp_dict[country_name][currency] = price
-                            else:
-                                country_temp_dict[country_name][currency] = round(
-                                    country_temp_dict[country_name][currency] + price, 2)
-                        else:
-                            country_temp_dict[country_name] = {'数量': 1, currency: price}
-                        order_summary.country = country_temp_dict
-                        store_meal_temp_dict = eval(order_summary.store_meal)
-                        if store_meal_name in store_meal_temp_dict:
-                            store_meal_temp_dict[store_meal_name]['数量'] += 1
-                            if currency not in store_meal_temp_dict[store_meal_name]:
-                                store_meal_temp_dict[store_meal_name][currency] = price
-                            else:
-                                store_meal_temp_dict[store_meal_name][currency] = round(
-                                    store_meal_temp_dict[store_meal_name][currency] + price, 2)
-                        else:
-                            store_meal_temp_dict[store_meal_name] = {'数量': 1, currency: price}
-                        order_summary.store_meal = store_meal_temp_dict
-                        order_summary.save()
-                    else:
-                        final_total = {currency: price}
-                        country_temp_dict = {
-                            country_name: {
-                                '数量': 1,
-                                currency: price
-                            }
-                        }
-                        store_meal_temp_dict = {
-                            store_meal_name: {
-                                '数量': 1,
-                                currency: price
-                            }
-                        }
-                        OrdersSummary.objects.create(time=add_time_stamp, count=1, query_type=0,
-                                                     service_type=order_type, total=final_total,
-                                                     country=country_temp_dict, created_time=created_time,
-                                                     device_type={}, store_meal=store_meal_temp_dict)
-            return response.json(0)
-        except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def collect_device_info(response):

+ 4 - 3
Controller/DetectController.py

@@ -26,7 +26,7 @@ from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, DETECT_PUSH
     JPUSH_CONFIG, FCM_CONFIG, APNS_CONFIG, \
     BASE_DIR, APNS_MODE, SERVER_TYPE, LOGGER
 from Ansjer.config import PUSH_REDIS_ADDRESS
-from Model.models import Device_Info, Equipment_Info, UidSetModel, UidPushModel, SysMsgModel, \
+from Model.models import Device_Info, VodHlsModel, Equipment_Info, UidSetModel, UidPushModel, SysMsgModel, \
     VodBucketModel
 from Object.ETkObject import ETkObject
 from Object.RedisObject import RedisObject
@@ -181,6 +181,7 @@ class DetectControllerView(View):
 
     def do_change_status(self, userID, request_dict, response):
         token_val = request_dict.get('token_val', None)
+        jg_token_val = request_dict.get('jg_token_val', '')
         appBundleId = request_dict.get('appBundleId', None)
         app_type = request_dict.get('app_type', None)
         push_type = request_dict.get('push_type', None)
@@ -271,6 +272,7 @@ class DetectControllerView(View):
                         'app_type': app_type,
                         'push_type': push_type,
                         'token_val': token_val,
+                        'jg_token_val': jg_token_val,
                         'updTime': nowTime,
                         'lang': lang,
                         'tz': tz
@@ -285,6 +287,7 @@ class DetectControllerView(View):
                         'app_type': app_type,
                         'push_type': push_type,
                         'token_val': token_val,
+                        'jg_token_val': jg_token_val,
                         'm_code': m_code,
                         'addTime': nowTime,
                         'updTime': nowTime,
@@ -293,8 +296,6 @@ class DetectControllerView(View):
                     }
                     # 绑定设备推送
                     UidPushModel.objects.create(**uid_push_create_dict)
-                if appBundleId == 0 or appBundleId == '0':
-                    LOGGER.info('detect/changeStatus接口推送数据:{}'.format(request_dict))
                 if interval:
                     self.do_delete_redis(uid, int(interval))
                 else:

+ 18 - 43
Controller/DetectControllerV2.py

@@ -10,6 +10,7 @@ from django.views.generic.base import View
 
 from Ansjer.config import DETECT_PUSH_DOMAIN, DETECT_PUSH_DOMAINS, DETECT_PUSH_DOMAIN_JIUAN, DETECT_PUSH_DOMAINS_JIUAN, \
     OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, LOGGER
+from Ansjer.config import PUSH_REDIS_ADDRESS
 from Model.models import Device_Info, Equipment_Info, UidSetModel, UidPushModel, CompanyModel, SysMsgModel, \
     AiService, VodBucketModel
 from Object.ETkObject import ETkObject
@@ -27,18 +28,17 @@ class DetectControllerViewV2(View):
     def get(self, request, *args, **kwargs):
         request.encoding = 'utf-8'
         operation = kwargs.get('operation')
-        api_version = kwargs.get('apiVersion')
         # self.ip = CommonService.get_ip_address(request)
-        return self.validation(request, request.GET, operation, api_version)
+        return self.validation(request.GET, operation)
 
     def post(self, request, *args, **kwargs):
         request.encoding = 'utf-8'
         operation = kwargs.get('operation')
-        api_version = kwargs.get('apiVersion')
         # self.ip = CommonService.get_ip_address(request)
-        return self.validation(request, request.POST, operation, api_version)
+        return self.validation(request.POST, operation)
+
+    def validation(self, request_dict, operation):
 
-    def validation(self, request, request_dict, operation, api_version):
         response = ResponseObject()
         if operation is None:
             return response.json(444, 'error path')
@@ -58,42 +58,14 @@ class DetectControllerViewV2(View):
             # 更新推送延迟
             elif operation == 'updateInterval':
                 return self.do_update_interval(userID, request_dict, response)
-            # 消息提醒配置
-            elif operation == 'messageNotificationSet':
-                return self.message_notification_set(api_version, request_dict, response)
             else:
                 return response.json(414)
         else:
             return response.json(tko.code)
 
-    @classmethod
-    def message_notification_set(cls, api_version, request_dict, response):
-        """
-        消息提醒设置
-        @param api_version: 版本号
-        @param request_dict: 参数json格式
-        @param response: 响应数据
-        """
-        try:
-            msg_data = request_dict.get('msgData', None)
-            uid = request_dict.get('uid', None)
-            LOGGER.info('*****DetectControllerViewV2.message_notification_set*****api_version:{},uid:{}'
-                        .format(api_version, uid))
-            if not all([msg_data, uid]):
-                return response.json(444)
-            data = json.loads(msg_data)
-            uid_set_qs = UidSetModel.objects.filter(uid=uid)
-            if not uid_set_qs.exists():
-                return response.json(173)
-            uid_set_qs.update(msg_notify=data, updTime=int(time.time()))
-            return response.json(0)
-        except Exception as e:
-            LOGGER.info('*****DetectControllerViewV2.message_notification_set:errLine:{}, errMsg:{}'
-                        .format(e.__traceback__.tb_lineno, repr(e)))
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
-
     def do_change_status(self, userID, request_dict, response):
         token_val = request_dict.get('token_val', None)
+        jg_token_val = request_dict.get('jg_token_val', '')
         appBundleId = request_dict.get('appBundleId', None)
         app_type = request_dict.get('app_type', None)
         push_type = request_dict.get('push_type', None)
@@ -142,6 +114,7 @@ class DetectControllerViewV2(View):
             uid_set_data = {
                 'device_type': device_info_qs[0].Type
             }
+
             # 设置开关状态,0:关闭,1:开启
             if status:
                 status = int(status)
@@ -151,6 +124,9 @@ class DetectControllerViewV2(View):
             # 检测类型
             if detect_group:
                 uid_set_data['detect_group'] = detect_group
+            # uid_set = UidSetModel.objects.filter(uid=uid).order_by('-updTime')
+            # if uid_set.exists():
+            #     interval = uid_set.first().new_detect_interval if not interval else interval
             # 设置消息推送间隔
             if interval:
                 interval = int(interval)
@@ -166,13 +142,12 @@ class DetectControllerViewV2(View):
                         }
                     }
                     CommonService.req_publish_mqtt_msg(uid, topic_name, msg)
+                    # 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():
-                msg_data = uid_set_qs.first().msg_notify
-                if status == 0 and msg_data:
-                    msg_data['appPush'] = -1
-                    uid_set_data['msg_notify'] = msg_data
                 uid_set_id = uid_set_qs[0].id
                 uid_set_data['updTime'] = nowTime
                 uid_set_qs.update(**uid_set_data)
@@ -193,6 +168,7 @@ class DetectControllerViewV2(View):
                             'app_type': app_type,
                             'push_type': push_type,
                             'token_val': token_val,
+                            'jg_token_val': jg_token_val,
                             'updTime': nowTime,
                             'lang': lang,
                             'tz': tz
@@ -206,6 +182,7 @@ class DetectControllerViewV2(View):
                             'app_type': app_type,
                             'push_type': push_type,
                             'token_val': token_val,
+                            'jg_token_val': jg_token_val,
                             'm_code': m_code,
                             'addTime': nowTime,
                             'updTime': nowTime,
@@ -214,8 +191,6 @@ class DetectControllerViewV2(View):
                         }
                         # 绑定设备推送
                         UidPushModel.objects.create(**uid_push_create_dict)
-                if appBundleId == 0 or appBundleId == '0':
-                    LOGGER.info('detectV2/changeStatus接口推送数据:{}'.format(request_dict))
                 return response.json(0)
 
             if status == 0:
@@ -231,6 +206,7 @@ class DetectControllerViewV2(View):
                             'app_type': app_type,
                             'push_type': push_type,
                             'token_val': token_val,
+                            'jg_token_val': jg_token_val,
                             'updTime': nowTime,
                             'lang': lang,
                             'tz': tz
@@ -244,6 +220,7 @@ class DetectControllerViewV2(View):
                             'app_type': app_type,
                             'push_type': push_type,
                             'token_val': token_val,
+                            'jg_token_val': jg_token_val,
                             'm_code': m_code,
                             'addTime': nowTime,
                             'updTime': nowTime,
@@ -252,8 +229,6 @@ class DetectControllerViewV2(View):
                         }
                         # 绑定设备推送
                         UidPushModel.objects.create(**uid_push_create_dict)
-                if appBundleId == 0 or appBundleId == '0':
-                    LOGGER.info('detectV2/changeStatus接口推送数据:{}'.format(request_dict))
                 if interval:
                     self.do_delete_redis(uid, interval)
                 else:
@@ -278,7 +253,7 @@ class DetectControllerViewV2(View):
             else:
                 return response.json(173)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def do_delete_redis(self, uid, detect_interval=0):
         keyPattern = '{uid}*'.format(uid=uid)

+ 40 - 43
Controller/EquipmentManager.py

@@ -776,13 +776,12 @@ def admin_modifyInterface(request):
             return response.json(0, res)
 
 
-# 新删除设备
 def deleteInterface(request):
-    '''
-    删除用户设备
-    :param request:
-    :return:
-    '''
+    """
+    删除设备
+    @param request: 请求体
+    @return: response
+    """
     response = ResponseObject()
     request.encoding = 'utf-8'
     if request.method == 'POST':
@@ -791,51 +790,53 @@ def deleteInterface(request):
         request_dict = request.GET
     else:
         return response.json(444)
+
     token = request_dict.get('token', None)
     id = request_dict.get('id', None)
-    if not id:
-        return response.json(444, 'id')
+    if not all([token, id]):
+        return response.json(444)
+
     tko = TokenObject(token)
     response.lang = tko.lang
     if tko.code != 0:
         return response.json(tko.code)
     userID = tko.userID
-    # 主用户删除设备全部删除
     if not userID:
         return response.json(309)
+
     try:
         with transaction.atomic():
-            dv_qs = Device_Info.objects.filter(userID_id=userID, id=id)
+            dv_qs = Device_Info.objects.filter(userID_id=userID, id=id).values('UID', 'serial_number', 'isShare',
+                                                                               'vodPrimaryUserID')
             if not dv_qs.exists():
                 return response.json(14)
-            uid = dv_qs[0].UID
-            serial_number = dv_qs[0].serial_number
-            if userID == dv_qs[0].vodPrimaryUserID:
-                Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')
-
-            up_qs = UidPushModel.objects.filter(uid_set__uid=uid)
-            if dv_qs[0].isShare:
-                DeviceShareView.del_device_channel_permission(userID, uid)
+            uid = dv_qs[0]['UID']
+            serial_number = dv_qs[0]['serial_number']
+            is_share = dv_qs[0]['isShare']
+            vod_primary_user_id = dv_qs[0]['vodPrimaryUserID']
+
+            del_channel_permission_user_id = ''
+            # 主用户删除
+            if userID == vod_primary_user_id:
+                user_id_list = list(Device_Info.objects.filter(UID=uid).values_list('userID_id', flat=True))
+                Device_Info.objects.filter(UID=uid).delete()
+                UidPushModel.objects.filter(uid_set__uid=uid).delete()
+                # 删除推送消息
+                del_eq_info_thread = threading.Thread(target=ModelService.del_user_list_eq_info,
+                                                      args=(user_id_list, uid))
             else:
-                # a.主用户删除设备
-                # 删除设备影子信息uid_set   外键关联删除设备推送配置信息 uid_push
-                DetectControllerView().do_delete_redis(uid)
-                if up_qs.count() > 1:
-                    redisObj = RedisObject()
-                    ykey = '{uid}_redis_qs'.format(uid=uid)
-                    if ykey:
-                        redisObj.del_data(key=ykey)
-                # b.删除次用户设备
-                Device_Info.objects.filter(UID=uid, isShare=True, primaryUserID=userID).delete()
-                DeviceShareView.del_device_channel_permission('', uid)
-            up_qs.delete()
-            dv_qs.delete()
+                Device_Info.objects.filter(UID=uid, userID_id=userID).delete()
+                UidPushModel.objects.filter(uid_set__uid=uid, userID_id=userID).delete()
+                # 删除推送消息
+                del_eq_info_thread = threading.Thread(target=ModelService.del_eq_info, args=(userID, uid))
+                if is_share:
+                    del_channel_permission_user_id = userID
+            del_eq_info_thread.start()
+            DeviceShareView.del_device_channel_permission(userID, uid)
+
             if not serial_number:
                 serial_number = CommonService.query_serial_with_uid(uid)
             del_unicom_info(userID, serial_number)
-            # 异步删除推送消息
-            asy = threading.Thread(target=ModelService.del_eq_info, args=(userID, uid))
-            asy.start()
 
             # 记录操作日志
             now_time = int(time.time())
@@ -851,12 +852,10 @@ def deleteInterface(request):
                 'operation': '{}删除设备,uid:{}'.format(userID, uid),
             }
             LogModel.objects.create(**log)
-    except Exception as e:
-        errorInfo = traceback.format_exc()
-        print('删除数据库记录错误: %s' % errorInfo)
-        return response.json(176, repr(e))
-    else:
+
         return response.json(0)
+    except Exception as e:
+        return response.json(176, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
 
 def del_unicom_info(user_id, serial_no):
@@ -1089,8 +1088,7 @@ def uid_status(request):
     # 判断用户是否绑定设备
     qs = UidSetModel.objects.filter(uid=uid).values('uid', 'detect_status', 'detect_interval', 'version', 'ucode',
                                                     'p2p_region', 'tz', 'video_code', 'channel', 'cloud_vod', 'id',
-                                                    'detect_group', 'is_alexa', 'region_alexa', 'is_ptz',
-                                                    'msg_notify')
+                                                    'detect_group', 'is_alexa', 'region_alexa', 'is_ptz')
 
     # 调试
     debugOnes = int(time.time())
@@ -1121,8 +1119,7 @@ def uid_status(request):
             'detect_group': qs[0]['detect_group'],  # 推送组
             'is_alexa': qs[0]['is_alexa'],  # 推送组
             'region_alexa': qs[0]['region_alexa'],  # 推送组
-            'is_ptz': qs[0]['is_ptz'],
-            'msgData': qs[0]['msg_notify']
+            'is_ptz': qs[0]['is_ptz']
         }
 
         # 调试

+ 10 - 26
Controller/EquipmentManagerV3.py

@@ -19,7 +19,7 @@ from Controller.SensorGateway.EquipmentFamilyController import EquipmentFamilyVi
 from Controller.UnicomCombo.UnicomComboController import UnicomComboView
 from Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidChannelSetModel, \
     Device_User, iotdeviceInfoModel, UIDCompanySerialModel, UnicomDeviceInfo, CountryModel, \
-    DeviceCloudPhotoInfo, UidPushModel, ExperienceContextModel
+    DeviceCloudPhotoInfo, UidPushModel
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
@@ -120,6 +120,7 @@ class EquipmentManagerV3(View):
         app_type = request_dict.get('app_type', None)
         push_type = request_dict.get('push_type', None)
         token_val = request_dict.get('token_val', None)
+        jg_token_val = request_dict.get('jg_token_val', '')
         lang = request_dict.get('lang', 'en')
         tz = request_dict.get('tz', '0')
 
@@ -252,6 +253,7 @@ class EquipmentManagerV3(View):
                         'app_type': app_type,
                         'push_type': push_type,
                         'token_val': token_val,
+                        'jg_token_val': jg_token_val,
                         'updTime': nowTime,
                         'lang': lang,
                         'tz': tz
@@ -265,6 +267,7 @@ class EquipmentManagerV3(View):
                         'app_type': app_type,
                         'push_type': push_type,
                         'token_val': token_val,
+                        'jg_token_val': jg_token_val,
                         'm_code': m_code,
                         'addTime': nowTime,
                         'updTime': nowTime,
@@ -273,8 +276,6 @@ class EquipmentManagerV3(View):
                     }
                     # 绑定设备推送
                     UidPushModel.objects.create(**uid_push_create_dict)
-                if appBundleId == 0 or appBundleId == '0':
-                    LOGGER.info('v3/equipment/add接口推送数据:{}'.format(request_dict))
             # 查询uid_channel表有无该uid的数据
             uid_channel_set = UidChannelSetModel.objects.filter(uid_id=UidSet_id)
             if not uid_channel_set.exists():
@@ -380,7 +381,9 @@ class EquipmentManagerV3(View):
             if not unicom_device_info_qs[0].user_id:
                 # 生成4G免费订单
                 UnicomComboView.experience_order_4G(unicom_device_info_qs[0].iccid,
-                                                    serial_number, user_id, True)
+                                                    serial_number, user_id, False)
+                UnicomDeviceInfo.objects.filter(iccid=unicom_device_info_qs[0].iccid) \
+                    .update(user_id=user_id, updated_time=int(time.time()))
             return True
         except Exception as e:
             logging.info('创建体验4G订单异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
@@ -739,8 +742,6 @@ class EquipmentManagerV3(View):
             p_uid = p['UID'].upper()
             UserDeviceService.get_sim_by_serial_number(p)  # 获取SIM卡属性
             p['cloudPhoto'] = self.get_cloud_photo_status(p['UID'])
-            # 获取云存使用状态
-            p['vod_use_status'] = self.get_vod_use_status(p_uid, nowTime)
             # 获取iot_deviceInfo表的endpoint和token_iot_number
             p['iot'] = []
             if p['serial_number']:  # 存在序列号根据序列号查询
@@ -777,7 +778,7 @@ class EquipmentManagerV3(View):
             p['View_Password'] = self.encrypt_pwd(p['View_Password'])
 
             # 判断设备是否支持4G
-            uid_set_qs = UidSetModel.objects.filter(uid=p['UID']).values('mobile_4g')
+            uid_set_qs =UidSetModel.objects.filter(uid=p['UID']).values('mobile_4g')
             if uid_set_qs.exists():
                 uid_set_qs = uid_set_qs.first()
                 if uid_set_qs['mobile_4g'] == 1:
@@ -786,23 +787,6 @@ class EquipmentManagerV3(View):
         result = data
         return response.json(0, result)
 
-    @staticmethod
-    def get_vod_use_status(uid, now_time):
-        """
-        根据UID获取云存使用状态
-        @param uid: 设备uid
-        @param now_time: 现在时间戳
-        @return: 0:未体验;1:使用中;2:已过期
-        """
-        experience_context_qs = ExperienceContextModel.objects.filter(uid=uid, experience_type=0)
-        if not experience_context_qs.exists():
-            return 0
-        uid_bucket_qs = UID_Bucket.objects.filter(uid=uid, endTime__gt=now_time, use_status=1)
-        if uid_bucket_qs.exists():
-            return 1
-        else:
-            return 2
-
     @staticmethod
     def get_cloud_photo_status(uid):
         """
@@ -974,7 +958,7 @@ class EquipmentManagerV3(View):
                         items.append(item)
             return response.json(0, items)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, 'error_ine:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
     # 加密
     def encrypt_pwd(self, userPwd):
@@ -1099,7 +1083,7 @@ class EquipmentManagerV3(View):
                     EquipmentInfoService.get_equipment_info_model('', val).filter(device_uid=uid).delete()
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def do_get_device_features(self, request_dict, response):
         uid = request_dict.get('uid', None)

+ 6 - 6
Controller/FeedBack.py

@@ -139,7 +139,7 @@ class FeedBackView(View):
                     fb.FS.add(StatResModel.objects.create(addTime=nowTime, name=res_3))
         except Exception as e:
             print(repr(e))
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
         else:
             return response.json(0)
 
@@ -174,7 +174,7 @@ class FeedBackView(View):
             print('----------')
 
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
         else:
             return response.json(0)
 
@@ -200,7 +200,7 @@ class FeedBackView(View):
                 try:
                     fb_qs = FeedBackModel.objects.filter()
                 except Exception as e:
-                    return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+                    return response.json(500, repr(e))
                 print('----------')
                 if filter_data:
                     fb_qs = fb_qs.filter(**filter_data)
@@ -253,7 +253,7 @@ class FeedBackView(View):
                 fb_qs.delete()
                 print('----------')
             except Exception as e:
-                return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+                return response.json(500, repr(e))
             else:
                 return response.json(0)
         else:
@@ -328,7 +328,7 @@ class FeedBackView(View):
             else:
                 return response.json(174)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def push_inaccurate(user_id, request_dict, response):
@@ -368,4 +368,4 @@ class FeedBackView(View):
                                                   add_time=now_time, tag=tag, is_st=is_st, event_time=event_time)
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))

+ 32 - 53
Controller/PaymentCycle.py

@@ -180,7 +180,7 @@ class PaypalCycleNotify(View):
         agreement_id = billing_agreement_response.id
         order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
         order_list = order_qs.values("UID", "channel", "commodity_code", "rank", "isSelectDiscounts",
-                                     "userID__userID", 'rank__is_ai',
+                                     "userID__userID",
                                      "userID__username", 'coupon_id')
         if not orderID:
             logger.info('----订阅订单号失效----')
@@ -255,22 +255,6 @@ class PaypalCycleNotify(View):
                         (uid=UID, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime,
                          updateTime=nowTime, use_status=1)
                     uid_bucket_id = ub_cqs.id
-                # 开通AI服务
-                if order_list[0]['rank__is_ai']:
-                    ai_service_qs = AiService.objects.filter(uid=UID, channel=channel)
-                    if ai_service_qs.exists():  # 有正在使用的套餐,套餐结束时间保存为套餐有效期
-                        ai_service_qs.update(endTime=endTime, use_status=1, updTime=nowTime)
-                    else:
-                        ai_service_dict = {
-                            'uid': UID,
-                            'channel': channel,
-                            'detect_status': 1,
-                            'addTime': nowTime,
-                            'updTime': nowTime,
-                            'use_status': 1,
-                            'endTime': endTime
-                        }
-                        AiService.objects.create(**ai_service_dict)
 
                 dvq = Device_Info.objects.filter(UID=UID, vodPrimaryUserID='', vodPrimaryMaster='')
                 if dvq.exists():
@@ -400,13 +384,15 @@ class PaypalCycleNotify(View):
                 paymentID = paypal_body.get('parent_payment')
                 if paymentID and paypal_transaction_id:
                     # 查询客户地区信息,地区跟服务器配置不匹配,返回500
-                    order_qs = Order_Model.objects.filter(paymentID=paymentID).values('userID__region_country')
+                    order_qs = Order_Model.objects.filter(paymentID=paymentID).values('UID', 'userID__region_country')
                     if not order_qs.exists():
                         PAY_LOGGER.info('PayPal周期扣款失败---根据paymentID查询订单数据不存在')
                         return HttpResponse('Fail', status=500)
 
+                    # 判断用户地区是否跟服务器地区匹配
+                    uid = order_qs[0]['UID']
                     country_id = order_qs[0]['userID__region_country']
-                    if not self.config_match_region(country_id):
+                    if not self.config_match_region(uid, country_id):
                         return HttpResponse('Fail', status=500)
 
                     order_qs.update(status=1, updTime=nowTime, trade_no=paypal_transaction_id)
@@ -440,8 +426,10 @@ class PaypalCycleNotify(View):
                 PAY_LOGGER.info('PayPal周期扣款失败---根据order_id查询订单数据不存在')
                 return HttpResponse('fail', status=500)
 
+            # 判断用户地区是否跟服务器地区匹配
+            uid = order_qs[0]['UID']
             country_id = order_qs[0]['userID__region_country']
-            if not self.config_match_region(country_id):
+            if not self.config_match_region(uid, country_id):
                 return HttpResponse('Fail', status=500)
 
             UID = order_qs[0]['UID']
@@ -466,15 +454,14 @@ class PaypalCycleNotify(View):
             username = order_qs[0]['userID__username']
             channel = order_qs[0]['channel']
             rank = order_qs[0]['rank']
-            store_meal_qs = Store_Meal.objects.filter(id=rank).values("day", "bucket_id", "bucket__storeDay", "expire",
-                                                                      "is_ai")
+            store_meal_qs = Store_Meal.objects.filter(id=rank).values("day", "bucket_id", "bucket__storeDay", "expire")
             if not store_meal_qs.exists():
                 PAY_LOGGER.info('{} PayPal周期扣款失败---套餐数据不存在'.format(UID))
                 return HttpResponse('fail', status=500)
 
             bucketId = store_meal_qs[0]['bucket_id']
             expire = store_meal_qs[0]['expire']
-            is_ai = store_meal_qs[0]['is_ai']
+
             ubqs = UID_Bucket.objects.filter(uid=UID).values("id", "bucket_id", "bucket__storeDay", "bucket__region",
                                                              "endTime", "use_status")
 
@@ -502,22 +489,7 @@ class PaypalCycleNotify(View):
                         (uid=UID, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime,
                          updateTime=nowTime, use_status=1)
                     uid_bucket_id = ub_cqs.id
-                # 开通AI服务
-                if is_ai:
-                    ai_service_qs = AiService.objects.filter(uid=UID, channel=channel)
-                    if ai_service_qs.exists():  # 有正在使用的套餐,套餐结束时间保存为套餐有效期
-                        ai_service_qs.update(endTime=endTime, use_status=1, updTime=nowTime)
-                    else:
-                        ai_service_dict = {
-                            'uid': UID,
-                            'channel': channel,
-                            'detect_status': 1,
-                            'addTime': nowTime,
-                            'updTime': nowTime,
-                            'use_status': 1,
-                            'endTime': endTime
-                        }
-                        AiService.objects.create(**ai_service_dict)
+
                 dvq = Device_Info.objects.filter(UID=UID, vodPrimaryUserID='', vodPrimaryMaster='')
                 if dvq.exists():
                     dvq_set_update_dict = {
@@ -533,19 +505,14 @@ class PaypalCycleNotify(View):
                     store_meal_name = store_meal_qs[0]['lang__title'] + '-' + store_meal_qs[0]['lang__content']
                 else:
                     store_meal_name = '未知套餐'
-                new_order_qs = Order_Model.objects.create(orderID=orderID, UID=UID, channel=channel, userID_id=userid,
-                                                          desc=desc, payType=pay_type, payTime=nowTime,
-                                                          price=amount.get('total'),
-                                                          currency=order_qs[0]['currency'], addTime=nowTime,
-                                                          updTime=nowTime,
-                                                          pay_url='', isSelectDiscounts=0,
-                                                          commodity_code=commodity_code,
-                                                          commodity_type=commodity_type, rank_id=rank, paymentID='',
-                                                          coupon_id='', uid_bucket_id=uid_bucket_id, status=1,
-                                                          agreement_id=agreement_id, store_meal_name=store_meal_name,
-                                                          plan_id=plan_id, ai_rank_id=1, trade_no=paypal_transaction_id)
-                if is_ai:
-                    new_order_qs.order_type = 1
+                Order_Model.objects.create(orderID=orderID, UID=UID, channel=channel, userID_id=userid,
+                                           desc=desc, payType=pay_type, payTime=nowTime, price=amount.get('total'),
+                                           currency=order_qs[0]['currency'], addTime=nowTime, updTime=nowTime,
+                                           pay_url='', isSelectDiscounts=0, commodity_code=commodity_code,
+                                           commodity_type=commodity_type, rank_id=rank, paymentID='',
+                                           coupon_id='', uid_bucket_id=uid_bucket_id, status=1,
+                                           agreement_id=agreement_id, store_meal_name=store_meal_name,
+                                           plan_id=plan_id, ai_rank_id=1, trade_no=paypal_transaction_id)
                 # 如果存在序列号,消息提示用序列号
                 device_name = CommonService.query_serial_with_uid(uid=UID)
                 datetime = time.strftime("%Y-%m-%d", time.localtime())
@@ -579,9 +546,21 @@ class PaypalCycleNotify(View):
             return HttpResponse('fail', status=500)
 
     @staticmethod
-    def config_match_region(country_id):
+    def config_match_region(uid, country_id):
+        """
+        判断用户地区是否跟服务器地区匹配
+        @param uid: uid
+        @param country_id: 国家表id
+        @return: bool
+        """
         country_qs = CountryModel.objects.filter(id=country_id).values('region_id')
+        # 不确定用户地区信息,默认美洲
+        if not country_qs.exists() and CONFIG_INFO == CONFIG_EUR:
+            PAY_LOGGER.info('PayPal周期扣款失败---不确定地区的用户请求欧洲服,uid:{},country_id:{}'.format(uid, country_id))
+            return False
+
         region_id = country_qs[0]['region_id']
+        PAY_LOGGER.info('uid{}的用户地区信息: country_id:{}, region_id:{}'.format(uid, country_id, region_id))
         if (CONFIG_INFO == CONFIG_US and region_id == 4) or (CONFIG_INFO == CONFIG_EUR and region_id != 4):
             PAY_LOGGER.info('PayPal周期扣款失败---服务器跟用户地区不匹配')
             return False

+ 0 - 2
Controller/RegionController.py

@@ -356,8 +356,6 @@ class RegionView(View):
                 for country in country_qs:
                     if country['country_id'] == 1:
                         country['api'] = 'https://www.zositechc.cn/'
-                    else:
-                        country['api'] = 'https://www.dvema.com/'
 
             return response.json(0, list(country_qs))
         except Exception as e:

+ 63 - 144
Controller/SensorGateway/GatewayDeviceController.py

@@ -7,7 +7,6 @@
 @Software: PyCharm
 """
 import datetime
-import threading
 import time
 
 import requests
@@ -15,7 +14,7 @@ from django.db import transaction
 from django.db.models import Q
 from django.views.generic.base import View
 
-from Ansjer.Config.gatewaySensorConfig import SMART_SCENE_TOPIC, SCENE_EVENT_DELETE, SUB_DEVICE_TOPIC
+from Ansjer.Config.gatewaySensorConfig import SMART_SCENE_TOPIC
 from Ansjer.config import CONFIG_INFO, AWS_IOT_SES_ACCESS_CHINA_ID, AWS_IOT_SES_ACCESS_CHINA_SECRET, \
     AWS_IOT_SES_ACCESS_CHINA_REGION, AWS_IOT_SES_ACCESS_FOREIGN_ID, AWS_IOT_SES_ACCESS_FOREIGN_SECRET, \
     AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA
@@ -24,13 +23,12 @@ from Controller.SensorGateway.EquipmentFamilyController import EquipmentFamilyVi
 from Controller.SensorGateway.SmartSocketController import SmartSocketView
 from Model.models import FamilyRoomDevice, FamilyRoom, GatewaySubDevice, Device_Info, UserFamily, FamilyMember, \
     UidSetModel, iotdeviceInfoModel, SmartScene, SceneLog, SocketInfo, SocketPowerStatistics, SocketSchedule, \
-    CountryModel, SensorRecord
+    CountryModel
 from Object.AWS.AWSIoTDataPlaneUtil import AWSIoTDataPlaneService
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
-from Service.ModelService import ModelService
 
 
 class GatewayDeviceView(View):
@@ -51,9 +49,6 @@ class GatewayDeviceView(View):
         if operation == 'bind-serial-user':
             response = ResponseObject()
             return self.bind_serial_user(request_dict, response)
-        elif operation == 'reset':
-            response = ResponseObject()
-            return self.reset(request_dict, response)
 
         token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
         lang = request_dict.get('lang', None)
@@ -169,7 +164,6 @@ class GatewayDeviceView(View):
         @param response:
         @return:
         """
-        LOGGER.info('开始删除设备:{}'.format(request_dict))
         device_id = request_dict.get('deviceId')
         family_id = request_dict.get('familyId')
         # 1 删除网关 否则删除子设备
@@ -184,53 +178,35 @@ class GatewayDeviceView(View):
                 if device_id:
                     device_qs = Device_Info.objects.filter(id=device_id)
                     if device_qs.exists():
-                        serial_number = device_qs.first().serial_number
-                        FamilyRoomDevice.objects.filter(device_id=device_id).delete()
-                        UidSetModel.objects.filter(uid=device_qs.first().UID).delete()
+                        family_device_qs = FamilyRoomDevice.objects.filter(device_id=device_id)
+                        if family_device_qs.exists():
+                            family_device_qs.delete()
+                        uid_set_qs = UidSetModel.objects.filter(uid=device_qs.first().UID)
+                        if uid_set_qs.exists():
+                            uid_set_qs.delete()
                         socket_info_qs = SocketInfo.objects.filter(device_id=device_id)
                         if socket_info_qs.exists():
                             # 设备在不在线, 都发布重置
+                            serial_number = device_qs.first().serial_number
                             cls.reset_device(serial_number)
                             socket_info_qs.delete()
-                            SocketPowerStatistics.objects.filter(device_id=device_id).delete()
-                            SocketSchedule.objects.filter(device_id=device_id).delete()
-                            SceneLog.objects.filter(device_id=serial_number).delete()
+                            socket_power_qs = SocketPowerStatistics.objects.filter(device_id=device_id)
+                            if socket_power_qs.exists():
+                                socket_power_qs.delete()
+                            socket_schedule_qs = SocketSchedule.objects.filter(device_id=device_id)
+                            if socket_schedule_qs.exists():
+                                socket_schedule_qs.delete()
+                            scene_log_qs = SceneLog.objects.filter(device_id=serial_number)
+                            if scene_log_qs.exists():
+                                scene_log_qs.delete()
                             SmartSocketView.delete_alexa_socket(serial_number)
-                        # 重置设备
-                        topic_name = SUB_DEVICE_TOPIC.format(serial_number)
-                        msg = {
-                            'zigbee': 'recover',
-                        }
-                        success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
-                        LOGGER.info('删除重置设备结果:{}'.format(success))
-                        try:
-                            assert success
-                        except AssertionError:
-                            return response.json(10044)
-                        time.sleep(0.3)
+
                         # 如果有子设备,删除子设备和关联的场景数据
                         gateway_qs = GatewaySubDevice.objects.filter(device_id=device_id)
                         if gateway_qs.exists():
                             sub_id_list = gateway_qs.values_list('id', flat=True)
-                            # 删除传感器记录
-                            SensorRecord.objects.filter(gateway_sub_device_id__in=list(sub_id_list)).delete()
                             smart_scene_qs = SmartScene.objects.filter(
                                 Q(device_id=device_id) | Q(sub_device_id__in=sub_id_list))
-
-                            # 下发删除设备消息
-                            ieee_addr_list = gateway_qs.values_list('ieee_addr', flat=True)
-                            for ieee_addr in ieee_addr_list:
-                                # 删除设备
-                                msg = {
-                                    'zigbee': 'delete',
-                                    'ieee': ieee_addr
-                                }
-                                success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
-                                try:
-                                    assert success
-                                except AssertionError:
-                                    return response.json(10044)
-                                time.sleep(0.3)
                         else:
                             smart_scene_qs = SmartScene.objects.filter(device_id=device_id)
                         if smart_scene_qs.exists():
@@ -240,8 +216,7 @@ class GatewayDeviceView(View):
                             topic_name = SMART_SCENE_TOPIC.format(serial_number)
                             for smart_scene in smart_scene_info:
                                 msg = {
-                                    'scene_event': SCENE_EVENT_DELETE,
-                                    'scene_id': int(smart_scene['id'])
+                                    'smart_scene_delete': int(smart_scene['id'])
                                 }
                                 success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
                                 try:
@@ -251,48 +226,44 @@ class GatewayDeviceView(View):
                                 time.sleep(0.3)
                             smart_scene_qs.delete()
                         gateway_qs.delete()  # 删除子设备
-                        SceneLog.objects.filter(device_id=device_id).delete()
+                        scene_log_qs = SceneLog.objects.filter(device_id=device_id)
+                        if scene_log_qs.exists():
+                            scene_log_qs.delete()
                         device_qs.delete()
-                        # 异步删除推送消息
-                        asy = threading.Thread(target=ModelService.del_eq_info, args=(user_id, serial_number))
-                        asy.start()
                 elif sub_ids:
-                    sub_id_list = list(map(int, sub_ids.split(',')))
-                    FamilyRoomDevice.objects.filter(sub_device__in=sub_id_list).delete()
-                    # 删除传感器记录
-                    SensorRecord.objects.filter(gateway_sub_device_id__in=sub_id_list).delete()
-                    # 查询网关序列号,确定MQTT主题
-                    sub_device_qs = GatewaySubDevice.objects.filter(id=sub_id_list[0]). \
-                        values('device__serial_number')
-                    assert sub_device_qs.exists()
-                    serial_number = sub_device_qs[0]['device__serial_number']
-
-                    # 下发删除设备消息
-                    gateway_sub_device_qs = GatewaySubDevice.objects.filter(id__in=sub_id_list)
-                    ieee_addr_list = gateway_sub_device_qs.values_list('ieee_addr', flat=True)
-                    topic_name = SUB_DEVICE_TOPIC.format(serial_number)
-                    for ieee_addr in ieee_addr_list:
-                        # 删除设备
-                        msg = {
-                            'zigbee': 'delete',
-                            'ieee': ieee_addr
-                        }
-                        success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
-                        try:
-                            assert success
-                        except AssertionError:
-                            return response.json(10044)
-                        time.sleep(0.3)
-                    # 删除场景,下发MQTT通知设备
-                    smart_scene_qs = SmartScene.objects.filter(sub_device_id__in=sub_id_list)
-                    if smart_scene_qs.exists():
+                    sub_ids = sub_ids.split(',')
+                    ids = []
+                    for item in sub_ids:
+                        sub_id = int(item)
+                        ids.append(sub_id)
+                        sub_device_qs = GatewaySubDevice.objects.filter(id=sub_id).values('device_type', 'src_addr',
+                                                                                          'device__serial_number')
+                        serial_number = sub_device_qs[0]['device__serial_number']
                         topic_name = SMART_SCENE_TOPIC.format(serial_number)
+                        device_type = sub_device_qs[0]['device_type']
+                        if device_type == 216:  # 删除智能按钮通知设备
+                            msg = {
+                                'sos_delete': int(sub_device_qs[0]['src_addr'], 16)
+                            }
+                            success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
+                            try:
+                                assert success
+                            except AssertionError:
+                                return response.json(10044)
+                            time.sleep(0.3)
+                    family_device_qs = FamilyRoomDevice.objects.filter(sub_device__in=ids)
+                    if family_device_qs.exists():
+                        family_device_qs.delete()
+                    gateway_sub_qs = GatewaySubDevice.objects.filter(id__in=ids)
+                    if gateway_sub_qs.exists():
+                        gateway_sub_qs.delete()
+                    smart_scene_qs = SmartScene.objects.filter(sub_device_id__in=ids)
+                    if smart_scene_qs.exists():
                         smart_scene_info = smart_scene_qs.values('id')
                         for smart_scene in smart_scene_info:
                             # 通知设备删除场景id
                             msg = {
-                                'scene_event': SCENE_EVENT_DELETE,
-                                'scene_id': int(smart_scene['id'])
+                                'smart_scene_delete': int(smart_scene['id'])
                             }
                             success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
                             try:
@@ -301,15 +272,13 @@ class GatewayDeviceView(View):
                                 return response.json(10044)
                             time.sleep(0.3)
                         smart_scene_qs.delete()
-
-                    gateway_sub_device_qs.delete()
-                    SceneLog.objects.filter(sub_device_id__in=sub_id_list).delete()
-                    # 异步删除推送消息
-                    asy = threading.Thread(target=ModelService.del_eq_info, args=(user_id, serial_number))
-                    asy.start()
+                    scene_log_qs = SceneLog.objects.filter(sub_device_id__in=ids)
+                    if scene_log_qs.exists():
+                        scene_log_qs.delete()
                 return response.json(0)
         except Exception as e:
-            return response.json(177, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            print(e)
+            return response.json(177, repr(e))
 
     @staticmethod
     def reset_device(serial_number):
@@ -419,7 +388,10 @@ class GatewayDeviceView(View):
                     sub_id = item['sub_device']
                     sub_id_list.append(sub_id)
                     gateway_sub_qs = GatewaySubDevice.objects.filter(device_id=device_id, id=sub_id).values(
-                        'id', 'device_type', 'nickname', 'status', 'created_time', 'ieee_addr')
+                        'id', 'device_type',
+                        'nickname',
+                        'src_addr', 'status',
+                        'created_time', 'ieee_addr')
                     if not gateway_sub_qs.exists():
                         continue
                     room_id = item['room_id']
@@ -430,6 +402,7 @@ class GatewayDeviceView(View):
                         'gatewaySubId': gateway_sub_qs['id'],
                         'nickName': gateway_sub_qs['nickname'],
                         'deviceType': gateway_sub_qs['device_type'],
+                        'srcAddr': gateway_sub_qs['src_addr'],
                         'status': gateway_sub_qs['status'],
                         'createdTime': gateway_sub_qs['created_time'],
                         'roomName': gateway_room_name,
@@ -508,15 +481,13 @@ class GatewayDeviceView(View):
         if not all([user_id, serial_number]):
             return response.json(444)
         try:
-            now_time = int(time.time())
-            LOGGER.info('用户{}的设备{}上传序列号时间:{}'.format(user_id, serial_number, now_time))
             redis_obj = RedisObject()
             result = redis_obj.set_data(user_id, serial_number, 300)
             if not result:
                 return response.json(178)
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def get_serial_user(user_id, request_dict, response):
@@ -528,63 +499,13 @@ class GatewayDeviceView(View):
         @return:
         """
         try:
-            now_time = int(time.time())
             redis_obj = RedisObject()
             serial_number = redis_obj.get_data(user_id)
-            LOGGER.info('用户{}的设备{}获取序列号时间:{}'.format(user_id, serial_number, now_time))
             if not serial_number:
                 return response.json(173)
             return response.json(0, {'serialNumber': serial_number})
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
-
-    @staticmethod
-    def reset(request_dict, response):
-        """
-        网关复位删除设备信息
-        @param request_dict: 请求参数字典
-        @request_dict serial_number: 序列号
-        @param response: 响应对象
-        @return:
-        """
-        serial_number = request_dict.get('serial_number')
-        if not serial_number:
-            return response.json(444)
-        try:
-            with transaction.atomic():
-                device_qs = Device_Info.objects.filter(serial_number=serial_number)
-                device_id_list = list(device_qs.values_list('id', flat=True))
-                user_id_list = list(device_qs.values_list('userID_id', flat=True))
-                if not device_qs.exists():
-                    return response.json(173)
-
-                FamilyRoomDevice.objects.filter(device_id__in=device_id_list).delete()
-                UidSetModel.objects.filter(uid=device_qs.first().UID).delete()
-                socket_info_qs = SocketInfo.objects.filter(device_id__in=device_id_list)
-                if socket_info_qs.exists():
-                    socket_info_qs.delete()
-                    SocketPowerStatistics.objects.filter(device_id__in=device_id_list).delete()
-                    SocketSchedule.objects.filter(device_id__in=device_id_list).delete()
-                    SmartSocketView.delete_alexa_socket(serial_number)
-
-                # 如果有子设备,删除子设备和关联的场景数据,删除传感器记录
-                gateway_qs = GatewaySubDevice.objects.filter(device_id__in=device_id_list)
-                if gateway_qs.exists():
-                    sub_id_list = gateway_qs.values_list('id', flat=True)
-                    SensorRecord.objects.filter(gateway_sub_device_id__in=list(sub_id_list)).delete()
-                    SmartScene.objects.filter(Q(device_id__in=device_id_list) | Q(sub_device_id__in=sub_id_list)).delete()
-                else:
-                    SmartScene.objects.filter(device_id__in=device_id_list).delete()
-
-                gateway_qs.delete()  # 删除子设备
-                SceneLog.objects.filter(device_id__in=device_id_list).delete()
-                device_qs.delete()
-                # 异步删除推送消息
-                asy = threading.Thread(target=ModelService.del_user_list_eq_info, args=(user_id_list, serial_number))
-                asy.start()
-            return response.json(0)
-        except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def update_socket(cls, serial_number, device_name, user_id, region):
@@ -600,8 +521,6 @@ class GatewayDeviceView(View):
             requests.post(url=url, data=data, timeout=5)
         except Exception as e:
             print(repr(e))
-
-
 #
 #                   ___====-_  _-====___
 #             _--^^^#####//      \\#####^^^--_

+ 54 - 90
Controller/SensorGateway/SmartSceneController.py

@@ -12,8 +12,7 @@ from django.db import transaction
 from django.db.models import F, Q, Count
 from django.views import View
 
-from Ansjer.Config.gatewaySensorConfig import SMART_SCENE_TOPIC, SENSOR_TYPE, EVENT_TYPE, SCENE_EVENT_CREATE, \
-    SCENE_EVENT_EDIT, SCENE_EVENT_DELETE, SCENE_STATUS_ON, SCENE_STATUS_OFF, SCENE_EVENT_EDIT_STATUS
+from Ansjer.Config.gatewaySensorConfig import SMART_SCENE_TOPIC, SENSOR_TYPE, EVENT_TYPE
 from Model.models import FamilyRoomDevice, GatewaySubDevice, FamilyRoom, SmartScene, EffectiveTime, Device_Info, \
     SceneLog
 from Object.ResponseObject import ResponseObject
@@ -85,7 +84,7 @@ class SmartSceneView(View):
             res = cls.get_sub_device_room_name(gateway_sub_device_qs)
             return response.json(0, res)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def task_devices(cls, request_dict, response):
@@ -115,9 +114,8 @@ class SmartSceneView(View):
                 else:  # 智能按钮返回网关,门磁和人体传感器(如果存在)
                     gateway_data = cls.get_gateway_data(device_id)
                     sub_device_qs = GatewaySubDevice.objects.filter(
-                        Q(Q(device_id=device_id) & Q(device_type=SENSOR_TYPE['door_magnet'])) |
-                        Q(Q(device_id=device_id) & Q(device_type=SENSOR_TYPE['body_sensor']))
-                    ).values('id', 'nickname', 'status', 'device_type')
+                        Q(device_id=device_id) & Q(device_type=SENSOR_TYPE['door_magnet']) | Q(
+                            device_type=SENSOR_TYPE['body_sensor'])).values('id', 'nickname', 'status', 'device_type')
                     if sub_device_qs.exists():
                         res = cls.get_sub_device_room_name(sub_device_qs, gateway_data)
                     else:
@@ -125,7 +123,7 @@ class SmartSceneView(View):
 
             return response.json(0, res)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def get_sub_device_room_name(sub_device_qs, gateway_data=None):
@@ -224,8 +222,7 @@ class SmartSceneView(View):
                 'updated_time': now_time,
             }
             msg = {
-                'scene_event': SCENE_EVENT_CREATE,
-                'scene_status': SCENE_STATUS_ON
+                'scene_status': 1
             }
             # 处理设置时间
             if is_all_day is not None:
@@ -268,13 +265,13 @@ class SmartSceneView(View):
 
                 smart_scene_dict['sub_device_id'] = sub_device_id
                 sub_device_qs = GatewaySubDevice.objects.filter(id=sub_device_id).values('device__serial_number',
-                                                                                         'ieee_addr')
+                                                                                         'src_addr')
                 if not sub_device_qs.exists():
                     return response.json(173)
                 serial_number = sub_device_qs[0]['device__serial_number']
 
                 msg['sensor_type'] = int(conditions_dict['sensor']['device_type'])
-                msg['sensor_ieee_addr'] = sub_device_qs[0]['ieee_addr']
+                msg['sensor_src'] = int(sub_device_qs[0]['src_addr'], 16)
                 msg['sensor_status'] = int(conditions_dict['sensor']['eventValues'][0]['event_type'])
 
             with transaction.atomic():
@@ -316,36 +313,23 @@ class SmartSceneView(View):
                     return response.json(444, {'error param': 'invalid isAllDay'})
 
                 msg['time'] = time_dict
-                msg['scene_id'] = smart_scene_qs.id
+                msg['smart_scene_id'] = smart_scene_qs.id
                 task_list = []
                 for task in tasks_list:
-                    sensor_type = int(task['device_type'])
                     task_temp = {
-                        'sensor_type': sensor_type
+                        'sensor_type': int(task['device_type']),
+                        'sensor_action': int(task['event_type'])
                     }
-                    if sensor_type != -1:   # 不为-1时需要其他数据
-                        task_temp['sensor_action'] = int(task['event_type'])
-
-                        # 延时
-                        if 'delay_time' in task and task['delay_time'] != 0:
-                            task_temp['sensor_delay'] = task['delay_time']
-
-                        # 子设备返回长地址
-                        sub_device_id = task.get('subDeviceId', None)
-                        if sub_device_id:
-                            sub_device_qs = GatewaySubDevice.objects.filter(id=sub_device_id).values('ieee_addr').first()
-                            task_temp['sensor_ieee_addr'] = sub_device_qs['ieee_addr']
-                        # 网关添加报警类型数据
-                        else:
-                            task_temp['voice_type'] = task.get('voice_type')
-                            task_temp['voice_id'] = task.get('voice_id')
-                            task_temp['count'] = task.get('count')
-                            task_temp['delay_time'] = task.get('delay_time')
-                            task_temp['duration'] = task.get('duration')
-                            task_temp['value_type'] = task.get('value_type')
 
-                    task_list.append(task_temp)
+                    # 延时
+                    if 'delay_time' in task and task['delay_time'] != 0:
+                        task_temp['sensor_delay'] = task['delay_time']
 
+                    sub_device_id = task.get('subDeviceId', None)
+                    if sub_device_id:
+                        sub_device_qs = GatewaySubDevice.objects.filter(id=sub_device_id).values('src_addr').first()
+                        task_temp['sensor_src'] = int(sub_device_qs['src_addr'], 16)
+                    task_list.append(task_temp)
                 msg['task'] = task_list
 
                 smart_scene_qs.device_data = json.dumps(msg)
@@ -362,7 +346,7 @@ class SmartSceneView(View):
 
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def scene_list(request_dict, user_id, response):
@@ -410,7 +394,7 @@ class SmartSceneView(View):
                 smart_scene_list.append(smart_scene_dict)
             return response.json(0, smart_scene_list)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def smart_button_scene_list(request_dict, user_id, response):
@@ -463,7 +447,7 @@ class SmartSceneView(View):
                 })
             return response.json(0, scene_list)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def update_status(request_dict, response):
@@ -482,9 +466,8 @@ class SmartSceneView(View):
             return response.json(444, {'error param': 'smartSceneId and status'})
         try:
             smart_scene_id = int(smart_scene_id)
-            scene_status = SCENE_STATUS_ON if is_enable == 'True' else SCENE_STATUS_OFF
+            scene_status = 1 if is_enable == 'True' else 0
             msg = {
-                'scene_event': SCENE_EVENT_EDIT_STATUS,
                 'scene_id': smart_scene_id,
                 'scene_status': scene_status
             }
@@ -510,7 +493,7 @@ class SmartSceneView(View):
                     return response.json(10044)
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def scene_detail(request_dict, response):
@@ -554,7 +537,7 @@ class SmartSceneView(View):
             return response.json(0, res)
 
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def edit_smart_scene(request_dict, user_id, response):
@@ -602,8 +585,7 @@ class SmartSceneView(View):
 
             scene_status = 1 if smart_scene_qs[0].is_enable else 0
             msg = {
-                'scene_id': smart_scene_id,
-                'scene_event': SCENE_EVENT_EDIT,
+                'smart_scene_id': smart_scene_id,
                 'scene_status': scene_status
             }
             if conditions_dict['type'] == 2:  # 条件为选择子设备
@@ -633,13 +615,13 @@ class SmartSceneView(View):
                     msg['sensor_data'] = float(value)
 
                 device_id = ''
-                sub_device_qs = GatewaySubDevice.objects.filter(id=sub_device_id).values('ieee_addr',
+                sub_device_qs = GatewaySubDevice.objects.filter(id=sub_device_id).values('src_addr',
                                                                                          'device__serial_number')
                 if not sub_device_qs.exists():
                     return response.json(173)
                 serial_number = sub_device_qs[0]['device__serial_number']
                 msg['sensor_type'] = int(conditions_dict['sensor']['device_type'])
-                msg['sensor_ieee_addr'] = sub_device_qs[0]['ieee_addr']
+                msg['sensor_src'] = int(sub_device_qs[0]['src_addr'], 16)
                 msg['sensor_status'] = int(conditions_dict['sensor']['eventValues'][0]['event_type'])
             else:
                 if not device_id:
@@ -652,33 +634,20 @@ class SmartSceneView(View):
 
             task_list = []
             for task in tasks_list:
-                sensor_type = int(task['device_type'])
                 task_temp = {
-                    'sensor_type': sensor_type
+                    'sensor_type': int(task['device_type']),
+                    'sensor_action': int(task['event_type'])
                 }
-                if sensor_type != -1:   # 不为-1时需要其他数据
-                    task_temp['sensor_action'] = int(task['event_type'])
 
-                    # 延时
-                    if 'delay_time' in task and task['delay_time'] != 0:
-                        task_temp['sensor_delay'] = task['delay_time']
-
-                    # 子设备返回长地址
-                    task_sub_device_id = task.get('subDeviceId', None)
-                    if task_sub_device_id:
-                        sub_device_qs = GatewaySubDevice.objects.filter(id=task_sub_device_id).values('ieee_addr').first()
-                        task_temp['sensor_ieee_addr'] = sub_device_qs['ieee_addr']
-                    # 网关添加报警类型数据
-                    else:
-                        task_temp['voice_type'] = task.get('voice_type')
-                        task_temp['voice_id'] = task.get('voice_id')
-                        task_temp['count'] = task.get('count')
-                        task_temp['delay_time'] = task.get('delay_time')
-                        task_temp['duration'] = task.get('duration')
-                        task_temp['value_type'] = task.get('value_type')
+                # 延时
+                if 'delay_time' in task and task['delay_time'] != 0:
+                    task_temp['sensor_delay'] = task['delay_time']
 
+                task_sub_device_id = task.get('subDeviceId', None)
+                if task_sub_device_id:
+                    sub_device_qs = GatewaySubDevice.objects.filter(id=task_sub_device_id).values('src_addr').first()
+                    task_temp['sensor_src'] = int(sub_device_qs['src_addr'], 16)
                 task_list.append(task_temp)
-
             msg['task'] = task_list
 
             with transaction.atomic():
@@ -736,7 +705,7 @@ class SmartSceneView(View):
             return response.json(0, res)
 
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def delete_smart_scene(request_dict, response):
@@ -768,8 +737,7 @@ class SmartSceneView(View):
                 for smart_scene_id in smart_scene_id_list:
                     # 通知设备删除场景id
                     msg = {
-                        'scene_event': SCENE_EVENT_DELETE,
-                        'scene_id': int(smart_scene_id)
+                        'smart_scene_delete': int(smart_scene_id)
                     }
                     success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
                     try:
@@ -779,7 +747,7 @@ class SmartSceneView(View):
                     time.sleep(0.3)
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def scene_log(request_dict, response):
@@ -815,19 +783,17 @@ class SmartSceneView(View):
                     device_list.append(device['device'])
                 if device['sub_device']:
                     sub_device_list.append(device['sub_device'])
-        elif sub_device_id:  # 查询子设备
-            family_room_device_qs = FamilyRoomDevice.objects.filter(family_id=family_id,
-                                                                    sub_device=sub_device_id).values('device_id')
-            for device in family_room_device_qs:
-                device_list.append(device['device_id'])
+        elif sub_device_id:
+            family_room_device_qs = FamilyRoomDevice.objects.filter(family_id=family_id, sub_device=sub_device_id)
             sub_device_list.append(sub_device_id)
-        else:  # 查询网关
-            family_room_device_qs = FamilyRoomDevice.objects.filter(Q(family_id=family_id) & Q(device=device_id) &
-                                                                    ~Q(sub_device=0)).values(
+        else:
+            family_room_device_qs = FamilyRoomDevice.objects.filter(family_id=family_id, device=device_id).values(
                 'sub_device')
             device_list.append(device_id)
             for device in family_room_device_qs:
                 sub_device_list.append(device['sub_device'])
+        if not family_room_device_qs.exists():
+            return response.json(173)
         try:
             page, size = int(page), int(size)
             scene_log_qs = SceneLog.objects.filter(Q(device_id__in=device_list) | Q(sub_device_id__in=sub_device_list))
@@ -862,13 +828,11 @@ class SmartSceneView(View):
                 else:
                     device_qs = Device_Info.objects.filter(id=item['device_id']).values('Type')
                     item['device_type'] = device_qs[0]['Type'] if device_qs.exists() else ''
-                if item['tasks'] != '':
-                    item['tasks'] = eval(item['tasks'])
-            scene_log_list = list(scene_log_qs)
-            return response.json(0, scene_log_list)
+                item['tasks'] = eval(item['tasks'])
+            return response.json(0, list(scene_log_qs))
         except Exception as e:
-            print('error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            print(repr(e))
+            return response.json(500, repr(e))
 
     @staticmethod
     def scene_log_date(request_dict, response):
@@ -922,7 +886,7 @@ class SmartSceneView(View):
                 })
             return response.json(0, log_date_list)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def get_scene_data(request_dict, response):
@@ -967,14 +931,14 @@ class SmartSceneView(View):
             # 下发智能按钮数据
             smart_button_qs = GatewaySubDevice.objects.filter(device_id=device_id,
                                                               device_type=SENSOR_TYPE['smart_button']).values(
-                'ieee_addr', 'is_tampered')
+                'src_addr', 'is_tampered')
             if smart_button_qs.exists():
                 sos_count = smart_button_qs.count()
                 for index, smart_button in enumerate(smart_button_qs):
                     msg = {
                         'sos_count': sos_count,  # 该网关下的智能按钮数量
                         'sos_num': index + 1,  # 第几个按钮
-                        'sensor_ieee_addr': smart_button['ieee_addr'],
+                        'sensor_src': int(smart_button['src_addr'], 16),
                         'sos_select': smart_button['is_tampered']
                     }
                     success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
@@ -986,7 +950,7 @@ class SmartSceneView(View):
 
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
 #
 #                   ___====-_  _-====___

+ 7 - 7
Controller/SensorGateway/SmartSocketController.py

@@ -502,7 +502,7 @@ class SmartSocketView(View):
                 data['electricityYesterday'] = 0
             return response.json(0, data)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def get_socket_schedule(request_dict, response):
@@ -552,7 +552,7 @@ class SmartSocketView(View):
                 })
             return response.json(0, schedule_list)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def get_log(request_dict, response):
@@ -602,7 +602,7 @@ class SmartSocketView(View):
                 log_list.append(data)
             return response.json(0, log_list)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def splittings_time(cls, startTime, endTime, unit):
@@ -770,7 +770,7 @@ class SmartSocketView(View):
             data['week_or_month_or_year'] = new_list
             return response.json(0, data)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def get_subscript(cls, unit, time_stamp):
@@ -825,7 +825,7 @@ class SmartSocketView(View):
                 })
             return response.json(0, schedule_date_list)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def alexa_socket_switch(cls, request_dict, response):
@@ -851,7 +851,7 @@ class SmartSocketView(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def get_socket_state(cls, request_dict, response):
@@ -877,7 +877,7 @@ class SmartSocketView(View):
             return response.json(173)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def delete_alexa_socket(cls, serial_number):

+ 56 - 0
Controller/SensorGateway/SubDeviceController.py

@@ -655,6 +655,62 @@ class GatewaySubDeviceView(View):
             print(e)
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
+    @staticmethod
+    def get_device_list(request_dict, response):
+        """
+        获取设备信息
+        @param request_dict: 请求参数
+        @request_dict familyId: 家庭id
+        @param response: 响应对象
+        @return: response
+        """
+        family_id = request_dict.get('familyId', None)
+        room_id = request_dict.get('roomId', None)
+        if not family_id:
+            return response.json(444, {'error param': 'familyId'})
+
+        try:
+            family_room_device_qs = FamilyRoomDevice.objects.filter(family_id=family_id, sub_device=0,
+                                                                    device__Type=200).values(
+                'device_id', 'device__NickName').order_by('-device__data_joined')
+            if room_id:
+                family_room_device_qs = family_room_device_qs.filter(room_id=room_id)
+            device_list = []
+            for item in family_room_device_qs:
+                device_dict = {
+                    'deviceId': item['device_id'],
+                    'deviceType': 200,
+                    'deviceNickName': item['device__NickName'],
+                }
+                sub_device = []
+                family_room_sub_device_qs = FamilyRoomDevice.objects.filter(Q(family_id=family_id), ~Q(sub_device=0),
+                                                                            Q(device_id=item['device_id'])).values(
+                    'sub_device', 'room_id').order_by('sort')
+                if family_room_sub_device_qs.exists():
+                    for each in family_room_sub_device_qs:
+                        room_qs = FamilyRoom.objects.filter(id=each['room_id']).values('name')
+                        room_name = room_qs[0]['name'] if room_qs.exists() else ''
+                        device_qs = GatewaySubDevice.objects.filter(id=each['sub_device']).values('id', 'nickname',
+                                                                                                  'device_type',
+                                                                                                  'src_addr',
+                                                                                                  'status',
+                                                                                                  'created_time')
+                        if device_qs.exists():
+                            sub_device.append({
+                                'gatewaySubId': device_qs[0]['id'],
+                                'nickName': device_qs[0]['nickname'],
+                                'deviceType': device_qs[0]['device_type'],
+                                'srcAddr': device_qs[0]['src_addr'],
+                                'status': device_qs[0]['status'],
+                                'createdTime': device_qs[0]['created_time'],
+                                'roomName': room_name,
+                                'familyId': family_id
+                            })
+                    device_dict['subDevice'] = sub_device
+                    device_list.append(device_dict)
+            return response.json(0, device_list)
+        except Exception as e:
+            return response.json(500, repr(e))
 #
 #                   ___====-_  _-====___
 #             _--^^^#####//      \\#####^^^--_

+ 125 - 24
Controller/SerialNumberController.py

@@ -2,6 +2,7 @@ import json
 import logging
 import threading
 import time
+from datetime import datetime
 
 import requests
 from django.db import transaction
@@ -10,13 +11,15 @@ from django.views import View
 from Ansjer.config import CRCKey, CONFIG_INFO, CONFIG_US, CONFIG_EUR, \
     CONFIG_CN, USED_SERIAL_REDIS_LIST, UNUSED_SERIAL_REDIS_LIST, SERVER_DOMAIN_US, REGION_ID_LIST, SERVER_DOMAIN_TEST, \
     SERVER_DOMAIN_LIST, SERVER_DOMAIN_CN, SERVER_DOMAIN_EUR, RESET_REGION_ID_SERIAL_REDIS_LIST, LOGGER
+from Controller.UnicomCombo.UnicomComboController import UnicomComboView
 from Model.models import SerialNumberModel, CompanySerialModel, UIDCompanySerialModel, UIDModel, Device_Info, \
     iotdeviceInfoModel, LogModel, UidSetModel, UID_Bucket, \
     Unused_Uid_Meal, Order_Model, StsCrdModel, VodHlsModel, ExperienceContextModel, UidUserModel, ExperienceAiModel, \
-    AiService, DeviceDomainRegionModel, RegionModel, UidPushModel
+    AiService, DeviceDomainRegionModel, RegionModel, UidPushModel, UnicomDeviceInfo
 from Object.AWS.S3Email import S3Email
 from Object.RedisObject import RedisObject
 from Object.TokenObject import TokenObject
+from Object.UnicomObject import UnicomObjeect
 from Object.uidManageResponseObject import uidManageResponseObject
 from Service.AlgorithmService import AlgorithmBaseOn35
 from Service.CommonService import CommonService
@@ -59,12 +62,14 @@ class SerialNumberView(View):
             return self.get_domain(request_dict, response)
         elif operation == 'resetRegionId':  # 重置地区id
             return self.reset_region_id(request_dict, response)
-        elif operation == 'get-status':  # 重置地区id
+        elif operation == 'get-status':  # 获取序列号绑定信息
             return self.check_serial_status(request_dict, response)
         elif operation == 'getUidRegion':  # 根据序列号获取uid地区
             return self.get_uid_region(request_dict, response)
         elif operation == 'getGlobalUidRegion':  # 获取序列号在全球服绑定uid的地区
             return self.get_global_uid_region(request_dict, response)
+        elif operation == 'getIoTCoreBySerialNumber':  # 根据序列号获取iot core
+            return self.get_iot_core_by_serial_number(request_dict, response)
         else:
             return response.json(414)
 
@@ -339,7 +344,7 @@ class SerialNumberView(View):
                 warning_count = 2000
                 if unused_uid_count < warning_count:
                     # 限制一天提醒一次
-                    redis_obj.set_data('uid_count_warning_time_limit', 1, 60*60*24)
+                    redis_obj.set_data('uid_count_warning_time_limit', 1, 60 * 60 * 24)
                     platform = '尚云' if p2p_type == 1 else 'tutk'
                     email_content = '{}服{}的uid数量少于{}个,请及时处理'.format(CONFIG_INFO, platform, warning_count)
                     S3Email().faEmail(email_content, 'servers@ansjer.com')
@@ -349,7 +354,7 @@ class SerialNumberView(View):
     @staticmethod
     def log_and_send_email(request, company_serial_id, serial, now_time):
         """
-        记录序列号占用操作日志及发送邮件通知
+        记录序列号占用操作日志及发送邮件通知,(美服、欧服已占用序列号将执行数据同步)
         @param company_serial_id: 企业关联序列号 ID
         @param request: 请求
         @param serial: 序列号
@@ -357,18 +362,20 @@ class SerialNumberView(View):
         """
         send_email = S3Email()
         try:
-            if CONFIG_INFO != 'us':
+            if CONFIG_INFO == 'cn' or CONFIG_INFO == 'test':
                 return {}
             # 判断当前序列号是否绑定UID
             uid_serial_qs = UIDCompanySerialModel.objects.filter(company_serial_id=company_serial_id)
             if uid_serial_qs.exists():
                 email_content = '{}序列号已占用当前数据库已绑定UID: {}'.format(CONFIG_INFO, serial)
                 send_email.faEmail(email_content, 'servers@ansjer.com')
-                send_email.faEmail(email_content, 'antony@ansjer.com')
                 return {}
-            # 请求国内服获取UID数据
-            response = requests.post("https://www.zositechc.cn/serialNumber/get-status",
-                                     data={'serial_number': serial}, timeout=3)
+            if CONFIG_INFO == 'eur':  # 查美服
+                response = requests.get("https://www.dvema.com/serialNumber/get-status",
+                                        params={'serial_number': serial}, timeout=3)
+            else:  # 查国服
+                response = requests.get("https://www.zositechc.cn/serialNumber/get-status",
+                                        params={'serial_number': serial}, timeout=3)
             ip = CommonService.get_ip_address(request)
             operation = '{}序列号占用:{}'.format(CONFIG_INFO, serial)
             log = {
@@ -380,48 +387,52 @@ class SerialNumberView(View):
                 'url': 'serialNumber/attachUID',
             }
             if not response.status_code == 200:
-                operation += '国内UID数据异常响应状态:{}'.format(response.status_code)
+                operation += '查询其它服UID数据异常响应状态:{}'.format(response.status_code)
                 log['operation'] = operation
                 LogModel.objects.create(**log)
                 return {}
             results = json.loads(response.text)
-            if not results:
-                operation += '查询UID数据解析为空'
-                log['operation'] = operation
-                LogModel.objects.create(**log)
-                return {}
             if not results['result_code'] == 0:
-                operation += '国内绑定UID数据result_code: {}'.format(results['result_code'])
+                operation += '其它服绑定UID数据result_code: {}'.format(results['result_code'])
                 log['operation'] = operation
                 LogModel.objects.create(**log)
                 return {}
-            # 解析从国内获取的UID数据
+            # 解析从其它服获取的UID数据
             uid_info = results['result']['uidInfo']
             if uid_info:
                 if uid_info['p2p_type'] == 1:  # 尚云UID不进行同步只进行 邮寄警报
                     # 邮件通知
                     email_content = '国内uid同步国外服类型为尚云不操作: {}'.format(serial)
                     send_email.faEmail(email_content, 'servers@ansjer.com')
-                    send_email.faEmail(email_content, 'antony@ansjer.com')
                 else:
                     # 同步UID数据
-                    uid_vo = UIDModel.objects.create(**uid_info)
+                    uid_id = ''
+                    uid_qs = UIDModel.objects.filter(uid=uid_info['uid'])
+                    if uid_qs.exists():
+                        if uid_qs.first().status == 2:  # 判断uid是否被使用
+                            email_content = '{}序列号已占用且{}已被使用:{}'.format(CONFIG_INFO, uid_info['uid'], serial)
+                            send_email.faEmail(email_content, 'servers@ansjer.com')
+                            return {}
+                        else:
+                            uid_qs.update(status=2, update_time=now_time)
+                            uid_id = uid_qs.first().id
+                    if not uid_id:
+                        uid_id = UIDModel.objects.create(**uid_info).id
                     # 企业序列号关联 uid
-                    UIDCompanySerialModel.objects.create(uid_id=uid_vo.id, company_serial_id=company_serial_id,
+                    UIDCompanySerialModel.objects.create(uid_id=uid_id, company_serial_id=company_serial_id,
                                                          add_time=now_time, update_time=now_time)
                     # 成功后 修改企业序列号状态为2(已分配)
                     CompanySerialModel.objects.filter(id=company_serial_id) \
                         .update(status=2, update_time=now_time)
-                    email_content = '{}序列号已占用已将国内UID数据同步完成: {}'.format(CONFIG_INFO, serial)
+                    SerialNumberView.sync_iot_core_data(serial)
+                    email_content = '{}序列号已占用已将其它服UID数据同步完成: {}'.format(CONFIG_INFO, serial)
                     send_email.faEmail(email_content, 'servers@ansjer.com')
-                    send_email.faEmail(email_content, 'antony@ansjer.com')
                     operation += '同步成功'
                     log['operation'] = operation
                     LogModel.objects.create(**log)
                     return 'success'
-            email_content = '序列号已占用国内没有绑定UID: {}'.format(serial)
+            email_content = '{}序列号已占用其它服没有绑定UID: {}'.format(CONFIG_INFO, serial)
             send_email.faEmail(email_content, 'servers@ansjer.com')
-            send_email.faEmail(email_content, 'antony@ansjer.com')
             return {}
         except Exception as e:
             email_content = '序列号占用同步数据异常: {},errLine:{}, errMsg:{}' \
@@ -596,6 +607,7 @@ class SerialNumberView(View):
 
         try:
             if company_serial.status == 0 or company_serial.status == 1:  # 未使用
+                self.is_4g_device(serial_number, request_dict, request)
                 return response.json(173)
             elif company_serial.status == 2:  # 返回uid
                 res = self.get_uid_info_by_serial(company_serial.id)
@@ -827,3 +839,92 @@ class SerialNumberView(View):
             return response.json(0, uid_list)
         except Exception as e:
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @classmethod
+    def get_iot_core_by_serial_number(cls, request_dict, response):
+        """
+        根据序列号查询iot core
+        """
+        try:
+            serial_number = request_dict.get('serialNumber', None)
+            if not serial_number:
+                return response.json(444)
+            serial = serial_number[0:6]
+            LOGGER.info('根据序列号查询IoTC:{}'.format(serial_number))
+            device_iot_qs = iotdeviceInfoModel.objects.filter(serial_number=serial)
+            if not device_iot_qs.exists():
+                return response.json(173)
+            iot_vo = device_iot_qs.first()
+            iot_dto = {
+                'serial_number': iot_vo.serial_number,
+                'uid': iot_vo.uid,
+                'certificate_id': iot_vo.certificate_id,
+                'certificate_pem': iot_vo.certificate_pem,
+                'public_key': iot_vo.public_key,
+                'private_key': iot_vo.private_key,
+                'thing_name': iot_vo.thing_name,
+                'thing_groups': iot_vo.thing_groups,
+                'endpoint': iot_vo.endpoint,
+                'token_iot_number': iot_vo.token_iot_number,
+                'add_time': iot_vo.add_time.strftime("%Y-%m-%d %H:%M:%S"),
+                'update_time': iot_vo.update_time.strftime("%Y-%m-%d %H:%M:%S")
+            }
+            return response.json(0, {'iotInfo': iot_dto})
+        except Exception as e:
+            LOGGER.info('查询序列号异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(176, str(e))
+
+    @staticmethod
+    def sync_iot_core_data(serial_number):
+        """
+        同步iot core 数据,目前只同步美服到欧服
+        @param serial_number: 序列号
+        """
+        try:
+            if not CONFIG_INFO == 'eur':
+                return False
+            response = requests.get("https://www.dvema.com/serialNumber/getIoTCoreBySerialNumber",
+                                    params={'serialNumber': serial_number}, timeout=3)
+            if response.status_code != 200:
+                return False
+            results = json.loads(response.text)
+            if results['result_code'] != 0:
+                return False
+            iot_vo = results['result']['iotInfo']
+            iot_vo['add_time'] = datetime.strptime(iot_vo['add_time'], "%Y-%m-%d %H:%M:%S")
+            iot_vo['update_time'] = datetime.strptime(iot_vo['update_time'], "%Y-%m-%d %H:%M:%S")
+            iotdeviceInfoModel.objects.create(**iot_vo)
+            return True
+        except Exception as e:
+            LOGGER.info('{}同步iot异常,errLine:{}, errMsg:{}'.format(serial_number, e.__traceback__.tb_lineno, repr(e)))
+            return False
+
+    @staticmethod
+    def is_4g_device(serial_number, request_dict, request):
+        """
+        判断是否4G设备
+        """
+        try:
+            serial_no = serial_number[0:9]
+            key = f'ASJ:UNICOM:CARD:ACTIVATE:{serial_no}'
+            redis = RedisObject()
+            if redis.get_data(key):
+                return True
+            # 根据序列号查询联通iccid
+            unicom_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_no, status=1, card_type=0) \
+                .values('iccid', 'status')
+            if not unicom_qs.exists():
+                return False
+            unicom_qs = unicom_qs.first()
+            unicom_api = UnicomObjeect()
+            unicom_api.change_device_to_activate(unicom_qs['iccid'])
+            redis.CONN.setnx(key, str(unicom_qs['iccid']))
+            redis.CONN.expire(key, 7200)  # 已调用过激活两个小时内不可调用
+            ip = CommonService.get_ip_address(request)
+            describe = '{}获取uid请求激活4G卡,{}'.format(serial_no, unicom_qs['iccid'])
+            UnicomComboView().create_operation_log('serialNumber/get-uid', ip, request_dict, describe)
+            return True
+        except Exception as e:
+            LOGGER.info('{}判断是否4G设备异常,errLine:{}, errMsg:{}'.format(serial_number, e.__traceback__.tb_lineno, repr(e)))
+            return False
+

+ 15 - 14
Controller/ShadowController.py

@@ -1,9 +1,9 @@
-import logging
+import json
 import time
 
 from django.http import JsonResponse
 
-from Ansjer.config import SERVER_TYPE
+from Ansjer.config import SERVER_TYPE, LOGGER
 from Model.models import Device_Info, UidSetModel, UID_Preview, VoicePromptModel, UID_Bucket, UidChannelSetModel, \
     AiService, CountryModel
 from Object.ETkObject import ETkObject
@@ -19,16 +19,16 @@ def update_device_shadow(request):
         request_dict = request.GET
     else:
         return JsonResponse(status=200, data={'code': 0, 'msg': 'success', 'data': {}})
-
-    logger = logging.getLogger('info')
-    logger.info('---更新设备影子---, 使用配置:{}, 参数:{}'.format(SERVER_TYPE, request_dict.dict()))
+    LOGGER.info('---更新设备影子---,使用配置:{}, 参数:{}'.format(SERVER_TYPE,
+                                                     json.dumps(request_dict.dict())))
 
     try:
         etk = request_dict.get('etk', None)
         eto = ETkObject(etk)
         uid = eto.uid
         if not uid:
-            return JsonResponse(status=200, data={'code': 0, 'msg': 'success', 'data': {}})
+            return JsonResponse(status=200, data={'code': 400001, 'msg': 'The UID length or format is incorrect.',
+                                                  'data': {}})
 
         nowTime = int(time.time())
 
@@ -36,7 +36,7 @@ def update_device_shadow(request):
         is_reset = request_dict.get('is_reset', None)
         # 传1则重置设备信息
         if is_reset == '1':
-            logger.info('设备重置: {}'.format(uid))
+            LOGGER.info('设备重置: {}'.format(uid))
 
             # 重置语音提示
             uid_channel_qs = UidChannelSetModel.objects.filter(uid__uid=uid)
@@ -50,7 +50,7 @@ def update_device_shadow(request):
             uid_bucket = UID_Bucket.objects.filter(uid=uid, endTime__gte=nowTime).values('id', 'has_unused').order_by(
                 'addTime')
             if not uid_bucket.exists():
-                Device_Info.objects.filter(UID=uid).update(isExist=2)
+                Device_Info.objects.filter(UID=uid).update(isExist=2, vodPrimaryUserID='', vodPrimaryMaster='')
             # 删除预览图
             uid_pre_qs = UID_Preview.objects.filter(uid=uid)
             if uid_pre_qs.exists():
@@ -61,12 +61,13 @@ def update_device_shadow(request):
             if voice_qs.exists():
                 voice_qs.delete()
 
-            # 关闭移动侦测的消息提醒
+            # 关闭移动侦测推送
+            UidSetModel.objects.filter(uid=uid).update(detect_status=0)
             Device_Info.objects.filter(UID=uid).update(NotificationMode=0)
 
             # 关闭AI
             AiService.objects.filter(uid=uid, use_status=1).update(detect_status=0, detect_group='')
-            logger.info('{}重置成功'.format(uid))
+            LOGGER.info('{}重置成功'.format(uid))
 
         ucode = request_dict.get('ucode', None)
         version = request_dict.get('version', None)
@@ -133,7 +134,7 @@ def update_device_shadow(request):
         if country_qs.exists():
             country = country_qs[0]['id']
             qs_dict['tb_country'] = country
-        logger.info('{} qs_dict: {}'.format(uid, qs_dict))
+        LOGGER.info('{} qs_dict: {}'.format(uid, qs_dict))
 
         us_qs = UidSetModel.objects.filter(uid=uid)
         if us_qs.exists():
@@ -147,8 +148,8 @@ def update_device_shadow(request):
             qs_dict['uid'] = uid
             qs_dict['addTime'] = nowTime
             UidSetModel.objects.create(**qs_dict)
-        logger.info('***设备影子保存成功{}'.format(uid))
+        LOGGER.info('***设备影子保存成功{}'.format(uid))
         return JsonResponse(status=200, data={'code': 0, 'msg': 'success', 'data': {}})
     except Exception as e:
-        logger.info('更新设备影子异常: {}'.format(repr(e)))
-        return JsonResponse(status=200, data={'code': 0, 'update_shadow_error': repr(e)})
+        LOGGER.info('更新设备影子异常: {}'.format(repr(e)))
+        return JsonResponse(status=200, data={'code': 1000001, 'update_shadow_error': repr(e)})

+ 3 - 11
Controller/SysMsg.py

@@ -12,7 +12,6 @@
 @Contact: chanjunkai@163.com
 """
 import time
-import re
 
 from django.views.generic.base import View
 
@@ -134,7 +133,7 @@ class SysMsgView(View):
                         SysMsgModel.objects.create(**create_data)
                         fb_qs.update(status=1)
                     except Exception as e:
-                        return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+                        return response.json(500, repr(e))
                     else:
                         return response.json(0, {'status': 1, 'updTime': nowTime})
                 else:
@@ -155,8 +154,7 @@ class SysMsgView(View):
         try:
             # 如果没有系统消息,周视ios用户暂时生成消息并返回
             if not sm_qs.exists():
-                user_ex_qs = UserExModel.objects.filter(userID_id=userID, appBundleId='com.ansjer.zccloud').values(
-                    'region')
+                user_ex_qs = UserExModel.objects.filter(userID_id=userID, appBundleId='com.ansjer.zccloud').values('region')
                 if not user_ex_qs.exists():
                     return response.json(0, [])
                 now_time = int(time.time())
@@ -192,12 +190,6 @@ class SysMsgView(View):
                 sm_q['jumpLink'] = ''
                 if sm_q['eventType'] > 0:
                     uid_list.append(sm_q['uid'])
-                if sm_q['eventType'] == 2:
-                    msg = sm_q['msg']
-                    number_list = re.findall('\d+', msg)
-                    for number in number_list:
-                        if len(number) == 6:
-                            sm_q['code'] = number
                 data_res.append(sm_q)
             if uid_list:
                 uid_set_qs = UidSetModel.objects.filter(uid__in=uid_list).values('uid', 'nickname')
@@ -209,7 +201,7 @@ class SysMsgView(View):
                     data_res.append(sm_q)
             return response.json(0, {'data': data_res, 'count': count})
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     def do_query_by_admin(self, userID, request_dict, response):
         own_perm = ModelService.check_perm(userID, 30)

+ 83 - 119
Controller/TestApi.py

@@ -1,47 +1,67 @@
-import json
-import logging
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: Ansjer
+@software: PyCharm
+@DATE: 2018/5/22 13:58
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: Test.py
+@Contact: chanjunkai@163.com
+"""
 import os
-import time
 import traceback
-import urllib
 
-import boto3
 import botocore
 import cv2
-import oss2
-import paypalrestsdk
+from botocore import client
+from django.db import transaction
+
+from Ansjer.cn_config.config_formal import CONFIG_INFO
+from Ansjer.config import CONFIG_INFO
+from Controller.DeviceConfirmRegion import Device_Region
+from Object.AWS.AmazonS3Util import AmazonS3Util
+from Object.RedisObject import RedisObject
+from Service.VodHlsService import SplitVodHlsObject
+
+'''
+http://192.168.136.40:8077/Test
+'''
+import json
+import time
+import urllib
 import requests
+from Object.AliPayObject import AliPayObject
+import boto3
 from boto3.session import Session
-from botocore import client
-from django.contrib.auth.hashers import make_password  # 对密码加密模块
-from django.db import transaction, connection
+import oss2
+import paypalrestsdk
+import logging
 from django.http import JsonResponse, HttpResponse
 from django.utils.decorators import method_decorator
 from django.views.decorators.csrf import csrf_exempt
 from django.views.generic.base import View
-
-from Ansjer.config import CONFIG_INFO
+from django.contrib.auth.hashers import make_password  # 对密码加密模块
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, \
     AWS_SECRET_ACCESS_KEY, SERVER_TYPE, AWS_SES_ACCESS_REGION
-from Ansjer.config import SERVER_DOMAIN_SSL
-from Controller.DeviceConfirmRegion import Device_Region
-from Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel
 from Model.models import Order_Model, Store_Meal, DeviceLogModel, VodBucketModel, \
-    TestSerialRepetition, TestDeviceFindSerial, UIDCompanySerialModel, CompanySerialModel, LogModel, Device_User
-from Object.AWS.AmazonS3Util import AmazonS3Util
-from Object.AliPayObject import AliPayObject
-from Object.RedisObject import RedisObject
+    TestSerialRepetition, UIDCompanySerialModel, CompanySerialModel, LogModel
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
-from Object.m3u8generate import PlaylistGenerator
 from Service.CommonService import CommonService
-from Service.VodHlsService import SplitVodHlsObject
+from Object.m3u8generate import PlaylistGenerator
+from Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel
+from Ansjer.config import SERVER_DOMAIN_SSL
 
+SERVER_DOMAIN = 'http://test.dvema.com/'
 ACCESS_KEY = "AKIA2E67UIMD3CYTIWPA"
 SECRET_KEY = "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"
 LOGGER = logging.getLogger('info')
 
 
+# 测试接口sdk
 class testView(View):
     @method_decorator(csrf_exempt)
     def dispatch(self, *args, **kwargs):
@@ -65,6 +85,7 @@ class testView(View):
 
     def validation(self, request_dict, request, operation):
         response = ResponseObject()
+        # operation => cloudVod/path
         if operation is None:
             return response.json(444, 'error path')
         elif operation == 'tests':
@@ -72,25 +93,40 @@ class testView(View):
             logger.info('测试打印')
             res = make_password(123456)
             return JsonResponse(status=200, data=res, safe=False)
+        elif operation == 'testMiddleWare':
+            a = int('a')
+            return JsonResponse(status=200, safe=False)
+        elif operation == 'testMiddleWare2':
+            try:
+                a = int('a')
+                return JsonResponse(status=200, safe=False)
+            except Exception as e:
+                return response.json(500, repr(e))
         elif operation == 'cbu':
             return self.createBucket()
         elif operation == 'vodList':
             ip = CommonService.get_ip_address(request)
-            return self.do_test_query_vod_list(ip, request_dict, response)
+            userID = '158943594633713800138000'
+            return self.do_test_query_vod_list(userID, ip, request_dict, response)
         elif operation == 'signplaym3u8':
             return self.do_sign_play_m3u8(request_dict, response)
         elif operation == 'get_sign_sts':
             ip = CommonService.get_ip_address(request)
             return self.do_test_get_sign_sts(request_dict, ip, response)
         elif operation == 'eqi_query':
-            return self.queryInterface(request_dict, response)
+            userID = '158943594633713800138000'
+            return self.queryInterface(request_dict, userID, response)
+        elif operation == 'getAlexa':
+            userID = '158943594633713800138000'
+            return self.queryInterface(request_dict, userID, response)
         elif operation == 'generateToken':
-            return self.generate_token(request_dict)
-        elif operation == 'analysisToken':
-            return self.analysis_token(request_dict, response)
+            userID = '158943604783713800138000'
+            return self.generate_token(request_dict, userID)
         elif operation == 'test_upload_s3':
+            userID = '158943604783713800138000'
             return self.test_upload_s3(request_dict, response)
         elif operation == 'rekognition':
+            userID = '158943604783713800138000'
             return self.testRekognition(request, request_dict)
         elif operation == 'ip':
             return self.ip(response)
@@ -104,8 +140,6 @@ class testView(View):
             return self.do_comb(request_dict, response)
         elif operation == 'count_ts':
             return self.count_ts(request_dict, response)
-        elif operation == 'tsCount':
-            return self.ts_count(request_dict, response)
         elif operation == 'upload-s3':
             return self.file_upload_s3(request, request_dict, response)
         elif operation == 'v2/upload-s3':
@@ -136,8 +170,6 @@ class testView(View):
             return self.getSerialNumberInfo(request_dict, response)
         elif operation == 'get-serial-details':  # 序列号信息查询
             return self.get_serial_details(request_dict, response, request)
-        elif operation == 'find_device_serial':  # 查找设备序列号接口:306低功耗无Wi-Fi产品
-            return self.find_device_serial(request_dict, response)
         else:
             return 123
 
@@ -407,7 +439,7 @@ class testView(View):
             f.write(resp['Body'].read())
 
     # 新查询设备字段
-    def queryInterface(self, request_dict, response):
+    def queryInterface(self, request_dict, userID, response):
         page = request_dict.get('page', None)
         line = request_dict.get('line', None)
         NickName = request_dict.get('NickName', None)
@@ -415,7 +447,7 @@ class testView(View):
         page = int(page)
         line = int(line)
         response.lang = 'cn'
-        userID = ''
+        userID = userID
         dvqs = Device_Info.objects.filter(userID_id=userID)
         # # 已重置的设备
         # dvqs = dvqs.filter(~Q(isExist=2))
@@ -479,7 +511,7 @@ class testView(View):
         return response.json(0, data)
 
     # 获取播放列表
-    def do_test_query_vod_list(self, ip, request_dict, response):
+    def do_test_query_vod_list(self, userID, ip, request_dict, response):
         uid = 'GZL2PEFJPLY7W6BG111A'
         channel = 2
         userID = '158943594633713800138000'
@@ -677,21 +709,21 @@ class testView(View):
                 {'name': vod['start_time'], 'sign_url': vod_play_url, 'thumb': thumb, 'sec': vod['sec']})
         return response.json(0, vod_play_list)
 
-    @staticmethod
-    def generate_token(request_dict):
+    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': userID, 'lang': 'cn', 'user': username, 'm_code': username})
-        return JsonResponse(status=200, data=res, safe=False)
+        res = tko.generate(
+            data={'userID': userID, 'lang': 'cn', 'user': username, 'm_code': username})
+        # uidToken
+        # utko = UidTokenObject()
+        # res = utko.generate(data={'uid': '4UZSEDP93MJ3X7YB111A','channel': 1})
 
-    @staticmethod
-    def analysis_token(request_dict, response):
-        token = request_dict.get('token', None)
-        token = TokenObject(token)
-        user_id = token.userID
-        username = Device_User.objects.get(userID=user_id).username
-        return response.json(0, username)
+        # from Object.ETkObject import ETkObject
+        # etkObj = ETkObject(etk='')
+        # res = etkObj.encrypt("4UZSEDP93MJ3X7YB111A")
+        return JsonResponse(status=200, data=res, safe=False)
 
     def test_upload_s3(self, request_dict, response):
         aws_s3_guonei = boto3.client(
@@ -785,35 +817,11 @@ class testView(View):
                 sumSec += (fg >> shift) & 0xf
         size = 0
         return HttpResponse(
-            "{year}年{month}月 </br>上传的TS总数:{sumTs} </br> 总秒数:{sumSec} </br> 总大小:{size}GB (1秒约等150KB计算)".format(
-                year=year,
-                month=month,
-                sumTs=sumTs,
-                sumSec=sumSec,
-                size=size))
-
-    @staticmethod
-    def ts_count(request_dict, response):
-        uid = request_dict.get('uid', None)
-        start_time = request_dict.get('start_time', None)
-        end_time = request_dict.get('end_time', None)
-
-        cursor = connection.cursor()
-        sql = 'SELECT fg FROM `vod_hls_mon` WHERE uid=%s AND start_time BETWEEN 1685289600 AND 1685548800 UNION ALL SELECT fg FROM `vod_hls_tues` WHERE uid=%s AND start_time BETWEEN 1685289600 AND 1685548800 UNION ALL SELECT fg FROM `vod_hls_wed` WHERE uid=%s AND start_time BETWEEN 1685289600 AND 1685548800 UNION ALL SELECT fg FROM `vod_hls_thur` WHERE uid=%s AND start_time BETWEEN 1685289600 AND 1685548800 UNION ALL SELECT fg FROM `vod_hls_fri` WHERE uid=%s AND start_time BETWEEN 1685289600 AND 1685548800 UNION ALL SELECT fg FROM `vod_hls_sat` WHERE uid=%s AND start_time BETWEEN 1685289600 AND 1685548800 UNION ALL SELECT fg FROM `vod_hls_sun` WHERE uid=%s AND start_time BETWEEN 1685289600 AND 1685548800'
-        print(sql)
-        try:
-            cursor.execute(sql, ['7TR9XE46NHXL5921111A', '7TR9XE46NHXL5921111A', '7TR9XE46NHXL5921111A',
-                                 '7TR9XE46NHXL5921111A', '7TR9XE46NHXL5921111A', '7TR9XE46NHXL5921111A',
-                                 '7TR9XE46NHXL5921111A'])
-            result = cursor.fetchall()
-            cursor.close()
-            ts_count = 0
-            for fg in result:
-                ts_count += int(fg[0]) & 0xf
-            return response.json(0, ts_count)
-        except Exception as e:
-            print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            "{year}年{month}月 </br>上传的TS总数:{sumTs} </br> 总秒数:{sumSec} </br> 总大小:{size}GB (1秒约等150KB计算)".format(year=year,
+                                                                                                              month=month,
+                                                                                                              sumTs=sumTs,
+                                                                                                              sumSec=sumSec,
+                                                                                                              size=size))
 
     @staticmethod
     def write_redis_list(response):
@@ -886,7 +894,7 @@ class testView(View):
             return response
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def getSerialNumberInfo(cls, request_dict, response):
@@ -976,7 +984,7 @@ class testView(View):
             if not serial_number:
                 return response.json(0)
             results_data = []
-            if CONFIG_INFO != 'cn':
+            if not CONFIG_INFO == 'cn':
                 return response.json(0, results_data)
             local_response = cls.getSerialNumberInfo(request_dict, response)
             res = json.loads(local_response.content)
@@ -1026,47 +1034,3 @@ class testView(View):
             LOGGER.info('异常详情,errLine:{}, errMsg:{}'
                         .format(e.__traceback__.tb_lineno, repr(e)))
             return response.json(500)
-
-    @classmethod
-    def find_device_serial(cls, request_dict, response):
-        try:
-            firmware_time_code_no = request_dict.get('firmwareTimeCode', None)
-            function_type_str = request_dict.get('functionType', None)
-            serial_no = request_dict.get('serialNo', None)
-            time_stamp = request_dict.get('timeStamp', None)
-            sign = request_dict.get('sign', None)
-            if not CommonService.check_time_stamp_token(sign, time_stamp):
-                return response.json(13)
-            if not function_type_str:
-                return response.json(444)
-            with transaction.atomic():
-                first_firmwares_qs = TestDeviceFindSerial.objects.filter(firmware_time_code=firmware_time_code_no)
-                if function_type_str == 'device_save_serial':  # 设备上报序列号绑定固件码  get_device_serial
-                    if not all([firmware_time_code_no, serial_no]):
-                        return response.json(444)
-                    if first_firmwares_qs.exists():
-                        return response.json(174)
-                    nowtime = int(time.time())
-                    params = {'firmware_time_code': firmware_time_code_no,
-                              'serial_number': serial_no,
-                              'created_time': nowtime}
-                    TestDeviceFindSerial.objects.create(**params)
-                    return response.json(0)
-                elif function_type_str == 'get_device-serial':  # 根据固件码获取序列号
-                    if not firmware_time_code_no:
-                        return response.json(444)
-                    if first_firmwares_qs.exists():
-                        result = {'Id': first_firmwares_qs.first().id,
-                                  'firmwareTimeCode': firmware_time_code_no,
-                                  'serialNumber': first_firmwares_qs.first().serial_number,
-                                  'createdTime': first_firmwares_qs.first().created_time}
-                        print('返回结果 : %s', result)
-                        return response.json(0, result)
-                    else:
-                        return response.json(173)
-                else:
-                    return response.json(444)
-
-        except Exception as e:
-            LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
-            return response.json(178, e)

+ 41 - 21
Controller/UnicomCombo/UnicomComboController.py

@@ -21,6 +21,7 @@ from django.views.generic.base import View
 from Model.models import UnicomDeviceInfo, UnicomCombo, Pay_Type, Order_Model, Store_Meal, AiStoreMeal, \
     UnicomComboOrderInfo, UnicomComboExperienceHistory, UnicomDeviceStatusChangePush, SysMsgModel, UnicomFlowPush, \
     LogModel
+from Object.EIoTClubObject import EIoTClubObject
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
@@ -384,13 +385,6 @@ class UnicomComboView(View):
                 # 待完善代码 根据uid与用户id验证系统设备mdcmd
                 unicom_device_qs = UnicomDeviceInfo.objects.filter(iccid=iccid)
                 if unicom_device_qs.exists():
-                    # if unicom_device_qs.first().status == 1:
-                    #     key = 'ASJ:UNICOM:RESET:{}'.format(serial_no)
-                    #     reset_cache = redis.get_data(key)
-                    #     if reset_cache:
-                    #         logger.info('--->三十分后再次访问接口生效赠送流量套餐')
-                    #         return response.json(0, 'Thirty minutes later to visit again take effect')
-                    #     cls.user_activate_flow(iccid)
                     if unicom_device_qs.first().serial_no != serial_no:
                         unicom_device_qs.update(main_card=sim, updated_time=n_time, serial_no=serial_no)
                         cls.create_operation_log('unicom/api/device-bind',
@@ -400,25 +394,22 @@ class UnicomComboView(View):
                     return response.json(0)
                 if sim == 0:
                     return response.json(0, '外置卡不保存相关信息{}'.format(serial_no))
-                unicom_obj = UnicomObjeect()
                 params = {'iccid': iccid, 'serial_no': serial_no, 'updated_time': n_time,
                           'created_time': n_time, 'main_card': sim}
-                if cls.check_iccid(iccid):
-                    params['card_type'] = 1
+                if cls.is_unicom_sim(iccid):  # 联通卡
+                    UnicomDeviceInfo.objects.create(**params)
+                    cls.create_operation_log('unicom/api/device-bind',
+                                             ip, request_dict, '4G序列号{}绑定{}'.format(serial_no, iccid))
+                    return response.json(0)
+                elif cls.is_dingxin_iot(iccid):  # 鼎芯物联卡
+                    params['card_type'] = 5  # 国际
                     params['status'] = 2
                     UnicomDeviceInfo.objects.create(**params)
                     return response.json(0)
-                result = unicom_obj.verify_device(iccid=iccid)
-                if result.status_code == 200 and result.text:
-                    res_dict = json.loads(result.text)
-                    if res_dict['success']:
-                        if res_dict['data']['status'] == 0:
-                            logger.info('--->设备请求绑定{}验证不存在{}'.format(iccid, res_dict))
-                            return response.json(173)
-                        # unicom_obj.change_device_to_activate(iccid)
-                        UnicomDeviceInfo.objects.create(**params)
-                        cls.create_operation_log('unicom/api/device-bind',
-                                                 ip, request_dict, '4G序列号{}绑定{}'.format(serial_no, iccid))
+                elif cls.check_iccid(iccid):  # 五兴物联卡
+                    params['card_type'] = 1
+                    params['status'] = 2
+                    UnicomDeviceInfo.objects.create(**params)
                     return response.json(0)
                 else:
                     logger.info('--->设备请求绑定{}验证失败'.format(iccid))
@@ -429,6 +420,35 @@ class UnicomComboView(View):
             logger.info('--->设备调用4G注册接口异常:{}'.format(ex))
             return response.json(177, repr(e))
 
+    @classmethod
+    def is_unicom_sim(cls, iccid):
+        """
+        判断是否联通SIM卡
+        @param iccid: iccid
+        @return: 是否联通卡结果
+        """
+        result = UnicomObjeect().verify_device(iccid=iccid)
+        if result.status_code == 200 and result.text:
+            res_dict = json.loads(result.text)
+            if res_dict['success'] and res_dict['data']['status'] != 0:
+                return True
+        return False
+
+    @classmethod
+    def is_dingxin_iot(cls, iccid):
+        """
+        根据iccid判断是否鼎芯国际卡
+        """
+        try:
+            dx_iot = EIoTClubObject()
+            params = {'iccid': iccid}
+            result = dx_iot.get_cards_info('v3', **params)
+            assert result['code'] == '200'
+            return True
+        except Exception as e:
+            print(repr(e))
+            return False
+
     @classmethod
     def check_iccid(cls, iccid):
         """

+ 47 - 22
Controller/UnicomCombo/WXTechController.py

@@ -65,7 +65,7 @@ class WXTechController(View):
             elif operation == 'getExperiencePackage':
                 return self.get_experience_package(request_dict, response)
             elif operation == 'createOrder':
-                return self.create_order_package(request_dict, response)
+                return self.create_order_package(user_id, request_dict, response)
             elif operation == 'exchangePackage':
                 return self.wx_exchange_package(request_dict, response, request, user_id)
 
@@ -128,6 +128,7 @@ class WXTechController(View):
                 serial_no = request_dict.get('serialNo', None)
                 if not serial_no:
                     return response.json(444)
+                serial_no = serial_no[0:9]
                 # 查询是否注册iccid
                 unicom_device_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_no) \
                     .values('serial_no', 'user_id', 'iccid')
@@ -151,7 +152,7 @@ class WXTechController(View):
                 return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
         @classmethod
-        def create_order_package(cls, request_dict, response):
+        def create_order_package(cls, user_id, request_dict, response):
             """
             五兴电信领取1G15天流量体验包
             """
@@ -161,12 +162,12 @@ class WXTechController(View):
                 operator = request_dict.get('operator', None)
                 if not all([operator, serial_no]):
                     return response.json(444)
+                serial_no = serial_no[0:9]
                 unicom_device_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_no) \
                     .values('serial_no', 'user_id', 'iccid')
                 if not unicom_device_qs.exists():
                     return response.json(173)
                 unicom_device_qs = unicom_device_qs.first()
-                user_id = unicom_device_qs['user_id']
                 iccid = unicom_device_qs['iccid']
                 # 查看是否体验过免费套餐
                 experience_history_qs = UnicomComboExperienceHistory.objects.filter(iccid=iccid)
@@ -183,6 +184,8 @@ class WXTechController(View):
                     experience_history_vo = {'iccid': iccid, 'experience_type': 0, 'do_time': int(time.time())}
                     UnicomComboExperienceHistory.objects.create(**experience_history_vo)
                     order_res = cls.created_order(serial_no, user_id, trade_no, pay_type=10)
+                    UnicomDeviceInfo.objects.filter(serial_no=serial_no) \
+                        .update(user_id=user_id, updated_time=int(time.time()))
                     LOGGER.info('*****系统创建体验订单:{}'.format(order_res))
                     return response.json(0)
                 return response.json(10063)
@@ -220,7 +223,7 @@ class WXTechController(View):
                           'store_meal_name': combo_info_vo['combo_name'],
                           'trade_no': trade_no}
             Order_Model.objects.create(**order_dict)
-            return True
+            return order_id
 
         @classmethod
         def delete_card_package(cls, request_dict, response):
@@ -267,14 +270,13 @@ class WXTechController(View):
                 # 校验兑换码格式是否正确
                 if not (code.isalnum() and len(code) == 10):
                     return response.json(10040)  # 兑换码格式错误
-                card_type = 1
-                device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number, card_type=card_type) \
-                    .values('iccid')
+                device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number) \
+                    .values('iccid', 'card_type')
                 if not device_info_qs.exists():
                     return response.json(173)  # 设备信息不存在
                 #  查询兑换码信息
-                exchange_code_qs = ExchangeCode.objects.filter(code=code, status=False, package_type=card_type) \
-                    .values('package_id', 'expire_time')
+                exchange_code_qs = ExchangeCode.objects.filter(code=code, status=False) \
+                    .values('package_id', 'expire_time', 'package_type')
                 if not exchange_code_qs.exists():
                     return response.json(10040)  # 兑换码无效
                 combo_id = exchange_code_qs[0]['package_id']
@@ -285,19 +287,29 @@ class WXTechController(View):
                     return response.json(173)
                 package_code = package_info_qs[0]['package_id']
                 iccid = device_info_qs[0]['iccid']
-                # 五兴订购流量包请求参数
-                data = {'iccid': iccid, 'operator': WXOperatorEnum.TELECOM.value,
-                        'startType': str(WXStartTypeEnum.EFFECTIVE_IMMEDIATELY.value), 'packageCode': package_code}
-                wx_tech = WXTechObject()
-                # 请求五兴API订购套餐接口
-                res = wx_tech.create_order_package(**data)
-                LOGGER.info('*****五兴订购年卡套餐结果:{}'.format(res))
-                if res['code'] == '0':
-                    trade_no = res['data']['orderNumber']
-                    cls.created_order(serial_number, user_id, trade_no, combo_id, 11)
-                    exchange_code_qs.update(status=True, updated_time=int(time.time()))
-                    cls.save_log(ip, 200, '兑换成功{},{}'.format(serial_number, code))
-                    return response.json(0)
+                # 兑换码套餐类型
+                card_type = device_info_qs[0]['card_type']
+                if card_type == 0:  # 联通无限流量兑换码
+                    result = cls.exchange_unicom_package(serial_number, iccid,
+                                                         user_id, combo_id)
+                    if result:
+                        exchange_code_qs.update(status=True, updated_time=int(time.time()))
+                        cls.save_log(ip, 200, '兑换成功{},{}'.format(serial_number, code))
+                        return response.json(0)
+                elif card_type == 1:  # 五兴电信无限流量兑换码
+                    # 五兴订购流量包请求参数
+                    data = {'iccid': iccid, 'operator': WXOperatorEnum.TELECOM.value,
+                            'startType': str(WXStartTypeEnum.EFFECTIVE_IMMEDIATELY.value), 'packageCode': package_code}
+                    wx_tech = WXTechObject()
+                    # 请求五兴API订购套餐接口
+                    res = wx_tech.create_order_package(**data)
+                    LOGGER.info('*****五兴订购年卡套餐结果:{}'.format(res))
+                    if res['code'] == '0':
+                        trade_no = res['data']['orderNumber']
+                        cls.created_order(serial_number, user_id, trade_no, combo_id, 11)
+                        exchange_code_qs.update(status=True, updated_time=int(time.time()))
+                        cls.save_log(ip, 200, '兑换成功{},{}'.format(serial_number, code))
+                        return response.json(0)
                 cls.save_log(ip, 10040, '兑换失败{},{}'.format(serial_number, code))
                 return response.json(10040)
             except Exception as e:
@@ -306,6 +318,19 @@ class WXTechController(View):
                 cls.save_log(ip, 500, '兑换内部错误')
                 return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
+        @classmethod
+        def exchange_unicom_package(cls, serial_number, iccid, user_id, combo_id):
+            try:
+                # 通过兑换码创建订单记录
+                order_id = cls.created_order(serial_number, user_id, 'ansjer', combo_id, 11)
+                # 根据订单信息创建流量套餐包
+                UnicomComboView.create_combo_order_info(order_id, 0, iccid, combo_id)
+                return True
+            except Exception as e:
+                LOGGER.info('*****WXTechController.exchange_unicom_package:errLine:{}, errMsg:{}'
+                            .format(e.__traceback__.tb_lineno, repr(e)))
+                return False
+
         @staticmethod
         def save_log(ip, code, operation):
             """

+ 25 - 50
Controller/UserController.py

@@ -37,13 +37,12 @@ from django.views.generic import View
 from jwt.algorithms import RSAAlgorithm
 from ratelimit import limits
 
-from Ansjer.config import AuthCode_Expire, SERVER_DOMAIN, APNS_CONFIG, JPUSH_CONFIG, FCM_CONFIG, TUTK_PUSH_DOMAIN, \
-    LOGGER
+from Ansjer.config import AuthCode_Expire, SERVER_DOMAIN, APNS_CONFIG, JPUSH_CONFIG, FCM_CONFIG, TUTK_PUSH_DOMAIN, LOGGER
 from Ansjer.config import BASE_DIR, CONFIG_EUR, CONFIG_INFO, SERVER_DOMAIN_EUR, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
 from Controller.CheckUserData import DataValid, date_handler, RandomStr
 from Model.models import Device_User, Role, UidPushModel, UserOauth2Model, UserExModel, Device_Info, UidSetModel, \
     UserAppFrequencyModel, CountryIPModel, CountryModel, UidChannelSetModel, Order_Model, UID_Bucket, Unused_Uid_Meal, \
-    GatewayPush, CountryLanguageModel, LanguageModel, IcloudUseDetails, IcloudStorageRecord, VodBucketModel
+    GatewayPush, CountryLanguageModel, LanguageModel, VodBucketModel
 from Object.AWS.AmazonS3Util import AmazonS3Util
 from Object.AWS.SesClassObject import SesClassObject
 from Object.AliSmsObject import AliSmsObject
@@ -490,7 +489,7 @@ class createPwd(TemplateView):
             djangoLogger = logging.getLogger('django')
             djangoLogger.exception(e)
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
 
 class ForgetPwdView(TemplateView):
@@ -749,7 +748,7 @@ class refreshTokenViewV3(TemplateView):
             return response.json(0, res)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
 
 # 获取验证码
@@ -2150,8 +2149,6 @@ class v3LoginView(TemplateView):
                 GatewayPush.objects.create(user_id=userID, app_bundle_id=app_bundle_id, app_type=app_type,
                                            push_type=push_type, token_val=token_val, m_code=m_code, lang=lang, tz=tz)
             UidPushModel.objects.filter(userID=userID, m_code=m_code).update(token_val=token_val, push_type=push_type)
-            if app_bundle_id == 0 or app_bundle_id == '0':
-                LOGGER.info('v3/account/login接口推送数据:{}'.format(request_dict))
         now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
         region_country = users['region_country']
         # 语言不存在返回英文
@@ -2291,7 +2288,7 @@ class oneClickLoginView(TemplateView):
             djangoLogger = logging.getLogger('django')
             djangoLogger.exception(e)
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
 
 # 用户登录后初始化接口
@@ -2322,6 +2319,7 @@ class InitInfoView(View):
     def init_info(self, request_dict, userID, response, request):
         # 未读的系统消息
         token_val = request_dict.get('token_val', None)
+        jg_token_val = request_dict.get('jg_token_val', '')
         m_code = request_dict.get('m_code', None)
         push_type = request_dict.get('push_type', None)
         appBundleId = request_dict.get('appBundleId', None)
@@ -2332,7 +2330,8 @@ class InitInfoView(View):
             m_code = m_code[4:]
         if all([token_val, push_type, appBundleId, userID]):
             self.save_push_config(userID, appBundleId, push_type, token_val, m_code, lang, tz)
-            self.save_or_creat_uid_push(userID, appBundleId, push_type, token_val, m_code, lang, tz, now_time)
+            self.save_or_creat_uid_push(userID, appBundleId, push_type, token_val, m_code, lang, tz, now_time,
+                                        jg_token_val)
             if appBundleId:
                 user_ex_qs = UserExModel.objects.filter(userID_id=userID)
                 user_ex = None
@@ -2395,13 +2394,14 @@ class InitInfoView(View):
             print('出错了~异步保存配置信息错误,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
     @staticmethod
-    def save_or_creat_uid_push(user_id, app_bundle_id, push_type, token_val, m_code, lang, tz, now_time):
+    def save_or_creat_uid_push(user_id, app_bundle_id, push_type, token_val, m_code, lang, tz, now_time, jg_token_val):
         """
         异步保存推送配置
         @param user_id: 用户id
         @param app_bundle_id: app版本包id
         @param push_type: 推送类型 0:Ios,1:Google,2:国内极光
         @param token_val: 推送token
+        @param jg_token_val: 极光推送token
         @param m_code: 手机唯一标识
         @param lang: 语言
         @param tz: 时区
@@ -2416,16 +2416,12 @@ class InitInfoView(View):
                 for item in uid_set:
                     uid_push_qs = UidPushModel.objects.filter(userID=user_id, m_code=m_code, uid_set_id=item['id'])
                     if uid_push_qs.exists():
-                        if uid_push_qs.first().token_val != token_val:
-                            uid_push_qs.update(token_val=token_val, push_type=push_type)
+                        uid_push_qs.update(token_val=token_val, push_type=push_type, jg_token_val=jg_token_val)
                     else:
                         UidPushModel.objects.create(userID_id=user_id, appBundleId=app_bundle_id, app_type=app_type,
                                                     push_type=push_type, token_val=token_val, m_code=m_code, lang=lang,
-                                                    tz=tz, addTime=now_time, updTime=now_time, uid_set_id=item['id'])
-                    if app_bundle_id == 0 or app_bundle_id == '0':
-                        LOGGER.info(
-                            'user/initInfo接口推送数据:appBundleId:{},app_type:{},push_type:{},token_val:{},m_code:{}'.format(
-                                app_bundle_id, app_type, push_type, token_val, m_code))
+                                                    tz=tz, addTime=now_time, updTime=now_time, uid_set_id=item['id'],
+                                                    jg_token_val=jg_token_val)
         except Exception as e:
             LOGGER.info('出错了~保存推送配置信息错误,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
@@ -3190,30 +3186,26 @@ class alexaAuthView(TemplateView):
     def valid_login(self, user_qs, password, response):
         if not user_qs.exists():
             return response.json(104)
-        users = user_qs.values('userID', 'password', 'region_country')[0]
+        users = user_qs.values('userID', 'password')[0]
         if not check_password(password, users['password']):
             return response.json(111)
         userID = users['userID']
-        region_country = users['region_country']
-
-        # 确认用户地区
-        region_code = 'US'
-        country_qs = CountryModel.objects.filter(id=region_country).values('region_id')
-        if country_qs.exists():
-            region_id = country_qs[0]['region_id']
-            if region_id == 4:
-                region_code = 'EU'
-
+        # uid_qs = Device_Info.objects.filter(userID_id=userID, isExist=1).values('UID', 'NickName', 'View_Password')
+        # uid_arr = []
+        # for uid_q in uid_qs:
+        #     uid_arr.append({'uid': uid_q['UID'], 'nick': uid_q['NickName'], 'password': uid_q['View_Password']})
         res = {
             'userID': userID,
-            'region_code': region_code
+            #     'uid_arr': uid_arr
         }
         return response.json(0, res)
+        # return response.json(0, res)
 
 
 class alexaUidView(TemplateView):
     def post(self, request, *args, **kwargs):
         request.encoding = 'utf-8'
+        # request_dict = json.loads(request.body.decode('utf-8'))
         request_dict = request.POST
         response = ResponseObject()
         return self.validates(request_dict, response)
@@ -3295,7 +3287,7 @@ class alexaUidView(TemplateView):
             }
             return response.json(0, res)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
 
 class alexaSwitchView(TemplateView):
@@ -3339,7 +3331,7 @@ class alexaSwitchView(TemplateView):
             }
             return response.json(0, res)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
 
 # 登出
@@ -4388,25 +4380,8 @@ def deleteAccount(request):
         hadUnUseSevice = Unused_Uid_Meal.objects.filter(uid__in=orderUserIds)
         if hadUnUseSevice.exists():
             return response.json(10046)
+        # return HttpResponse(list(hadUseSevice.values()))
         delUser.delete()
-        # 删除云盘记录
-        icloud_record = IcloudStorageRecord.objects.filter(user_id=userID).values('bucket_id')
-        if icloud_record.exists():
-            bucket_id = icloud_record[0]['bucket_id']
-            bucket_qs = VodBucketModel.objects.filter(id=bucket_id).values('bucket', 'region', 'mold')
-            bucket_name = bucket_qs[0]['bucket']
-            bucket_region = bucket_qs[0]['region']
-            mold = bucket_qs[0]['mold']
-            s3_obj = AmazonS3Util(
-                AWS_ACCESS_KEY_ID[mold],
-                AWS_SECRET_ACCESS_KEY[mold],
-                bucket_region
-            )
-            object_list = s3_obj.get_object_list(bucket_name, userID)
-            for obj in object_list:
-                s3_obj.delete_obj(bucket_name, obj['Key'])
-            icloud_record.delete()
-        IcloudUseDetails.objects.filter(user_id=userID).update(use_size=0)
         return response.json(0)
 
 
@@ -4480,4 +4455,4 @@ class DeleteUser(View):
             Device_Info.objects.filter(userID=user_id).delete()
             return response.json(0)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))

+ 2 - 2
Controller/UserDevice/UserDeviceShareController.py

@@ -88,7 +88,7 @@ class UserDeviceShareView(View):
             return response.json(0, data)
         except Exception as e:
             LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @classmethod
     def user_channel_permission_save(cls, request_dict, response):
@@ -137,7 +137,7 @@ class UserDeviceShareView(View):
                 return response.json(0)
         except Exception as e:
             LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
     @staticmethod
     def qrcode_share_channel_permission_save(user_id, uid):

+ 4 - 13
Controller/UserManger.py

@@ -12,8 +12,7 @@ from django.views.generic import TemplateView, View
 
 from Ansjer.config import BASE_DIR, ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME, AVATAR_BUCKET
 from Ansjer.config import SERVER_DOMAIN
-from Model.models import Role, Device_User, UserOauth2Model, UserExModel, CountryLanguageModel, LanguageModel, App_Info, \
-    IcloudUseDetails
+from Model.models import Role, Device_User, UserOauth2Model, UserExModel, CountryLanguageModel, LanguageModel, App_Info
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
@@ -75,9 +74,6 @@ class showUserMoreView(TemplateView):
                         userIconUrl = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
                         sqlDict['datas'][k]['fields']['userIconUrl'] = userIconUrl
 
-                # 判断用户是否开通云盘
-                icloud_user_qs = IcloudUseDetails.objects.filter(user_id=user_id)
-                v['fields']['is_cloudDrive'] = 1 if icloud_user_qs.exists() else 0
                 # 确认地区字段
                 sqlDict['datas'][k]['fields']['region_status'] = 1 if region_status else 0
 
@@ -115,7 +111,7 @@ class showUserMoreView(TemplateView):
                     region_country = sqlDict['datas'][k]['fields']['region_country']
                     language_qs = LanguageModel.objects.filter(lang=lang).values('id')
                     region_qs = CountryLanguageModel.objects.filter(country_id=region_country,
-                                                                    language_id=language_qs[0]['id']). \
+                                                                    language_id=language_qs[0]['id']).\
                         values('country_name')
                     sqlDict['datas'][k]['fields']['region'] = region_qs[0]['country_name'] if region_qs.exists() else ''
 
@@ -124,7 +120,7 @@ class showUserMoreView(TemplateView):
             sqlDict['oauth2'] = list(ua_qs)
             return response.json(0, sqlDict)
         except Exception as e:
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
 
 
 class perfectUserInfoView(TemplateView):
@@ -217,11 +213,6 @@ class perfectUserInfoView(TemplateView):
             for k, v in enumerate(res["datas"]):
                 res['datas'][k]['fields'].pop('password')
                 userIconPath = res['datas'][k]['fields']['userIconPath']
-                region_status = res['datas'][k]['fields']['region_status']
-                if region_status is True:
-                    res['datas'][k]['fields']['region_status'] = 1
-                else:
-                    res['datas'][k]['fields']['region_status'] = 0
                 if userIconPath and userIconUrl != '':
                     res['datas'][k]['fields']['userIconUrl'] = userIconUrl
             return response.json(0, res)
@@ -262,7 +253,7 @@ class getAvatarView(TemplateView):
                 return HttpResponse(get_object_response['Body'], content_type="image/jpeg")
             except Exception as e:
                 print(e)
-                return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+                return response.json(500, repr(e))
 
         fullPath = os.path.join(BASE_DIR, "static", filePath).replace('\\', '/')
         if os.path.isfile(fullPath):

+ 12 - 201
Model/models.py

@@ -754,9 +754,9 @@ class Store_Meal(models.Model):
     lang = models.ManyToManyField(to='Lang', verbose_name='套餐语言', db_table='store_meal_lang')
     cycle_config_id = models.IntegerField(null=True, verbose_name='周期付款配置表id')
     sort = models.IntegerField(default=99, blank=True, verbose_name=u'排序,越小越靠前')  # 单位月
-    is_beta = models.SmallIntegerField(default=0, verbose_name=u'是否显示beta')  # 0: 否, 1: 是
-    is_ai = models.SmallIntegerField(default=0, verbose_name=u'是否支持AI')  # 0: 否, 1: 是
-    icloud_store_meal_id = models.IntegerField(default=0, verbose_name='关联云盘套餐id')
+    # 备用字段
+    spare_3 = models.CharField(default='', blank=True, max_length=64, db_index=True, verbose_name=u'备用字段3')
+    spare_4 = models.CharField(default='', blank=True, max_length=64, db_index=True, verbose_name=u'备用字段4')
 
     def __str__(self):
         return self.id
@@ -815,7 +815,6 @@ class Lang(models.Model):
     title = models.CharField(blank=True, max_length=320, verbose_name='标题')
     content = models.TextField(blank=True, null=True, verbose_name='描述')
     discount_content = models.CharField(blank=True, max_length=320, verbose_name=u'优惠信息描述')
-    type = models.SmallIntegerField(default=0, verbose_name='类型')  # 0:云存 1:AI 2:4G 3:云盘
 
     def __str__(self):
         return self.id
@@ -849,7 +848,6 @@ class Equipment_Version(models.Model):
     mci = models.CharField(default='', blank=True, max_length=10, verbose_name='设备类型')
     img = models.CharField(max_length=300, blank=True, default='', verbose_name=u'图片路径')
     max_ver = models.CharField(default='', max_length=16, verbose_name='最大版本号')
-    is_popup = models.SmallIntegerField(default=0, verbose_name=u'是否弹窗')
 
     def __str__(self):
         return self.eid
@@ -935,7 +933,7 @@ class Order_Model(models.Model):
     rank = models.ForeignKey(Store_Meal, to_field='id', default='', on_delete=models.CASCADE, verbose_name='关联云存套餐表')
     ai_rank = models.ForeignKey(AiStoreMeal, to_field='id', default='', on_delete=models.CASCADE,
                                 verbose_name='关联ai套餐表')
-    order_type = models.SmallIntegerField(default=0, verbose_name='订单类型:0:云存,1:云存ai,2:联通4G,3:五兴,4:云盘')
+    order_type = models.SmallIntegerField(default=0, verbose_name='订单类型:0:云存,1:ai,2:联通4G')
     unify_combo_id = models.CharField(blank=True, default='', max_length=32, verbose_name=u'统一套餐id')
     nickname = models.CharField(default='', max_length=64, verbose_name='设备昵称')
     uid_bucket_id = models.IntegerField(default=0, verbose_name='关联uid_bucket的字段')
@@ -1272,7 +1270,7 @@ class UID_Bucket(models.Model):
     uid = models.CharField(max_length=20, verbose_name='设备UID', db_index=True)
     channel = models.SmallIntegerField(default=0, verbose_name='通道')
     bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, verbose_name='存储空间')
-    status = models.SmallIntegerField(default=0, verbose_name='状态[0:关闭,1:开启]')  # 修改2023/5/15(原状态[0:开启,1:关闭])
+    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)
     updateTime = models.BigIntegerField(verbose_name='更新时间', default=0)
@@ -1385,7 +1383,6 @@ class UidSetModel(models.Model):
     tb_country = models.IntegerField(blank=True, default=0, verbose_name='国家')
     device_type = models.SmallIntegerField(default=0, verbose_name='设备类型')
     ai_type = models.SmallIntegerField(default=0, verbose_name='检测类型')
-    msg_notify = models.JSONField(null=True, verbose_name='消息通知Json')
 
     class Meta:
         db_table = 'uid_set'
@@ -1404,6 +1401,7 @@ class UidPushModel(models.Model):
     push_type = models.IntegerField(default=0,
                                     verbose_name=u'推送类型')  # 0: apns, 1: 安卓gcm, 2: 极光, 3:华为, 4:小米, 5:vivo, 6:oppo, 7:魅族
     token_val = models.CharField(default='', max_length=500, verbose_name=u'设备验证令牌')
+    jg_token_val = models.CharField(default='', max_length=500, verbose_name=u'极光推送令牌')
     m_code = models.CharField(default='', max_length=64, verbose_name='手机唯一标识')
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     updTime = models.IntegerField(verbose_name='更新时间', default=0)
@@ -2497,8 +2495,8 @@ class AiService(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
     uid = models.CharField(max_length=20, verbose_name='设备UID', db_index=True)
     channel = models.SmallIntegerField(default=0, verbose_name='通道')
-    # orders = models.ForeignKey(Order_Model, to_field='orderID', default='', on_delete=models.CASCADE,
-    #                           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:开启
     endTime = models.BigIntegerField(verbose_name='套餐结束时间', db_index=True, default=0)
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
@@ -2762,7 +2760,7 @@ class GatewaySubDevice(models.Model):
     nickname = models.CharField(default='', max_length=32, verbose_name=u'设备名称')
     ieee_addr = models.CharField(default='', max_length=64, verbose_name=u'长地址')
     src_addr = models.CharField(default='', max_length=16, verbose_name=u'短地址')
-    status = models.SmallIntegerField(default=1, verbose_name='在线状态')  # 1:在线, 0:离线
+    status = models.SmallIntegerField(default=0, verbose_name='状态')  # 0:关闭, 1:开启
     # 0:正常, 1:被拆动, 智能按钮紧急开关状态: 0:关闭, 1:开启
     is_tampered = models.SmallIntegerField(default=0, verbose_name='拆动状态')
     mac = models.CharField(default='', max_length=32, verbose_name=u'mac地址')
@@ -2942,9 +2940,9 @@ class UnicomDeviceInfo(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记Id')
     iccid = models.CharField(db_index=True, unique=True, max_length=32, verbose_name=u'完整的20位纯数字ICCID')
     status = models.SmallIntegerField(default=0, verbose_name=u'状态{0:可测试,1:测试完成,2:已使用}')
-    serial_no = models.CharField(default='', max_length=32, verbose_name=u'设备序列号')
+    serial_no = models.CharField(default='', db_index=True, max_length=32, verbose_name=u'设备序列号')
     user_id = models.CharField(blank=True, max_length=32, verbose_name=u'用户id')
-    card_type = models.SmallIntegerField(default=0, verbose_name=u'状态{0:联通,1:电信,2:移动}')
+    card_type = models.SmallIntegerField(default=0, verbose_name=u'状态{0:联通,1:电信,2:移动,4:其它,5:国际}')
     main_card = models.SmallIntegerField(default=0, verbose_name=u'SIM卡类型{0:拔插卡,1:贴片卡}')
     sim_used_flow = models.DecimalField(default=0, max_digits=10, decimal_places=2, verbose_name=u'sim卡已用总流量(MB)')
     sim_cycle_used_flow = models.DecimalField(default=0, max_digits=10, decimal_places=2,
@@ -3537,58 +3535,6 @@ class SocketSchedule(models.Model):
         verbose_name_plural = verbose_name
 
 
-class SwitchInfo(models.Model):
-    id = models.AutoField(primary_key=True, verbose_name='自增id')
-    device_id = models.CharField(max_length=32, default='', verbose_name='设备id')
-    model = models.CharField(max_length=32, default='', verbose_name='型号')
-    hardware_version = models.CharField(max_length=32, default='', verbose_name='硬件版本')
-    firmware_version = models.CharField(max_length=32, default='', verbose_name='固件版本')
-    mac = models.CharField(max_length=32, default='', verbose_name='mac地址')
-
-    class Meta:
-        db_table = 'switch_info'
-        verbose_name = '智能开关信息'
-        verbose_name_plural = verbose_name
-
-
-class SwitchDimmingSettings(models.Model):
-    id = models.AutoField(primary_key=True, verbose_name='自增id')
-    device_id = models.CharField(max_length=32, default='', verbose_name='设备id')
-    click_turn_on_speed = models.SmallIntegerField(default=0, verbose_name='单击开启速度')
-    click_turn_off_speed = models.SmallIntegerField(default=0, verbose_name='单击关闭速度')
-    double_click = models.CharField(max_length=8, default='', verbose_name='双击')  # 0: 无, 1: 缓慢开/关, x%: 预设亮度
-    press = models.CharField(max_length=8, default='', verbose_name='长按')  # 0: 无, 1: 缓慢开/关, x%: 预设亮度
-    double_press_click_turn_on_speed = models.SmallIntegerField(default=0, verbose_name='双击/长按开启速度')
-    double_press_click_turn_off_speed = models.SmallIntegerField(default=0, verbose_name='双击/长按单击关闭速度')
-    led = models.BooleanField(default=False, verbose_name='LED指示灯')  # True: 开, False: 关
-    dimming_correction = models.CharField(max_length=8, default='', verbose_name='调光校正')
-
-    class Meta:
-        db_table = 'switch_dimming_settings'
-        verbose_name = '智能开关调光设置'
-        verbose_name_plural = verbose_name
-
-
-class SwitchChronopher(models.Model):
-    id = models.AutoField(primary_key=True, verbose_name='自增id')
-    device_id = models.CharField(max_length=32, default='', verbose_name='设备id')
-    time_type_radio = models.SmallIntegerField(default=0, verbose_name='切换时间点/时间段')  # 1: 按时间点, 2: 按时间段
-    time_point = models.IntegerField(default=0, verbose_name='时间点')
-    time_quantum_start_time = models.IntegerField(default=0, verbose_name='时间段开始时间')
-    time_quantum_end_time = models.IntegerField(default=0, verbose_name='时间段结束时间')
-    time_point_device_will_doing = models.CharField(max_length=8, default='',
-                                                    verbose_name='设备将会')  # 0: 开启, 1: 关闭, x%: 预设亮度
-    time_quantum_device_will_doing = models.SmallIntegerField(default=0,
-                                                              verbose_name='设备将会')  # 0: 开启, 1: 关闭, x: 开启/关闭切换间隔
-    slow_open_or_close_speed = models.SmallIntegerField(default=0, verbose_name='缓慢开/关速度')
-    repeat = models.SmallIntegerField(default=0, verbose_name=u'重复周期')
-
-    class Meta:
-        db_table = 'switch_chronopher'
-        verbose_name = '定时计划'
-        verbose_name_plural = verbose_name
-
-
 class ExchangeCode(models.Model):
     id = models.AutoField(primary_key=True)
     code = models.CharField(max_length=32, unique=True, verbose_name='兑换码')
@@ -3608,141 +3554,6 @@ class ExchangeCode(models.Model):
         verbose_name_plural = verbose_name
 
 
-class ICloudStoreMeal(models.Model):
-    id = models.AutoField(primary_key=True, verbose_name=u'自增ID')
-    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'价格')
-    expire = models.IntegerField(default=0, blank=True, verbose_name=u'有效期')  # 单位月
-    add_time = models.DateTimeField(blank=True, null=True, verbose_name=u'加入时间', auto_now_add=True)
-    pay_type = models.ManyToManyField(to='Pay_Type', verbose_name='付款类型', db_table='icloud_store_meal_pay')
-    update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True)
-    is_show = models.SmallIntegerField(default=0, verbose_name=u'是否隐藏 [0=隐藏,1展示]')
-    is_delete = models.SmallIntegerField(default=0, verbose_name=u'是否删除 [0=否,1=是]')
-    lang = models.ManyToManyField(to='Lang', verbose_name='套餐语言', db_table='icloud_store_meal_lang')
-    size = models.IntegerField(null=True, default=0, verbose_name='云盘容量大小')  # 单位GB
-    bucket_id = models.SmallIntegerField(default=0, verbose_name='关联存储桶id')
-    sort = models.IntegerField(default=99, blank=True, verbose_name=u'排序,越小越靠前')
-
-    def __str__(self):
-        return self.id
-
-    class Meta:
-        db_table = 'icloud_store_meal'
-        verbose_name = u'云盘套餐'
-        verbose_name_plural = verbose_name
-        ordering = ('id',)
-
-
-class IcloudUseDetails(models.Model):
-    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
-    use_size = models.DecimalField(default=0, max_digits=10, decimal_places=2, verbose_name='已使用容量大小')  # 单位MB
-    add_time = models.IntegerField(verbose_name='添加时间', default=0)
-    upd_time = models.BigIntegerField(verbose_name='更新时间', default=0)
-    detect_status = models.SmallIntegerField(default=0, verbose_name='开关状态')  # 0:关闭, 1:开启
-    user_id = models.CharField(blank=True, max_length=32, verbose_name=u'用户id')
-    bucket_id = models.SmallIntegerField(default=0, verbose_name='关联存储桶id')
-
-    class Meta:
-        db_table = 'icloud_use_details'
-        verbose_name = '云盘使用表'
-        verbose_name_plural = verbose_name
-        ordering = ('id',)
-
-
-class IcloudService(models.Model):
-    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
-    size = models.IntegerField(default=0, verbose_name='容量大小')  # 单位GB
-    end_time = models.IntegerField(verbose_name='套餐结束时间', db_index=True, default=0)
-    add_time = models.IntegerField(verbose_name='添加时间', default=0)
-    upd_time = models.IntegerField(verbose_name='更新时间', default=0)
-    use_status = models.IntegerField(verbose_name='使用状态', default=0)  # 0:使用中, 1:已过期
-    use_details_id = models.IntegerField(default=0, verbose_name='关联云盘使用表id')
-    type = models.SmallIntegerField(default=0, verbose_name='云盘购买类型')  # 0:注册永久送,1:购买云存附送,2:单独购买套餐
-    order_id = models.CharField(default='', max_length=20, verbose_name='关联订单id')
-
-    class Meta:
-        db_table = 'icloud_service'
-        verbose_name = '云盘服务表'
-        verbose_name_plural = verbose_name
-        ordering = ('id',)
-
-
-class IcloudStorageRecord(models.Model):
-    id = models.AutoField(primary_key=True, verbose_name='回放列表主键')
-    user_id = models.CharField(blank=True, max_length=32, verbose_name=u'用户id')
-    uid = models.CharField(max_length=20, verbose_name='设备UID', db_index=True)
-    nickname = models.CharField(max_length=20, verbose_name='设备昵称', db_index=True)
-    channel = models.SmallIntegerField(default=0, verbose_name='通道')
-    time_stamp = models.BigIntegerField(verbose_name='视频/图片名字时间戳', default=0, db_index=True)  # 单位毫秒
-    sec = models.IntegerField(verbose_name='秒数', default=0)
-    bucket_id = models.IntegerField(verbose_name='关联存储桶id', default=0)
-    fg = models.CharField(max_length=20, verbose_name='ts个数,时间描述片段数',
-                          default='')  # 阿里为时间片段数,亚马逊为一个32bit整型,前28bit代表ts文件的时长
-    size = models.DecimalField(default=0, max_digits=4, decimal_places=2, verbose_name='视频/图片大小')  # 单位MB
-    file_type = models.SmallIntegerField(default=0, verbose_name='文件类型')  # 0:图片, 1:ts视频, 2:MP4视频
-
-    def __str__(self):
-        return self.id
-
-    class Meta:
-        db_table = 'icloud_storage_record'
-        verbose_name = u'云盘信息记录表'
-        verbose_name_plural = verbose_name
-        ordering = ('-id',)
-
-
-class VseesDeviceType(models.Model):
-    id = models.AutoField(primary_key=True, verbose_name='列表主键')
-    name = models.CharField(max_length=50, default='', verbose_name='设备类型名称')
-    icon_url = models.CharField(max_length=200, default='', verbose_name='图标地址')
-
-    def __str__(self):
-        return self.id
-
-    class Meta:
-        db_table = 'vsees_device_type'
-        verbose_name = u'微瞳设备类型表'
-        verbose_name_plural = verbose_name
-        ordering = ('-id',)
-
-
-class vseesProductInfo(models.Model):
-    id = models.AutoField(primary_key=True, verbose_name='列表主键')
-    file_name = models.CharField(max_length=120, default='', verbose_name='文件名')
-    vsees = models.ForeignKey(VseesDeviceType, to_field='id', on_delete=models.CASCADE, verbose_name='关联微瞳设备类型表')
-    title = models.CharField(max_length=32, default='', verbose_name='标题')
-    type = models.SmallIntegerField(default=0, verbose_name='类型{0:视频链接, 1:说明书, 2:固件}')
-    url = models.CharField(max_length=200, default='', verbose_name='路径')
-    add_time = models.IntegerField(verbose_name='添加时间', default=0)
-    upd_time = models.IntegerField(verbose_name='更新时间', default=0)
-    status = models.SmallIntegerField(default=0, verbose_name='状态0:已上架, 1: 已下架')
-    is_del = models.BooleanField(blank=True, default=False, verbose_name=u'是否删除')
-
-    def __str__(self):
-        return self.id
-
-    class Meta:
-        db_table = 'vsees_product_info'
-        verbose_name = u'微瞳产品信息记录表'
-        verbose_name_plural = verbose_name
-        ordering = ('-id',)
-
-
-class EnterpriseUserInfo(models.Model):
-    userID = models.IntegerField(primary_key=True, verbose_name=u'企业用户ID', unique=True)
-    name = models.CharField(blank=True, max_length=32, verbose_name=u'名字')
-    position = models.CharField(blank=True, max_length=64, verbose_name=u'岗位')
-    status = models.SmallIntegerField(default=0, verbose_name='用户状态')  # 1:已激活,2:已禁用,4:未激活,5:退出企业
-    add_time = models.IntegerField(default=0, verbose_name='创建时间')
-    upd_time = models.IntegerField(default=0, verbose_name='修改时间')
-
-    class Meta:
-        db_table = 'enterprise_user_info'
-        verbose_name = '企业用户信息'
-        verbose_name_plural = verbose_name
-
-
 class IotCardUsageHistory(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='列表主键')
     iccid = models.CharField(default='', max_length=32, verbose_name=u'ICCID号')
@@ -3759,4 +3570,4 @@ class IotCardUsageHistory(models.Model):
     class Meta:
         db_table = 'iot_card_usage_history'
         verbose_name = '物联网卡用量历史'
-        verbose_name_plural = verbose_name
+        verbose_name_plural = verbose_name

+ 0 - 94
Object/AWS/AmazonS3Util.py

@@ -149,97 +149,3 @@ class AmazonS3Util:
             'Key': file_key
         }
         self.session_conn.meta.client.copy(source_dict, to_bucket, file_key)
-
-    def copy_single_obj(self, source_bucket, source_object, target_bucket, target_object, StorageClass=None):
-        """
-        单个对象复制
-        @param source_bucket:源存储桶
-        @param source_object:源对象
-        @param target_bucket:目标存储桶
-        @param target_object:目标对象
-        @param StorageClass:存储类
-        @return: None
-        """
-        s3 = self.session_conn
-        copy_source = {
-            'Bucket': source_bucket,
-            'Key': source_object
-        }
-        target_object = s3.Object(target_bucket, target_object)
-        if StorageClass:
-            target_object.copy_from(CopySource=copy_source, StorageClass=StorageClass)
-        else:
-            target_object.copy_from(CopySource=copy_source)
-
-    def generate_put_obj_url(self, bucket_name, obj_key, storage_class=None):
-        """
-        生成预签名对象URL
-        @param bucket_name: 存储桶名称
-        @param obj_key: 对象key
-        @param storage_class: 存储类 例
-        @return: 对象URL
-        """
-        params = {
-            'Bucket': bucket_name,
-            'Key': obj_key,
-        }
-        if storage_class:
-            params['StorageClass'] = storage_class
-        return self.session_conn.meta.client.generate_presigned_url('put_object',
-                                                                    Params=params,
-                                                                    ExpiresIn=7200)
-
-    def batch_copy_obj(self, source_bucket, target_bucket, prefix, target_prefix, storage_class=None):
-        """
-        批量拷贝对象
-        @param source_bucket: 源存储桶
-        @param target_bucket: 目标存储桶
-        @param prefix: 需要搜索的对象前缀 例:AUS000247LTCLY/vod1/1686043996
-        @param target_prefix: 目标对象前缀 例:app/algorithm-shop/1686043996
-        @param storage_class: 存储类
-        @return: None
-        """
-        s3 = self.session_conn
-        # 遍历源存储桶中指定前缀下的所有对象,依次进行复制操作
-        for obj in s3.Bucket(source_bucket).objects.filter(Prefix=prefix):
-            key = obj.key  # 对象键名
-            target_key = f'{target_prefix}/' + key.split('/')[-1]  # 新的对象键名,此处为 "new_path/" + 原有文件名
-            copy_source = {
-                'Bucket': source_bucket,
-                'Key': key
-            }
-            # 将对象复制到目标存储桶,并设置存储类型和新的对象键名
-            if storage_class:
-                s3.Object(target_bucket, target_key).copy_from(CopySource=copy_source, StorageClass=storage_class)
-            else:
-                s3.Object(target_bucket, target_key).copy_from(CopySource=copy_source)
-
-    def get_object_size(self,bucket_name, object_key):
-        """
-        获取存储桶中指定对象的大小
-
-        :param bucket_name: string,存储桶名称
-        :param object_key: string,对象键名
-        :return: int,指定对象的大小,单位为字节
-        """
-        s3 = self.session_conn
-        obj = s3.Object(bucket_name, object_key)
-        try:
-            return obj.content_length
-        except Exception as e:
-            return 0
-
-    def get_object_list(self, bucket_name, prefix):
-        """
-        获取指定路径所有对象
-
-        :param bucket_name: string,存储桶名称
-        :param prefix: string,路径
-        :return: int,指定对象的大小,单位为字节
-        """
-        try:
-            s3 = self.client_conn
-            obj = s3.list_objects_v2(Bucket=bucket_name, Prefix=prefix)
-            return obj['Contents']
-        except Exception as e:
-            return []

+ 17 - 13
Object/UnicomObject.py

@@ -359,16 +359,20 @@ class UnicomObjeect:
         @param icc_id:20位数字iccid
         @return: traffic
         """
-        redis = RedisObject()
-        traffic_key = 'ASJ:UNICOM:FLOW:{}'.format(icc_id)
-        traffic_sys = 'ASJ:SIM:TRAFFIC:{}'.format(icc_id)
-        traffic_val = redis.get_data(traffic_key)
-        if traffic_val:
-            traffic_dict = json.loads(traffic_val)
-            redis.set_data(key=traffic_sys, val=traffic_val, expire=60 * 60 * 24)
-        else:
-            traffic_val = redis.get_data(traffic_sys)
-            if not traffic_val:
-                return 0
-            traffic_dict = json.loads(traffic_val)
-        return traffic_dict['data']['flowTotalUsage']
+        try:
+            redis = RedisObject()
+            traffic_key = 'ASJ:UNICOM:FLOW:{}'.format(icc_id)
+            traffic_sys = 'ASJ:SIM:TRAFFIC:{}'.format(icc_id)
+            traffic_val = redis.get_data(traffic_key)
+            if traffic_val:
+                traffic_dict = json.loads(traffic_val)
+                redis.set_data(key=traffic_sys, val=traffic_val, expire=60 * 60 * 24)
+            else:
+                traffic_val = redis.get_data(traffic_sys)
+                if not traffic_val:
+                    return 0
+                traffic_dict = json.loads(traffic_val)
+            return traffic_dict['data']['flowTotalUsage']
+        except Exception as e:
+            meg = '异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e))
+            return meg

+ 9 - 0
Object/WXTechObject.py

@@ -109,6 +109,15 @@ class WXTechObject:
         assert response.status_code == 200
         return UnicomObjeect().get_text_dict(response)
 
+    def get_package_order_record(self, **params):
+        """
+        根据卡号,获取该卡片的套餐订购记录
+        @param params: iccid、operator
+        @return: 卡篇套餐订购记录
+        """
+        url = WX_TECH_URL + '/api/v2/package/packageOrderRecord'
+        return self.wx_service_api(url, **params)
+
 
 if __name__ == '__main__':
     pass

+ 4 - 26
Service/CommonService.py

@@ -17,7 +17,7 @@ from pyipip import IPIPDatabase
 from Ansjer.config import BASE_DIR, SERVER_DOMAIN_SSL, CONFIG_INFO, CONFIG_TEST, CONFIG_CN, SERVER_DOMAIN_TEST, \
     SERVER_DOMAIN_CN, SERVER_DOMAIN_US, CONFIG_US, CONFIG_EUR, SERVER_DOMAIN_LIST, SERVER_DOMAIN_EUR
 from Controller.CheckUserData import RandomStr
-from Model.models import iotdeviceInfoModel, Device_Info, UIDModel, AppDeviceType
+from Model.models import iotdeviceInfoModel, Device_Info, UIDModel
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 
@@ -549,7 +549,7 @@ GCqvlyw5dfxNA+EtxNE2wCW/LW7ENJlACgcfgPlBZtpLheWoZB/maw4=
         """
         根据uid查询返回完整序列号
         @param uid: uid
-        @param serial_number: 9位序列号
+        @param serial_number: 序列号
         @param device_type: 设备类型
         @return: full_serial_number
         """
@@ -683,8 +683,8 @@ GCqvlyw5dfxNA+EtxNE2wCW/LW7ENJlACgcfgPlBZtpLheWoZB/maw4=
 
         if CONFIG_INFO == CONFIG_TEST:
             domain_name_list = [SERVER_DOMAIN_TEST[:-1]]
-        elif CONFIG_INFO == CONFIG_CN or CONFIG_INFO == CONFIG_US:
-            domain_name_list = [SERVER_DOMAIN_US[:-1], SERVER_DOMAIN_CN[:-1]]
+        elif CONFIG_INFO == CONFIG_CN or CONFIG_INFO == CONFIG_US or CONFIG_INFO == CONFIG_EUR:
+            domain_name_list = [SERVER_DOMAIN_US[:-1], SERVER_DOMAIN_CN[:-1], SERVER_DOMAIN_EUR[:-1]]
         else:
             domain_name_list = []
         return domain_name_list
@@ -727,28 +727,6 @@ GCqvlyw5dfxNA+EtxNE2wCW/LW7ENJlACgcfgPlBZtpLheWoZB/maw4=
             return content
         elif order_type == 2:
             pass
-        elif order_type == 4:
-            content = content + '(' + '云盘' + ')'
-            return content
-
-
-    @staticmethod
-    def is_cloud_device(ucode, device_type):
-        """
-        设备是否支持云存
-        @param ucode: 设备版本
-        @param device_type: 设备类型
-        """
-        if len(ucode) > 4:
-            number = ucode[-4]
-        else:
-            return False
-        device_type_qs = AppDeviceType.objects.filter(type=device_type).values('model')
-        model = device_type_qs[0]['model'] if device_type_qs.exists() else ''
-        #  判断设备是否为ipc设备和是否支持云存
-        if model == 2 and number in ['4', '5']:
-            return True
-        return False
 
     @staticmethod
     def negative_number_judgment(number_list):

BIN
requirements.txt