Browse Source

绑定和解绑序列号通过redis列表方式更新其他服务器的序列号状态

locky 2 years ago
parent
commit
468ee2ce2d

+ 5 - 14
Ansjer/config.py

@@ -1,17 +1,3 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-"""
-@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
-@AUTHOR: ASJRD018
-@NAME: Ansjer
-@software: PyCharm
-@DATE: 2018/7/2 14:06
-@Version: python3.6
-@MODIFY DECORD:ansjer dev
-@file: Conf.py
-@Contact: chanjunkai@163.com
-"""
-# 主要静态变量配置文件
 import os
 import os
 import datetime
 import datetime
 
 
@@ -21,6 +7,10 @@ CONFIG_CN = 'cn'
 CONFIG_US = 'us'
 CONFIG_US = 'us'
 CONFIG_EUR = 'eur'
 CONFIG_EUR = 'eur'
 
 
+# redis列表
+USED_SERIAL_REDIS_LIST = 'used_serial_redis_list'
+UNUSED_SERIAL_REDIS_LIST = 'unused_serial_redis_list'
+
 SERVER_TYPE = os.environ.get('DJANGO_SETTINGS_MODULE')
 SERVER_TYPE = os.environ.get('DJANGO_SETTINGS_MODULE')
 print(SERVER_TYPE)
 print(SERVER_TYPE)
 
 
@@ -91,6 +81,7 @@ SERVER_DOMAIN_US = 'http://www.dvema.com/'
 SERVER_DOMAIN_CN = 'http://www.zositechc.cn/'
 SERVER_DOMAIN_CN = 'http://www.zositechc.cn/'
 SERVER_DOMAIN_EUR = 'http://www.zositeche.com/'
 SERVER_DOMAIN_EUR = 'http://www.zositeche.com/'
 SERVER_DOMAIN_TEST = 'http://test.zositechc.cn/'
 SERVER_DOMAIN_TEST = 'http://test.zositechc.cn/'
+SERVER_DOMAIN_LIST = [SERVER_DOMAIN_US, SERVER_DOMAIN_CN, SERVER_DOMAIN_EUR, SERVER_DOMAIN_TEST]
 
 
 # 不同环境配置
 # 不同环境配置
 # 本地
 # 本地

+ 55 - 1
Controller/Cron/CronTaskController.py

@@ -8,18 +8,22 @@
 # @File    : CronTaskController.py
 # @File    : CronTaskController.py
 # @Software: PyCharm
 # @Software: PyCharm
 import datetime
 import datetime
+import threading
 import time
 import time
 
 
+import requests
 from django.db import connection, connections, transaction
 from django.db import connection, connections, transaction
 from django.db.models import Q, Sum, Count
 from django.db.models import Q, Sum, Count
 from django.views import View
 from django.views import View
 
 
 from Model.models import Device_User, Device_Info, UidSetModel, UID_Bucket, Unused_Uid_Meal, Order_Model, StsCrdModel, \
 from Model.models import Device_User, Device_Info, UidSetModel, UID_Bucket, Unused_Uid_Meal, Order_Model, StsCrdModel, \
     VodHlsModel, ExperienceContextModel, AiService, VodHlsSummary, VideoPlaybackTimeModel, DeviceUserSummary, \
     VodHlsModel, ExperienceContextModel, AiService, VodHlsSummary, VideoPlaybackTimeModel, DeviceUserSummary, \
-    CountryModel, DeviceTypeModel, Lang, UnicomCombo, OrdersSummary, DeviceInfoSummary
+    CountryModel, DeviceTypeModel, Lang, UnicomCombo, OrdersSummary, DeviceInfoSummary, CompanySerialModel
+from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.utils import LocalDateTimeUtil
 from Object.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
+from Ansjer.config import USED_SERIAL_REDIS_LIST, UNUSED_SERIAL_REDIS_LIST
 
 
 
 
 class CronDelDataView(View):
 class CronDelDataView(View):
@@ -203,6 +207,10 @@ class CronUpdateDataView(View):
             return self.updateUnusedUidBucket(response)
             return self.updateUnusedUidBucket(response)
         elif operation == 'updateUnusedAiService':  # 定时更新过期ai关联的未使用套餐状态
         elif operation == 'updateUnusedAiService':  # 定时更新过期ai关联的未使用套餐状态
             return self.updateUnusedAiService(response)
             return self.updateUnusedAiService(response)
+        elif operation == 'reqUpdateSerialStatus':  # 定时请求更新序列号状态
+            return self.reqUpdateSerialStatus(response)
+        elif operation == 'updateSerialStatus':  # 更新序列号状态
+            return self.updateSerialStatus(request_dict, response)
         else:
         else:
             return response.json(404)
             return response.json(404)
 
 
@@ -291,6 +299,52 @@ class CronUpdateDataView(View):
                 continue
                 continue
         return response.json(0)
         return response.json(0)
 
 
+    @classmethod
+    def reqUpdateSerialStatus(cls, response):
+        redis_obj = RedisObject()
+        # 更新已使用序列号其他服务器的状态
+        used_serial_redis_list_len = redis_obj.llen(USED_SERIAL_REDIS_LIST)
+        if used_serial_redis_list_len > 0:
+            used_serial_redis_list = []
+            for i in range(used_serial_redis_list_len):
+                used_serial_redis_list.append(redis_obj.lpop(USED_SERIAL_REDIS_LIST))
+            request_thread = threading.Thread(target=cls.do_request_thread, args=(used_serial_redis_list, 3))
+            request_thread.start()
+        # 更新未使用序列号其他服务器的状态
+        unused_serial_redis_list_len = redis_obj.llen(UNUSED_SERIAL_REDIS_LIST)
+        if unused_serial_redis_list_len > 0:
+            unused_serial_redis_list = []
+            for i in range(unused_serial_redis_list_len):
+                unused_serial_redis_list.append(redis_obj.lpop(UNUSED_SERIAL_REDIS_LIST))
+            request_thread = threading.Thread(target=cls.do_request_thread, args=(used_serial_redis_list, 1))
+            request_thread.start()
+        return response.json(0)
+
+    @staticmethod
+    def do_request_thread(serial_redis_list, status):
+        """
+        请求更新序列号线程
+        @param serial_redis_list: 序列号redis列表
+        @param status: 状态, 1: 未使用, 3: 已占用
+        """
+        data = {
+            'serial_redis_list': serial_redis_list,
+            'status': status
+        }
+        # 确认域名列表
+        orders_domain_name_list = CommonService.get_orders_domain_name_list()
+        for domain_name in orders_domain_name_list:
+            url = '{}cron/update/updateSerialStatus'.format(domain_name)
+            requests.post(url=url, data=data, timeout=2)
+
+    @staticmethod
+    def updateSerialStatus(request_dict, response):
+        serial_redis_list = request_dict.get('serial_redis_list', None)
+        status = request_dict.get('status', None)
+        if not all([serial_redis_list, status]):
+            return response.json(444)
+        serial_redis_list = eval(serial_redis_list)
+        CompanySerialModel.objects.filter(serial_number__in=serial_redis_list).update(status=int(status))
 
 
 class CronCollectDataView(View):
 class CronCollectDataView(View):
     def get(self, request, *args, **kwargs):
     def get(self, request, *args, **kwargs):

+ 6 - 14
Controller/SerialNumberController.py

@@ -9,7 +9,7 @@ from django.db import transaction
 from django.views import View
 from django.views import View
 
 
 from Ansjer.config import CRCKey, SERVER_DOMAIN_US, SERVER_DOMAIN_CN, CONFIG_INFO, CONFIG_TEST, CONFIG_US, \
 from Ansjer.config import CRCKey, SERVER_DOMAIN_US, SERVER_DOMAIN_CN, CONFIG_INFO, CONFIG_TEST, CONFIG_US, \
-    CONFIG_CN
+    CONFIG_CN, USED_SERIAL_REDIS_LIST, UNUSED_SERIAL_REDIS_LIST
 from Model.models import SerialNumberModel, CompanySerialModel, UIDCompanySerialModel, UIDModel, Device_Info, \
 from Model.models import SerialNumberModel, CompanySerialModel, UIDCompanySerialModel, UIDModel, Device_Info, \
     iotdeviceInfoModel, LogModel, UidSetModel, UID_Bucket, \
     iotdeviceInfoModel, LogModel, UidSetModel, UID_Bucket, \
     Unused_Uid_Meal, Order_Model, StsCrdModel, VodHlsModel, ExperienceContextModel, UidUserModel, ExperienceAiModel, \
     Unused_Uid_Meal, Order_Model, StsCrdModel, VodHlsModel, ExperienceContextModel, UidUserModel, ExperienceAiModel, \
@@ -233,12 +233,8 @@ class SerialNumberView(View):
                             'operation': '序列号{}绑定uid: {}'.format(serial, uid.uid),
                             'operation': '序列号{}绑定uid: {}'.format(serial, uid.uid),
                         }
                         }
                         LogModel.objects.create(**log)
                         LogModel.objects.create(**log)
-                        # 修改其他数据库的序列号使用状态为已占用
-                        update_success = self.update_serial_status(serial=serial, status=3)
-                        try:
-                            assert update_success
-                        except AssertionError:
-                            return response.json(378)
+                        if CONFIG_INFO != CONFIG_TEST:  # 不为测试服,则序列号写入redis列表
+                            redisObj.rpush(USED_SERIAL_REDIS_LIST, serial)
                         redisObj.del_data(key=key)
                         redisObj.del_data(key=key)
                         return response.json(0, res)
                         return response.json(0, res)
                     return response.json(5)
                     return response.json(5)
@@ -322,7 +318,7 @@ class SerialNumberView(View):
         if not uid_serial_qs.exists():
         if not uid_serial_qs.exists():
             return response.json(173)
             return response.json(173)
         uid_serial = uid_serial_qs[0]
         uid_serial = uid_serial_qs[0]
-
+        redisObj = RedisObject()
         try:
         try:
             with transaction.atomic():
             with transaction.atomic():
                 uid = uid_serial.uid.uid
                 uid = uid_serial.uid.uid
@@ -348,12 +344,8 @@ class SerialNumberView(View):
                 ExperienceAiModel.objects.filter(uid=uid).delete()
                 ExperienceAiModel.objects.filter(uid=uid).delete()
                 AiService.objects.filter(uid=uid).delete()
                 AiService.objects.filter(uid=uid).delete()
 
 
-                # 修改其他数据库的序列号使用状态为已使用
-                update_success = self.update_serial_status(serial=serial, status=1)
-                try:
-                    assert update_success
-                except AssertionError:
-                    return response.json(378)
+                if CONFIG_INFO != CONFIG_TEST:  # 不为测试服,则序列号写入redis列表
+                    redisObj.rpush(UNUSED_SERIAL_REDIS_LIST, serial)
 
 
                 UIDModel.objects.filter(uid=uid).update(status=0, mac='')  # 重置uid的使用状态为未使用
                 UIDModel.objects.filter(uid=uid).update(status=0, mac='')  # 重置uid的使用状态为未使用
                 uid_serial.delete()
                 uid_serial.delete()

+ 18 - 1
Service/CommonService.py

@@ -17,7 +17,7 @@ from django.utils import timezone
 from pyipip import IPIPDatabase
 from pyipip import IPIPDatabase
 
 
 from Ansjer.config import BASE_DIR, SERVER_DOMAIN_SSL, CONFIG_INFO, CONFIG_TEST, CONFIG_CN, SERVER_DOMAIN_TEST, \
 from Ansjer.config import BASE_DIR, SERVER_DOMAIN_SSL, CONFIG_INFO, CONFIG_TEST, CONFIG_CN, SERVER_DOMAIN_TEST, \
-    SERVER_DOMAIN_CN, SERVER_DOMAIN_US, CONFIG_US, CONFIG_EUR
+    SERVER_DOMAIN_CN, SERVER_DOMAIN_US, CONFIG_US, CONFIG_EUR, SERVER_DOMAIN_LIST, SERVER_DOMAIN_EUR
 from Controller.CheckUserData import RandomStr
 from Controller.CheckUserData import RandomStr
 from Model.models import iotdeviceInfoModel, Device_Info, CountryModel, RegionModel, UIDModel
 from Model.models import iotdeviceInfoModel, Device_Info, CountryModel, RegionModel, UIDModel
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
@@ -711,6 +711,23 @@ GCqvlyw5dfxNA+EtxNE2wCW/LW7ENJlACgcfgPlBZtpLheWoZB/maw4=
             domain_name_list = []
             domain_name_list = []
         return domain_name_list
         return domain_name_list
 
 
+    @staticmethod
+    def get_orders_domain_name_list():
+        """
+        获取其他服务器域名列表
+        @return: orders_domain_name_list 其他服务器域名列表
+        """
+        orders_domain_name_list = SERVER_DOMAIN_LIST
+        if CONFIG_INFO == CONFIG_TEST:
+            orders_domain_name_list.remove(SERVER_DOMAIN_TEST)
+        elif CONFIG_INFO == CONFIG_CN:
+            orders_domain_name_list.remove(SERVER_DOMAIN_CN)
+        elif CONFIG_INFO == CONFIG_US:
+            orders_domain_name_list.remove(SERVER_DOMAIN_US)
+        elif CONFIG_INFO == CONFIG_EUR:
+            orders_domain_name_list.remove(SERVER_DOMAIN_EUR)
+        return orders_domain_name_list
+
     @staticmethod
     @staticmethod
     def list_sort(e):
     def list_sort(e):
         """
         """