SerialNumberCheckController.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : SerialNumberCheckController.py
  4. @Time : 2024/6/20 13:33
  5. @Author : stephen
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import time
  10. import requests
  11. from django.http import QueryDict
  12. from django.views import View
  13. from Ansjer.config import LOGGER
  14. from Model.models import SerialNumberCheckLog, SerialNumberRenovateLog, Device_Info
  15. from Object.ResponseObject import ResponseObject
  16. from Service.CommonService import CommonService
  17. class SerialNumberView(View):
  18. def get(self, request, *args, **kwargs):
  19. request.encoding = 'utf-8'
  20. operation = kwargs.get('operation')
  21. return self.validation(request.GET, request, operation)
  22. def post(self, request, *args, **kwargs):
  23. request.encoding = 'utf-8'
  24. operation = kwargs.get('operation')
  25. return self.validation(request.POST, request, operation)
  26. def delete(self, request, *args, **kwargs):
  27. request.encoding = 'utf-8'
  28. operation = kwargs.get('operation')
  29. delete = QueryDict(request.body)
  30. if not delete:
  31. delete = request.GET
  32. return self.validation(delete, request, operation)
  33. def put(self, request, *args, **kwargs):
  34. request.encoding = 'utf-8'
  35. operation = kwargs.get('operation')
  36. put = QueryDict(request.body)
  37. return self.validation(put, request, operation)
  38. def validation(self, request_dict, request, operation):
  39. response = ResponseObject('cn')
  40. if operation == 'serialNumberCheck': # 扫码序列号查重
  41. return self.save_serial_number_log(request_dict, response)
  42. elif operation == 'addSerialNumberRenovate': # 添加序列号翻新记录
  43. return self.serial_number_renovate_check(request, request_dict, response)
  44. elif operation == 'getSerialNumberRenovation': # 查询序列号翻新记录
  45. return self.get_serial_number_renovation(request, request_dict, response)
  46. @classmethod
  47. def save_serial_number_log(cls, request_dict, response):
  48. """
  49. 保存APP扫码工具排查序列号重复日志
  50. @param request_dict: 序列号、手机型号、类型
  51. @param response: 响应类
  52. @return:
  53. """
  54. serial_no = request_dict.get("serialNo", None)
  55. phone_model = request_dict.get("phoneModel", None)
  56. if not serial_no:
  57. return response.json(444)
  58. p_type = int(request_dict.get('type', 0))
  59. n_time = int(time.time())
  60. try:
  61. dict_type = {'1': '三乡总装', '2': '三乡包装', '3': '三乡返工', '4': '三乡管理', '5': '珠海翻新', '6': '珠海管理'}
  62. first_serial = serial_no[:6]
  63. # 查询当前工位是否扫过序列号
  64. first_serial_qs = SerialNumberCheckLog.objects.filter(serial_number=first_serial)
  65. # 工位类型,1:三乡总装,2:三乡包装,3:三乡返工,4:三乡管理,5:珠海翻新,6:珠海管理
  66. if p_type == 4 or p_type == 6:
  67. first_serial_qs = first_serial_qs.filter(type__in=[2, 5]) if p_type == 6 \
  68. else first_serial_qs.exclude(type=5)
  69. first_serial_qs = first_serial_qs.order_by('type', '-created_time')
  70. if not first_serial_qs.exists():
  71. return response.json(173)
  72. logs = []
  73. # 管理分类可查询当前序列号扫码记录
  74. for item in first_serial_qs:
  75. log_dict = {'fullSerialNumber': item.full_serial_number, 'count': item.count, 'type': item.type,
  76. 'createdTime': item.created_time, 'stationName': dict_type[str(item.type)],
  77. 'phoneModel': item.phone_model}
  78. logs.append(log_dict)
  79. result = {'logs': logs}
  80. return response.json(0, result)
  81. first_serial_qs = first_serial_qs.filter(type=p_type)
  82. if first_serial_qs.exists():
  83. # APP扫码工具记录+1
  84. params = {'serial_number': first_serial, 'created_time': n_time,
  85. 'full_serial_number': serial_no, 'type': p_type, 'phone_model': phone_model}
  86. SerialNumberCheckLog.objects.create(**params)
  87. # 返回当前序列号数据结构
  88. log_dict = {'fullSerialNumber': first_serial_qs[0].full_serial_number,
  89. 'count': first_serial_qs[0].count, 'type': first_serial_qs[0].type,
  90. 'createdTime': first_serial_qs[0].created_time,
  91. 'stationName': dict_type[str(first_serial_qs[0].type)],
  92. 'phoneModel': first_serial_qs[0].phone_model}
  93. result = {'logs': [log_dict]}
  94. return response.json(174, result)
  95. else:
  96. params = {'serial_number': first_serial, 'created_time': n_time,
  97. 'full_serial_number': serial_no, 'type': p_type, 'phone_model': phone_model}
  98. SerialNumberCheckLog.objects.create(**params)
  99. # 珠海翻新查询三乡包装扫码记录超过2次则提示异常
  100. if p_type == 5:
  101. s_qs = SerialNumberCheckLog.objects.filter(serial_number=first_serial, type=2)
  102. if s_qs.count() >= 2:
  103. # 返回当前序列号数据结构
  104. log_dict = {'fullSerialNumber': s_qs[0].full_serial_number,
  105. 'count': s_qs[0].count, 'type': s_qs[0].type,
  106. 'createdTime': s_qs[0].created_time,
  107. 'stationName': dict_type[str(s_qs[0].type)],
  108. 'phoneModel': s_qs[0].phone_model}
  109. result = {'logs': [log_dict]}
  110. return response.json(174, result)
  111. return response.json(0)
  112. except Exception as e:
  113. LOGGER.error('APP扫码工具保存日志异常:errLine:{}, errMsg:{}'
  114. .format(e.__traceback__.tb_lineno, repr(e)))
  115. return response.json(5)
  116. @classmethod
  117. def serial_number_renovate_check(cls, request, request_dict, response):
  118. """
  119. 序列号翻新检查
  120. @param request: 请求体
  121. @param request_dict: 请求参数
  122. @param response: 响应参数
  123. @return: 返回序列号查询结果
  124. """
  125. # 获取完整序列号
  126. full_serial_number = request_dict.get("serialNo")
  127. try:
  128. # 获取请求的IP地址和手机型号
  129. ip_address = CommonService.get_ip_address(request)
  130. phone_model = request_dict.get("phoneModel")
  131. # 检查序列号分配方式URL
  132. check_url = 'http://serial.zositechc.cn:7880/serialNumber/checkSerialLog'
  133. if not full_serial_number:
  134. return response.json(444)
  135. LOGGER.info('翻新前端检查: serial: {}, ip: {}'.format(full_serial_number, ip_address))
  136. # 获取序列号的前6位进行检查
  137. serial_number_prefix = full_serial_number[:6]
  138. params = {'serial': serial_number_prefix}
  139. # 向外部服务发送请求以检查序列号
  140. response_from_service = requests.get(check_url, params=params, timeout=10)
  141. result = response_from_service.json()
  142. # 根据返回结果确定分发类型
  143. distribution_type = 1 if result['code'] == 0 else 0
  144. # 查询翻新记录
  145. renovation_logs = SerialNumberRenovateLog.objects.filter(serial_number=serial_number_prefix)
  146. current_time = int(time.time())
  147. # 准备插入或更新的参数
  148. insert_or_update_params = {
  149. 'serial_number': serial_number_prefix,
  150. 'full_serial_number': full_serial_number,
  151. 'count': 1,
  152. 'operation_count': 1,
  153. 'phone_model': phone_model,
  154. 'created_time': current_time,
  155. 'updated_time': current_time,
  156. 'type': 1
  157. }
  158. # 获取UID并查询设备信息
  159. uid = CommonService.get_uid_by_serial_number(serial_number=serial_number_prefix)
  160. device_info = Device_Info.objects.filter(UID=uid).values('userID__username')
  161. user_name = device_info[0]['userID__username'] if device_info.exists() else ''
  162. user_added = 1 if device_info.exists() else 0
  163. scan_log = 1 if SerialNumberCheckLog.objects.filter(serial_number=serial_number_prefix).exists() else 0
  164. # 创建或更新翻新记录
  165. cls.create_or_update_renovation_log(renovation_logs, insert_or_update_params, current_time)
  166. # 准备返回的数据
  167. response_data = {
  168. 'distributionType': distribution_type,
  169. 'userAdded': user_added,
  170. 'userName': user_name,
  171. 'scanLog': scan_log,
  172. 'color': 'E24A28' if distribution_type == 0 or user_added == 1 or scan_log == 0 else '4EDF4E'
  173. }
  174. return response.json(0, response_data)
  175. except Exception as e:
  176. # 记录异常信息
  177. LOGGER.error('翻新前端检查异常 serial: {}: errLine: {}, errMsg: {}'.format(
  178. full_serial_number, e.__traceback__.tb_lineno, repr(e)))
  179. return response.json(503)
  180. @classmethod
  181. def create_or_update_renovation_log(cls, renovation_logs, params, current_time):
  182. """创建或更新翻新记录"""
  183. if not renovation_logs.exists():
  184. SerialNumberRenovateLog.objects.create(**params)
  185. else:
  186. # 更新现有记录
  187. should_reset = False
  188. # 翻新次数
  189. count = 1
  190. # 扫码检查次数
  191. operation_count = 1
  192. # 是否存在前端检查
  193. frontend = False
  194. for log in renovation_logs:
  195. # 翻新前端==1,翻新入库==2
  196. if log.type == 1:
  197. count = log.count
  198. frontend = True
  199. operation_count = log.operation_count
  200. elif log.type == 2 and log.count == 1:
  201. should_reset = True
  202. if not frontend: # 不存在前端检查新增记录
  203. SerialNumberRenovateLog.objects.create(**params)
  204. elif should_reset:
  205. # 更新操作计数和重置计数
  206. SerialNumberRenovateLog.objects.filter(serial_number=params['serial_number'], type=1) \
  207. .update(operation_count=1, count=count + 1, updated_time=current_time)
  208. SerialNumberRenovateLog.objects.filter(serial_number=params['serial_number'], type=2) \
  209. .update(operation_count=1, count=0, updated_time=current_time)
  210. else:
  211. # 仅更新操作计数
  212. SerialNumberRenovateLog.objects.filter(serial_number=params['serial_number'], type=1) \
  213. .update(operation_count=operation_count + 1, count=count, updated_time=current_time)
  214. @classmethod
  215. def get_serial_number_renovation(cls, request, request_dict, response):
  216. """
  217. 获取序列号翻新记录
  218. @param request: 请求体
  219. @param request_dict: 请求参数
  220. @param response: 响应结果
  221. @return: 返回查询结果
  222. """
  223. # 获取完整序列号
  224. full_serial_number = request_dict.get("serialNo")
  225. # 检查序列号是否存在
  226. if not full_serial_number:
  227. return response.json(444) # 返回错误代码444,表示序列号缺失
  228. try:
  229. # 获取请求的IP地址和手机型号
  230. ip_address = CommonService.get_ip_address(request)
  231. phone_model = request_dict.get("phoneModel")
  232. # 提取序列号前缀(前6位)
  233. serial_number_prefix = full_serial_number[:6]
  234. LOGGER.info('翻新入库检查: serial: {}, ip: {}'.format(full_serial_number, ip_address))
  235. # 查询翻新记录和翻新前记录
  236. renovation_logs = SerialNumberRenovateLog.objects.filter(serial_number=serial_number_prefix, type=2)
  237. renovation_before_logs = SerialNumberRenovateLog.objects.filter(serial_number=serial_number_prefix, type=1)
  238. # 获取当前时间戳
  239. now_time = int(time.time())
  240. # 准备插入或更新的参数
  241. insert_or_update_params = {
  242. 'serial_number': serial_number_prefix,
  243. 'full_serial_number': full_serial_number,
  244. 'count': 1,
  245. 'operation_count': 1,
  246. 'phone_model': phone_model,
  247. 'created_time': now_time,
  248. 'updated_time': now_time,
  249. 'type': 2
  250. }
  251. # 如果没有入库记录,则创建新记录
  252. if not renovation_logs.exists():
  253. SerialNumberRenovateLog.objects.create(**insert_or_update_params)
  254. else:
  255. # 如果存在入库记录,则更新操作计数和更新时间
  256. renovation_logs.update(operation_count=renovation_logs[0].operation_count + 1, count=1,
  257. updated_time=now_time)
  258. # 获取翻新前记录的操作计数
  259. count = renovation_before_logs[0].operation_count if renovation_before_logs.exists() else 0
  260. # 根据操作计数确定颜色
  261. color = 'E24A28' # 默认颜色为红色
  262. if count == 0:
  263. color = 'E3C310' # 操作计数为0时为黄色
  264. elif count == 1:
  265. color = '4EDF4E' # 操作计数为1时为绿色
  266. # 准备返回的数据
  267. res_data = {
  268. 'checkCount': count,
  269. 'color': color
  270. }
  271. return response.json(0, res_data) # 返回成功响应
  272. except Exception as e:
  273. # 记录异常信息
  274. LOGGER.error('翻新入库检查异常 serial: {}: errLine: {}, errMsg: {}'.format(
  275. full_serial_number, e.__traceback__.tb_lineno, repr(e)))
  276. return response.json(503) # 返回错误代码503,表示服务不可用