SerialNumberController.py 29 KB

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