浏览代码

新增序列号分配

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),
     path('admin/', admin.site.urls),
     re_path('user/(?P<operation>.*)', UserController.UserView.as_view()),
     re_path('user/(?P<operation>.*)', UserController.UserView.as_view()),
     re_path('uid/(?P<operation>.*)', UIDController.UIDView.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('history/(?P<operation>.*)', HistoryUIDController.HistoryUIDView.as_view()),
     re_path('log/(?P<operation>.*)', LogController.LogView.as_view()),
     re_path('log/(?P<operation>.*)', LogController.LogView.as_view()),
     re_path('orderTask/(?P<operation>.*)', OrderTaskController.OrderTaskView.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('upload', FileController.UploadUIDFileView.as_view()),
-    path('download', FileController.DownloadUIDFileView.as_view()),
+    # path('download', FileController.DownloadUIDFileView.as_view()),
     path('sales', SalesController.SalesView.as_view()),
     path('sales', SalesController.SalesView.as_view()),
     path('device/online', SalesController.DeviceOnlineView.as_view()),
     path('device/online', SalesController.DeviceOnlineView.as_view()),
-
     re_path('serialNumber/(?P<operation>.*)', SerialNumberController.SerialNumberView.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 django.db import transaction
 
 
 from AnsjerUIDManage.config import BASE_DIR
 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.RedisObject import RedisObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
+from bulk_update.helper import bulk_update
 
 
 
 
 class UploadUIDFileView(View):
 class UploadUIDFileView(View):
@@ -526,3 +528,161 @@ class DownloadUIDFileView(View):
                                                                                      time.localtime()) + '.zip'
                                                                                      time.localtime()) + '.zip'
         return response
         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
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
-
+import logging
+import random
 import time
 import time
 
 
 from django.db import transaction
 from django.db import transaction
 from django.views import View
 from django.views import View
 
 
 from Model.models import SerialNumberModel
 from Model.models import SerialNumberModel
+from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
 from Service.AlgorithmService import AlgorithmBaseOn35
 from Service.AlgorithmService import AlgorithmBaseOn35
+from Service.CommonService import CommonService
+from Service.ModelService import ModelService
 
 
 
 
 class SerialNumberView(View):
 class SerialNumberView(View):
 
 
     def get(self, request, *args, **kwargs):
     def get(self, request, *args, **kwargs):
         request.encoding = 'utf-8'
         request.encoding = 'utf-8'
-        operation = kwargs.get('operation', None)
         request_dict = request.GET
         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):
     def post(self, request, *args, **kwargs):
         request.encoding = 'utf-8'
         request.encoding = 'utf-8'
-        operation = kwargs.get('operation', None)
         request_dict = request.POST
         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()
         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)
             return self.do_create(request_dict, response)
         else:
         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):
     def do_create(self, request_dict, response):
         quantity = int(request_dict.get('quantity', 0))
         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'
         db_table = 'tb_serial_number'
         verbose_name = '序列号表'
         verbose_name = '序列号表'
         verbose_name_plural = 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