| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614 | #!/usr/bin/python3.6# -*- coding: utf-8 -*-## Copyright (C) 2022 ## @Time    : 2022/3/9 9:20# @Author  : ming# @Email   : zhangdongming@asj6.wecom.work# @File    : SurveysManageController.py# @Software: PyCharmimport jsonimport timeimport requestsfrom django.db import transactionfrom django.utils.decorators import method_decoratorfrom django.views.decorators.csrf import csrf_exemptfrom django.views.generic.base import Viewfrom Model.models import CompanyModel, VPGModel, UIDModel, UIDCompanySerialModel, CompanySerialModel, \    LogModel, iotdeviceInfoModel, UidSetModelfrom Object.ResponseObject import ResponseObjectfrom Object.TokenObject import TokenObjectfrom Service.CommonService import CommonServicefrom Ansjer.config import SERVER_DOMAIN_TEST, SERVER_DOMAIN_CN, SERVER_DOMAIN_US, SERVER_DOMAIN_EURclass SerialView(View):    @method_decorator(csrf_exempt)    def dispatch(self, *args, **kwargs):        return super(SerialView, self).dispatch(*args, **kwargs)    def get(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation')        return self.validation(request.GET, request, operation)    def post(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation')        return self.validation(request.POST, request, operation)    def validation(self, request_dict, request, operation):        response = ResponseObject()        if operation == 'uploadUid':            return self.uploadUid(request, request_dict, response)        elif operation == 'getSerialData':  # 获取需要同步的序列号数据            return self.getSerialData(request_dict, response)        elif operation == 'unbindUid':  # 解绑序列号            return self.unbind_uid(request_dict, response)        else:            token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))            if token.code != 0:                return response.json(token.code)            response = ResponseObject(returntype='pc')            if operation == 'company-page':                return self.company_page(request_dict, response)            if operation == 'number/page':                return self.serial_page(request_dict, response)            if operation == 'syncSerial':   # 同步序列号数据                return self.sync_serial(request, request_dict, response)            if operation == 'vpg-info/page':                return self.vpg_page(request_dict, response)            if operation == 'uid-info/page':                return self.uid_page(request_dict, response)            return response.json(414)    @classmethod    def uploadUid(cls, request, request_dict, response):        uid_list = request_dict.get('uid_list', None)        vpg_id = request_dict.get('vpg_id', None)        p2p_type = request_dict.get('p2p_type', None)        platform = request_dict.get('platform', '')        init_string = request_dict.get('init_string', '')        init_string_app = request_dict.get('init_string_app', '')        if not all([vpg_id, p2p_type]):            return response.json(444)        p2p_type = int(p2p_type)        # 尚云必须输入平台和初始化字符        if p2p_type == 1 and (not platform or not platform or not init_string_app):            return response.json(444)        p2p = '尚云' if p2p_type == 1 else 'tutk'        add_time = update_time = int(time.time())        try:            # 根据vpg关联的region确定area            region = VPGModel.objects.filter(id=vpg_id).values('region__name')[0]['region__name']            area = 0 if region in ['中国', '测试'] else 1            uid_list = uid_list.splitlines()  # 按行('\r', '\r\n', \n')切割字符串返回列表            bulk = []            for uid in uid_list:                UID = UIDModel(                    mac='',                    uid_extra='',                    status=0,                    add_time=add_time,                    update_time=update_time,                    area=area,  # 关联vgp表已有区域信息,可以考虑去掉                    vpg_id=vpg_id,                    p2p_type=p2p_type,                    platform=platform,                    init_string=init_string,                    init_string_app=init_string_app                )                # 尚云完整uid,eg.ACN-000005-FHCGR,VRWEDU -> ACN000005FHCGR,必须包含','                if p2p == '尚云':                    if '-' in uid and ',' in uid:                        UID.full_uid_code = uid                        uid_split = uid.split('-')                        uid = uid_split[0] + uid_split[1] + uid_split[2].split(',')[0]                    else:                        return response.json(376)                # tutk uid长度为14或20                elif len(uid) != 14 and len(uid) != 20:                    return response.json(376)                UID.uid = uid                bulk.append(UID)            ip = CommonService.get_ip_address(request)            content = json.loads(json.dumps(request_dict))            log = {                'ip': ip,                'user_id': 1,                'status': 200,                'time': add_time,                'url': 'serial/uploadUid',                'content': json.dumps(content),                'operation': '上传{}个{}uid到vpg {}'.format(len(uid_list), p2p, vpg_id),            }            with transaction.atomic():                LogModel.objects.create(**log)  # 记录操作日志                UIDModel.objects.bulk_create(bulk)  # 批量写入uid数据                uid_count = UIDModel.objects.filter(vpg_id=vpg_id).count()  # 获取族群下uid的数量                VPGModel.objects.filter(id=vpg_id).update(uid_count=uid_count)  # 更新vgp表的uid_count            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)))    @classmethod    def company_page(cls, request_dict, response):        isSelect = request_dict.get('isSelect', None)        if isSelect:            # 获取企业名称作为选项            company_qs = CompanyModel.objects.all().values('id', 'name')            return response.json(0, {'list': list(company_qs)})        pageNo = request_dict.get('pageNo', None)        pageSize = request_dict.get('pageSize', None)        if not all([pageNo, pageSize]):            return response.json(444)        page = int(pageNo)        line = int(pageSize)        try:            request_qs = CompanyModel.objects.all()            if not request_qs.exists():                return response.json(0, {'list': '', 'total': 0})            total = request_qs.count()            company_page = request_qs[(page - 1) * line:page * line].values()            return response.json(0, {'list': list(company_page), 'total': total})        except Exception as e:            print(e)            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))    @classmethod    def serial_page(cls, request_dict, response):        company_name = request_dict.get('companyName', None)        serial_number = request_dict.get('serialNumber', None)        status = request_dict.get('status', None)        pageNo = request_dict.get('pageNo', None)        pageSize = request_dict.get('pageSize', None)        if not all([pageNo, pageSize]):            return response.json(444)        page = int(pageNo)        line = int(pageSize)        try:            company_serial_qs = CompanySerialModel.objects.filter()            if company_name:                company_serial_qs = company_serial_qs.filter(company__name=company_name)            if serial_number:                company_serial_qs = company_serial_qs.filter(serial_number__contains=serial_number)            if status:                status = int(status)                company_serial_qs = company_serial_qs.filter(status=status)            if not company_serial_qs.exists():                return response.json(0, {'list': '', 'total': 0})            total = company_serial_qs.count()            serial_number_page = company_serial_qs.order_by('-serial_number')[(page - 1) * line:page * line]. \                values('serial_number', 'company__name', 'status', 'add_time', 'update_time')            return response.json(0, {'list': list(serial_number_page), 'total': total})        except Exception as e:            print(e)            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))    @staticmethod    def sync_serial(request, request_dict, response):        serial = request_dict.get('serial', None)        sync_region = request_dict.get('syncRegion', None)        if not all([serial, sync_region]):            return response.json(444)        # 判断序列号是否已绑定uid        uid_company_serial_qs = UIDCompanySerialModel.objects.filter(company_serial__serial_number=serial)        if uid_company_serial_qs.exists():            return response.json(174)        if sync_region == 'test':            url = SERVER_DOMAIN_TEST        elif sync_region == 'cn':            url = SERVER_DOMAIN_CN        elif sync_region == 'us':            url = SERVER_DOMAIN_US        elif sync_region == 'eu':            url = SERVER_DOMAIN_EUR        else:            return response.json(444)        try:            # 请求需要同步的地区获取数据            url = url + 'serial/getSerialData'            data = {'serial': serial}            req = requests.post(url=url, data=data, timeout=5)            if req.status_code != 200:                return response.json(503)            req = req.json()            if req['result_code'] != 0:                return response.json(173)            res_data = req['result']['res_data']            # 查询是否存在该uid,存在修改状态为已使用,否则写入数据            uid = res_data['uid']            uid_qs = UIDModel.objects.filter(uid=uid).values('id')            with transaction.atomic():                if uid_qs.exists():                    uid_qs.update(status=2)                    uid_id = uid_qs[0]['id']                else:                    uid_data = {                        'uid': uid,                        'mac': res_data['mac'],                        'uid_extra': res_data['uid_extra'],                        'status': res_data['status'],                        'add_time': res_data['add_time'],                        'update_time': res_data['update_time'],                        'area': res_data['area'],                        'vpg_id': res_data['vpg_id'],                        'p2p_type': res_data['p2p_type'],                        'full_uid_code': res_data['full_uid_code'],                        'platform': res_data['platform'],                        'init_string': res_data['init_string'],                        'init_string_app': res_data['init_string_app']                    }                    uid_obj = UIDModel.objects.create(**uid_data)                    uid_id = uid_obj.id                # 查询tb_company_serial表id                company_serial_qs = CompanySerialModel.objects.filter(serial_number=serial).values('id')                company_serial_id = company_serial_qs[0]['id']                # 序列号绑定uid                now_time = int(time.time())                UIDCompanySerialModel.objects.create(add_time=now_time, update_time=now_time,                                                     uid_id=uid_id, company_serial_id=company_serial_id)                # 修改序列号状态为绑定uid                company_serial_qs.update(status=2)                # 同步iot数据                if res_data.get('certificate_id'):                    iot_device_info_qs = iotdeviceInfoModel.objects.filter(serial_number=serial).\                        values('certificate_id')                    iot_data = {                        'certificate_id': res_data['certificate_id'],                        'certificate_pem': res_data['certificate_pem'],                        'public_key': res_data['public_key'],                        'private_key': res_data['private_key'],                        'thing_name': res_data['thing_name'],                        'thing_groups': res_data['thing_groups'],                        'endpoint': res_data['endpoint'],                        'token_iot_number': res_data['token_iot_number']                    }                    if iot_device_info_qs.exists():                        if iot_device_info_qs[0]['certificate_id'] != res_data['certificate_id']:                            iot_device_info_qs.update(**iot_data)                    else:                        iot_data['serial_number'] = serial                        iotdeviceInfoModel.objects.create(**iot_data)                # 同步uid_set数据                if res_data.get('uid_set') is not None:                    uid_set_qs = UidSetModel.objects.filter(uid=uid)                    uid_set_data = {                        'channel': res_data['uid_set']['channel'],                        'detect_status': res_data['uid_set']['detect_status'],                        'detect_interval': res_data['uid_set']['detect_interval'],                        'addTime': res_data['uid_set']['addTime'],                        'updTime': res_data['uid_set']['updTime'],                        'ucode': res_data['uid_set']['ucode'],                        'version': res_data['uid_set']['version'],                        'p2p_region': res_data['uid_set']['p2p_region'],                        'tz': res_data['uid_set']['tz'],                        'video_code': res_data['uid_set']['video_code'],                        'nickname': res_data['uid_set']['nickname'],                        'ip': res_data['uid_set']['ip'],                        'detect_group': res_data['uid_set']['detect_group'],                        'pwd': res_data['uid_set']['pwd'],                        'resetTime': res_data['uid_set']['resetTime'],                        'region_alexa': res_data['uid_set']['region_alexa'],                        'deviceModel': res_data['uid_set']['deviceModel'],                        'TimeZone': res_data['uid_set']['TimeZone'],                        'TimeStatus': res_data['uid_set']['TimeStatus'],                        'SpaceUsable': res_data['uid_set']['SpaceUsable'],                        'SpaceSum': res_data['uid_set']['SpaceSum'],                        'MirrorType': res_data['uid_set']['MirrorType'],                        'RecordType': res_data['uid_set']['RecordType'],                        'OutdoorModel': res_data['uid_set']['OutdoorModel'],                        'WIFIName': res_data['uid_set']['WIFIName'],                        'isDetector': res_data['uid_set']['isDetector'],                        'DetectorRank': res_data['uid_set']['DetectorRank'],                        'is_human': res_data['uid_set']['is_human'],                        'is_custom_voice': res_data['uid_set']['is_custom_voice'],                        'double_wifi': res_data['uid_set']['double_wifi'],                        'isSupportFourPoint': res_data['uid_set']['isSupportFourPoint'],                        'mobile_4g': res_data['uid_set']['mobile_4g'],                        'is_ptz': res_data['uid_set']['is_ptz'],                        'is_ai': res_data['uid_set']['is_ai'],                        'cloud_vod': res_data['uid_set']['cloud_vod'],                        'is_alexa': res_data['uid_set']['is_alexa'],                        'is_notification': res_data['uid_set']['is_notification'],                        'new_detect_interval': res_data['uid_set']['new_detect_interval'],                        'tb_country': res_data['uid_set']['tb_country'],                        'device_type': res_data['uid_set']['device_type'],                        'ai_type': res_data['uid_set']['ai_type'],                        'msg_notify': res_data['uid_set']['msg_notify']                    }                    if uid_set_qs.exists():                        uid_set_qs.update(**uid_set_data)                    else:                        uid_set_data['uid'] = uid                        UidSetModel.objects.create(**uid_set_data)                # 记录操作日志                ip = CommonService.get_ip_address(request)                content = json.loads(json.dumps(request_dict))                log = {                    'ip': ip,                    'user_id': 1,                    'status': 200,                    'time': now_time,                    'url': 'serial/syncSerial',                    'content': json.dumps(content),                    'operation': '序列号{}同步{}服数据'.format(serial, sync_region)                }                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)))    @staticmethod    def getSerialData(request_dict, response):        serial = request_dict.get('serial', None)        if not serial:            return response.json(444)        try:            # 查询绑定的uid数据            uid_company_serial_qs = UIDCompanySerialModel.objects.filter(company_serial__serial_number=serial).\                values('uid__uid', 'uid__mac', 'uid__uid_extra', 'uid__status', 'uid__add_time', 'uid__update_time',                       'uid__area', 'uid__vpg_id', 'uid__p2p_type', 'uid__full_uid_code', 'uid__platform',                       'uid__init_string', 'uid__init_string_app')            if not uid_company_serial_qs.exists():                return response.json(173)            uid = uid_company_serial_qs[0]['uid__uid']            res_data = {                'uid': uid,                'mac': uid_company_serial_qs[0]['uid__mac'],                'uid_extra': uid_company_serial_qs[0]['uid__uid_extra'],                'status': uid_company_serial_qs[0]['uid__status'],                'add_time': uid_company_serial_qs[0]['uid__add_time'],                'update_time': uid_company_serial_qs[0]['uid__update_time'],                'area': uid_company_serial_qs[0]['uid__area'],                'vpg_id': uid_company_serial_qs[0]['uid__vpg_id'],                'p2p_type': uid_company_serial_qs[0]['uid__p2p_type'],                'full_uid_code': uid_company_serial_qs[0]['uid__full_uid_code'],                'platform': uid_company_serial_qs[0]['uid__platform'],                'init_string': uid_company_serial_qs[0]['uid__init_string'],                'init_string_app': uid_company_serial_qs[0]['uid__init_string_app']            }            # 查询iot数据            iot_device_info_qs = iotdeviceInfoModel.objects.filter(serial_number=serial).values(                'certificate_id', 'certificate_pem', 'public_key', 'private_key', 'thing_name',                'thing_groups', 'endpoint', 'token_iot_number')            if iot_device_info_qs.exists():                res_data['certificate_id'] = iot_device_info_qs[0]['certificate_id']                res_data['certificate_pem'] = iot_device_info_qs[0]['certificate_pem']                res_data['public_key'] = iot_device_info_qs[0]['public_key']                res_data['private_key'] = iot_device_info_qs[0]['private_key']                res_data['thing_name'] = iot_device_info_qs[0]['thing_name']                res_data['thing_groups'] = iot_device_info_qs[0]['thing_groups']                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()            if uid_set_qs.exists():                res_data['uid_set'] = {}                res_data['uid_set']['channel'] = uid_set_qs[0]['channel']                res_data['uid_set']['detect_status'] = uid_set_qs[0]['detect_status']                res_data['uid_set']['detect_interval'] = uid_set_qs[0]['detect_interval']                res_data['uid_set']['addTime'] = uid_set_qs[0]['addTime']                res_data['uid_set']['updTime'] = uid_set_qs[0]['updTime']                res_data['uid_set']['ucode'] = uid_set_qs[0]['ucode']                res_data['uid_set']['version'] = uid_set_qs[0]['version']                res_data['uid_set']['p2p_region'] = uid_set_qs[0]['p2p_region']                res_data['uid_set']['tz'] = uid_set_qs[0]['tz']                res_data['uid_set']['video_code'] = uid_set_qs[0]['video_code']                res_data['uid_set']['nickname'] = uid_set_qs[0]['nickname']                res_data['uid_set']['ip'] = uid_set_qs[0]['ip']                res_data['uid_set']['detect_group'] = uid_set_qs[0]['detect_group']                res_data['uid_set']['pwd'] = uid_set_qs[0]['pwd']                res_data['uid_set']['resetTime'] = uid_set_qs[0]['resetTime']                res_data['uid_set']['region_alexa'] = uid_set_qs[0]['region_alexa']                res_data['uid_set']['deviceModel'] = uid_set_qs[0]['deviceModel']                res_data['uid_set']['TimeZone'] = uid_set_qs[0]['TimeZone']                res_data['uid_set']['TimeStatus'] = uid_set_qs[0]['TimeStatus']                res_data['uid_set']['SpaceUsable'] = uid_set_qs[0]['SpaceUsable']                res_data['uid_set']['SpaceSum'] = uid_set_qs[0]['SpaceSum']                res_data['uid_set']['MirrorType'] = uid_set_qs[0]['MirrorType']                res_data['uid_set']['RecordType'] = uid_set_qs[0]['RecordType']                res_data['uid_set']['OutdoorModel'] = uid_set_qs[0]['OutdoorModel']                res_data['uid_set']['WIFIName'] = uid_set_qs[0]['WIFIName']                res_data['uid_set']['isDetector'] = uid_set_qs[0]['isDetector']                res_data['uid_set']['DetectorRank'] = uid_set_qs[0]['DetectorRank']                res_data['uid_set']['is_human'] = uid_set_qs[0]['is_human']                res_data['uid_set']['is_custom_voice'] = uid_set_qs[0]['is_custom_voice']                res_data['uid_set']['double_wifi'] = uid_set_qs[0]['double_wifi']                res_data['uid_set']['isSupportFourPoint'] = uid_set_qs[0]['isSupportFourPoint']                res_data['uid_set']['mobile_4g'] = uid_set_qs[0]['mobile_4g']                res_data['uid_set']['is_ptz'] = uid_set_qs[0]['is_ptz']                res_data['uid_set']['is_ai'] = uid_set_qs[0]['is_ai']                res_data['uid_set']['cloud_vod'] = uid_set_qs[0]['cloud_vod']                res_data['uid_set']['is_alexa'] = uid_set_qs[0]['is_alexa']                res_data['uid_set']['is_notification'] = uid_set_qs[0]['is_notification']                res_data['uid_set']['new_detect_interval'] = uid_set_qs[0]['new_detect_interval']                res_data['uid_set']['tb_country'] = uid_set_qs[0]['tb_country']                res_data['uid_set']['device_type'] = uid_set_qs[0]['device_type']                res_data['uid_set']['ai_type'] = uid_set_qs[0]['ai_type']                res_data['uid_set']['msg_notify'] = uid_set_qs[0]['msg_notify']            # 修改序列号状态为占用,uid状态为3(数据被同步)            CompanySerialModel.objects.filter(serial_number=serial).update(status=3)            UIDModel.objects.filter(uid=uid).update(status=3)            return response.json(0, {'res_data': res_data})        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))    @classmethod    def vpg_page(cls, request_dict, response):        isSelect = request_dict.get('isSelect', None)        if isSelect:            # 获取vpg id作为选项            vpg_qs = VPGModel.objects.all().values('id')            return response.json(0, {'list': list(vpg_qs)})        pageNo = request_dict.get('pageNo', None)        pageSize = request_dict.get('pageSize', None)        if not all([pageNo, pageSize]):            return response.json(444)        page = int(pageNo)        line = int(pageSize)        try:            query = VPGModel.objects.filter()            if not query.exists():                return response.json(0, {'list': '', 'total': 0})            total = query.count()            vpg_page = query[(page - 1) * line:page * line] \                .values('id', 'name',                        'region__name',                        'region_id',                        'company__name',                        'add_time',                        'update_time',                        'company__secret',                        'uid_count')            if vpg_page.exists():                for vpg in vpg_page:                    vpg['shangyun_use_count'] = UIDModel.objects.filter(vpg=vpg['id'], status=2, p2p_type=1).count()                    vpg['shangyun_unuse_count'] = UIDModel.objects.filter(vpg=vpg['id'], status=0, p2p_type=1).count()                    vpg['tutk_use_count'] = UIDModel.objects.filter(vpg=vpg['id'], status=2, p2p_type=2).count()                    vpg['tutk_unuse_count'] = UIDModel.objects.filter(vpg=vpg['id'], status=0, p2p_type=2).count()                return response.json(0, {'list': list(vpg_page), 'total': total})            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)))    @classmethod    def uid_page(cls, request_dict, response):        vpg_id = request_dict.get('vpg_id', None)        status = request_dict.get('status', None)        serial_number = request_dict.get('serialNumber', None)        uid = request_dict.get('uid', None)        p2p_type = request_dict.get('p2pType', None)        pageNo = request_dict.get('pageNo', None)        pageSize = request_dict.get('pageSize', None)        if not all([pageNo, pageSize]):            return response.json(444)        page = int(pageNo)        line = int(pageSize)        try:            query = UIDModel.objects.filter()            if serial_number:                company_serial_qs = CompanySerialModel.objects.filter(serial_number__contains=serial_number).values()                if company_serial_qs.exists():                    cs_id = str(company_serial_qs[0]['id'])                    uid_company_serial_qs = UIDCompanySerialModel.objects.filter(company_serial_id=cs_id).values(                        'uid_id')                    if uid_company_serial_qs.exists():                        uid_id = uid_company_serial_qs[0]['uid_id']                        query = query.filter(id=uid_id)                else:                    return response.json(0, {'list': '', 'total': 0})            if vpg_id:                query = query.filter(vpg_id=int(vpg_id))            if status:                query = query.filter(status=int(status))            if uid:                query = query.filter(uid__contains=uid)            if p2p_type:                query = query.filter(p2p_type=int(p2p_type))            if not query.exists():                return response.json(0, {'list': '', 'total': 0})            total = query.count()            uid_page = query[(page - 1) * line:page * line]            result_list = []            if not uid_page.exists():                return response.json(0, {'list': '', 'total': 0})            for vo in uid_page:                uid_company_serial_qs = UIDCompanySerialModel.objects.filter(uid_id=vo.id).values('uid_id',                                                                                                  'company_serial_id')                serial = None                if uid_company_serial_qs.exists():                    company_serial_id = uid_company_serial_qs[0]['company_serial_id']                    company_serial_qs = CompanySerialModel.objects.filter(id=company_serial_id).values()                    if company_serial_qs.exists():                        serial = str(company_serial_qs[0]['serial_number'])                result_list.append({                    'vpg_id': vo.vpg_id,                    'id': vo.id,                    'uid': vo.uid,                    'serial': serial,                    'status': vo.status,                    'area': vo.area,                    'p2pType': vo.p2p_type,                    'platform': vo.platform,                    'fullUidCode': vo.full_uid_code,                    'init_string': vo.init_string,                    'init_string_app': vo.init_string_app,                    'addTime': vo.add_time,                    'updateTime': vo.update_time,                })            return response.json(0, {'list': result_list, 'total': total})        except Exception as e:            print(e)            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))    def unbind_uid(self, request_dict, response):        serial_number = request_dict.get('serialNumber', None)        try:            # Step 1: 查找并更新序列号状态            CompanySerialModel.objects.filter(serial_number=serial_number).update(status=3,                                                                                  update_time=int(time.time()))            # Step 2: 解绑UID与序列号的关联            UIDCompanySerialModel.objects.filter(company_serial__serial_number=serial_number).delete()        except CompanySerialModel.DoesNotExist:            return response.json(173)        return response.json(0)
 |