Browse Source

Merge branch 'test' of http://192.168.136.99:3000/servers/ASJServer into ming

# Conflicts:
#	AdminController/ProductsSchemeManageController.py
zhangdongming 3 tháng trước cách đây
mục cha
commit
0df34f984d

+ 38 - 23
AdminController/ProductsSchemeManageController.py

@@ -8,8 +8,7 @@
 """
 import datetime
 import json
-import secrets
-import string
+import logging
 import time
 from io import BytesIO
 
@@ -20,10 +19,11 @@ from django.db.models import Q
 from django.http import QueryDict, HttpResponse
 from django.views import View
 
-from Ansjer.config import LOGGER
 from Model.models import ProductsScheme, DeviceScheme
+from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
+from Ansjer.config import LOGGER
 
 
 class ProductsSchemeManageView(View):
@@ -73,10 +73,10 @@ class ProductsSchemeManageView(View):
 
         # 操作路由映射
         operation_handlers = {
-            'queryList': self.query_list,  # 查询列表
-            'add': self.add_scheme,  # 添加方案
-            'edit': self.edit_scheme,  # 编辑方案
-            'delete': self.delete_scheme,  # 删除方案
+            'queryList': self.query_list,# 查询列表
+            'add': self.add_scheme,# 添加方案
+            'edit': self.edit_scheme,# 编辑方案
+            'delete': self.delete_scheme,# 删除方案
             'generateQR': self.generate_qr_code,  # 生成二维码
             'deviceSchemeList': self.device_scheme_list
         }
@@ -90,7 +90,6 @@ class ProductsSchemeManageView(View):
         except Exception as e:
             LOGGER.error(f"操作{operation}执行异常:{repr(e)}")
             return response.json(500, "服务器内部错误")
-
     def query_list(self, user_id, request_dict, response):
         """查询方案列表(优化点:分页封装/字段映射)"""
         # 参数处理与验证
@@ -145,20 +144,36 @@ class ProductsSchemeManageView(View):
         })
 
     @staticmethod
-    def generate_timestamp_code(device_type: int = 0) -> str:
+    def _generate_storage_code(device_type=0):
         """
-        方案1:基于时间戳的编码
-        格式:PC+设备类型+年月日+时分秒+6位随机大写字符
-        示例:PC020250519143022-ABCDEF
+        生成入库编码规则:SC+年月日+3位序列号
+        示例:SC20231125-001
+        特性:
+        1. 每日按设备类型独立计数(Redis原子计数器)
+        2. 自动处理分布式并发
+        3. 序列号每日自动重置
         """
-        current_time = datetime.datetime.now()
         try:
-            date_part = current_time.strftime("%Y%m%d%H%M%S")
-            # 使用string.ascii_uppercase生成大写随机字符
-            random_part = ''.join(secrets.choice(string.ascii_uppercase) for _ in range(6))
-            return f"PC{device_type}{date_part}-{random_part}"
+            redis_conn = RedisObject(2)
+            # 生成 Redis 键名(格式:SC日期:设备类型)
+            date_prefix = datetime.datetime.now().strftime("SC%Y%m%d")
+            redis_key = f"{date_prefix}:{device_type}"
+
+            # 原子操作:递增并获取序列号(自动创建并设置过期时间)
+            sequence = redis_conn.incr(redis_key)
+
+            # 首次创建时设置过期时间(保留两天防止跨天边界问题)
+            if sequence == 1:
+                redis_conn.set_expire(redis_key, 172800)  # 60*60*24*2 = 2天
+
+            # 检查序列号溢出
+            if sequence > 999:
+                raise ValueError(f"当日设备类型 {device_type} 的序列号已超过最大值999")
+
+            return f"{date_prefix}-{sequence:03d}"
+
         except Exception as e:
-            LOGGER.error(f"添加方案异常:{repr(e)}")
+            LOGGER.error(f"生成storage_code失败: {str(e)}")
             raise
 
     def add_scheme(self, user_id, request_dict, response):
@@ -167,7 +182,7 @@ class ProductsSchemeManageView(View):
             device_type = int(request_dict.get('deviceType', 0))
 
             # 生成唯一storage_code
-            storage_code = self.generate_timestamp_code(device_type)
+            storage_code = self._generate_storage_code(device_type)
 
             # 构造方案数据
             scheme_data = {
@@ -350,7 +365,7 @@ class ProductsSchemeManageView(View):
             'sensor': scheme.sensor,
             'orderQuantity': scheme.order_quantity,
             'customerCode': scheme.customer_code,
-            'phy': scheme.phy,
+            'phy':scheme.phy,
             'remark': scheme.remark,
             'createdTime': scheme.created_time,
             'createdBy': scheme.created_by
@@ -453,7 +468,7 @@ class ProductsSchemeManageView(View):
                 device_data = {
                     'id': device.id,
                     'serialNumber': device.serial_number,
-                    'type': 'NVR' if device.device_type == 1 else 'IPC',
+                    'deviceType': device.device_type,
                     'phoneModel': device.phone_model,
                     'storageCode': device.storage_code,
                     'createdTime': device.created_time,
@@ -462,7 +477,7 @@ class ProductsSchemeManageView(View):
                 if product_scheme:
                     device_data.update({
                         'orderNumber': product_scheme.order_number if product_scheme.order_number else '',
-                        'deviceType': product_scheme.device_type if product_scheme.device_type else '',
+                        'type': 'NVR' if product_scheme.device_type == 1 else 'IPC',
                         'flash': product_scheme.flash if product_scheme.flash else '',
                         'ddr': product_scheme.ddr if product_scheme.ddr else '',
                         'mainController': product_scheme.main_controller if product_scheme.main_controller else '',
@@ -485,4 +500,4 @@ class ProductsSchemeManageView(View):
             return response.json(0, data)
         except Exception as e:
             print(e)
-            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 1 - 1
Controller/IncomeProductsController.py

@@ -50,7 +50,7 @@ class IncomeProductsView(View):
             if device_scheme_qs.exists():
                 storage_code = device_scheme_qs.first().storage_code
                 LOGGER.info(f"设备关联产品方案, serialNumber已存在, storageCode: {storage_code}, serialNumber: {serial_number}")
-                return response.json(173, f"数据已存在, storage_code为: {storage_code}")
+                return response.json(174, f"数据已存在, storage_code为: {storage_code}")
 
             now_time = int(time.time())