Ver código fonte

后台同步设备数据时同步uid_set数据,优化添加删除设备操作日志;传感器返回iee_addr,open weather调用次数邮件提醒

locky 1 ano atrás
pai
commit
ca6999100d

+ 45 - 1
AdminController/SerialManageController.py

@@ -17,7 +17,7 @@ from django.views.decorators.csrf import csrf_exempt
 from django.views.generic.base import View
 
 from Model.models import CompanyModel, VPGModel, UIDModel, UIDCompanySerialModel, CompanySerialModel, \
-    LogModel, iotdeviceInfoModel
+    LogModel, iotdeviceInfoModel, UidSetModel
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
@@ -289,6 +289,30 @@ class SerialView(View):
                         iot_data['serial_number'] = serial
                         iotdeviceInfoModel.objects.create(**iot_data)
 
+                # 同步uid_set数据
+                if res_data.get('ucode') is not None:
+                    uid_set_qs = UidSetModel.objects.filter(uid=uid)
+                    uid_set_data = {
+                        'ucode': res_data['ucode'],
+                        'version': res_data['version'],
+                        'tz': res_data['tz'],
+                        'ip': res_data['ip'],
+                        'is_human': res_data['is_human'],
+                        'is_custom_voice': res_data['is_custom_voice'],
+                        'double_wifi': res_data['double_wifi'],
+                        'isSupportFourPoint': res_data['isSupportFourPoint'],
+                        'mobile_4g': res_data['mobile_4g'],
+                        'is_ptz': res_data['is_ptz'],
+                        'is_ai': res_data['is_ai'],
+                        'cloud_vod': res_data['cloud_vod'],
+                        'is_alexa': res_data['is_alexa'],
+                        'ai_type': res_data['ai_type']
+                    }
+                    if uid_set_qs.exists():
+                        iot_device_info_qs.update(**uid_set_data)
+                    else:
+                        UidSetModel.objects.create(**uid_set_data)
+
                 # 记录操作日志
                 ip = CommonService.get_ip_address(request)
                 content = json.loads(json.dumps(request_dict))
@@ -353,6 +377,26 @@ class SerialView(View):
                 res_data['endpoint'] = iot_device_info_qs[0]['endpoint']
                 res_data['token_iot_number'] = iot_device_info_qs[0]['token_iot_number']
 
+            # 查询uid_set数据
+            uid_set_qs = UidSetModel.objects.filter(uid=uid).values(
+                'ucode', 'version', 'tz', 'ip', 'is_human', 'is_custom_voice', 'double_wifi', 'isSupportFourPoint',
+                'mobile_4g', 'is_ptz', 'is_ai', 'cloud_vod', 'is_alexa', 'ai_type')
+            if uid_set_qs.exists():
+                res_data['ucode'] = uid_set_qs[0]['ucode']
+                res_data['version'] = uid_set_qs[0]['version']
+                res_data['tz'] = uid_set_qs[0]['tz']
+                res_data['ip'] = uid_set_qs[0]['ip']
+                res_data['is_human'] = uid_set_qs[0]['is_human']
+                res_data['is_custom_voice'] = uid_set_qs[0]['is_custom_voice']
+                res_data['double_wifi'] = uid_set_qs[0]['double_wifi']
+                res_data['isSupportFourPoint'] = uid_set_qs[0]['isSupportFourPoint']
+                res_data['mobile_4g'] = uid_set_qs[0]['mobile_4g']
+                res_data['is_ptz'] = uid_set_qs[0]['is_ptz']
+                res_data['is_ai'] = uid_set_qs[0]['is_ai']
+                res_data['cloud_vod'] = uid_set_qs[0]['cloud_vod']
+                res_data['is_alexa'] = uid_set_qs[0]['is_alexa']
+                res_data['ai_type'] = uid_set_qs[0]['ai_type']
+
             # 修改序列号状态为占用,uid状态为3(数据被同步)
             CompanySerialModel.objects.filter(serial_number=serial).update(status=3)
             UIDModel.objects.filter(uid=uid).update(status=3)

+ 17 - 7
Controller/EquipmentManager.py

@@ -804,6 +804,7 @@ def deleteInterface(request):
     if not userID:
         return response.json(309)
 
+    username = CommonService.get_username(userID)
     try:
         with transaction.atomic():
             dv_qs = Device_Info.objects.filter(userID_id=userID, id=id).values('UID', 'serial_number', 'isShare',
@@ -853,7 +854,7 @@ def deleteInterface(request):
                 'time': now_time,
                 'content': json.dumps(content),
                 'url': 'equipment/delete',
-                'operation': '{}删除设备,uid:{}'.format(userID, uid),
+                'operation': '{}删除设备,uid:{}'.format(username, uid),
             }
             LogModel.objects.create(**log)
 
@@ -868,7 +869,7 @@ def deleteInterface(request):
             'time': now_time,
             'content': 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)),
             'url': 'equipment/delete',
-            'operation': '{}删除设备失败,uid:{}'.format(userID, uid),
+            'operation': '{}删除设备失败,uid:{}'.format(username, uid),
         }
         LogModel.objects.create(**log)
         return response.json(176, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
@@ -913,10 +914,9 @@ def batchDeleteInterface(request):
     if tko.code != 0:
         return response.json(tko.code)
     userID = tko.userID
-    # userID = request_dict.get('userID', None)   # 调试
-    # 主用户删除设备全部删除
     if not userID:
         return response.json(309)
+    username = CommonService.get_username(userID)
     try:
         deviceInfo_qs = Device_Info.objects.filter(userID_id=userID, id__in=ids.split(','))
         if not deviceInfo_qs.exists():
@@ -959,12 +959,22 @@ def batchDeleteInterface(request):
             'time': now_time,
             'content': json.dumps(content),
             'url': 'equipment/batchDelete',
-            'operation': '{}批量删除设备,uid:{}'.format(userID, uid_list),
+            'operation': '{}批量删除设备,uid:{}'.format(username, uid_list),
         }
         LogModel.objects.create(**log)
     except Exception as e:
-        errorInfo = traceback.format_exc()
-        print('删除数据库记录错误: %s' % errorInfo)
+        now_time = int(time.time())
+        ip = CommonService.get_ip_address(request)
+        log = {
+            'ip': ip,
+            'user_id': 1,
+            'status': 200,
+            'time': now_time,
+            'content': 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)),
+            'url': 'equipment/batchDelete',
+            'operation': '{}批量删除设备失败'.format(username),
+        }
+        LogModel.objects.create(**log)
         return response.json(176, repr(e))
     else:
         return response.json(0)

+ 3 - 2
Controller/EquipmentManagerV3.py

@@ -216,6 +216,7 @@ class EquipmentManagerV3(View):
             return response.json(0, res)
 
         # 日志数据
+        username = CommonService.get_username(userID)
         nowTime = int(time.time())
         ip = CommonService.get_ip_address(request)
         content = json.loads(json.dumps(request_dict))
@@ -226,7 +227,7 @@ class EquipmentManagerV3(View):
             'time': nowTime,
             'content': json.dumps(content),
             'url': 'v3/equipment/add',
-            'operation': '{}添加{}成功'.format(userID, UID)
+            'operation': '{}添加{}成功'.format(username, UID)
         }
 
         try:
@@ -347,7 +348,7 @@ class EquipmentManagerV3(View):
         except Exception as e:
             # 记录添加失败日志
             error_msg = 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e))
-            operation = '{}添加{}失败:{}'.format(userID, UID, error_msg)
+            operation = '{}添加{}失败:{}'.format(username, UID, error_msg)
             log['operation'] = operation
             LogModel.objects.create(**log)
             return response.json(10, error_msg)

+ 2 - 1
Controller/SensorGateway/SubDeviceController.py

@@ -158,7 +158,7 @@ class GatewaySubDeviceView(View):
         try:
             gateway_sub_device_qs = GatewaySubDevice.objects.filter(id=sub_device_id).\
                 values('manufacturer', 'device_model', 'mac', 'sensor_serial', 'device_type', 'is_tampered',
-                       'firmware_version', 'hardware_version')
+                       'firmware_version', 'hardware_version', 'ieee_addr')
             if not gateway_sub_device_qs.exists():
                 return response.json(173)
             res = {
@@ -168,6 +168,7 @@ class GatewaySubDeviceView(View):
                 'sensor_serial': gateway_sub_device_qs[0]['sensor_serial'],
                 'firmware_version': gateway_sub_device_qs[0]['firmware_version'],
                 'hardware_version': gateway_sub_device_qs[0]['hardware_version'],
+                'ieee_addr': gateway_sub_device_qs[0]['ieee_addr'],
             }
             if gateway_sub_device_qs[0]['device_type'] == SENSOR_TYPE['smart_button']:  # 智能按钮返回紧急开关状态
                 res['emergency_status'] = gateway_sub_device_qs[0]['is_tampered']

+ 14 - 1
Object/IPWeatherObject.py

@@ -7,9 +7,10 @@ import geoip2.webservice
 import requests
 
 from Model.models import IPAddr, OpenWeatherMapCallCount
+from Object.AWS.S3Email import S3Email
 from Object.RedisObject import RedisObject
 from Service.CommonService import CommonService
-from Ansjer.config import LOGGER
+from Ansjer.config import LOGGER, CONFIG_INFO
 
 
 class IPQuery:
@@ -211,6 +212,18 @@ class OpenWeatherMap:
         else:
             count = open_weather_map_call_count_qs[0]['count'] + 1
             open_weather_map_call_count_qs.update(count=count)
+            # 调用次数超过750,000,邮件提醒
+            warning_count = 750000
+            if count > warning_count:
+                redis_obj = RedisObject()
+                key = 'open_weather_map_call_count_warning_time_limit'
+                time_limit = redis_obj.get_data(key)
+                if not time_limit:
+                    # 限制一天提醒一次
+                    redis_obj.set_data(key, 1, 60 * 60 * 24)
+                    subject = '邮件提醒'
+                    data = '{}服open weather调用次数大于{}'.format(CONFIG_INFO, warning_count)
+                    S3Email().send_email(subject, data, 'servers@ansjer.com')
 
         if res.status_code != 200:
             return None, None

+ 19 - 1
Service/CommonService.py

@@ -21,7 +21,8 @@ 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, UIDCompanySerialModel
+from Model.models import iotdeviceInfoModel, Device_Info, UIDModel, AppDeviceType, UIDCompanySerialModel, GatewayPush, \
+    Device_User
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 
@@ -182,6 +183,23 @@ class CommonService:
                     eID = '13800' + timeID + '138000'
                     return eID
 
+    @staticmethod
+    def get_username(userID):
+        """
+        根据用户id获取用户名/邮箱/电话
+        @param userID: 用户id
+        @return:
+        """
+        if userID:
+            device_user_qs = Device_User.objects.filter(userID=userID).values('username', 'userEmail', 'phone')
+            if device_user_qs[0]['username']:
+                return device_user_qs[0]['username']
+            elif device_user_qs[0]['userEmail']:
+                return device_user_qs[0]['userEmail']
+            elif device_user_qs[0]['phone']:
+                return device_user_qs[0]['phone']
+        return ''
+
     # 生成随机数
     @staticmethod
     def RandomStr(randomlength=8, number=True):