Procházet zdrojové kódy

优化序列号管理系统;过滤查询时的登录和退出登录

guanhailong před 2 roky
rodič
revize
d6aa6081de

+ 5 - 0
Controller/FileController.py

@@ -765,6 +765,7 @@ class DownloadSerialNumberFileView(View):
         num = 0
 
         updates = []
+        company_serial_updates = []
         updates_serial_number = []
         content = ''
         now_time = int(time.time())
@@ -791,6 +792,8 @@ class DownloadSerialNumberFileView(View):
             )
             updates.append(serialNumberModel)
 
+            company_serial_updates.append(serial_number)  # 获取序列号
+
             order_serial_number = OrderSerialNumberModel(serial_number=item, order=order, add_time=now_time, update_time=now_time)
             updates_serial_number.append(order_serial_number)
 
@@ -801,6 +804,8 @@ class DownloadSerialNumberFileView(View):
                 updates_serial_number.clear()
         mac_qs.update(value=mac, update_time=now_time)  # 更新mac表数据
 
+        CompanySerialModel.objects.filter(serial_number__in=company_serial_updates).update(status=2) # 更新序列号状态
+
         if len(updates) > 0:
             bulk_update(updates)
             OrderSerialNumberModel.objects.bulk_create(updates_serial_number)

+ 5 - 1
Controller/LogController.py

@@ -1,5 +1,6 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
+from django.db.models import Q
 from django.utils.decorators import method_decorator
 from django.views import View
 from django.views.decorators.csrf import csrf_exempt
@@ -50,7 +51,10 @@ class LogView(View):
         line = request_dict.get('line', None)
 
         if page and line:
-            log_qs = LogModel.objects.filter(user__id=token.userID).values('id', 'operation', 'time', 'ip', 'user__username')
+            log_qs = LogModel.objects.filter(
+                Q(user__id=token.userID) & ~Q(operation='登录账号') & ~Q(operation='退出登录')).values('id', 'operation',
+                                                                                               'time', 'ip',
+                                                                                               'user__username')
             if log_qs.exists():
                 page = int(page)
                 line = int(line)

+ 334 - 59
Controller/SerialNumberController.py

@@ -2,22 +2,21 @@
 # -*- coding: utf-8 -*-
 import json
 import logging
-import random
 import time
 
+import requests
 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, UserModel, UserSerialNumberModel, UserUIDModel, CompanySerialModel, \
-    MacModel, LogModel
+    MacModel, LogModel, CompanyModel
 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):
@@ -46,26 +45,296 @@ class SerialNumberView(View):
         if token.code != 0:
             return response.json(token.code)
 
-        if operation == 'quantity':
-            return self.do_quantity(request_dict,token.userID, response)
+        if operation == 'quantity':  # 查询当前可用的UID的数量
+            return self.do_quantity(request_dict, token.userID, response)
         elif operation == 'allot':
             return self.do_allot(request_dict, response)
+        elif operation == 'createSerial':  # 生成序列号
+            return self.create_serial(request_dict, response, request)
+        elif operation == 'serialCompany':  # 将序列号分匹配到指定企业
+            return self.do_serial_company(request_dict, response, request)
+        elif operation == 'revise/state':  # 修改序列号状态
+            return self.revise_state(request_dict, response, request)
         else:
             return response.json(309)
 
-    # 查询当前可用的UID的数量
+    def revise_state(self, request_dict, response, request):
+        """
+        修改序列号状态
+        @param request_dict:请求参数
+        @param response: 响应对象
+        """
+        use_status = request_dict.get('useStatus', None)  # 序列号表的状态
+        status = request_dict.get('status', None)   # 关联企业序列号表的状态
+
+        if not all([use_status, status]):
+            return response.json(444)
+        serial_number_qs = SerialNumberModel.objects.filter(use_status=use_status).values('serial_number')
+        if not serial_number_qs.exists():
+            return response.json(173)
+        serial_list = [item[key] for item in serial_number_qs for key in item]
+        try:
+            country_serial_qs = CompanySerialModel.objects.filter(serial_number__in=serial_list).values('status')
+            country_serial_qs.filter(status=status).update(status=1)
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500)
+
+    def do_serial_company(self, request_dict, response, request):
+        """
+        将序列号分匹配到指定企业
+        :param request_dict: 请求参数
+        :param response: 响应对象
+        :param request: 请求
+        :return:
+        """
+        id = request_dict.get('id', None)
+        quantity = request_dict.get('quantity', None)
+
+        if not all([id, quantity]):
+            return response.json(444)
+
+        company_qs = CompanyModel.objects.filter(id=id)
+        if not company_qs.exists():
+            return response.json(444)
+
+        sum_Serial = SerialNumberModel.objects.filter().count()
+        sum_Serial_company = CompanySerialModel.objects.filter().count()
+        sum_bind = sum_Serial - sum_Serial_company  # 剩余可绑定的序列号
+        if int(quantity) > int(sum_bind):
+            return response.json(10041)
+
+        try:
+            company = company_qs[0]
+            start_1 = sum_Serial_company
+            end_1 = int(start_1) + int(quantity)
+            serial_qs = SerialNumberModel.objects.filter()[start_1:end_1]
+            if not serial_qs.exists():
+                return response.json(173)
+            company_serial_bulk = []
+            now_time = int(time.time())
+            for item in serial_qs:  # 更新状态为已分配但未使用
+                company_serial_bulk.append(CompanySerialModel(
+                    status=3,
+                    add_time=now_time,
+                    update_time=now_time,
+                    company_id=company.id,
+                    serial_number=item.serial_number,
+                ))
+                SerialNumberModel.objects.filter(serial_number=item.serial_number).update(
+                    use_status=3,
+                    add_time=now_time
+                )
+
+            # 记录操作日志
+            ip = CommonService.get_ip_address(request)
+            content = json.loads(json.dumps(request_dict))
+            log = {
+                'ip': ip,
+                'user_id': 1,
+                'status': 200,
+                'time': now_time,
+                'url': 'company/createSerial',
+                'content': json.dumps(content),
+                'operation': '{}生成{}个Company Serial{}: {}'.format(company.name, quantity, '成功', '同步更新成功'),
+            }
+
+            with transaction.atomic():
+                CompanySerialModel.objects.bulk_create(company_serial_bulk)
+                company.quantity = CompanySerialModel.objects.filter(company_id=id).count()
+                company.save()
+                Log = LogModel.objects.create(**log)
+
+                # 同步更新业务服务器和uid管理系统的企业序列号表
+                url1 = 'http://test.zositechc.cn/company/createSerial'
+                url2 = 'https://www.zositechc.cn/company/createSerial'
+                url3 = 'http://www.dvema.com/company/createSerial'
+                url4 = 'http://www.zositeche.com/company/createSerial'
+                requests_data = {'id': id, 'quantity': quantity}
+
+                res1 = requests.post(url=url1, data=requests_data, timeout=2 * 60)
+                if res1.status_code != 200:
+                    fail_reason = '请求测试服务器生成Company Serial响应状态码异常'
+                    return self.failResponse(company.name, quantity, fail_reason, Log, response)
+                res1 = res1.json()
+                if res1['result_code'] != 0:
+                    fail_reason = '测试服务器生成Company Serial发生异常'
+                    return self.failResponse(company.name, quantity, fail_reason, Log, response)
+
+                res2 = requests.post(url=url2, data=requests_data, timeout=2 * 60)
+                if res2.status_code != 200:
+                    fail_reason = '请求国内服务器生成Company Serial响应状态码异常'
+                    return self.failResponse(company.name, quantity, fail_reason, Log, response)
+                res2 = res2.json()
+                if res2['result_code'] != 0:
+                    fail_reason = '国内服务器生成Company Serial发生异常'
+                    return self.failResponse(company.name, quantity, fail_reason, Log, response)
+
+                res3 = requests.post(url=url3, data=requests_data, timeout=2 * 60)
+                if res3.status_code != 200:
+                    fail_reason = '请求国外服务器生成Company Serial响应状态码异常'
+                    return self.failResponse(company.name, quantity, fail_reason, Log, response)
+                res3 = res3.json()
+                if res3['result_code'] != 0:
+                    fail_reason = '国外服务器生成Company Serial发生异常'
+                    return self.failResponse(company.name, quantity, fail_reason, Log, response)
+
+                res4 = requests.post(url=url4, data=requests_data, timeout=2 * 60)
+                if res4.status_code != 200:
+                    fail_reason = '请求uid管理系统生成Company Serial响应状态码异常'
+                    return self.failResponse(company.name, quantity, fail_reason, Log, response)
+                res4 = res4.json()
+                if res4['code'] != 0:
+                    fail_reason = 'uid管理系统生成Company Serial发生异常'
+                    return self.failResponse(company.name, quantity, fail_reason, Log, response)
+
+                return response.json(0)
+
+        except Exception as e:
+            djangoLogger = logging.getLogger('django')
+            djangoLogger.exception(repr(e))
+            return response.json(176)
+
+    def create_serial(self, request_dict, response, request):
+        """
+        生成序列号
+        :param request_dict: 请求参数
+        :param response: 响应对象
+        :param request: 请求
+        :return:
+        """
+        quantity = int(request_dict.get('quantity', 0))
+
+        if not quantity:
+            return response.json(444)
+
+        try:
+            try:
+                sum = SerialNumberModel.objects.last().id
+            except:
+                sum = 0
+            serial_number_bulk = []
+            now_time = int(time.time())
+            algorithm = AlgorithmBaseOn35()
+            for i in range(quantity):
+                serial_number = algorithm.getLetter(sum)
+                sum += 1  # sum每次递增1
+                # 前面补0至六位
+                serial_number = (6 - len(serial_number)) * '0' + serial_number
+                serial_number_bulk.append(SerialNumberModel(serial_number=serial_number, add_time=now_time))
+
+            # 记录操作日志
+            ip = CommonService.get_ip_address(request)
+            content = json.loads(json.dumps(request_dict))
+            log = {
+                'ip': ip,
+                'user_id': 1,
+                'status': 200,
+                'time': now_time,
+                'url': 'serialNumber/create',
+                'content': json.dumps(content),
+                'operation': '生成{}个Serial Number{}: {}'.format(quantity, '成功', '同步更新成功'),
+            }
+
+            # 开启事务写入
+            with transaction.atomic():
+                SerialNumberModel.objects.bulk_create(serial_number_bulk)
+                Log = LogModel.objects.create(**log)
+
+                # 同步更新业务服务器和uid管理系统的序列号表
+                url1 = 'http://test.zositechc.cn/serialNumber/create'
+                url2 = 'https://www.zositechc.cn/serialNumber/create'
+                url3 = 'http://www.dvema.com/serialNumber/create'
+                url4 = 'http://www.zositeche.com/company/createSerial'
+                requests_data = {'quantity': quantity}
+
+                res1 = requests.post(url=url1, data=requests_data, timeout=2 * 60)
+                if res1.status_code != 200:
+                    fail_reason = '请求测试服务器生成Serial Number响应状态码异常'
+                    return self.failResponse(quantity, fail_reason, Log, response)
+                res1 = res1.json()
+                if res1['result_code'] != 0:
+                    fail_reason = '测试服务器生成Serial Number发生异常'
+                    return self.failResponse(quantity, fail_reason, Log, response)
+
+                res2 = requests.post(url=url2, data=requests_data, timeout=2 * 60)
+                if res2.status_code != 200:
+                    fail_reason = '请求国内服务器生成Serial Number响应状态码异常'
+                    return self.failResponse(quantity, fail_reason, Log, response)
+                res2 = res2.json()
+                if res2['result_code'] != 0:
+                    fail_reason = '国内服务器生成Serial Number发生异常'
+                    return self.failResponse(quantity, fail_reason, Log, response)
+
+                res3 = requests.post(url=url3, data=requests_data, timeout=2 * 60)
+                if res3.status_code != 200:
+                    fail_reason = '请求国外服务器生成Serial Number响应状态码异常'
+                    return self.failResponse(quantity, fail_reason, Log, response)
+                res3 = res3.json()
+                if res3['result_code'] != 0:
+                    fail_reason = '国外服务器生成Serial Number发生异常'
+                    return self.failResponse(quantity, fail_reason, Log, response)
+                res4 = requests.post(url=url4, data=requests_data, timeout=2 * 60)
+                if res4.status_code != 200:
+                    fail_reason = '请求uid管理系统生成Company Serial响应状态码异常'
+                    return self.failResponse(quantity, fail_reason, Log, response)
+                res4 = res4.json()
+                if res4['code'] != 0:
+                    fail_reason = 'uid管理系统生成Company Serial发生异常'
+                    return self.failResponse(quantity, fail_reason, Log, response)
+                return response.json(0)
+
+        except Exception as e:
+            djangoLogger = logging.getLogger('django')
+            djangoLogger.exception(repr(e))
+            return response.json(176)
+
+    def failResponse(self, quantity, fail_reason, Log, response):
+        operation = '生成{}个Serial Number{}: {}'.format(quantity, '失败', fail_reason)
+        Log.operation = operation
+        Log.save()
+        return response.json(177)
+
     def do_quantity(self, request_dict, userID, response):
+        """
+        查询当前可用的UID的数量
+        :param request_dict: 请求参数
+        :param userID: 响应对象
+        :param response: 请求
+        :return:
+        """
         user_qs = UserModel.objects.filter(id=userID)
         if not user_qs.exists():
             return response.json(9)
 
-        user = user_qs[0]
-
-        result = UserSerialNumberModel.objects.filter(user__id=user.id, serial_number__use_status=1).aggregate(num=Count('serial_number__use_status'))
-        chenyundev = result['num']
         unused_serial_number_count = SerialNumberModel.objects.filter(use_status=0).count()
-        chenyun = SerialNumberModel.objects.filter(use_status=1).count()
-        res_data = {'code': 0, 'chenyun': chenyun, 'unused_serial_number_count': unused_serial_number_count, 'chenyundev': chenyundev}
+        remain_qs = CompanySerialModel.objects.filter(status=1).count()
+        company_qs = CompanyModel.objects.values('id', 'name')
+        company_serial_list = []    # 剩余已分配未使用的序列号数量
+        company_not_used_list = []   # 已使用的序列号数量
+        for company in company_qs:
+            id = company['id']
+            name = company['name']
+            not_used_qs = CompanySerialModel.objects.filter(status=3, company_id=id).count()
+            res = {
+                'name': name,
+                'number': not_used_qs
+            }
+            company_not_used_list.append(res)
+
+        for company in company_qs:
+            id = company['id']
+            name = company['name']
+            company_used_qs = CompanySerialModel.objects.filter(status=1, company_id=id).count()
+            res = {
+                'name': name,
+                'numbers': company_used_qs
+            }
+            company_serial_list.append(res)
+        res_data = {'code': 0, 'companyRemainCount': company_not_used_list, 'companyRemain': company_serial_list,
+                    'unused_serial_number_count': unused_serial_number_count,
+                    'unused_all_count': remain_qs}
         return response.json(0, {'data': res_data})
 
     def do_create(self, request_dict, response):
@@ -84,9 +353,9 @@ class SerialNumberView(View):
             algorithm = AlgorithmBaseOn35()
             for i in range(quantity):
                 serial_number = algorithm.getLetter(sum)
-                sum += 1    # sum每次递增1
+                sum += 1  # sum每次递增1
                 # 前面补0至六位
-                serial_number = (6-len(serial_number))*'0' + serial_number
+                serial_number = (6 - len(serial_number)) * '0' + serial_number
                 serial_number_bulk.append(SerialNumberModel(serial_number=serial_number, add_time=now_time))
             # 开启事务写入
             with transaction.atomic():
@@ -107,7 +376,6 @@ class SerialNumberView(View):
         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)
 
@@ -117,12 +385,12 @@ class SerialNumberView(View):
             return response.json(444, 'username')
 
         # 取出对应区域可用的UID分配给allot_user
-        sn_qs = SerialNumberModel.objects.filter(use_status=0)[0:quantity]
+        sn_qs = SerialNumberModel.objects.filter(use_status=3)[0:quantity]
         sns = []
         for sn in sn_qs:
             sns.append(sn.serial_number)
 
-        cs_qs = CompanySerialModel.objects.filter(serial_number__in=sns, status=1)
+        cs_qs = CompanySerialModel.objects.filter(serial_number__in=sns, status=3)
 
         sns = []
         for cs in cs_qs:
@@ -132,48 +400,52 @@ class SerialNumberView(View):
         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,
-                    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:
+        try:
+            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,
+                        add_time=item.add_time
+                    )
+                    CompanySerialModel.objects.filter(serial_number=item.serial_number).update(status=1)
+                    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)
 
-            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)
+                del datas
+                del updates
+                return response.json(0)
+            else:
+                return response.json(444)
+        except Exception as e:
+            print(e)
+            return response.json(500)
 
     # 提供给pc端获取序列号
     def do_get_serial_number(self, request_dict, request, response):
-        quantity = 1   #只能取一个
+        quantity = 1  # 只能取一个
         company_id = request_dict.get('company_id', None)
         token = request_dict.get('token', None)
         time_stamp = request_dict.get('time_stamp', None)
@@ -205,17 +477,18 @@ class SerialNumberView(View):
             return response.json(9)
 
         user = user_qs[0]
-        result = UserSerialNumberModel.objects.filter(user__id=user.id, serial_number__use_status=1).\
+        result = UserSerialNumberModel.objects.filter(user__id=user.id, serial_number__use_status=1). \
             aggregate(num=Count('serial_number__use_status'))
 
-        us_qs = UserSerialNumberModel.objects.filter(user__id=user.id, serial_number__use_status=1).\
+        us_qs = UserSerialNumberModel.objects.filter(user__id=user.id, serial_number__use_status=1). \
             values('serial_number__serial_number')
 
         sns = []
         for us in us_qs:
             sns.append(us['serial_number__serial_number'])
 
-        cs_qs = CompanySerialModel.objects.filter(serial_number__in=sns, status=1, company__secret=company_id).values('serial_number', 'company__mark')
+        cs_qs = CompanySerialModel.objects.filter(serial_number__in=sns, status=1, company__secret=company_id).values(
+            'serial_number', 'company__mark')
         sns = []
         mark = ""
         if cs_qs.exists():
@@ -231,7 +504,7 @@ class SerialNumberView(View):
             return response.json(444, '序列号不足')
 
         try:
-            with transaction.atomic():      # 开启事务
+            with transaction.atomic():  # 开启事务
                 sn_qs = sn_qs[0: quantity]
                 serial_number = sn_qs[0].serial_number
                 # 防止重复获取序列号
@@ -240,7 +513,7 @@ class SerialNumberView(View):
                 if not is_lock:
                     return response.json(5)
 
-                if not mac:     # 不传入则分配mac
+                if not mac:  # 不传入则分配mac
                     mac_qs = MacModel.objects.filter().values('id', 'value', 'is_active')[0]
                     if not mac_qs['is_active']:
                         return response.json(175)
@@ -264,6 +537,9 @@ class SerialNumberView(View):
                 updates.append(serialNumberModel)
                 bulk_update(updates)
 
+                # 更新企业关联序列号状态
+                CompanySerialModel.objects.filter(serial_number=serial_number).update(status=2, update_time=now_time)
+
                 # 记录操作日志
                 ip = CommonService.get_ip_address(request)
                 content = json.loads(json.dumps(request.POST))
@@ -283,4 +559,3 @@ class SerialNumberView(View):
         except Exception as e:
             redisObj.del_data(key=serial_operate_lock_key)  # redis解锁
             return response.json(500, repr(e))
-