ソースを参照

Merge remote-tracking branch 'remotes/origin/locky' into test

Ansjer 10 ヶ月 前
コミット
d26ad59a70
3 ファイル変更124 行追加68 行削除
  1. 95 2
      Controller/Cron/CronTaskController.py
  2. 14 66
      Controller/SerialNumberController.py
  3. 15 0
      Model/models.py

+ 95 - 2
Controller/Cron/CronTaskController.py

@@ -30,14 +30,15 @@ from Model.models import Device_User, Device_Info, UidSetModel, UID_Bucket, Unus
     CountryModel, DeviceTypeModel, OrdersSummary, DeviceInfoSummary, CompanySerialModel, \
     CountryModel, DeviceTypeModel, OrdersSummary, DeviceInfoSummary, CompanySerialModel, \
     CloudLogModel, UidCloudStorageCount, UserExModel, DeviceDomainRegionModel, VodHlsTag, VodHlsTagType, IcloudService, \
     CloudLogModel, UidCloudStorageCount, UserExModel, DeviceDomainRegionModel, VodHlsTag, VodHlsTagType, IcloudService, \
     Store_Meal, Lang, VodBucketModel, UnicomComboOrderInfo, UnicomDeviceInfo, AbnormalOrder, DailyReconciliation, \
     Store_Meal, Lang, VodBucketModel, UnicomComboOrderInfo, UnicomDeviceInfo, AbnormalOrder, DailyReconciliation, \
-    CustomizedPush, UIDCompanySerialModel, UIDModel, LogModel, OperatingCosts, UidBucketStatistics, AppScannedSerial
+    CustomizedPush, UIDCompanySerialModel, UIDModel, LogModel, OperatingCosts, UidBucketStatistics, AppScannedSerial, \
+    SerialUnbindUID, UidUserModel, UidPushModel, iotdeviceInfoModel, ExperienceAiModel
 from Object.AWS.AmazonS3Util import AmazonS3Util
 from Object.AWS.AmazonS3Util import AmazonS3Util
 from Object.AWS.S3Email import S3Email
 from Object.AWS.S3Email import S3Email
 from Object.RedisObject import RedisObject
 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 Service.EquipmentInfoService import EQUIPMENT_INFO_MODEL_LIST
+from Service.EquipmentInfoService import EQUIPMENT_INFO_MODEL_LIST, EquipmentInfoService
 from Service.VodHlsService import SplitVodHlsObject
 from Service.VodHlsService import SplitVodHlsObject
 from Object.UnicomObject import UnicomObjeect
 from Object.UnicomObject import UnicomObjeect
 from Object.WechatPayObject import WechatPayObject
 from Object.WechatPayObject import WechatPayObject
@@ -503,6 +504,8 @@ class CronUpdateDataView(View):
             return self.reqUpdateSerialStatus(response)
             return self.reqUpdateSerialStatus(response)
         elif operation == 'updateSerialStatus':  # 更新序列号状态
         elif operation == 'updateSerialStatus':  # 更新序列号状态
             return self.updateSerialStatus(request_dict, response)
             return self.updateSerialStatus(request_dict, response)
+        elif operation == 'deleteUidData':  # 清除uid数据
+            return self.deleteUidData(request_dict, response)
         elif operation == 'reset-region-id':  # 重置地区id
         elif operation == 'reset-region-id':  # 重置地区id
             return self.reset_region_id(request_dict, response)
             return self.reset_region_id(request_dict, response)
         elif operation == 'updateVodMeal':  # 定时修改体验套餐有效期为1个月
         elif operation == 'updateVodMeal':  # 定时修改体验套餐有效期为1个月
@@ -770,6 +773,96 @@ class CronUpdateDataView(View):
             LOGGER.info('---更新序列号状态异常---:{}'.format(repr(e)))
             LOGGER.info('---更新序列号状态异常---:{}'.format(repr(e)))
             return response.json(500)
             return response.json(500)
 
 
+    @staticmethod
+    def deleteUidData(request_dict, response):
+        """
+        清除uid数据
+        @param request_dict: 请求参数
+        @request_dict serial_redis_list: 序列号redis列表
+        @param response: 响应对象
+        """
+        serial_unbind_uid_qs = SerialUnbindUID.objects.filter(status=0).values_list('serial', 'uid')
+        # 没有需要清除的数据直接返回
+        if not serial_unbind_uid_qs.exists():
+            return response.json(0)
+        # 获取序列号,uid列表
+        serial_list, uid_list = [], []
+        for serial_unbind_uid in serial_unbind_uid_qs:
+            serial_list.append(serial_unbind_uid['serial'])
+            uid_list.append(serial_unbind_uid['uid'])
+
+        now_time = int(time.time())
+        redis_obj = RedisObject()
+        try:
+            with transaction.atomic():
+                # 更新序列号解绑uid表状态
+                serial_unbind_uid_qs.update(status=1, updated_time=now_time)
+                # 更新序列号状态
+                CompanySerialModel.objects.filter(serial_number__in=serial_list).update(status=1, update_time=now_time)
+                UIDCompanySerialModel.objects.filter(company_serial__serial_number__in=serial_list).delete()
+                # 删除设备相关数据,参考后台的设备重置删除的数据
+                Device_Info.objects.filter(UID__in=uid_list).delete()
+                UidSetModel.objects.filter(uid__in=uid_list).delete()
+                UidUserModel.objects.filter(UID__in=uid_list).delete()
+                UidPushModel.objects.filter(uid_set__uid__in=uid_list).delete()
+                iotdeviceInfoModel.objects.filter(serial_number__in=serial_list).delete()
+                # 删除推送消息
+                EquipmentInfoService.delete_all_equipment_info(device_uid__in=uid_list)
+
+                # 重置设备云存
+                UID_Bucket.objects.filter(uid__in=uid_list).delete()
+                Unused_Uid_Meal.objects.filter(uid__in=uid_list).delete()
+                # Order_Model.objects.filter(UID__in=uid_list).delete()
+                StsCrdModel.objects.filter(uid__in=uid_list).delete()
+                VodHlsModel.objects.filter(uid__in=uid_list).delete()
+                # 删除vod_hls分表数据
+                split_vod_hls_obj = SplitVodHlsObject()
+                split_vod_hls_obj.del_vod_hls_data(uid__in=uid_list)
+                ExperienceContextModel.objects.filter(uid__in=uid_list).delete()
+
+                # 重置AI
+                ExperienceAiModel.objects.filter(uid__in=uid_list).delete()
+                AiService.objects.filter(uid__in=uid_list).delete()
+
+                # 写入未使用序列号redis列表
+                redis_obj.rpush(UNUSED_SERIAL_REDIS_LIST, *serial_list)
+
+                # 重置region_id,不为美洲服,则写入redis列表
+                if CONFIG_INFO == CONFIG_US:
+                    DeviceDomainRegionModel.objects.filter(serial_number__in=serial_list).update(region_id=0)
+                else:
+                    redis_obj.rpush(RESET_REGION_ID_SERIAL_REDIS_LIST, *serial_list)
+
+                # 重置已使用的uid的使用状态为未使用,更新时间
+                UIDModel.objects.filter(uid__in=uid_list, status=2).update(status=0, mac='', update_time=now_time)
+
+                # 重置扫码记录
+                AppScannedSerial.objects.filter(serial__in=serial_list).delete()
+
+                # 记录操作日志
+                end_time = int(time.time())
+                log = {
+                    'user_id': 1,
+                    'status': 200,
+                    'time': now_time,
+                    'url': 'cron/update/deleteUidData',
+                    'operation': '已解绑序列号清除uid成功,执行时间{}秒'.format(end_time - now_time),
+                }
+                LogModel.objects.create(**log)
+
+            return response.json(0)
+        except Exception as e:
+            # 记录操作日志
+            log = {
+                'user_id': 1,
+                'status': 200,
+                'time': now_time,
+                'url': 'cron/update/deleteUidData',
+                'operation': '已解绑序列号清除uid异常:{}'.format(repr(e))
+            }
+            LogModel.objects.create(**log)
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
     @staticmethod
     @staticmethod
     def reset_region_id(request_dict, response):
     def reset_region_id(request_dict, response):
         """
         """

+ 14 - 66
Controller/SerialNumberController.py

@@ -15,7 +15,7 @@ from Controller.UnicomCombo.UnicomComboController import UnicomComboView
 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, \
-    AiService, DeviceDomainRegionModel, RegionModel, UidPushModel, AppScannedSerial, Device_User
+    AiService, DeviceDomainRegionModel, RegionModel, UidPushModel, AppScannedSerial, Device_User, SerialUnbindUID
 from Object.AWS.S3Email import S3Email
 from Object.AWS.S3Email import S3Email
 from Object.RedisObject import RedisObject
 from Object.RedisObject import RedisObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
@@ -139,6 +139,11 @@ class SerialNumberView(View):
             if serial in unused_serial_redis_list:
             if serial in unused_serial_redis_list:
                 return response.json(5)
                 return response.json(5)
 
 
+            # 判断序列号是否未清除uid数据
+            serial_unbind_uid_qs = SerialUnbindUID.objects.filter(serial=serial, status=0)
+            if serial_unbind_uid_qs.exists():
+                return response.json(5)
+
             # 判断序列号是否已和企业关联
             # 判断序列号是否已和企业关联
             company_serial_qs = CompanySerialModel.objects.filter(company__secret=company_secret, serial_number=serial)
             company_serial_qs = CompanySerialModel.objects.filter(company__secret=company_secret, serial_number=serial)
             if not company_serial_qs.exists():
             if not company_serial_qs.exists():
@@ -566,71 +571,14 @@ class SerialNumberView(View):
         used_serial_redis_list = [str(i, 'utf-8') for i in used_serial_redis_list]
         used_serial_redis_list = [str(i, 'utf-8') for i in used_serial_redis_list]
         if serial in used_serial_redis_list:
         if serial in used_serial_redis_list:
             return response.json(5)
             return response.json(5)
+        # 判断序列号是否未清除uid数据
+        serial_unbind_uid_qs = SerialUnbindUID.objects.filter(serial=serial, status=0)
+        if serial_unbind_uid_qs.exists():
+            return response.json(5)
         try:
         try:
-            with transaction.atomic():
-                uid = uid_serial.uid.uid
-                # 更新序列号状态
-                company_serial_qs.update(status=1, update_time=now_time)
-                # 删除设备相关数据,参考后台的设备重置删除的数据
-                Device_Info.objects.filter(UID=uid).delete()
-                UidSetModel.objects.filter(uid=uid).delete()
-                UidUserModel.objects.filter(UID=uid).delete()
-                UidPushModel.objects.filter(uid_set__uid=uid).delete()
-                iotdeviceInfoModel.objects.filter(serial_number=serial).delete()
-                # 删除推送消息
-                EquipmentInfoService.delete_all_equipment_info(device_uid=uid)
-
-                # 重置设备云存
-                UID_Bucket.objects.filter(uid=uid).delete()
-                Unused_Uid_Meal.objects.filter(uid=uid).delete()
-                # Order_Model.objects.filter(UID=uid).delete()
-                StsCrdModel.objects.filter(uid=uid).delete()
-                VodHlsModel.objects.filter(uid=uid).delete()
-                # 删除vod_hls分表数据
-                split_vod_hls_obj = SplitVodHlsObject()
-                split_vod_hls_obj.del_vod_hls_data(uid=uid)
-                ExperienceContextModel.objects.filter(uid=uid).delete()
-
-                # 重置AI
-                ExperienceAiModel.objects.filter(uid=uid).delete()
-                AiService.objects.filter(uid=uid).delete()
-
-                # 写入未使用序列号redis列表
-                redisObj.rpush(UNUSED_SERIAL_REDIS_LIST, serial)
-
-                # 重置region_id,不为美洲服,则写入redis列表
-                if CONFIG_INFO == CONFIG_US:
-                    DeviceDomainRegionModel.objects.filter(serial_number=serial).update(region_id=0)
-                else:
-                    redisObj.rpush(RESET_REGION_ID_SERIAL_REDIS_LIST, serial)
-
-                # 重置已使用的uid的使用状态为未使用,更新时间
-                UIDModel.objects.filter(uid=uid, status=2).update(status=0, mac='', update_time=now_time)
-                uid_serial.delete()
-
-                # 重置扫码记录
-                AppScannedSerial.objects.filter(serial=serial).delete()
-
-                # 异步调用客户代理平台同步序列号解绑UID
-                agent_thread = threading.Thread(target=AgentDeviceView.device_binding_or_unbinding,
-                                                args=(serial_number[0:9], 2))
-                agent_thread.start()
-
-                # 记录操作日志
-                ip = CommonService.get_ip_address(request)
-                content = json.loads(json.dumps(request_dict))
-                end_time = int(time.time())
-                log = {
-                    'ip': ip,
-                    'user_id': 1,
-                    'status': 200,
-                    'time': now_time,
-                    'content': json.dumps(content),
-                    'url': 'serialNumber/detachUID',
-                    'operation': '序列号{}解绑uid{},执行时间{}秒'.format(serial, uid, end_time-now_time),
-                }
-                LogModel.objects.create(**log)
-
+            uid = uid_serial.uid.uid
+            # 写入序列号解绑uid表
+            SerialUnbindUID.objects.create(serial=serial, uid=uid, created_time=now_time, updated_time=now_time)
             return response.json(0)
             return response.json(0)
         except Exception as e:
         except Exception as e:
             # 记录操作日志
             # 记录操作日志
@@ -643,7 +591,7 @@ class SerialNumberView(View):
                 'time': now_time,
                 'time': now_time,
                 'content': json.dumps(content) + '异常:{}'.format(repr(e)),
                 'content': json.dumps(content) + '异常:{}'.format(repr(e)),
                 'url': 'serialNumber/detachUID',
                 'url': 'serialNumber/detachUID',
-                'operation': '序列号{}解绑uid{}异常'.format(serial, uid),
+                'operation': '序列号{}解绑uid异常'.format(serial),
             }
             }
             LogModel.objects.create(**log)
             LogModel.objects.create(**log)
             return response.json(176, str(e))
             return response.json(176, str(e))

+ 15 - 0
Model/models.py

@@ -5281,3 +5281,18 @@ class CustomCustomerDevice(models.Model):
     class Meta:
     class Meta:
         db_table = 'custom_customer_device'
         db_table = 'custom_customer_device'
         verbose_name = '定制客户设备'
         verbose_name = '定制客户设备'
+
+
+class SerialUnbindUID(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='自增标记ID')
+    serial = models.CharField(default='', max_length=9, db_index=True, verbose_name='序列号')
+    uid = models.CharField(default='', max_length=32, verbose_name='设备uid')
+    # 0: 未清除uid数据, 1: 已清除uid数据
+    status = models.IntegerField(default=0, verbose_name='状态')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'unbound_serial'
+        verbose_name = '序列号解绑uid'
+