SerialNumberController.py 32 KB

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