Explorar o código

新增序列号前端检查API

zhangdongming hai 9 meses
pai
achega
09c98e31a1
Modificáronse 2 ficheiros con 208 adicións e 2 borrados
  1. 188 2
      Controller/UserDevice/SerialNumberCheckController.py
  2. 20 0
      Model/models.py

+ 188 - 2
Controller/UserDevice/SerialNumberCheckController.py

@@ -8,12 +8,14 @@
 """
 import time
 
+import requests
 from django.http import QueryDict
 from django.views import View
 
 from Ansjer.config import LOGGER
-from Model.models import SerialNumberCheckLog
+from Model.models import SerialNumberCheckLog, SerialNumberRenovateLog, Device_Info
 from Object.ResponseObject import ResponseObject
+from Service.CommonService import CommonService
 
 
 class SerialNumberView(View):
@@ -43,8 +45,12 @@ class SerialNumberView(View):
 
     def validation(self, request_dict, request, operation):
         response = ResponseObject('cn')
-        if operation == 'serialNumberCheck':
+        if operation == 'serialNumberCheck':  # 扫码序列号查重
             return self.save_serial_number_log(request_dict, response)
+        elif operation == 'addSerialNumberRenovate':  # 添加序列号翻新记录
+            return self.serial_number_renovate_check(request, request_dict, response)
+        elif operation == 'getSerialNumberRenovation':  # 查询序列号翻新记录
+            return self.get_serial_number_renovation(request, request_dict, response)
 
     @classmethod
     def save_serial_number_log(cls, request_dict, response):
@@ -116,3 +122,183 @@ class SerialNumberView(View):
             LOGGER.error('APP扫码工具保存日志异常:errLine:{}, errMsg:{}'
                          .format(e.__traceback__.tb_lineno, repr(e)))
             return response.json(5)
+
+    @classmethod
+    def serial_number_renovate_check(cls, request, request_dict, response):
+        """
+        序列号翻新检查
+        @param request: 请求体
+        @param request_dict: 请求参数
+        @param response: 响应参数
+        @return: 返回序列号查询结果
+        """
+        # 获取完整序列号
+        full_serial_number = request_dict.get("serialNo")
+
+        try:
+            # 获取请求的IP地址和手机型号
+            ip_address = CommonService.get_ip_address(request)
+            phone_model = request_dict.get("phoneModel")
+
+            # 检查序列号分配方式URL
+            check_url = 'http://serial.zositechc.cn:7880/serialNumber/checkSerialLog'
+
+            if not full_serial_number:
+                return response.json(444)
+
+            LOGGER.info('翻新前端检查: serial: {}, ip: {}'.format(full_serial_number, ip_address))
+
+            # 获取序列号的前6位进行检查
+            serial_number_prefix = full_serial_number[:6]
+            params = {'serial': serial_number_prefix}
+
+            # 向外部服务发送请求以检查序列号
+            response_from_service = requests.get(check_url, params=params, timeout=10)
+            result = response_from_service.json()
+
+            # 根据返回结果确定分发类型
+            distribution_type = 1 if result['code'] == 0 else 0
+
+            # 查询翻新记录
+            renovation_logs = SerialNumberRenovateLog.objects.filter(serial_no=serial_number_prefix)
+            current_time = int(time.time())
+
+            # 准备插入或更新的参数
+            insert_or_update_params = {
+                'serial_number': serial_number_prefix,
+                'full_serial_number': full_serial_number,
+                'count': 1,
+                'operation_count': 1,
+                'phone_model': phone_model,
+                'created_time': current_time,
+                'updated_time': current_time,
+                'type': 1
+            }
+
+            # 获取UID并查询设备信息
+            uid = CommonService.get_uid_by_serial_number(serial_number=serial_number_prefix)
+            device_info = Device_Info.objects.filter(UID=uid)
+            user_name = device_info[0].username if device_info.exists() else ''
+            user_added = 1 if device_info.exists() else 0
+            scan_log = 1 if SerialNumberCheckLog.objects.filter(serial_number=serial_number_prefix).exists() else 0
+
+            # 创建或更新翻新记录
+            cls.create_or_update_renovation_log(renovation_logs, insert_or_update_params, current_time)
+
+            # 准备返回的数据
+            response_data = {
+                'distributionType': distribution_type,
+                'userAdded': user_added,
+                'userName': user_name,
+                'scanLog': scan_log,
+                'color': 'red' if distribution_type == 0 or user_added == 1 or scan_log == 0 else 'green'
+            }
+
+            return response.json(0, {'data': response_data})
+
+        except Exception as e:
+            # 记录异常信息
+            LOGGER.error('翻新前端检查异常 serial: {}: errLine: {}, errMsg: {}'.format(
+                full_serial_number, e.__traceback__.tb_lineno, repr(e)))
+            return response.json(503)
+
+    @classmethod
+    def create_or_update_renovation_log(cls, renovation_logs, params, current_time):
+        """创建或更新翻新记录"""
+        if not renovation_logs.exists():
+            SerialNumberRenovateLog.objects.create(**params)
+        else:
+            # 更新现有记录
+            should_reset = False
+            count = 0
+            operation_count = 0
+
+            for log in renovation_logs:
+                should_reset = log.type == 2 and log.count == 1
+                count = log.count if log.type == 1 else 1
+                operation_count = log.operation_count if log.type == 1 else 1
+
+            if should_reset:
+                # 更新操作计数和重置计数
+                SerialNumberRenovateLog.objects.filter(serial_number=params['serial_number'], type=1) \
+                    .update(operation_count=1, count=count + 1, updated_time=current_time)
+                SerialNumberRenovateLog.objects.filter(serial_number=params['serial_number'], type=2) \
+                    .update(operation_count=1, count=0, updated_time=current_time)
+            else:
+                # 仅更新操作计数
+                SerialNumberRenovateLog.objects.filter(serial_number=params['serial_number'], type=1) \
+                    .update(operation_count=operation_count + 1, count=count, updated_time=current_time)
+
+    @classmethod
+    def get_serial_number_renovation(cls, request, request_dict, response):
+        """
+        获取序列号翻新记录
+        @param request: 请求体
+        @param request_dict: 请求参数
+        @param response: 响应结果
+        @return: 返回查询结果
+        """
+        # 获取完整序列号
+        full_serial_number = request_dict.get("serialNo")
+
+        # 检查序列号是否存在
+        if not full_serial_number:
+            return response.json(444)  # 返回错误代码444,表示序列号缺失
+
+        try:
+            # 获取请求的IP地址和手机型号
+            ip_address = CommonService.get_ip_address(request)
+            phone_model = request_dict.get("phoneModel")
+
+            # 提取序列号前缀(前6位)
+            serial_number_prefix = full_serial_number[:6]
+            LOGGER.info('翻新入库检查: serial: {}, ip: {}'.format(full_serial_number, ip_address))
+
+            # 查询翻新记录和翻新前记录
+            renovation_logs = SerialNumberRenovateLog.objects.filter(serial_no=serial_number_prefix, type=2)
+            renovation_before_logs = SerialNumberRenovateLog.objects.filter(serial_no=serial_number_prefix, type=1)
+
+            # 获取当前时间戳
+            now_time = int(time.time())
+
+            # 准备插入或更新的参数
+            insert_or_update_params = {
+                'serial_number': serial_number_prefix,
+                'full_serial_number': full_serial_number,
+                'count': 1,
+                'operation_count': 1,
+                'phone_model': phone_model,
+                'created_time': now_time,
+                'updated_time': now_time,
+                'type': 2
+            }
+
+            # 如果没有翻新记录,则创建新记录
+            if not renovation_logs.exists():
+                SerialNumberRenovateLog.objects.create(**insert_or_update_params)
+            else:
+                # 如果存在翻新记录,则更新操作计数和更新时间
+                renovation_logs.update(operation_count=renovation_logs[0].operation_count + 1, updated_time=now_time)
+
+                # 获取翻新前记录的操作计数
+            count = renovation_before_logs[0].operation_count if renovation_before_logs.exists() else 0
+
+            # 根据操作计数确定颜色
+            color = 'red'  # 默认颜色为红色
+            if count == 0:
+                color = 'yellow'  # 操作计数为0时为黄色
+            elif count == 1:
+                color = 'green'  # 操作计数为1时为绿色
+
+            # 准备返回的数据
+            res_data = {
+                'checkCount': count,
+                'color': color
+            }
+            return response.json(0, {'data': res_data})  # 返回成功响应
+
+        except Exception as e:
+            # 记录异常信息
+            LOGGER.error('翻新入库检查异常 serial: {}: errLine: {}, errMsg: {}'.format(
+                full_serial_number, e.__traceback__.tb_lineno, repr(e)))
+            return response.json(503)  # 返回错误代码503,表示服务不可用

+ 20 - 0
Model/models.py

@@ -5105,6 +5105,26 @@ class SerialNumberCheckLog(models.Model):
         verbose_name_plural = verbose_name
 
 
+class SerialNumberRenovateLog(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='自增id')
+    serial_number = models.CharField(blank=True, db_index=True, max_length=20, default='',
+                                     verbose_name='6序列号')
+    full_serial_number = models.CharField(blank=True, db_index=True, max_length=20, default='',
+                                          verbose_name='完成序列号')
+    operation_count = models.IntegerField(default=0, verbose_name='计算')
+    count = models.IntegerField(default=0, verbose_name='翻新次数')
+    # 翻新检查类型,1:翻新前端检查,2.翻新入库检查
+    type = models.SmallIntegerField(default=1, verbose_name='翻新操作类型')
+    phone_model = models.CharField(max_length=64, default='', verbose_name='手机型号')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'serial_number_renovate_log'
+        verbose_name = '序列号翻新日志'
+        verbose_name_plural = verbose_name
+
+
 class RegionRestriction(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='自增id')
     statusName = models.CharField(max_length=255, unique=True)