|  | @@ -22,6 +22,8 @@ from Service.CommonService import CommonService
 | 
	
		
			
				|  |  |  from Service.EquipmentInfoService import EquipmentInfoService
 | 
	
		
			
				|  |  |  from Service.VodHlsService import SplitVodHlsObject
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +LOGGER = logging.getLogger('info')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  class SerialNumberView(View):
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -56,6 +58,8 @@ 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
 | 
	
		
			
				|  |  | +            return self.check_serial_status(request_dict, response)
 | 
	
		
			
				|  |  |          else:
 | 
	
		
			
				|  |  |              return response.json(414)
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -90,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]
 | 
	
	
		
			
				|  | @@ -214,31 +218,88 @@ 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)
 | 
	
		
			
				|  |  | +            elif company_serial.status == 3:  # 已占用
 | 
	
		
			
				|  |  | +                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)
 | 
	
		
			
				|  |  | +        if not serial_number:
 | 
	
		
			
				|  |  | +            return response.json(444)
 | 
	
		
			
				|  |  | +        serial = serial_number[0:6]
 | 
	
		
			
				|  |  | +        company_identity = serial_number[6:9]
 | 
	
		
			
				|  |  | +        # 根据企业标识确认企业秘钥
 | 
	
		
			
				|  |  | +        company_secret = ''
 | 
	
		
			
				|  |  | +        if company_identity == '11A':
 | 
	
		
			
				|  |  | +            company_secret = 'MTEyMTNB'
 | 
	
		
			
				|  |  | +        elif company_identity == '11L':
 | 
	
		
			
				|  |  | +            company_secret = 'VmXEWnBR'
 | 
	
		
			
				|  |  | +        elif company_identity == '11Z':
 | 
	
		
			
				|  |  | +            company_secret = 'ZsKWcxdD'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        try:
 | 
	
		
			
				|  |  | +            # 判断序列号是否已和企业关联
 | 
	
		
			
				|  |  | +            company_serial_qs = CompanySerialModel.objects.filter(company__secret=company_secret, serial_number=serial)
 | 
	
		
			
				|  |  | +            if not company_serial_qs.exists():
 | 
	
		
			
				|  |  | +                return response.json(173)
 | 
	
		
			
				|  |  | +            company_serial = company_serial_qs[0]
 | 
	
		
			
				|  |  | +            # 获取企业序列号是否绑定UID
 | 
	
		
			
				|  |  | +            uid_company_qs = UIDCompanySerialModel.objects.filter(company_serial_id=company_serial.id) \
 | 
	
		
			
				|  |  | +                .values('uid__uid', 'uid__mac', 'uid__uid_extra', 'uid__status', 'uid__area', 'uid__vpg_id',
 | 
	
		
			
				|  |  | +                        'uid__p2p_type', 'uid__full_uid_code', 'uid__platform',
 | 
	
		
			
				|  |  | +                        'uid__init_string', 'uid__init_string_app')
 | 
	
		
			
				|  |  | +            uid_info = {}
 | 
	
		
			
				|  |  | +            if uid_company_qs.exists():
 | 
	
		
			
				|  |  | +                uid_info['uid'] = uid_company_qs[0]['uid__uid']
 | 
	
		
			
				|  |  | +                uid_info['mac'] = uid_company_qs[0]['uid__mac']
 | 
	
		
			
				|  |  | +                uid_info['uid_extra'] = uid_company_qs[0]['uid__uid_extra']
 | 
	
		
			
				|  |  | +                uid_info['status'] = uid_company_qs[0]['uid__status']
 | 
	
		
			
				|  |  | +                uid_info['area'] = uid_company_qs[0]['uid__area']
 | 
	
		
			
				|  |  | +                uid_info['vpg_id'] = uid_company_qs[0]['uid__vpg_id']
 | 
	
		
			
				|  |  | +                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['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}
 | 
	
		
			
				|  |  | +            return response.json(0, results)
 | 
	
		
			
				|  |  | +        except Exception as e:
 | 
	
		
			
				|  |  | +            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):
 | 
	
		
			
				|  |  |          """
 | 
	
	
		
			
				|  | @@ -268,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)
 | 
	
	
		
			
				|  | @@ -510,7 +624,7 @@ class SerialNumberView(View):
 | 
	
		
			
				|  |  |                      data['ip'] = CommonService.get_ip_address(request)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  # 写入数据
 | 
	
		
			
				|  |  | -                device_domain_region_qs = DeviceDomainRegionModel.objects.filter(serial_number=serial_number).\
 | 
	
		
			
				|  |  | +                device_domain_region_qs = DeviceDomainRegionModel.objects.filter(serial_number=serial_number). \
 | 
	
		
			
				|  |  |                      values('region_id')
 | 
	
		
			
				|  |  |                  if not device_domain_region_qs.exists():
 | 
	
		
			
				|  |  |                      data['serial_number'] = serial_number
 |