| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541 | #!/usr/bin/env python3# -*- coding: utf-8 -*-import base64import jsonimport loggingimport osimport timeimport zipfileimport xlwtfrom django.http import StreamingHttpResponse, HttpResponse, QueryDictfrom django.utils.decorators import method_decoratorfrom django.views import Viewfrom django.views.decorators.csrf import csrf_exemptfrom django.db import transactionfrom Ansjer.config import BASE_DIRfrom Model.models import UIDModel, UserUIDModel, UserModel, LogModel, MacModel, OrderTaskModel, OrderUIDModelfrom Object.RedisObject import RedisObjectfrom Object.TokenObject import TokenObjectfrom Object.uidManageResponseObject import uidManageResponseObjectfrom Service.CommonService import CommonServiceclass UploadUIDFileView(View):    @method_decorator(csrf_exempt)    def dispatch(self, request, *args, **kwargs):        return super(UploadUIDFileView, self).dispatch(request, *args, **kwargs)    def get(self, request, *args, **kwargs):        request.encoding = 'utf-8'        request_dict = request.GET        fileName = request.FILES.get('fileName', None)        return self.validate(fileName, request_dict, request)    def post(self, request, *args, **kwargs):        request.encoding = 'utf-8'        request_dict = request.POST        fileName = request.FILES.get('fileName', None)        return self.validate(fileName, request_dict, request)    def validate(self, fileName, request_dict, request):        token = request_dict.get('token', None)        area = request_dict.get('area', None)        isReset = request_dict.get('isReset', 0)        content = request_dict.get('fileName', None)        vpg_id = request_dict.get('vpg_id', None)        print('content')        print(content)        content = base64.b64decode(content).decode().strip()        content = content[3:(len(content) - 3)]        uids = content.split('\n')        # print(uids)        # print(len(uids))        response = uidManageResponseObject()        tko = TokenObject(token)        if tko.code != 0:            return response.json(tko.code)        # if not fileName and not area:        #     return response.json(444, 'fileName,area')        data = {}        duplicate = []        for line in uids:            if len(line) < 20:                continue            if data.__contains__(line):                duplicate.append(line)            else:                data[line] = ''        if isReset == 0:            return self.do_insert(data, duplicate, vpg_id, area, response, request, tko)        else:            return self.do_reset(data, response, area, request, tko)    @transaction.atomic    def do_insert(self, data, duplicate, vpg_id, area, response, request, token):        bulk = []        count = 0        add_time = int(time.time())        update_time = int(time.time())        keys = data.keys()        # 获取最新的mac        mac = MacModel.objects.filter().values('id', 'value', 'is_active')[0]        if not mac['is_active']:            return response.json(175)        # redisObject = RedisObject(db=3)        key = ''        tmpMac = mac['value']        savePoint = None        for item in keys:            key = item.strip()            # value = redisObject.get_data(key)            # if value is False:            #     # redisObject.set_data(key, '1', 600)            # else:            #     duplicate.append(key)            #     continue            bulk.append(UIDModel(                uid=item.strip(),                uid_extra='',                status=0,                add_time=add_time,                update_time=update_time,                area=area,                mac=mac['value'],                vpg_id=vpg_id            ))            try:                try:                    if (count % 5000) == 0:                        savePoint = transaction.savepoint()                        UIDModel.objects.bulk_create(bulk)                        bulk.clear()                        data = {                            'value': mac['value'],                            'is_active': tmpMac is not None                        }                        MacModel.objects.filter().update(**data)                except Exception as e:                    # print('--------------------------error 5000')                    # print(repr(e))                    if savePoint:                        transaction.rollback(savePoint)                    djangoLogger = logging.getLogger('django')                    djangoLogger.exception(repr(e))                    return response.json(174, str(e))                else:                    savePoint = None            except Exception as e:                # print('--------------------------error 5001')                # print(repr(e))                djangoLogger = logging.getLogger('django')                djangoLogger.exception(repr(e))                return response.json(174, str(e))            count += 1            tmpMac = CommonService.updateMac(mac['value'])            if tmpMac is None:                # 能分配的mac已用完                break            else:                mac['value'] = tmpMac        # 当bulk不足5000时,还有数据要插入        try:            try:                savePoint = transaction.savepoint()  # 事务保存点                if len(bulk) > 0:                    UIDModel.objects.bulk_create(bulk)                    bulk.clear()            except Exception as e:                # print('--------------------------error')                # print(repr(e))                if savePoint:                    transaction.rollback(savePoint)                djangoLogger = logging.getLogger('django')                djangoLogger.exception(repr(e))                return response.json(174)            else:                del data                del bulk                data = {                    'value': mac['value'],                    'is_active': tmpMac is not None                }                MacModel.objects.filter().update(**data)        except Exception as e:            # print('--------------------------error 1111')            # print(repr(e))            djangoLogger = logging.getLogger('django')            djangoLogger.exception(repr(e))            return response.json(174)        # print('重复:')        # print(duplicate)        try:            operation = self.formatOperation(operation='上传', quantity=int(count), area=int(area))            print(operation)            self.add_log(request, operation, token)        except Exception as e:            djangoLogger = logging.getLogger('django')            djangoLogger.exception(repr(e))        if tmpMac is None:            return response.json(175, {'last_uid': key})        return response.json(0, {'count': count, 'duplicate_count': len(duplicate), 'data': duplicate})    def do_reset(self, data, response, area, request, token):        keys = data.keys()        uids = []        count = 0        for key in keys:            uids.append(key.strip())            if len(uids) % 5000 == 0:                count += self.do_update_uid_status(uids, area)                uids.clear()        if len(uids) > 0:            count += self.do_update_uid_status(uids, area)            uids.clear()        operation = self.formatOperation('重置', int(count), int(area))        self.add_log(request, operation, token)        return response.json(0)    def do_update_uid_status(self, uids, area):        uid_qs = UIDModel.objects.filter(uid__in=uids, area=area, status=2)        if uid_qs.exists():            uid_ids = []            for uid in uid_qs:                if uid.status == 2:                    uid.status = 1                    uid_ids.append(uid.id)            UIDModel.objects.bulk_update(uid_qs, fields=['status'])            try:                OrderUIDModel.objects.filter(uid__id__in=tuple(uid_ids)).delete()            except Exception as e:                print(e)            return uid_qs.count()        return 0    def add_log(self, request, operation, token):        ip = CommonService.get_ip_address(request)        now_time = time.time()        content = json.loads(json.dumps(request.POST))        user_qs = UserModel.objects.filter(id=token.userID)        if content.__contains__('fileName'):            del content['fileName']        log = {            'status': 200,            'content': json.dumps(content),            'ip': ip,            'time': now_time,            'url': 'upload',            'operation': operation,            'user': user_qs[0]        }        try:            LogModel.objects.create(**log)        except Exception as e:            print('出错')            print(repr(e))    def formatOperation(self, operation, quantity, area):        str = '{operation}{quantity}个{area}UID'        if area == 0:            return str.format(operation=operation, quantity=quantity, area='国内')        else:            return str.format(operation=operation, quantity=quantity, area='国外')class DownloadUIDFileView(View):    @method_decorator(csrf_exempt)    def dispatch(self, request, *args, **kwargs):        return super(DownloadUIDFileView, self).dispatch(request, *args, **kwargs)    def get(self, request, *args, **kwargs):        request.encoding = 'utf-8'        request_dict = request.GET        return self.validate(request_dict)    def post(self, request, *args, **kwargs):        request.encoding = 'utf-8'        request_dict = request.POST        return self.validate(request_dict)    def validate(self, request_dict):        token = request_dict.get('token', None)        area = request_dict.get('area', None)        quantity = int(request_dict.get('quantity', None))        fileType = request_dict.get('fileType', None)        order_number = request_dict.get('order_number', None)        board = request_dict.get('board', None)        plan = request_dict.get('plan', None)        checksum = request_dict.get('checksum', None)        ic_model = request_dict.get('ic_model', None)        order_quantity = request_dict.get('order_quantity', None)        response = uidManageResponseObject()        # print(area)        # print(quantity)        token = TokenObject(token)        if token.code != 0:            return response.json(token.code)        if not area or not order_number or not board or not plan or not checksum or not ic_model or not order_quantity or not fileType:            return response.json(444)        area = int(area)        if area >= 0 and quantity > 0:            # 保存订单信息            now_time = int(time.time())            order = {                'order_number': order_number,                'board': board,                'plan': plan,                'checksum': checksum,                'ic_model': ic_model,                'quantity': order_quantity,                'add_time': now_time            }            tmp = OrderTaskModel.objects.create(**order)            print(tmp)            order = OrderTaskModel.objects.filter(order_number=order_number).order_by('-add_time')[0]            uid_qs = UserUIDModel.objects.filter(user__id=token.userID, uid__status=1, uid__area=area)            uid_values = uid_qs.values('uid__id', 'uid__uid', 'uid__mac', 'uid__uid_extra', 'uid__add_time', 'uid__update_time', 'uid__area')            count = uid_values.count()            if count < quantity:                return response.json(444, '设备UID不足')            if uid_values.exists():                uid_values = uid_values[0:quantity]                uid_qs = uid_qs[0: quantity]                if fileType == 'txt':                    # return self.download_txt(uid_values, uid_qs, order)                    # return self.download_excel(uid_values, order)                    return self.download_zip(uid_values, order)                elif fileType == 'excel':                    return self.download_excel(uid_values, order)                else:                    return response.json(444, 'fileType')            else:                return response.json(444, '111')        else:            return response.json(444, '222')    def download_txt(self, uid_values, uid_qs, order):        updates = []        updates_uid = []        content = ''        now_time = int(time.time())        for i in range(len(uid_values)):            # print(item)            item = uid_values[i]            mac = str(item['uid__mac'])            index = mac.rfind(':')            tmp = mac[0:index] + '\t' + mac[index:]            content += tmp + '\t'            content += item['uid__uid'].strip()            content += '\r\n'            uidModel = UIDModel(                id=item['uid__id'],                uid=item['uid__uid'],                mac=item['uid__mac'],                uid_extra=item['uid__uid_extra'],                status=2,                add_time=item['uid__add_time'],                update_time=now_time,                area=item['uid__area']            )            updates.append(uidModel)            order_uid = OrderUIDModel(uid=uidModel, order=order, add_time=now_time, update_time=now_time)            updates_uid.append(order_uid)            if len(updates) % 5000 == 0:                UIDModel.objects.bulk_update(updates, fields=["status"])                OrderUIDModel.objects.bulk_create(updates_uid)                updates.clear()                updates_uid.clear()            # print(item['uid__uid'])        if len(updates) > 0:            UIDModel.objects.bulk_update(updates, fields=["status"])            OrderUIDModel.objects.bulk_create(updates_uid)            updates.clear()            updates_uid.clear()        del updates        del updates_uid        content = content[0:len(content) - 1]        response = StreamingHttpResponse(content)        response['Content-Type'] = 'application/octet-stream'        response['Content-Disposition'] = 'attachment;filename=UID'+time.strftime('-%Y-%m-%d-%H-%M-%S', time.localtime()) + '.txt'        return response    def download_excel(self, uid_qs, order):        response = HttpResponse(content_type='application/vnd.ms-excel')        response['Content-Disposition'] = 'attachment; filename=UID' + time.strftime('-%Y-%m-%d-%H-%M-%S',                                                                                     time.localtime()) + '.xls'        workbook = xlwt.Workbook(encoding='utf-8')        sheet1 = workbook.add_sheet('UID')        # row1 = [u'设备UID']        # for i in range(0, len(row1)):        #     sheet1.write(0, i, row1[i])        num = 1        updates = []        updates_uid = []        now_time = int(time.time())        for item in uid_qs:            uid = item['uid__uid']            mac = item['uid__mac']            index = mac.rfind(':')            sheet1.write(num, 0, mac[0:index])            sheet1.write(num, 1, mac[index:])            sheet1.write(num, 2, uid)            num += 1            uidModel = UIDModel(                id=item['uid__id'],                uid=item['uid__uid'],                mac=item['uid__mac'],                uid_extra=item['uid__uid_extra'],                status=2,                add_time=item['uid__add_time'],                update_time=now_time,                area=item['uid__area']            )            updates.append(uidModel)            order_uid = OrderUIDModel(uid=uidModel, order=order, add_time=now_time, update_time=now_time)            updates_uid.append(order_uid)            if len(updates) % 5000 == 0:                UIDModel.objects.bulk_update(updates, fields=["status"])                OrderUIDModel.objects.bulk_create(updates_uid)                updates.clear()                updates_uid.clear()            # print(item['uid__uid'])        if len(updates) > 0:            UIDModel.objects.bulk_update(updates, fields=["status"])            OrderUIDModel.objects.bulk_create(updates_uid)            updates.clear()            updates_uid.clear()        UIDModel.objects.bulk_update(updates, fields=["status"])        workbook.save(response)        return response    def download_zip(self, uid_qs, order):        dir_name = 'static/' + time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime())        path = '/'.join((BASE_DIR, dir_name)).replace('\\', '/') + '/'        if not os.path.exists(path):            os.mkdir(path)        filename = time.strftime('_%Y_%m_%d_%H_%M_%S', time.localtime())        txt_filename = 'UID' + filename + '.txt'        excel_filename = 'UID' + filename + '.xls'        txt_file = open(path + txt_filename, 'w+')        workbook = xlwt.Workbook(encoding='utf-8')        sheet1 = workbook.add_sheet('UID')        num = 1        updates = []        updates_uid = []        content = ''        now_time = int(time.time())        for i in range(len(uid_qs)):            # print(item)            item = uid_qs[i]            uid = item['uid__uid']            mac = item['uid__mac']            index = mac.rfind(':')            tmp = mac[0:index] + '\t' + mac[index:]            content += tmp + '\t'            content += item['uid__uid'].strip()            content += '\r\n'            sheet1.write(num, 0, mac[0:index])            sheet1.write(num, 1, mac[index:])            sheet1.write(num, 2, uid)            num += 1            uidModel = UIDModel(                id=item['uid__id'],                uid=item['uid__uid'],                mac=item['uid__mac'],                uid_extra=item['uid__uid_extra'],                status=2,                add_time=item['uid__add_time'],                update_time=now_time,                area=item['uid__area']            )            updates.append(uidModel)            order_uid = OrderUIDModel(uid=uidModel, order=order, add_time=now_time, update_time=now_time)            updates_uid.append(order_uid)            if len(updates) % 5000 == 0:                UIDModel.objects.bulk_update(updates, fields=["status"])                OrderUIDModel.objects.bulk_create(updates_uid)                updates.clear()                updates_uid.clear()            # print(item['uid__uid'])        if len(updates) > 0:            UIDModel.objects.bulk_update(updates, fields=["status"])            OrderUIDModel.objects.bulk_create(updates_uid)            updates.clear()            updates_uid.clear()        del updates        del updates_uid        content = content[0:len(content) - 1]        txt_file.write(content)        txt_file.close()        workbook.save(path + excel_filename)        zip_name = path[0:path.rfind('/')] + '.zip'        return self.get_zip(path, os.listdir(path), zip_name)    def get_zip(self, path, files, zip_name):        zp = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED)        for file in files:            zp.write(filename=(path + file), arcname=str(file))        zp.close()        response = StreamingHttpResponse(open(zip_name, 'rb'))        response['content_type'] = "application/octet-stream"        response['Content-Disposition'] = 'attachment; filename=UID' + time.strftime('_%Y_%m_%d_%H_%M_%S',                                                                                     time.localtime()) + '.zip'        return response
 |