|
@@ -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,表示服务不可用
|