SerialNumberController.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623
  1. import json
  2. import logging
  3. import time
  4. import requests
  5. from bulk_update.helper import bulk_update
  6. from django.db import transaction
  7. from django.db.models import Count
  8. from django.views import View
  9. from Model.models import SerialNumberModel, UserModel, UserSerialNumberModel, CompanySerialModel, \
  10. MacModel, LogModel, CompanyModel
  11. from Object.RedisObject import RedisObject
  12. from Object.ResponseObject import ResponseObject
  13. from Object.S3Email import S3Email
  14. from Object.TokenObject import TokenObject
  15. from Service.AlgorithmService import AlgorithmBaseOn35
  16. from Service.CommonService import CommonService
  17. class SerialNumberView(View):
  18. def get(self, request, *args, **kwargs):
  19. request.encoding = 'utf-8'
  20. request_dict = request.GET
  21. operation = kwargs.get('operation')
  22. return self.validate(request_dict, operation, request)
  23. def post(self, request, *args, **kwargs):
  24. request.encoding = 'utf-8'
  25. request_dict = request.POST
  26. operation = kwargs.get('operation')
  27. return self.validate(request_dict, operation, request)
  28. def validate(self, request_dict, operation, request):
  29. response = ResponseObject()
  30. if operation == 'getSerial': # 获取序列号
  31. return self.get_serial(request_dict, response)
  32. elif operation == 'create': # 生成序列号
  33. return self.do_create(request_dict, response)
  34. elif operation == 'mac': # 生成mac
  35. return self.generate_mac(request_dict, response)
  36. elif operation == 'checkSerial': # 序列号库存数量少于2000,发送邮件通知
  37. return self.check_serial_number(response)
  38. token = request_dict.get('token', None)
  39. token = TokenObject(token)
  40. if token.code != 0:
  41. return response.json(token.code)
  42. if operation == 'quantity': # 查询当前可用的UID的数量
  43. return self.do_quantity(token.userID, response)
  44. elif operation == 'allot': # 分配序列号
  45. return self.do_allot(request_dict, response)
  46. elif operation == 'createSerial': # 生成序列号
  47. return self.create_serial(request_dict, response, request, token.userID)
  48. elif operation == 'serialCompany': # 将序列号分匹配到指定企业
  49. return self.do_serial_company(request_dict, response, request, token.userID)
  50. elif operation == 'revise/state': # 修改序列号状态
  51. return self.revise_state(request_dict, response, request)
  52. else:
  53. return response.json(309)
  54. def revise_state(self, request_dict, response, request):
  55. """
  56. 修改序列号状态
  57. @param request_dict:请求参数
  58. @param response: 响应对象
  59. """
  60. use_status = request_dict.get('useStatus', None) # 序列号表的状态
  61. status = request_dict.get('status', None) # 关联企业序列号表的状态
  62. if not all([use_status, status]):
  63. return response.json(444)
  64. serial_number_qs = SerialNumberModel.objects.filter(use_status=use_status).values('serial_number')
  65. if not serial_number_qs.exists():
  66. return response.json(173)
  67. serial_list = [item[key] for item in serial_number_qs for key in item]
  68. try:
  69. country_serial_qs = CompanySerialModel.objects.filter(serial_number__in=serial_list).values('status')
  70. country_serial_qs.filter(status=status).update(status=2)
  71. return response.json(0)
  72. except Exception as e:
  73. print(e)
  74. return response.json(500)
  75. def do_serial_company(self, request_dict, response, request, user_id):
  76. """
  77. 将序列号分匹配到指定企业
  78. :param request_dict: 请求参数
  79. :param response: 响应对象
  80. :param request: 请求
  81. :param user_id: 用户id
  82. :return:
  83. """
  84. id = request_dict.get('id', None)
  85. quantity = request_dict.get('quantity', None)
  86. if not all([id, quantity]):
  87. return response.json(444)
  88. company_qs = CompanyModel.objects.filter(id=id)
  89. if not company_qs.exists():
  90. return response.json(444)
  91. sum_Serial = SerialNumberModel.objects.filter().count()
  92. sum_Serial_company = CompanySerialModel.objects.filter().count()
  93. sum_bind = sum_Serial - sum_Serial_company # 剩余可绑定的序列号
  94. if int(quantity) > int(sum_bind):
  95. return response.json(10041)
  96. try:
  97. company = company_qs[0]
  98. start_1 = sum_Serial_company
  99. end_1 = int(start_1) + int(quantity)
  100. serial_qs = SerialNumberModel.objects.filter()[start_1:end_1]
  101. if not serial_qs.exists():
  102. return response.json(173)
  103. company_serial_bulk = []
  104. now_time = int(time.time())
  105. for item in serial_qs: # 更新状态为已分配但未使用
  106. company_serial_bulk.append(CompanySerialModel(
  107. status=3,
  108. add_time=now_time,
  109. update_time=now_time,
  110. company_id=company.id,
  111. serial_number=item.serial_number,
  112. ))
  113. SerialNumberModel.objects.filter(serial_number=item.serial_number).update(
  114. use_status=3,
  115. add_time=now_time
  116. )
  117. # 记录操作日志
  118. ip = CommonService.get_ip_address(request)
  119. content = json.loads(json.dumps(request_dict))
  120. log = {
  121. 'ip': ip,
  122. 'user_id': user_id,
  123. 'status': 200,
  124. 'time': now_time,
  125. 'url': 'serialNumber/serialCompany',
  126. 'content': json.dumps(content),
  127. 'operation': '{}生成{}个序列号{}: {}'.format(company.name, quantity, '成功', '同步更新成功'),
  128. }
  129. with transaction.atomic():
  130. CompanySerialModel.objects.bulk_create(company_serial_bulk)
  131. company.quantity = CompanySerialModel.objects.filter(company_id=id).count()
  132. company.save()
  133. Log = LogModel.objects.create(**log)
  134. # 同步更新业务服务器和uid管理系统的企业序列号表
  135. url1 = 'http://test.zositechc.cn/company/createSerial'
  136. url2 = 'https://www.zositechc.cn/company/createSerial'
  137. url3 = 'http://www.dvema.com/company/createSerial'
  138. url4 = 'http://api.zositeche.com/company/createSerial'
  139. requests_data = {'id': id, 'quantity': quantity}
  140. res1 = requests.post(url=url1, data=requests_data, timeout=2 * 60)
  141. if res1.status_code != 200:
  142. fail_reason = '请求测试服务器生成序列号响应状态码异常'
  143. return self.failResponse(company.name, quantity, fail_reason, Log, response)
  144. res1 = res1.json()
  145. if res1['result_code'] != 0:
  146. fail_reason = '测试服务器生成序列号发生异常'
  147. return self.failResponse(company.name, quantity, fail_reason, Log, response)
  148. res2 = requests.post(url=url2, data=requests_data, timeout=2 * 60)
  149. if res2.status_code != 200:
  150. fail_reason = '请求国内服务器生成序列号响应状态码异常'
  151. return self.failResponse(company.name, quantity, fail_reason, Log, response)
  152. res2 = res2.json()
  153. if res2['result_code'] != 0:
  154. fail_reason = '国内服务器生成序列号发生异常'
  155. return self.failResponse(company.name, quantity, fail_reason, Log, response)
  156. res3 = requests.post(url=url3, data=requests_data, timeout=2 * 60)
  157. if res3.status_code != 200:
  158. fail_reason = '请求美国服务器生成序列号响应状态码异常'
  159. return self.failResponse(company.name, quantity, fail_reason, Log, response)
  160. res3 = res3.json()
  161. if res3['result_code'] != 0:
  162. fail_reason = '美国服务器生成序列号发生异常'
  163. return self.failResponse(company.name, quantity, fail_reason, Log, response)
  164. res4 = requests.post(url=url4, data=requests_data, timeout=2 * 60)
  165. if res4.status_code != 200:
  166. fail_reason = '请求欧洲服务器生成序列号响应状态码异常'
  167. return self.failResponse(company.name, quantity, fail_reason, Log, response)
  168. res4 = res4.json()
  169. if res4['code'] != 0:
  170. fail_reason = '欧洲服务器生成序列号发生异常'
  171. return self.failResponse(company.name, quantity, fail_reason, Log, response)
  172. return response.json(0)
  173. except Exception as e:
  174. djangoLogger = logging.getLogger('django')
  175. djangoLogger.exception(repr(e))
  176. return response.json(176)
  177. def failResponse(self, company_name, quantity, fail_reason, Log, response):
  178. operation = '{}生成{}个序列号{}: {}'.format(company_name, quantity, '失败', fail_reason)
  179. Log.operation = operation
  180. Log.save()
  181. return response.json(177)
  182. def create_serial(self, request_dict, response, request, user_id):
  183. """
  184. 生成序列号
  185. :param request_dict: 请求参数
  186. :param response: 响应对象
  187. :param request: 请求
  188. :param user_id: 用户id
  189. :return:
  190. """
  191. quantity = int(request_dict.get('quantity', 0))
  192. if not quantity:
  193. return response.json(444)
  194. try:
  195. try:
  196. sum = SerialNumberModel.objects.last().id
  197. except:
  198. sum = 0
  199. serial_number_bulk = []
  200. now_time = int(time.time())
  201. algorithm = AlgorithmBaseOn35()
  202. for i in range(quantity):
  203. serial_number = algorithm.getLetter(sum)
  204. sum += 1 # sum每次递增1
  205. # 前面补0至六位
  206. serial_number = (6 - len(serial_number)) * '0' + serial_number
  207. serial_number_bulk.append(SerialNumberModel(serial_number=serial_number, add_time=now_time))
  208. # 记录操作日志
  209. ip = CommonService.get_ip_address(request)
  210. content = json.loads(json.dumps(request_dict))
  211. log = {
  212. 'ip': ip,
  213. 'user_id': user_id,
  214. 'status': 200,
  215. 'time': now_time,
  216. 'url': 'serialNumber/createSerial',
  217. 'content': json.dumps(content),
  218. 'operation': '生成{}个序列号{}: {}'.format(quantity, '成功', '同步更新成功'),
  219. }
  220. # 开启事务写入
  221. with transaction.atomic():
  222. SerialNumberModel.objects.bulk_create(serial_number_bulk)
  223. Log = LogModel.objects.create(**log)
  224. # 同步更新业务服务器和uid管理系统的序列号表
  225. url1 = 'http://test.zositechc.cn/serialNumber/create'
  226. url2 = 'https://www.zositechc.cn/serialNumber/create'
  227. url3 = 'http://www.dvema.com/serialNumber/create'
  228. url4 = 'http://api.zositeche.com/serialNumber/create'
  229. requests_data = {'quantity': quantity}
  230. res1 = requests.post(url=url1, data=requests_data, timeout=2 * 60)
  231. if res1.status_code != 200:
  232. fail_reason = '请求测试服务器生成序列号响应状态码异常'
  233. return self.generateFail(quantity, fail_reason, Log, response)
  234. res1 = res1.json()
  235. if res1['result_code'] != 0:
  236. fail_reason = '测试服务器生成序列号发生异常'
  237. return self.generateFail(quantity, fail_reason, Log, response)
  238. res2 = requests.post(url=url2, data=requests_data, timeout=2 * 60)
  239. if res2.status_code != 200:
  240. fail_reason = '请求国内服务器生成序列号响应状态码异常'
  241. return self.generateFail(quantity, fail_reason, Log, response)
  242. res2 = res2.json()
  243. if res2['result_code'] != 0:
  244. fail_reason = '国内服务器生成序列号发生异常'
  245. return self.generateFail(quantity, fail_reason, Log, response)
  246. res3 = requests.post(url=url3, data=requests_data, timeout=2 * 60)
  247. if res3.status_code != 200:
  248. fail_reason = '请求美国服务器生成序列号响应状态码异常'
  249. return self.generateFail(quantity, fail_reason, Log, response)
  250. res3 = res3.json()
  251. if res3['result_code'] != 0:
  252. fail_reason = '美国服务器生成序列号发生异常'
  253. return self.generateFail(quantity, fail_reason, Log, response)
  254. res4 = requests.post(url=url4, data=requests_data, timeout=2 * 60)
  255. if res4.status_code != 200:
  256. fail_reason = '请求欧洲服务器生成序列号响应状态码异常'
  257. return self.generateFail(quantity, fail_reason, Log, response)
  258. res4 = res4.json()
  259. if res4['result_code'] != 0:
  260. fail_reason = '欧洲服务器生成序列号发生异常'
  261. return self.generateFail(quantity, fail_reason, Log, response)
  262. return response.json(0)
  263. except Exception as e:
  264. djangoLogger = logging.getLogger('django')
  265. djangoLogger.info(repr(e))
  266. return response.json(500)
  267. def generateFail(self, quantity, fail_reason, Log, response):
  268. operation = '生成{}个序列号{}: {}'.format(quantity, '失败', fail_reason)
  269. Log.operation = operation
  270. Log.save()
  271. return response.json(177)
  272. def do_quantity(self, userID, response):
  273. """
  274. 查询当前可用的UID的数量
  275. :param userID: 响应对象
  276. :param response: 请求
  277. :return:
  278. """
  279. user_qs = UserModel.objects.filter(id=userID)
  280. if not user_qs.exists():
  281. return response.json(9)
  282. unused_serial_number_count = SerialNumberModel.objects.filter(use_status=0).count()
  283. remain_qs = CompanySerialModel.objects.filter(status=1).count()
  284. company_qs = CompanyModel.objects.values('id', 'name')
  285. try:
  286. company_serial_list = [] # 剩余已分配未使用的序列号数量
  287. company_not_used_list = [] # 已使用的序列号数量
  288. for company in company_qs:
  289. id = company['id']
  290. name = company['name']
  291. serial_list = []
  292. not_used_qs = CompanySerialModel.objects.filter(status=3, company_id=id).values('serial_number')
  293. res = {
  294. 'name': name,
  295. 'number': not_used_qs.count(),
  296. 'subMember': []
  297. }
  298. for serial in not_used_qs:
  299. serial_list.append(serial['serial_number'])
  300. user_serial_qs = UserSerialNumberModel.objects.filter(
  301. serial_number__serial_number__in=serial_list).values('user__username').annotate(
  302. count=Count('user__username'))
  303. for user in user_serial_qs:
  304. res['subMember'].append({'username': user['user__username'], 'count': user['count']})
  305. company_not_used_list.append(res)
  306. for company in company_qs:
  307. id = company['id']
  308. name = company['name']
  309. serial_list = []
  310. company_serial_qs = CompanySerialModel.objects.filter(status=1, company_id=id).order_by('id').values(
  311. 'serial_number')
  312. if company_serial_qs.exists():
  313. count = company_serial_qs.count()
  314. last_serial = company_serial_qs.last()['serial_number']
  315. for serial in company_serial_qs:
  316. serial_list.append(serial['serial_number'])
  317. else:
  318. count = 0
  319. last_serial = ''
  320. res = {
  321. 'name': name,
  322. 'numbers': count,
  323. 'lastSerial': last_serial,
  324. 'subMember': []
  325. }
  326. user_serial_qs = UserSerialNumberModel.objects.filter(
  327. serial_number__serial_number__in=serial_list).values('user__username').annotate(count=Count('user__username'))
  328. for user in user_serial_qs:
  329. res['subMember'].append({'username': user['user__username'], 'count': user['count']})
  330. company_serial_list.append(res)
  331. res_data = {'code': 0, 'companyRemainCount': company_not_used_list, 'companyRemain': company_serial_list,
  332. 'unused_serial_number_count': unused_serial_number_count,
  333. 'unused_all_count': remain_qs}
  334. return response.json(0, {'data': res_data})
  335. except Exception as e:
  336. print(e)
  337. return response.json(500)
  338. def do_create(self, request_dict, response):
  339. quantity = int(request_dict.get('quantity', 0))
  340. if not quantity:
  341. return response.json(444)
  342. try:
  343. try:
  344. sum = SerialNumberModel.objects.last().id
  345. except:
  346. sum = 0
  347. serial_number_bulk = []
  348. now_time = int(time.time())
  349. algorithm = AlgorithmBaseOn35()
  350. for i in range(quantity):
  351. serial_number = algorithm.getLetter(sum)
  352. sum += 1 # sum每次递增1
  353. # 前面补0至六位
  354. serial_number = (6 - len(serial_number)) * '0' + serial_number
  355. serial_number_bulk.append(SerialNumberModel(serial_number=serial_number, add_time=now_time))
  356. # 开启事务写入
  357. with transaction.atomic():
  358. SerialNumberModel.objects.bulk_create(serial_number_bulk)
  359. return response.json(0)
  360. except Exception as e:
  361. print(e)
  362. return response.json(500, repr(e))
  363. @transaction.atomic
  364. def do_allot(self, request_dict, response):
  365. username = request_dict.get('username', None)
  366. quantity = int(request_dict.get('quantity', None))
  367. token = request_dict.get('token', None)
  368. token = TokenObject(token)
  369. if token.code != 0:
  370. return response.json(token.code)
  371. user = UserModel.objects.get(id=token.userID)
  372. if not user or '0' not in user.permission:
  373. return response.json(404)
  374. # 要分配的对象
  375. allot_user_qs = UserModel.objects.filter(username=username)
  376. if not allot_user_qs.exists():
  377. return response.json(444, 'username')
  378. if allot_user_qs[0].permission not in ['1', '2']:
  379. return response.json(109)
  380. # 取出对应区域可用的UID分配给allot_user
  381. sn_qs = SerialNumberModel.objects.filter(use_status=3)[0:quantity]
  382. sns = []
  383. for sn in sn_qs:
  384. sns.append(sn.serial_number)
  385. cs_qs = CompanySerialModel.objects.filter(serial_number__in=sns, status=3)
  386. sns = []
  387. for cs in cs_qs:
  388. sns.append(cs.serial_number)
  389. sn_qs = SerialNumberModel.objects.filter(serial_number__in=sns)
  390. count = sn_qs.count()
  391. if count < quantity:
  392. return response.json(444, '序列号不足')
  393. try:
  394. updates = []
  395. datas = []
  396. if not sn_qs.exists():
  397. return response.json(444)
  398. sn_qs = sn_qs[0:quantity]
  399. now_time = int(time.time())
  400. for i in range(len(sn_qs)):
  401. item = sn_qs[i]
  402. serialNumberModel = SerialNumberModel(
  403. id=item.id,
  404. serial_number=item.serial_number,
  405. status=item.status,
  406. use_status=1,
  407. add_time=item.add_time
  408. )
  409. CompanySerialModel.objects.filter(serial_number=item.serial_number).update(status=1)
  410. user_serial_number = UserSerialNumberModel()
  411. user_serial_number.serial_number = serialNumberModel
  412. user_serial_number.user = allot_user_qs[0]
  413. user_serial_number.add_time = now_time
  414. user_serial_number.update_time = now_time
  415. datas.append(user_serial_number)
  416. updates.append(serialNumberModel)
  417. if len(updates) > 0:
  418. bulk_update(updates)
  419. UserSerialNumberModel.objects.bulk_create(datas)
  420. return response.json(0)
  421. except Exception as e:
  422. print(e)
  423. return response.json(500)
  424. @staticmethod
  425. def get_serial(request_dict, response):
  426. """
  427. 获取序列号
  428. @param request_dict: 请求数据
  429. @param response: 响应
  430. @return: response
  431. """
  432. token = request_dict.get('token', None)
  433. time_stamp = request_dict.get('time_stamp', None)
  434. company_secret = request_dict.get('company_id', None) # 企业id, Ansjer: MTEyMTNB, Loocam: VmXEWnBR
  435. if not all([token, time_stamp, company_secret]) or company_secret not in ['MTEyMTNB', 'VmXEWnBR']:
  436. return response.json(444)
  437. # 时间戳token校验
  438. if not CommonService.check_time_stamp_token(token, time_stamp):
  439. return response.json(13)
  440. redis_obj = RedisObject()
  441. # redis加锁,防止同时进行其他操作
  442. serial_operate_lock_key = 'serial_operate_lock'
  443. serial_operate_lock = redis_obj.CONN.setnx(serial_operate_lock_key, 1)
  444. if not serial_operate_lock:
  445. return response.json(5)
  446. redis_obj.CONN.expire(serial_operate_lock_key, 60)
  447. # 企业为Ansjer查询13800138005账号(user_id: 6)下未使用的序列号,Loocam查询13800138006账号(user_id: 7)
  448. if company_secret == 'MTEyMTNB':
  449. user_serial_number_qs = UserSerialNumberModel.objects.filter(user__id=6,
  450. serial_number__use_status=1).first()
  451. else:
  452. user_serial_number_qs = UserSerialNumberModel.objects.filter(user__id=7,
  453. serial_number__use_status=1).first()
  454. if user_serial_number_qs is None:
  455. redis_obj.del_data(key=serial_operate_lock_key) # redis解锁
  456. return response.json(14)
  457. serial_number = user_serial_number_qs.serial_number.serial_number
  458. # 查询序列号企业数据
  459. company_serial_qs = CompanySerialModel.objects.filter(company__secret=company_secret,
  460. serial_number=serial_number, status=1).first()
  461. if company_serial_qs is None:
  462. redis_obj.del_data(key=serial_operate_lock_key) # redis解锁
  463. return response.json(14)
  464. company_mark = company_serial_qs.company.mark
  465. # 防止重复获取序列号
  466. serial_number_lock = redis_obj.CONN.setnx(serial_number + 'serial_number_lock', 1)
  467. redis_obj.CONN.expire(serial_number + 'serial_number_lock', 60)
  468. if not serial_number_lock:
  469. return response.json(5)
  470. # 获取mac
  471. mac_qs = MacModel.objects.filter(is_active=True).values('value')
  472. if not mac_qs.exists():
  473. return response.json(175)
  474. mac = mac_qs[0]['value']
  475. # 绑定mac地址成功后更新mac表
  476. next_mac = CommonService.updateMac(mac)
  477. now_time = int(time.time())
  478. mac_data = {
  479. 'update_time': now_time
  480. }
  481. if next_mac:
  482. mac_data['value'] = next_mac
  483. else:
  484. mac_data['is_active'] = False
  485. # 操作日志数据
  486. operation = '获取序列号:{}'.format(serial_number)
  487. log = {
  488. 'user_id': 3,
  489. 'time': now_time,
  490. 'operation': operation,
  491. 'url': 'serialNumber/getSerial',
  492. }
  493. try:
  494. with transaction.atomic():
  495. # 更新和创建数据
  496. mac_qs.update(**mac_data)
  497. SerialNumberModel.objects.filter(serial_number=serial_number).update(use_status=2, add_time=now_time)
  498. CompanySerialModel.objects.filter(serial_number=serial_number).update(status=2, update_time=now_time)
  499. LogModel.objects.create(**log)
  500. redis_obj.del_data(key=serial_operate_lock_key) # redis解锁
  501. return response.json(0, {'serial_number': serial_number + company_mark, 'mac': mac})
  502. except Exception as e:
  503. redis_obj.del_data(key=serial_operate_lock_key) # redis解锁
  504. return response.json(500, repr(e))
  505. @staticmethod
  506. def generate_mac(request_dict, response):
  507. """
  508. 生成mac到mac.txt文件
  509. :param request_dict: 请求
  510. :param response: 响应
  511. :return: response
  512. """
  513. quantity = int(request_dict.get('quantity', 0))
  514. if quantity == 0:
  515. return response.json(444)
  516. mac_qs = MacModel.objects.filter(is_active=True).values('value')
  517. if not mac_qs.exists():
  518. return response.json(175)
  519. mac = mac_qs[0]['value']
  520. now_time = int(time.time())
  521. with open('mac.txt', 'w') as f:
  522. f.write(mac + '\n')
  523. for i in range(quantity - 1):
  524. next_mac = CommonService.updateMac(mac)
  525. mac = next_mac
  526. f.write(next_mac + '\n')
  527. # 保存下个mac
  528. next_mac = CommonService.updateMac(mac)
  529. mac_qs.update(value=next_mac, update_time=now_time)
  530. return response.json(0)
  531. @staticmethod
  532. def check_serial_number(response):
  533. """
  534. 定时查询序列号库存数量,不足2000发送邮件通知
  535. :param response: 响应
  536. :return: response
  537. """
  538. company_qs = CompanyModel.objects.values('id')
  539. try:
  540. for company in company_qs:
  541. company_id = company['id']
  542. company_serial_count = CompanySerialModel.objects.filter(status=1, company_id=company_id).count()
  543. if company_serial_count < 2000:
  544. sys_msg_text = '序列号库存数量少于2000,请及时处理'
  545. S3Email().faEmail(sys_msg_text, 'servers@ansjer.com')
  546. break
  547. return response.json(0)
  548. except Exception as e:
  549. return response.json(500)