SerialNumberController.py 31 KB

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