chenshibin пре 4 година
родитељ
комит
33a1fb9e0c
4 измењених фајлова са 212 додато и 11 уклоњено
  1. 5 2
      AnsjerUIDManage/urls.py
  2. 161 1
      Controller/FileController.py
  3. 33 8
      Controller/SerialNumberController.py
  4. 13 0
      Model/models.py

+ 5 - 2
AnsjerUIDManage/urls.py

@@ -23,13 +23,16 @@ urlpatterns = [
     path('admin/', admin.site.urls),
     re_path('user/(?P<operation>.*)', UserController.UserView.as_view()),
     re_path('uid/(?P<operation>.*)', UIDController.UIDView.as_view()),
+    re_path('serialNumber/(?P<operation>.*)', SerialNumberController.SerialNumberView.as_view()),
     re_path('history/(?P<operation>.*)', HistoryUIDController.HistoryUIDView.as_view()),
     re_path('log/(?P<operation>.*)', LogController.LogView.as_view()),
     re_path('orderTask/(?P<operation>.*)', OrderTaskController.OrderTaskView.as_view()),
+    path('downloadUID', FileController.DownloadUIDFileView.as_view()),
+    path('downloadSerialNumber', FileController.DownloadSerialNumberFileView.as_view()),
     path('upload', FileController.UploadUIDFileView.as_view()),
-    path('download', FileController.DownloadUIDFileView.as_view()),
+    # path('download', FileController.DownloadUIDFileView.as_view()),
     path('sales', SalesController.SalesView.as_view()),
     path('device/online', SalesController.DeviceOnlineView.as_view()),
-
     re_path('serialNumber/(?P<operation>.*)', SerialNumberController.SerialNumberView.as_view()),
+
 ]

+ 161 - 1
Controller/FileController.py

@@ -16,11 +16,13 @@ from django.views.decorators.csrf import csrf_exempt
 from django.db import transaction
 
 from AnsjerUIDManage.config import BASE_DIR
-from Model.models import UIDModel, UserUIDModel, UserModel, LogModel, MacModel, OrderTaskModel, OrderUIDModel
+from Model.models import UIDModel, UserUIDModel, UserModel, LogModel, MacModel, OrderTaskModel, OrderUIDModel, \
+    SerialNumberModel, OrderSerialNumberModel
 from Object.RedisObject import RedisObject
 from Object.TokenObject import TokenObject
 from Object.ResponseObject import ResponseObject
 from Service.CommonService import CommonService
+from bulk_update.helper import bulk_update
 
 
 class UploadUIDFileView(View):
@@ -526,3 +528,161 @@ class DownloadUIDFileView(View):
                                                                                      time.localtime()) + '.zip'
         return response
 
+
+
+
+class DownloadSerialNumberFileView(View):
+
+    @method_decorator(csrf_exempt)
+    def dispatch(self, request, *args, **kwargs):
+        return super(DownloadSerialNumberFileView, 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 = ResponseObject()
+
+        # 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]
+
+            sn_qs = SerialNumberModel.objects.filter(use_status=0, p2p=area)
+            count = sn_qs.count()
+            if count < quantity:
+                return response.json(444, '序列号不足')
+
+            if sn_qs.exists():
+
+                sn_qs = sn_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(sn_qs, order)
+                else:
+                    return response.json(444, 'fileType')
+            else:
+                return response.json(444, '111')
+        else:
+            return response.json(444, '222')
+
+
+    def download_zip(self, sn_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 = 'SerialNumber' + filename + '.txt'
+        excel_filename = 'SerialNumber' + filename + '.xls'
+
+        txt_file = open(path + txt_filename, 'w+')
+        workbook = xlwt.Workbook(encoding='utf-8')
+        sheet1 = workbook.add_sheet('SerialNumber')
+        num = 0
+
+        updates = []
+        updates_serial_number = []
+        content = ''
+        now_time = int(time.time())
+        for i in range(len(sn_qs)):
+            # print(item)
+            item = sn_qs[i]
+            serial_number = item.serial_number
+            sheet1.write(num, 0, serial_number)
+            num += 1
+            content += serial_number.strip()
+            content += '\n'
+
+            serialNumberModel = SerialNumberModel(
+                id=item.id,
+                serial_number = item.serial_number,
+                status=item.status,
+                use_status=1,
+                p2p=item.p2p,
+                add_time=item.add_time
+            )
+            updates.append(serialNumberModel)
+
+            order_serial_number = OrderSerialNumberModel(serial_number=item, order=order, add_time=now_time, update_time=now_time)
+            updates_serial_number.append(order_serial_number)
+
+            if len(updates) % 5000 == 0:
+                bulk_update(updates)
+                OrderSerialNumberModel.objects.bulk_create(updates_serial_number)
+                updates.clear()
+                updates_serial_number.clear()
+            # print(item['uid__uid'])
+
+        if len(updates) > 0:
+            bulk_update(updates)
+            OrderSerialNumberModel.objects.bulk_create(updates_serial_number)
+            updates.clear()
+            updates_serial_number.clear()
+
+        del updates
+        del updates_serial_number
+        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=SerialNumber' + time.strftime('_%Y_%m_%d_%H_%M_%S',
+                                                                                     time.localtime()) + '.zip'
+        return response

+ 33 - 8
Controller/SerialNumberController.py

@@ -1,37 +1,62 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
-
+import logging
+import random
 import time
 
 from django.db import transaction
 from django.views import View
 
 from Model.models import SerialNumberModel
+from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
 from Service.AlgorithmService import AlgorithmBaseOn35
+from Service.CommonService import CommonService
+from Service.ModelService import ModelService
 
 
 class SerialNumberView(View):
 
     def get(self, request, *args, **kwargs):
         request.encoding = 'utf-8'
-        operation = kwargs.get('operation', None)
         request_dict = request.GET
-        return self.validate(request_dict, operation, request)
+        operation = kwargs.get('operation')
+        return self.validate(request_dict, operation)
 
     def post(self, request, *args, **kwargs):
         request.encoding = 'utf-8'
-        operation = kwargs.get('operation', None)
         request_dict = request.POST
-        return self.validate(request_dict, operation, request)
+        operation = kwargs.get('operation')
+        return self.validate(request_dict, operation)
 
-    def validate(self, request_dict, operation, request):
+    def validate(self, request_dict, operation):
+        token = request_dict.get('token', None)
         response = ResponseObject()
 
-        if operation == 'create':
+        token = TokenObject(token)
+        if token.code != 0:
+            return response.json(token.code)
+
+        if operation == 'quantity':
+            return self.do_quantity(request_dict, response)
+        elif operation == 'create':
             return self.do_create(request_dict, response)
         else:
-            return response.json(404)
+            return response.json(309)
+
+    # 查询当前可用的UID的数量
+    def do_quantity(self, request_dict, response):
+        token = request_dict.get('token', None)
+
+        token = TokenObject(token)
+        if token.code != 0:
+            return response.json(token.code)
+
+        chenyun = SerialNumberModel.objects.filter(use_status=0 , p2p=1).count()
+        tutk = SerialNumberModel.objects.filter(use_status=0, p2p=2).count()
+        res_data = {'code': 0, 'chenyun': chenyun, 'tutk': tutk}
+        return response.json(0, {'data': res_data})
 
     def do_create(self, request_dict, response):
         quantity = int(request_dict.get('quantity', 0))

+ 13 - 0
Model/models.py

@@ -145,3 +145,16 @@ class SerialNumberModel(models.Model):
         db_table = 'tb_serial_number'
         verbose_name = '序列号表'
         verbose_name_plural = verbose_name
+
+
+class OrderSerialNumberModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    serial_number = models.ForeignKey(SerialNumberModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联序列号表')
+    order = models.ForeignKey(OrderTaskModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联订单任务表')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+    update_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'order_serial_number'
+        verbose_name = '订单与序列号关联表'
+        verbose_name_plural = verbose_name