Ver Fonte

UID绑定订单信息

tanghongbin há 5 anos atrás
pai
commit
657db935c0

+ 63 - 17
Controller/FileController.py

@@ -11,7 +11,7 @@ from django.views import View
 from django.views.decorators.csrf import csrf_exempt
 from django.db import transaction
 
-from Model.models import UIDModel, UserUIDModel, UserModel, LogModel, MacModel
+from Model.models import UIDModel, UserUIDModel, UserModel, LogModel, MacModel, OrderTaskModel, OrderUIDModel
 from Object.RedisObject import RedisObject
 from Object.TokenObject import TokenObject
 from Object.ResponseObject import ResponseObject
@@ -41,8 +41,8 @@ class UploadUIDFileView(View):
         area = request_dict.get('area', None)
         isReset = request_dict.get('isReset', 0)
         content = request_dict.get('fileName', None)
-        # print('content')
-        # print(content)
+        print('content')
+        print(content)
 
         content = base64.b64decode(content).decode().strip()
         content = content[3:(len(content) - 3)]
@@ -198,10 +198,18 @@ class UploadUIDFileView(View):
     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
 
@@ -256,6 +264,12 @@ class DownloadUIDFileView(View):
         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)
@@ -264,25 +278,44 @@ class DownloadUIDFileView(View):
         if token.code != 0:
             return response.json(token.code)
 
-        if not area:
-            return response.json(444, 'area')
+        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:
 
-            uid_qs = UserUIDModel.objects.filter(user__id=token.userID, uid__status=1, uid__area=area). \
-                values('uid__id', 'uid__uid', 'uid__mac', 'uid__uid_extra', 'uid__add_time', 'uid__update_time', 'uid__area')
-            count = uid_qs.count()
+            # 保存订单信息
+            order = {
+                'order_number': order_number,
+                'board': board,
+                'plan': plan,
+                'checksum': checksum,
+                'ic_model': ic_model,
+                'quantity': order_quantity
+            }
+
+            tmp = OrderTaskModel.objects.update_or_create(defaults={'order_number': order_number}, **order)
+            print(tmp)
+
+            order = OrderTaskModel.objects.filter(order_number=order_number)[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_qs.exists():
-                uid_qs = uid_qs[0:quantity]
+            if uid_values.exists():
+
+                uid_values = uid_values[0:quantity]
+                uid_qs = uid_qs[0: quantity]
                 if fileType == 'txt':
-                    return self.download_txt(uid_qs)
+                    return self.download_txt(uid_values, uid_qs, order)
                 elif fileType == 'excel':
-                    return self.download_excel(uid_qs)
+                    return self.download_excel(uid_values)
                 else:
                     return response.json(444, 'fileType')
             else:
@@ -290,37 +323,50 @@ class DownloadUIDFileView(View):
         else:
             return response.json(444, '222')
 
-    def download_txt(self, uid_qs):
+    def download_txt(self, uid_values, uid_qs, order):
         updates = []
+        updates_uid = []
         content = ''
-        for item in uid_qs:
+        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] + ' ' + mac[index:]
             content += tmp + ' '
             content += item['uid__uid']
             content += '\r\n'
-            updates.append(UIDModel(
+            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=item['uid__update_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'

+ 37 - 1
Controller/UIDController.py

@@ -1,13 +1,16 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
+import json
 import time
 
+from django.http import StreamingHttpResponse
 from django.utils.decorators import method_decorator
 from django.views import View
 from django.views.decorators.csrf import csrf_exempt
 from django.db.models import Avg,Max,Min,Count,Sum, Q  #   引入函数
 
 from Model.models import UIDModel, UserModel, UserUIDModel, HistoryUIDModel
+from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 
@@ -44,6 +47,8 @@ class UIDView(View):
             return self.do_allot(request_dict, response)
         elif operation == 'remove':
             return self.do_remove(request_dict, response)
+        elif operation == 'download':
+            return self.download_txt(token, response)
         else:
             return response.json(309)
 
@@ -136,12 +141,15 @@ class UIDView(View):
         datas = []
         if uid_qs.exists():
             uid_qs = uid_qs[0:quantity]
+            now_time = int(time.time())
             for item in uid_qs:
                 item.status = 1
                 item.update_time = time.time()
                 user_uid = UserUIDModel()
                 user_uid.uid = item
                 user_uid.user = allot_user_qs[0]
+                user_uid.add_time = now_time
+                user_uid.update_time = now_time
                 datas.append(user_uid)
                 updates.append(item)
 
@@ -155,7 +163,10 @@ class UIDView(View):
                 UIDModel.objects.bulk_update(updates, fields=['status', 'update_time'])
                 datas.clear()
                 updates.clear()
-
+            redisObject = RedisObject()
+            values = uid_qs.values('uid')
+            print(values)
+            redisObject.set_data(key=token.token, val=json.dumps(list(values)), expire=3600)
             del datas
             del updates
             return response.json(0)
@@ -235,3 +246,28 @@ class UIDView(View):
             return response.json(0)
         else:
             return response.json(173)
+
+    def download_txt(self, token, response):
+
+        redisObject = RedisObject()
+        uid_qs = redisObject.get_data(key=token.token)
+
+        if uid_qs is False:
+            return response.json(308)
+
+        uid_qs = json.loads(uid_qs)
+        content = ''
+        for item in uid_qs:
+            # print(item)
+            content += item['uid']
+            content += '\r\n'
+
+        redisObject.del_data(key=token.token)
+
+        content = content[0:len(content) - 1]
+        response = StreamingHttpResponse(content)
+        response['Content-Type'] = 'application/octet-stream'
+        filename = 'uid_need_to_set_up_push.txt'
+        response['Content-Disposition'] = 'attachment;filename=' + filename
+
+        return response

+ 29 - 0
Model/models.py

@@ -37,6 +37,8 @@ class UserUIDModel(models.Model):
     id = models.AutoField(primary_key=True)
     user = models.ForeignKey(UserModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联用户表id')
     uid = models.ForeignKey(UIDModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联uid表id')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+    update_time = models.IntegerField(default=0, verbose_name='更新时间')
 
     class Meta:
         verbose_name = '用户与UID的关联表'
@@ -100,3 +102,30 @@ class MacModel(models.Model):
         db_table = 'tb_mac'
 
 
+class OrderTaskModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    order_number = models.CharField(max_length=32, unique=True, verbose_name='订单号')
+    board = models.CharField(max_length=32, verbose_name='主板')
+    plan = models.CharField(max_length=32, verbose_name='配置方案')
+    checksum = models.CharField(max_length=32, verbose_name='校验和')
+    ic_model = models.CharField(max_length=32, verbose_name='ic型号')
+    quantity = models.IntegerField(default=0, verbose_name='通知单上的生成数量')
+
+    class Meta:
+        db_table = 'order_task'
+        verbose_name = '订单任务表'
+        verbose_name_plural = verbose_name
+
+
+class OrderUIDModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    uid = models.ForeignKey(UIDModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联uid表')
+    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_uid'
+        verbose_name = '订单与uid关联表'
+        verbose_name_plural = verbose_name
+

+ 1 - 4
Object/RedisObject.py

@@ -25,10 +25,7 @@ db=3  -> 统计在线人数用
 
 class RedisObject:
 
-    def __init__(self, db=0,SERVER_HOST = SERVER_HOST):
-        if db == 3:
-            if SERVER_TYPE != 'Ansjer.formal_settings':
-                db = 4
+    def __init__(self, db=0, SERVER_HOST = SERVER_HOST):
         self.POOL = redis.ConnectionPool(host=SERVER_HOST, port=6379, db=db)
         self.CONN = redis.Redis(connection_pool=self.POOL)
 

+ 2 - 0
Object/ResponseObject.py

@@ -40,6 +40,7 @@ class ResponseObject(object):
             175: 'mac地址已用完',
             305: '令牌格式是错误的,相关参数是不存在的!',
             307: '令牌已过期!',
+            308: '此次下载已失效',
             309: '你没有权限访问',
             404: 'You don not have permission to access this!',
             444: '请确认参数的正确性!',
@@ -78,6 +79,7 @@ class ResponseObject(object):
             175: 'MAC address has been used up',
             305: 'The Token format is wrong and the related parameter is None!',
             307: 'The Token has expired!',
+            308: 'This download has expired!',
             309: 'You have no access',
             404: 'You don not have permission to access this!',
             444: 'Please confirm the correctness of the parameters!',

+ 1 - 1
Service/LogMiddleware.py

@@ -46,7 +46,7 @@ def add_log(request, response):
     request_path = request.path.strip().strip('/')
     print(request_path)
     jsonObject = {}
-    if request_path == 'download':
+    if request_path == 'download' or request_path == 'uid/download':
         if response.status_code != 200:
             return
     else: