Bläddra i källkod

优化序列号已占用同步数据、新增同步iotCore数据接口

zhangdongming 2 år sedan
förälder
incheckning
159048845b
1 ändrade filer med 77 tillägg och 20 borttagningar
  1. 77 20
      Controller/SerialNumberController.py

+ 77 - 20
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
@@ -59,12 +60,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 +342,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 +352,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 +360,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,18 +385,13 @@ 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 {}
@@ -402,7 +402,6 @@ class SerialNumberView(View):
                     # 邮件通知
                     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)
@@ -412,16 +411,15 @@ class SerialNumberView(View):
                     # 成功后 修改企业序列号状态为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:{}' \
@@ -827,3 +825,62 @@ 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={'serial_number': 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