Forráskód Böngészése

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

locky 2 éve
szülő
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 datetime
 
@@ -21,6 +7,10 @@ CONFIG_CN = 'cn'
 CONFIG_US = 'us'
 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')
 print(SERVER_TYPE)
 
@@ -91,6 +81,7 @@ SERVER_DOMAIN_US = 'http://www.dvema.com/'
 SERVER_DOMAIN_CN = 'http://www.zositechc.cn/'
 SERVER_DOMAIN_EUR = 'http://www.zositeche.com/'
 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
 # @Software: PyCharm
 import datetime
+import threading
 import time
 
+import requests
 from django.db import connection, connections, transaction
 from django.db.models import Q, Sum, Count
 from django.views import View
 
 from Model.models import Device_User, Device_Info, UidSetModel, UID_Bucket, Unused_Uid_Meal, Order_Model, StsCrdModel, \
     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.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
+from Ansjer.config import USED_SERIAL_REDIS_LIST, UNUSED_SERIAL_REDIS_LIST
 
 
 class CronDelDataView(View):
@@ -203,6 +207,10 @@ class CronUpdateDataView(View):
             return self.updateUnusedUidBucket(response)
         elif operation == 'updateUnusedAiService':  # 定时更新过期ai关联的未使用套餐状态
             return self.updateUnusedAiService(response)
+        elif operation == 'reqUpdateSerialStatus':  # 定时请求更新序列号状态
+            return self.reqUpdateSerialStatus(response)
+        elif operation == 'updateSerialStatus':  # 更新序列号状态
+            return self.updateSerialStatus(request_dict, response)
         else:
             return response.json(404)
 
@@ -291,6 +299,52 @@ class CronUpdateDataView(View):
                 continue
         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):
     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 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, \
     iotdeviceInfoModel, LogModel, UidSetModel, UID_Bucket, \
     Unused_Uid_Meal, Order_Model, StsCrdModel, VodHlsModel, ExperienceContextModel, UidUserModel, ExperienceAiModel, \
@@ -233,12 +233,8 @@ class SerialNumberView(View):
                             'operation': '序列号{}绑定uid: {}'.format(serial, uid.uid),
                         }
                         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)
                         return response.json(0, res)
                     return response.json(5)
@@ -322,7 +318,7 @@ class SerialNumberView(View):
         if not uid_serial_qs.exists():
             return response.json(173)
         uid_serial = uid_serial_qs[0]
-
+        redisObj = RedisObject()
         try:
             with transaction.atomic():
                 uid = uid_serial.uid.uid
@@ -348,12 +344,8 @@ class SerialNumberView(View):
                 ExperienceAiModel.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的使用状态为未使用
                 uid_serial.delete()

+ 18 - 1
Service/CommonService.py

@@ -17,7 +17,7 @@ from django.utils import timezone
 from pyipip import IPIPDatabase
 
 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 Model.models import iotdeviceInfoModel, Device_Info, CountryModel, RegionModel, UIDModel
 from Object.ResponseObject import ResponseObject
@@ -711,6 +711,23 @@ GCqvlyw5dfxNA+EtxNE2wCW/LW7ENJlACgcfgPlBZtpLheWoZB/maw4=
             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
     def list_sort(e):
         """