Переглянути джерело

管理人员 分配序列号

chenshibin 4 роки тому
батько
коміт
b318f44fb9

+ 1 - 0
AnsjerUIDManage/urls.py

@@ -30,6 +30,7 @@ urlpatterns = [
     path('downloadUID', FileController.DownloadUIDFileView.as_view()),
     path('downloadSerialNumber', FileController.DownloadSerialNumberFileView.as_view()),
     path('upload', FileController.UploadUIDFileView.as_view()),
+    path('uploadSerialNumber', FileController.UploadSerialNumberFileView.as_view()),
     # path('download', FileController.DownloadUIDFileView.as_view()),
     path('sales', SalesController.SalesView.as_view()),
     path('device/online', SalesController.DeviceOnlineView.as_view()),

+ 142 - 4
Controller/FileController.py

@@ -8,6 +8,7 @@ import time
 import zipfile
 
 import xlwt
+from django.db.models import Count
 
 from django.http import StreamingHttpResponse, HttpResponse, QueryDict
 from django.utils.decorators import method_decorator
@@ -17,7 +18,7 @@ from django.db import transaction
 
 from AnsjerUIDManage.config import BASE_DIR
 from Model.models import UIDModel, UserUIDModel, UserModel, LogModel, MacModel, OrderTaskModel, OrderUIDModel, \
-    SerialNumberModel, OrderSerialNumberModel
+    SerialNumberModel, OrderSerialNumberModel, UserSerialNumberModel
 from Object.RedisObject import RedisObject
 from Object.TokenObject import TokenObject
 from Object.ResponseObject import ResponseObject
@@ -254,6 +255,130 @@ class UploadUIDFileView(View):
             return str.format(operation=operation, quantity=quantity, area='国外')
 
 
+
+
+class UploadSerialNumberFileView(View):
+
+    @method_decorator(csrf_exempt)
+    def dispatch(self, request, *args, **kwargs):
+        return super(UploadSerialNumberFileView, 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)
+        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 = ResponseObject()
+
+        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] = ''
+
+        self.do_reset(data, response, area, request, tko)
+
+    def do_reset(self, data, response, area, request, token):
+        keys = data.keys()
+        serial_numbers = []
+        count = 0
+        for key in keys:
+            serial_numbers.append(key.strip())
+            if len(serial_numbers) % 5000 == 0:
+                count += self.do_update_uid_status(serial_numbers, area)
+                serial_numbers.clear()
+
+        if len(serial_numbers) > 0:
+            count += self.do_update_uid_status(serial_numbers, area)
+            serial_numbers.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)
@@ -590,8 +715,21 @@ class DownloadSerialNumberFileView(View):
 
             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()
+            user_qs = UserModel.objects.filter(id=token.userID)
+            if not user_qs.exists():
+                return response.json(9)
+
+            user = user_qs[0]
+            result = UserSerialNumberModel.objects.filter(user__id=user.id, serial_number__p2p=area,
+                                                          serial_number__use_status=1).aggregate(
+                num=Count('serial_number__use_status'))
+
+
+            us_qs = UserSerialNumberModel.objects.filter(user__id=user.id, serial_number__p2p=area,
+                                                          serial_number__use_status=1).values('serial_number')
+
+            sn_qs = SerialNumberModel.objects.filter(id__in=us_qs)
+            count = result['num']
             if count < quantity:
                 return response.json(444, '序列号不足')
 
@@ -642,7 +780,7 @@ class DownloadSerialNumberFileView(View):
                 id=item.id,
                 serial_number = item.serial_number,
                 status=item.status,
-                use_status=1,
+                use_status=2,
                 p2p=item.p2p,
                 add_time=item.add_time
             )

+ 88 - 10
Controller/SerialNumberController.py

@@ -4,10 +4,12 @@ import logging
 import random
 import time
 
+from bulk_update.helper import bulk_update
 from django.db import transaction
+from django.db.models import Count
 from django.views import View
 
-from Model.models import SerialNumberModel
+from Model.models import SerialNumberModel, UserModel, UserSerialNumberModel, UserUIDModel
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
@@ -39,23 +41,33 @@ class SerialNumberView(View):
             return response.json(token.code)
 
         if operation == 'quantity':
-            return self.do_quantity(request_dict, response)
+            return self.do_quantity(request_dict,token.userID, response)
         elif operation == 'create':
             return self.do_create(request_dict, response)
+        elif operation == 'allot':
+            return self.do_allot(request_dict, response)
         else:
             return response.json(309)
 
     # 查询当前可用的UID的数量
-    def do_quantity(self, request_dict, response):
-        token = request_dict.get('token', None)
+    def do_quantity(self, request_dict, userID, response):
+        user_qs = UserModel.objects.filter(id=userID)
+        if not user_qs.exists():
+            return response.json(9)
 
-        token = TokenObject(token)
-        if token.code != 0:
-            return response.json(token.code)
+        user = user_qs[0]
+
+        chenyunsuper = SerialNumberModel.objects.filter(p2p=1).count()
+        tutksuper = SerialNumberModel.objects.filter(p2p=2).count()
+
+        result = UserSerialNumberModel.objects.filter(user__id=user.id, serial_number__p2p= 1, serial_number__use_status=1).aggregate(num=Count('serial_number__use_status'))
+        chenyundev = result['num']
+        result2 = UserSerialNumberModel.objects.filter(user__id=user.id, serial_number__p2p=2,serial_number__use_status=1).aggregate(num=Count('serial_number__use_status'))
+        tutkdev  = result2['num']
 
-        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}
+        chenyun = SerialNumberModel.objects.filter(use_status=1 , p2p=1).count()
+        tutk = SerialNumberModel.objects.filter(use_status=1, p2p=2).count()
+        res_data = {'code': 0, 'chenyun': chenyun, 'tutk': tutk, 'chenyunsuper': chenyunsuper, 'tutksuper': tutksuper, 'chenyundev': chenyundev, 'tutkdev': tutkdev}
         return response.json(0, {'data': res_data})
 
     def do_create(self, request_dict, response):
@@ -86,3 +98,69 @@ class SerialNumberView(View):
         except Exception as e:
             print(e)
             return response.json(500, repr(e))
+
+    # 分配序列号
+    @transaction.atomic
+    def do_allot(self, request_dict, response):
+        username = request_dict.get('username', None)
+        quantity = int(request_dict.get('quantity', None))
+        area = request_dict.get('area', None)
+        token = request_dict.get('token', None)
+
+        token = TokenObject(token)
+        if token.code != 0:
+            return response.json(token.code)
+        user = UserModel.objects.get(id=token.userID)
+
+        if not user or '0' not in user.permission:
+            return response.json(404)
+
+        # 要分配的对象
+        allot_user_qs = UserModel.objects.filter(username=username)
+        if not allot_user_qs.exists():
+            return response.json(444, 'username')
+
+        # 取出对应区域可用的UID分配给allot_user
+        sn_qs = SerialNumberModel.objects.filter(p2p=area, use_status=0)
+        count = sn_qs.count()
+        if count < quantity:
+            return response.json(444, '序列号不足')
+
+        updates = []
+        datas = []
+        count = 0
+        if sn_qs.exists():
+            sn_qs = sn_qs[0:quantity]
+            now_time = int(time.time())
+            for i in range(len(sn_qs)):
+                item = sn_qs[i]
+                serialNumberModel = SerialNumberModel(
+                    id=item.id,
+                    serial_number=item.serial_number,
+                    status=item.status,
+                    use_status=1,
+                    p2p=item.p2p,
+                    add_time=item.add_time
+                )
+                user_serial_number = UserSerialNumberModel()
+                user_serial_number.serial_number = serialNumberModel
+                user_serial_number.user = allot_user_qs[0]
+                user_serial_number.add_time = now_time
+                user_serial_number.update_time = now_time
+
+                datas.append(user_serial_number)
+                updates.append(serialNumberModel)
+
+                if len(updates) % 5000 == 0:
+                    bulk_update(updates)
+                    UserSerialNumberModel.objects.bulk_create(datas)
+
+            if len(updates) > 0:
+                bulk_update(updates)
+                UserSerialNumberModel.objects.bulk_create(datas)
+
+            del datas
+            del updates
+            return response.json(0)
+        else:
+            return response.json(444)

+ 14 - 1
Model/models.py

@@ -137,7 +137,7 @@ class SerialNumberModel(models.Model):
     id = models.AutoField(primary_key=True)
     serial_number = models.CharField(max_length=9, db_index=True, unique=True, verbose_name='序列号')
     status = models.SmallIntegerField(default=1, verbose_name='可用状态。0:不可用,1:可用')
-    use_status = models.SmallIntegerField(default=0, db_index=True, verbose_name='使用状态, 0: 未使用, 1: 已分配')
+    use_status = models.SmallIntegerField(default=0, db_index=True, verbose_name='使用状态, 0: 未使用, 1: 已分配  2: 已下载')
     p2p = models.SmallIntegerField(default=0, verbose_name='p2p类型。0:无,1:宸云,2:tutk')
     add_time = models.IntegerField(default=0, verbose_name='添加时间')
 
@@ -158,3 +158,16 @@ class OrderSerialNumberModel(models.Model):
         db_table = 'order_serial_number'
         verbose_name = '订单与序列号关联表'
         verbose_name_plural = verbose_name
+
+
+class UserSerialNumberModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    user = models.ForeignKey(UserModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联用户表id')
+    serial_number = models.ForeignKey(SerialNumberModel, 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:
+        verbose_name = '用户与序列号的关联表'
+        verbose_name_plural = verbose_name
+        db_table = 'user_serial_number'