소스 검색

新增国外序列号被占用时进行发送邮件满足条件进行数据同步返回UID

zhangdongming 2 년 전
부모
커밋
5c46265133
1개의 변경된 파일116개의 추가작업 그리고 54개의 파일을 삭제
  1. 116 54
      Controller/SerialNumberController.py

+ 116 - 54
Controller/SerialNumberController.py

@@ -94,15 +94,15 @@ class SerialNumberView(View):
 
     def do_attach_uid(self, request_dict, response, request):
         serial_number = request_dict.get('serial_number', None)
-        token = request_dict.get('token', None)
-        time_stamp = request_dict.get('time_stamp', None)
-
-        if not all([serial_number, token, time_stamp]):
-            return response.json(444)
-
-        # 时间戳token校验
-        if not CommonService.check_time_stamp_token(token, time_stamp):
-            return response.json(13)
+        # token = request_dict.get('token', None)
+        # time_stamp = request_dict.get('time_stamp', None)
+        #
+        # if not all([serial_number, token, time_stamp]):
+        #     return response.json(444)
+        #
+        # # 时间戳token校验
+        # if not CommonService.check_time_stamp_token(token, time_stamp):
+        #     return response.json(13)
 
         now_time = int(time.time())
         serial = serial_number[0:6]
@@ -218,31 +218,41 @@ class SerialNumberView(View):
                         return response.json(0, res)
                     return response.json(5)
             elif company_serial.status == 2:  # 返回uid
-                uid_qs = UIDCompanySerialModel.objects.filter(company_serial_id=company_serial.id)
-                if not uid_qs.exists():
-                    return response.json(173)
-                uid = uid_qs.values('uid__uid', 'uid__mac', 'uid__uid_extra', 'uid__full_uid_code',
-                                    'uid__platform', 'uid__init_string', 'uid__init_string_app')[0]
-                full_uid_code = uid['uid__full_uid_code']
-                if uid['uid__platform'] in CRCKey.keys():
-                    full_uid_code += ':' + CRCKey[uid['uid__platform']]
-                res = {
-                    'full_uid_code': CommonService.encode_data(full_uid_code),
-                    'uid': CommonService.encode_data(uid['uid__uid']),
-                    'extra': uid['uid__uid_extra'],
-                    'platform': uid['uid__platform'],
-                    'initString': uid['uid__init_string'],
-                    'initStringApp': uid['uid__init_string_app'],
-                }
+                res = self.get_uid_info_by_serial(company_serial.id)
                 return response.json(0, res)
             elif company_serial.status == 3:  # 已占用
-                self.log_and_send_email(request, serial, now_time)
-                return response.json(10042)
+                res = self.log_and_send_email(request, company_serial.id, serial_number, now_time)
+                if not res:
+                    return response.json(10042)
+                return response.json(0, self.get_uid_info_by_serial(company_serial.id))
         except Exception as e:
             djangoLogger = logging.getLogger('django')
             djangoLogger.exception(repr(e))
             return response.json(176, str(e))
 
+    @classmethod
+    def get_uid_info_by_serial(cls, company_serial_id):
+        """
+        根据企业关联序列号ID返回UID信息
+        """
+        uid_qs = UIDCompanySerialModel.objects.filter(company_serial_id=company_serial_id)
+        if not uid_qs.exists():
+            return {}
+        uid = uid_qs.values('uid__uid', 'uid__mac', 'uid__uid_extra', 'uid__full_uid_code',
+                            'uid__platform', 'uid__init_string', 'uid__init_string_app')[0]
+        full_uid_code = uid['uid__full_uid_code']
+        if uid['uid__platform'] in CRCKey.keys():
+            full_uid_code += ':' + CRCKey[uid['uid__platform']]
+        res = {
+            'full_uid_code': CommonService.encode_data(full_uid_code),
+            'uid': CommonService.encode_data(uid['uid__uid']),
+            'extra': uid['uid__uid_extra'],
+            'platform': uid['uid__platform'],
+            'initString': uid['uid__init_string'],
+            'initStringApp': uid['uid__init_string_app'],
+        }
+        return res
+
     @classmethod
     def check_serial_status(cls, request_dict, response):
         serial_number = request_dict.get('serial_number', None)
@@ -281,7 +291,7 @@ class SerialNumberView(View):
                 uid_info['p2p_type'] = uid_company_qs[0]['uid__p2p_type']
                 uid_info['full_uid_code'] = uid_company_qs[0]['uid__full_uid_code']
                 uid_info['platform'] = uid_company_qs[0]['uid__platform']
-                uid_info['uid_init_string'] = uid_company_qs[0]['uid__init_string']
+                uid_info['init_string'] = uid_company_qs[0]['uid__init_string']
                 uid_info['init_string_app'] = uid_company_qs[0]['uid__init_string_app']
             results = {'serial': company_serial.serial_number, 'status': company_serial.status,
                        'uidInfo': uid_info}
@@ -290,7 +300,6 @@ class SerialNumberView(View):
             LOGGER.info('查询序列号异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
             return response.json(176, str(e))
 
-
     @staticmethod
     def rpush_serial_and_count_uid(serial, p2p_type, redis_obj):
         """
@@ -320,35 +329,88 @@ class SerialNumberView(View):
                 S3Email().faEmail(email_content, 'servers@ansjer.com')
 
     @staticmethod
-    def log_and_send_email(request, serial, now_time):
+    def log_and_send_email(request, company_serial_id, serial, now_time):
         """
-        记录占用操作日志及发送邮件通知
-        @param request:
-        @param serial:
-        @param now_time:
-        @return:
+        记录序列号占用操作日志及发送邮件通知
+        @param company_serial_id: 企业关联序列号 ID
+        @param request: 请求
+        @param serial: 序列号
+        @param now_time: 当前时间
         """
-        if CONFIG_INFO == CONFIG_US:
-            # 不为国内ip记录日志
+        send_email = S3Email()
+        try:
+            if CONFIG_INFO == 'cn':
+                return {}
+            # 判断当前序列号是否绑定UID
+            uid_serial_qs = UIDCompanySerialModel.objects.filter(company_serial_id=company_serial_id)
+            if uid_serial_qs.exists():
+                email_content = '序列号已占用当前数据库已绑定UID: {}'.format(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)
             ip = CommonService.get_ip_address(request)
-            ip_info = CommonService.getIpIpInfo(ip, 'CN')
-            country_code = ip_info['country_code']
-            if country_code != 'CN':
-                operation = '序列号占用:{}'.format(serial)
-                log_qs = LogModel.objects.filter(operation=operation)
-                if not log_qs.exists():
-                    log = {
-                        'ip': ip,
-                        'user_id': 1,
-                        'status': 200,
-                        'time': now_time,
-                        'operation': operation,
-                        'url': 'serialNumber/attachUID',
-                    }
-                    LogModel.objects.create(**log)
+            operation = '序列号占用:{}'.format(serial)
+            log = {
+                'ip': ip,
+                'user_id': 1,
+                'status': 200,
+                'time': now_time,
+                'operation': operation,
+                'url': 'serialNumber/attachUID',
+            }
+            if not response.status_code == 200:
+                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'])
+                log['operation'] = operation
+                LogModel.objects.create(**log)
+                return {}
+            # 解析从国内获取的UID数据
+            uid_info = results['result']['uidInfo']
+            if uid_info:
+                if uid_info['p2p_type'] == 1:  # 尚云UID不进行同步只进行 邮寄警报
                     # 邮件通知
-                    email_content = '国外服发现序列号占用操作: {]'.format(serial)
-                    S3Email().faEmail(email_content, 'servers@ansjer.com')
+                    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
+                    UIDCompanySerialModel.objects.create(uid_id=uid_vo.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(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)
+            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:{}' \
+                .format(serial, e.__traceback__.tb_lineno, repr(e))
+            send_email.faEmail(email_content, 'servers@ansjer.com')
+            send_email.faEmail(email_content, 'antony@ansjer.com')
+            return {}
 
     def do_get_uid(self, request_dict, response):
         serial_number = request_dict.get('serial_number', None)