Browse Source

设备版本配置新增4G带云存、优化烧录UID管理

zhangdongming 2 weeks ago
parent
commit
9363455430

+ 5 - 0
AdminController/DeviceManagementController.py

@@ -1509,6 +1509,7 @@ class DeviceManagement(View):
                         'otherFeatures': device_ver_info.other_features,
                         'electricityStatistics': device_ver_info.electricity_statistics,
                         'supportsPetTracking': device_ver_info.supports_pet_tracking,
+                        'has4gCloud': device_ver_info.has_4g_cloud,
                         'createdTime': device_ver_info.created_time,
                         'updatedTime': device_ver_info.updated_time
                     }
@@ -1547,6 +1548,7 @@ class DeviceManagement(View):
         other_features = request_dict.get('otherFeatures', None)
         electricity_statistics = request_dict.get('electricityStatistics', 0)
         supports_pet_tracking = request_dict.get('supportsPetTracking', 0)
+        has_4g_cloud = request_dict.get('has4gCloud', -1)
         if not all([d_code, software_ver, video_code,
                     device_type, supports_alarm,
                     screen_channels, network_type]
@@ -1587,6 +1589,7 @@ class DeviceManagement(View):
                 other_features=other_features,
                 electricity_statistics=electricity_statistics,
                 supports_pet_tracking=supports_pet_tracking,
+                has_4g_cloud=has_4g_cloud,
                 created_time=now_time,
                 updated_time=now_time
             )
@@ -1620,6 +1623,7 @@ class DeviceManagement(View):
         other_features = request_dict.get('otherFeatures', None)
         electricity_statistics = request_dict.get('electricityStatistics', 0)
         supports_pet_tracking = request_dict.get('supportsPetTracking', 0)
+        has_4g_cloud = request_dict.get('has4gCloud', -1)
 
         if not all([device_ver_id, video_code, device_type, supports_alarm, screen_channels, network_type]):
             return response.json(444)
@@ -1668,6 +1672,7 @@ class DeviceManagement(View):
                 other_features=other_features,
                 electricity_statistics=electricity_statistics,
                 supports_pet_tracking=supports_pet_tracking,
+                has_4g_cloud=has_4g_cloud,
                 created_time=now_time,
                 updated_time=now_time
             )

+ 15 - 7
AdminController/UIDBurnManageController.py

@@ -506,7 +506,7 @@ class UIDBurnManageView(View):
             base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
             upload_dir = os.path.join(base_dir, 'static', 'uploaded_files')
             os.makedirs(upload_dir, exist_ok=True)
-            file_path = os.path.join(upload_dir, f"{task_id}.xlsx")
+            file_path = os.path.join(upload_dir, f"{task_id}.xls")
 
             with open(file_path, 'wb+') as destination:
                 for chunk in excel_file.chunks():
@@ -544,9 +544,9 @@ class UIDBurnManageView(View):
             redis_obj.set_data(redis_key, json.dumps(task_data))
 
             # 1. 读取Excel文件获取总行数
-            wb = load_workbook(file_path)
-            ws = wb.active
-            total_rows = ws.max_row
+            workbook = xlrd.open_workbook(file_path)
+            sheet = workbook.sheet_by_index(0)
+            total_rows = sheet.nrows
 
             # 更新总行数和开始时间
             task_data['total'] = total_rows
@@ -572,9 +572,10 @@ class UIDBurnManageView(View):
             processed = 0
             uids_batch = []
 
-            for row in ws.iter_rows(min_row=1, values_only=True):
-                if row[0]:
-                    uid = str(row[0]).strip()
+            for row_idx in range(0, total_rows):
+                row = sheet.row_values(row_idx)
+                if len(row) > 2 and row[2]:
+                    uid = str(row[2]).strip()
                     if uid:
                         uids_batch.append(uid)
                         processed += 1
@@ -856,6 +857,13 @@ class UIDBurnManageView(View):
             except ValueError:
                 return response.json(444, "batch_id必须是整数")
 
+        uid = request_dict.get('uid', None)
+        if uid:
+            query &= Q(uid=uid)
+        burn_id = request_dict.get('burnId')
+        if burn_id:
+            burn_id = int(burn_id)
+            query &= Q(burn_id=burn_id)
         # 4. 查询并分页
         uid_qs = BurnEncryptedICUID.objects.filter(query).order_by('-created_time').values(
             'id', 'uid', 'batch_id', 'status', 'created_time', 'updated_time'

+ 1 - 1
AgentModel/models.py

@@ -221,7 +221,7 @@ class DeviceCustomUID(models.Model):
 
 class BurnRecord(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='自增标记ID')
-    order_number = models.CharField(default='', max_length=32, unique=True, verbose_name='订单号')
+    order_number = models.CharField(default='', max_length=32, verbose_name='订单号')
     burn_count = models.IntegerField(verbose_name='烧录数量')
     purpose = models.TextField(verbose_name='用途')
     created_time = models.IntegerField(default=0, verbose_name='创建时间')

+ 39 - 0
Controller/UserDevice/DeviceVersionInfoController.py

@@ -61,6 +61,11 @@ class DeviceVersionInfoView(View):
             return self.validateUserDevice(userID, request, request_dict, response)
         elif operation == 'clearDeviceVersionCache':
             return self.clear_device_version_cache(userID, request, request_dict, response)
+        elif operation == 'getDeviceVersion':
+            d_code = request_dict.get('d_code')
+            ver = request_dict.get('ver')
+            res = self.cache_device_version_info(d_code, ver)
+            return response.json(0, res)
         else:
             return response.json(414)
     @classmethod
@@ -154,6 +159,40 @@ class DeviceVersionInfoView(View):
         except Exception as e:
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
+    @classmethod
+    def cache_device_version_info(cls, d_code, ver):
+        """
+        缓存设备版本信息
+        :param d_code: 设备规格码(软件方案)
+        :param ver: 设备版本号
+        :return: 设备版本信息字典或 None
+        """
+        redis = RedisObject()
+        version_key = f"{RedisKeyConstant.ZOSI_DEVICE_VERSION_INFO.value}{ver}{d_code}"
+
+        try:
+            version_info = redis.get_data(version_key)
+            if version_info:
+                return json.loads(version_info)
+        except Exception as e:
+            LOGGER.error(f"Redis get failed for key {version_key}: {e}")
+            return None
+
+        device_info = DeviceVersionInfo.objects.filter(
+            d_code=d_code, software_ver=ver
+        ).values().first()
+
+        if not device_info:
+            return None
+
+        try:
+            redis.set_data(version_key, json.dumps(device_info), 60 * 60 * 24)
+        except Exception as e:
+            LOGGER.error(f"Redis set failed for key {version_key}: {e}")
+            return None
+
+        return device_info
+
     @classmethod
     def validateUserDevice(cls, user_id, request, request_dict, response):
         """

+ 1 - 0
Model/models.py

@@ -5225,6 +5225,7 @@ class DeviceVersionInfo(models.Model):
     other_features = models.JSONField(null=True, verbose_name='其它功能')
     electricity_statistics = models.IntegerField(default=0, verbose_name='电量显示')
     supports_pet_tracking = models.SmallIntegerField(default=0, verbose_name='是否支持宠物追踪')
+    has_4g_cloud = models.SmallIntegerField(default=-1, verbose_name='-1:未配置,0:是4G但没云存,1:4G带云存')
     created_time = models.IntegerField(default=0, verbose_name='创建时间')
     updated_time = models.IntegerField(default=0, verbose_name='更新时间')