Browse Source

管理人员 分配序列号

chenshibin 4 years ago
parent
commit
b318f44fb9
4 changed files with 245 additions and 15 deletions
  1. 1 0
      AnsjerUIDManage/urls.py
  2. 142 4
      Controller/FileController.py
  3. 88 10
      Controller/SerialNumberController.py
  4. 14 1
      Model/models.py

+ 1 - 0
AnsjerUIDManage/urls.py

@@ -30,6 +30,7 @@ urlpatterns = [
     path('downloadUID', FileController.DownloadUIDFileView.as_view()),
     path('downloadUID', FileController.DownloadUIDFileView.as_view()),
     path('downloadSerialNumber', FileController.DownloadSerialNumberFileView.as_view()),
     path('downloadSerialNumber', FileController.DownloadSerialNumberFileView.as_view()),
     path('upload', FileController.UploadUIDFileView.as_view()),
     path('upload', FileController.UploadUIDFileView.as_view()),
+    path('uploadSerialNumber', FileController.UploadSerialNumberFileView.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()),

+ 142 - 4
Controller/FileController.py

@@ -8,6 +8,7 @@ import time
 import zipfile
 import zipfile
 
 
 import xlwt
 import xlwt
+from django.db.models import Count
 
 
 from django.http import StreamingHttpResponse, HttpResponse, QueryDict
 from django.http import StreamingHttpResponse, HttpResponse, QueryDict
 from django.utils.decorators import method_decorator
 from django.utils.decorators import method_decorator
@@ -17,7 +18,7 @@ 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
+    SerialNumberModel, OrderSerialNumberModel, UserSerialNumberModel
 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
@@ -254,6 +255,130 @@ class UploadUIDFileView(View):
             return str.format(operation=operation, quantity=quantity, area='国外')
             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):
 class DownloadUIDFileView(View):
 
 
     @method_decorator(csrf_exempt)
     @method_decorator(csrf_exempt)
@@ -590,8 +715,21 @@ class DownloadSerialNumberFileView(View):
 
 
             order = OrderTaskModel.objects.filter(order_number=order_number).order_by('-add_time')[0]
             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:
             if count < quantity:
                 return response.json(444, '序列号不足')
                 return response.json(444, '序列号不足')
 
 
@@ -642,7 +780,7 @@ class DownloadSerialNumberFileView(View):
                 id=item.id,
                 id=item.id,
                 serial_number = item.serial_number,
                 serial_number = item.serial_number,
                 status=item.status,
                 status=item.status,
-                use_status=1,
+                use_status=2,
                 p2p=item.p2p,
                 p2p=item.p2p,
                 add_time=item.add_time
                 add_time=item.add_time
             )
             )

+ 88 - 10
Controller/SerialNumberController.py

@@ -4,10 +4,12 @@ import logging
 import random
 import random
 import time
 import time
 
 
+from bulk_update.helper import bulk_update
 from django.db import transaction
 from django.db import transaction
+from django.db.models import Count
 from django.views import View
 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.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
@@ -39,23 +41,33 @@ class SerialNumberView(View):
             return response.json(token.code)
             return response.json(token.code)
 
 
         if operation == 'quantity':
         if operation == 'quantity':
-            return self.do_quantity(request_dict, response)
+            return self.do_quantity(request_dict,token.userID, response)
         elif operation == 'create':
         elif operation == 'create':
             return self.do_create(request_dict, response)
             return self.do_create(request_dict, response)
+        elif operation == 'allot':
+            return self.do_allot(request_dict, response)
         else:
         else:
             return response.json(309)
             return response.json(309)
 
 
     # 查询当前可用的UID的数量
     # 查询当前可用的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})
         return response.json(0, {'data': res_data})
 
 
     def do_create(self, request_dict, response):
     def do_create(self, request_dict, response):
@@ -86,3 +98,69 @@ class SerialNumberView(View):
         except Exception as e:
         except Exception as e:
             print(e)
             print(e)
             return response.json(500, repr(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)
     id = models.AutoField(primary_key=True)
     serial_number = models.CharField(max_length=9, db_index=True, unique=True, verbose_name='序列号')
     serial_number = models.CharField(max_length=9, db_index=True, unique=True, verbose_name='序列号')
     status = models.SmallIntegerField(default=1, verbose_name='可用状态。0:不可用,1:可用')
     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')
     p2p = models.SmallIntegerField(default=0, verbose_name='p2p类型。0:无,1:宸云,2:tutk')
     add_time = models.IntegerField(default=0, verbose_name='添加时间')
     add_time = models.IntegerField(default=0, verbose_name='添加时间')
 
 
@@ -158,3 +158,16 @@ class OrderSerialNumberModel(models.Model):
         db_table = 'order_serial_number'
         db_table = 'order_serial_number'
         verbose_name = '订单与序列号关联表'
         verbose_name = '订单与序列号关联表'
         verbose_name_plural = 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'