Browse Source

序列号解绑uid写入表,定时任务清除uid数据

locky 10 months ago
parent
commit
c99efe0f82
3 changed files with 123 additions and 62 deletions
  1. 95 2
      Controller/Cron/CronTaskController.py
  2. 13 60
      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, \
     CloudLogModel, UidCloudStorageCount, UserExModel, DeviceDomainRegionModel, VodHlsTag, VodHlsTagType, \
     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.S3Email import S3Email
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.utils import LocalDateTimeUtil
 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 Object.UnicomObject import UnicomObjeect
 from Object.WechatPayObject import WechatPayObject
@@ -481,6 +482,8 @@ class CronUpdateDataView(View):
             return self.reqUpdateSerialStatus(response)
         elif operation == 'updateSerialStatus':  # 更新序列号状态
             return self.updateSerialStatus(request_dict, response)
+        elif operation == 'deleteUidData':  # 清除uid数据
+            return self.deleteUidData(request_dict, response)
         elif operation == 'reset-region-id':  # 重置地区id
             return self.reset_region_id(request_dict, response)
         elif operation == 'updateVodMeal':  # 定时修改体验套餐有效期为1个月
@@ -732,6 +735,96 @@ class CronUpdateDataView(View):
             LOGGER.info('---更新序列号状态异常---:{}'.format(repr(e)))
             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('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(serial_list, uid_list, 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(serial_list, uid_list, repr(e))
+            }
+            LogModel.objects.create(**log)
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
     @staticmethod
     def reset_region_id(request_dict, response):
         """

+ 13 - 60
Controller/SerialNumberController.py

@@ -15,7 +15,7 @@ from Controller.UnicomCombo.UnicomComboController import UnicomComboView
 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, \
-    AiService, DeviceDomainRegionModel, RegionModel, UidPushModel, AppScannedSerial, Device_User
+    AiService, DeviceDomainRegionModel, RegionModel, UidPushModel, AppScannedSerial, Device_User, SerialUnbindUID
 from Object.AWS.S3Email import S3Email
 from Object.RedisObject import RedisObject
 from Object.TokenObject import TokenObject
@@ -137,6 +137,11 @@ class SerialNumberView(View):
             if serial in unused_serial_redis_list:
                 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)
             if not company_serial_qs.exists():
@@ -559,66 +564,14 @@ class SerialNumberView(View):
         used_serial_redis_list = [str(i, 'utf-8') for i in used_serial_redis_list]
         if serial in used_serial_redis_list:
             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:
-            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()
-
-                # 记录操作日志
-                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)
         except Exception as e:
             # 记录操作日志

+ 15 - 0
Model/models.py

@@ -5110,3 +5110,18 @@ class TokenRecord(models.Model):
     class Meta:
         db_table = 'token_record'
         verbose_name = 'token记录表'
+
+
+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'
+