FileController.py 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import base64
  4. import json
  5. import logging
  6. import os
  7. import time
  8. import zipfile
  9. import xlwt
  10. from django.db.models import Count
  11. from django.http import StreamingHttpResponse, HttpResponse, QueryDict
  12. from django.utils.decorators import method_decorator
  13. from django.views import View
  14. from django.views.decorators.csrf import csrf_exempt
  15. from django.db import transaction
  16. from AnsjerUIDManage.config import BASE_DIR
  17. from Model.models import UIDModel, UserUIDModel, UserModel, LogModel, MacModel, OrderTaskModel, OrderUIDModel, \
  18. SerialNumberModel, OrderSerialNumberModel, UserSerialNumberModel, CompanySerialModel
  19. from Object.RedisObject import RedisObject
  20. from Object.TokenObject import TokenObject
  21. from Object.ResponseObject import ResponseObject
  22. from Service.CommonService import CommonService
  23. from bulk_update.helper import bulk_update
  24. from Object.S3Email import S3Email
  25. class UploadUIDFileView(View):
  26. @method_decorator(csrf_exempt)
  27. def dispatch(self, request, *args, **kwargs):
  28. return super(UploadUIDFileView, self).dispatch(request, *args, **kwargs)
  29. def get(self, request, *args, **kwargs):
  30. request.encoding = 'utf-8'
  31. request_dict = request.GET
  32. fileName = request.FILES.get('fileName', None)
  33. return self.validate(fileName, request_dict, request)
  34. def post(self, request, *args, **kwargs):
  35. request.encoding = 'utf-8'
  36. request_dict = request.POST
  37. fileName = request.FILES.get('fileName', None)
  38. return self.validate(fileName, request_dict, request)
  39. def validate(self, fileName, request_dict, request):
  40. token = request_dict.get('token', None)
  41. area = request_dict.get('area', None)
  42. isReset = request_dict.get('isReset', 0)
  43. content = request_dict.get('fileName', None)
  44. print('content')
  45. print(content)
  46. content = base64.b64decode(content).decode().strip()
  47. content = content[3:(len(content) - 3)]
  48. uids = content.split('\n')
  49. # print(uids)
  50. # print(len(uids))
  51. response = ResponseObject()
  52. tko = TokenObject(token)
  53. if tko.code != 0:
  54. return response.json(tko.code)
  55. # if not fileName and not area:
  56. # return response.json(444, 'fileName,area')
  57. data = {}
  58. duplicate = []
  59. for line in uids:
  60. if len(line) < 20:
  61. continue
  62. if data.__contains__(line):
  63. duplicate.append(line)
  64. else:
  65. data[line] = ''
  66. if isReset == 0:
  67. return self.do_insert(data, duplicate, area, response, request, tko)
  68. else:
  69. return self.do_reset(data, response, area, request, tko)
  70. @transaction.atomic
  71. def do_insert(self, data, duplicate, area, response, request, token):
  72. bulk = []
  73. count = 0
  74. add_time = int(time.time())
  75. update_time = int(time.time())
  76. keys = data.keys()
  77. # 获取最新的mac,判断分配到哪里
  78. mac = MacModel.objects.filter().values('id', 'value', 'is_active')[0]
  79. current_mac = mac['value']
  80. username = 'cspublic@ansjer.com'
  81. if current_mac[-8:] == '0F:42:40': # 一组一共1048576个,此mac是第100w个时
  82. sys_msg_text = "当前旧UID管理系统mac地址已分配到" + current_mac + ",此mac地址是当前组的第100w个,还剩下48576个可分配,mac地址即将用完。"
  83. S3Email().faEmail(sys_msg_text, username)
  84. elif current_mac[-8:] == '0F:90:60': # 一组一共1048576个,此mac是第102w个时
  85. sys_msg_text = "当前旧UID管理系统mac地址已分配到" + current_mac + ",此mac地址是当前组的第102w个,还剩下28576个可分配,mac地址即将用完。"
  86. S3Email().faEmail(sys_msg_text, username)
  87. elif not mac['is_active']:
  88. return response.json(175)
  89. elif current_mac[-8:] == '0F:FF:FF':
  90. MacModel.objects.filter().update(is_active=False) # 更改mac可使用的状态,当再此调用接口时使用上面条件进行阻止
  91. sys_msg_text = "当前旧UID管理系统mac地址已分配到" + current_mac + ",mac地址已分配使用完,请更换分组。"
  92. S3Email().faEmail(sys_msg_text, username)
  93. return response.json(175)
  94. if not mac['is_active']:
  95. return response.json(175)
  96. # redisObject = RedisObject(db=3)
  97. key = ''
  98. tmpMac = mac['value']
  99. savePoint = None
  100. for item in keys:
  101. key = item.strip()
  102. # value = redisObject.get_data(key)
  103. # if value is False:
  104. # # redisObject.set_data(key, '1', 600)
  105. # else:
  106. # duplicate.append(key)
  107. # continue
  108. bulk.append(UIDModel(
  109. uid=item.strip(),
  110. uid_extra='',
  111. status=0,
  112. add_time=add_time,
  113. update_time=update_time,
  114. area=area,
  115. mac=mac['value']
  116. ))
  117. try:
  118. try:
  119. if (count % 5000) == 0:
  120. savePoint = transaction.savepoint()
  121. UIDModel.objects.bulk_create(bulk)
  122. bulk.clear()
  123. data = {
  124. 'value': mac['value'],
  125. 'is_active': tmpMac is not None
  126. }
  127. MacModel.objects.filter().update(**data)
  128. except Exception as e:
  129. # print('--------------------------error 5000')
  130. # print(repr(e))
  131. if savePoint:
  132. transaction.rollback(savePoint)
  133. djangoLogger = logging.getLogger('django')
  134. djangoLogger.exception(repr(e))
  135. return response.json(174, str(e))
  136. else:
  137. savePoint = None
  138. except Exception as e:
  139. # print('--------------------------error 5001')
  140. # print(repr(e))
  141. return response.json(174, str(e))
  142. count += 1
  143. tmpMac = CommonService.updateMac(mac['value'])
  144. if tmpMac is None:
  145. # 能分配的mac已用完
  146. break
  147. else:
  148. mac['value'] = tmpMac
  149. # 当bulk不足5000时,还有数据要插入
  150. try:
  151. try:
  152. savePoint = transaction.savepoint() # 事务保存点
  153. if len(bulk) > 0:
  154. UIDModel.objects.bulk_create(bulk)
  155. bulk.clear()
  156. except Exception as e:
  157. # print('--------------------------error')
  158. # print(repr(e))
  159. if savePoint:
  160. transaction.rollback(savePoint)
  161. return response.json(174)
  162. else:
  163. del data
  164. del bulk
  165. data = {
  166. 'value': mac['value'],
  167. 'is_active': tmpMac is not None
  168. }
  169. MacModel.objects.filter().update(**data)
  170. except Exception as e:
  171. # print('--------------------------error 1111')
  172. # print(repr(e))
  173. return response.json(174)
  174. # print('重复:')
  175. # print(duplicate)
  176. operation = self.formatOperation(operation='上传', quantity=int(count), area=int(area))
  177. print(operation)
  178. self.add_log(request, operation, token)
  179. if tmpMac is None:
  180. return response.json(175, {'last_uid': key})
  181. return response.json(0, {'count': count, 'duplicate_count': len(duplicate), 'data': duplicate})
  182. def do_reset(self, data, response, area, request, token):
  183. keys = data.keys()
  184. uids = []
  185. count = 0
  186. for key in keys:
  187. uids.append(key.strip())
  188. if len(uids) % 5000 == 0:
  189. count += self.do_update_uid_status(uids, area)
  190. uids.clear()
  191. if len(uids) > 0:
  192. count += self.do_update_uid_status(uids, area)
  193. uids.clear()
  194. operation = self.formatOperation('重置', int(count), int(area))
  195. self.add_log(request, operation, token)
  196. return response.json(0)
  197. def do_update_uid_status(self, uids, area):
  198. uid_qs = UIDModel.objects.filter(uid__in=uids, area=area, status=2)
  199. if uid_qs.exists():
  200. uid_ids = []
  201. for uid in uid_qs:
  202. if uid.status == 2:
  203. uid.status = 1
  204. uid_ids.append(uid.id)
  205. UIDModel.objects.bulk_update(uid_qs, fields=['status'])
  206. try:
  207. OrderUIDModel.objects.filter(uid__id__in=tuple(uid_ids)).delete()
  208. except Exception as e:
  209. print(e)
  210. return uid_qs.count()
  211. return 0
  212. def add_log(self, request, operation, token):
  213. ip = CommonService.get_ip_address(request)
  214. now_time = time.time()
  215. content = json.loads(json.dumps(request.POST))
  216. user_qs = UserModel.objects.filter(id=token.userID)
  217. if content.__contains__('fileName'):
  218. del content['fileName']
  219. log = {
  220. 'status': 200,
  221. 'content': json.dumps(content),
  222. 'ip': ip,
  223. 'time': now_time,
  224. 'url': 'upload',
  225. 'operation': operation,
  226. 'user': user_qs[0]
  227. }
  228. try:
  229. LogModel.objects.create(**log)
  230. except Exception as e:
  231. print('出错')
  232. print(repr(e))
  233. def formatOperation(self, operation, quantity, area):
  234. str = '{operation}{quantity}个{area}UID'
  235. if area == 0:
  236. return str.format(operation=operation, quantity=quantity, area='国内')
  237. else:
  238. return str.format(operation=operation, quantity=quantity, area='国外')
  239. class UploadSerialNumberFileView(View):
  240. # 上传文件重置序列号使用状态
  241. @method_decorator(csrf_exempt)
  242. def dispatch(self, request, *args, **kwargs):
  243. return super(UploadSerialNumberFileView, self).dispatch(request, *args, **kwargs)
  244. def get(self, request, *args, **kwargs):
  245. request.encoding = 'utf-8'
  246. request_dict = request.GET
  247. return self.reset_serial_number(request_dict, request)
  248. def post(self, request, *args, **kwargs):
  249. request.encoding = 'utf-8'
  250. request_dict = request.POST
  251. return self.reset_serial_number(request_dict, request)
  252. def reset_serial_number(self, request_dict, request):
  253. token = request_dict.get('token', None)
  254. content = request_dict.get('fileName', None)
  255. print('content: ', content)
  256. response = ResponseObject()
  257. tko = TokenObject(token)
  258. if tko.code != 0:
  259. return response.json(tko.code)
  260. try:
  261. # redis加锁,防止同时进行其他操作
  262. redisObj = RedisObject()
  263. serial_operate_lock_key = 'serial_operate_lock'
  264. isLock = redisObj.CONN.setnx(serial_operate_lock_key, 1)
  265. if not isLock:
  266. return response.json(5)
  267. redisObj.CONN.expire(serial_operate_lock_key, 60)
  268. content = base64.b64decode(content).decode().strip()
  269. content = content[3:(len(content)-3)]
  270. serial_number_list = content.split('\n')
  271. serial_number_list = list(map(self.cut_len, serial_number_list)) # 获取序列号前6位
  272. # print('serial_number_list: ', serial_number_list)
  273. # 重置使用状态为已下载(2)的序列号为已分配(1)
  274. serial_number_qs = SerialNumberModel.objects.filter(serial_number__in=serial_number_list, use_status=2)
  275. if not serial_number_qs.exists():
  276. return response.json(173)
  277. count = serial_number_qs.count() # 需要重置的序列号个数
  278. if count:
  279. with transaction.atomic():
  280. # 删除订单
  281. order_serial_number = OrderSerialNumberModel.objects.filter(serial_number__in=serial_number_qs)
  282. order = order_serial_number.values('order_id').distinct() # 确定订单id
  283. OrderTaskModel.objects.filter(id__in=order).delete() # 删除订单
  284. order_serial_number.delete() # 删除订单与序列号关联表数据
  285. serial_number_qs.update(use_status=1) # 重置序列号状态为已分配
  286. operation = self.formatOperation('重置', int(count))
  287. self.add_log(request, operation, tko)
  288. redisObj.del_data(key=serial_operate_lock_key) # redis解锁
  289. return response.json(0)
  290. except Exception as e:
  291. # print('e:', e)
  292. return response.json(500, repr(e))
  293. def cut_len(self, serial_number):
  294. serial_number = serial_number[:6]
  295. return serial_number
  296. def add_log(self, request, operation, token):
  297. ip = CommonService.get_ip_address(request)
  298. now_time = time.time()
  299. content = json.loads(json.dumps(request.POST))
  300. user_qs = UserModel.objects.filter(id=token.userID)
  301. if content.__contains__('fileName'):
  302. del content['fileName']
  303. log = {
  304. 'status': 200,
  305. 'content': json.dumps(content),
  306. 'ip': ip,
  307. 'time': now_time,
  308. 'url': 'uploadSerialNumber',
  309. 'operation': operation,
  310. 'user': user_qs[0]
  311. }
  312. LogModel.objects.create(**log)
  313. def formatOperation(self, operation, quantity):
  314. operate = '{operation}{quantity}个序列号'
  315. return operate.format(operation=operation, quantity=quantity)
  316. class DownloadUIDFileView(View):
  317. @method_decorator(csrf_exempt)
  318. def dispatch(self, request, *args, **kwargs):
  319. return super(DownloadUIDFileView, self).dispatch(request, *args, **kwargs)
  320. def get(self, request, *args, **kwargs):
  321. request.encoding = 'utf-8'
  322. request_dict = request.GET
  323. return self.validate(request_dict)
  324. def post(self, request, *args, **kwargs):
  325. request.encoding = 'utf-8'
  326. request_dict = request.POST
  327. return self.validate(request_dict)
  328. def validate(self, request_dict):
  329. token = request_dict.get('token', None)
  330. area = request_dict.get('area', None)
  331. quantity = int(request_dict.get('quantity', None))
  332. fileType = request_dict.get('fileType', None)
  333. order_number = request_dict.get('order_number', None)
  334. board = request_dict.get('board', None)
  335. plan = request_dict.get('plan', None)
  336. checksum = request_dict.get('checksum', None)
  337. ic_model = request_dict.get('ic_model', None)
  338. order_quantity = request_dict.get('order_quantity', None)
  339. response = ResponseObject()
  340. # print(area)
  341. # print(quantity)
  342. token = TokenObject(token)
  343. if token.code != 0:
  344. return response.json(token.code)
  345. if not area or not order_number or not board or not plan or not checksum or not ic_model or not order_quantity or not fileType:
  346. return response.json(444)
  347. area = int(area)
  348. if area >= 0 and quantity > 0:
  349. # 保存订单信息
  350. now_time = int(time.time())
  351. order = {
  352. 'order_number': order_number,
  353. 'board': board,
  354. 'plan': plan,
  355. 'checksum': checksum,
  356. 'ic_model': ic_model,
  357. 'quantity': order_quantity,
  358. 'add_time': now_time
  359. }
  360. tmp = OrderTaskModel.objects.create(**order)
  361. print(tmp)
  362. order = OrderTaskModel.objects.filter(order_number=order_number).order_by('-add_time')[0]
  363. uid_qs = UserUIDModel.objects.filter(user__id=token.userID, uid__status=1, uid__area=area)
  364. uid_values = uid_qs.values('uid__id', 'uid__uid', 'uid__mac', 'uid__uid_extra', 'uid__add_time', 'uid__update_time', 'uid__area')
  365. count = uid_values.count()
  366. if count < quantity:
  367. return response.json(444, '设备UID不足')
  368. if uid_values.exists():
  369. uid_values = uid_values[0:quantity]
  370. uid_qs = uid_qs[0: quantity]
  371. if fileType == 'txt':
  372. # return self.download_txt(uid_values, uid_qs, order)
  373. # return self.download_excel(uid_values, order)
  374. return self.download_zip(uid_values, order)
  375. elif fileType == 'excel':
  376. return self.download_excel(uid_values, order)
  377. else:
  378. return response.json(444, 'fileType')
  379. else:
  380. return response.json(444, '111')
  381. else:
  382. return response.json(444, '222')
  383. def download_txt(self, uid_values, uid_qs, order):
  384. updates = []
  385. updates_uid = []
  386. content = ''
  387. now_time = int(time.time())
  388. for i in range(len(uid_values)):
  389. # print(item)
  390. item = uid_values[i]
  391. mac: str = item['uid__mac']
  392. index = mac.rfind(':')
  393. tmp = mac[0:index] + '\t' + mac[index:]
  394. content += tmp + '\t'
  395. content += item['uid__uid'].strip()
  396. content += '\r\n'
  397. uidModel = UIDModel(
  398. id=item['uid__id'],
  399. uid=item['uid__uid'],
  400. mac=item['uid__mac'],
  401. uid_extra=item['uid__uid_extra'],
  402. status=2,
  403. add_time=item['uid__add_time'],
  404. update_time=now_time,
  405. area=item['uid__area']
  406. )
  407. updates.append(uidModel)
  408. order_uid = OrderUIDModel(uid=uidModel, order=order, add_time=now_time, update_time=now_time)
  409. updates_uid.append(order_uid)
  410. if len(updates) % 5000 == 0:
  411. UIDModel.objects.bulk_update(updates, fields=["status"])
  412. OrderUIDModel.objects.bulk_create(updates_uid)
  413. updates.clear()
  414. updates_uid.clear()
  415. # print(item['uid__uid'])
  416. if len(updates) > 0:
  417. UIDModel.objects.bulk_update(updates, fields=["status"])
  418. OrderUIDModel.objects.bulk_create(updates_uid)
  419. updates.clear()
  420. updates_uid.clear()
  421. del updates
  422. del updates_uid
  423. content = content[0:len(content) - 1]
  424. response = StreamingHttpResponse(content)
  425. response['Content-Type'] = 'application/octet-stream'
  426. response['Content-Disposition'] = 'attachment;filename=UID'+time.strftime('-%Y-%m-%d-%H-%M-%S', time.localtime()) + '.txt'
  427. return response
  428. def download_excel(self, uid_qs, order):
  429. response = HttpResponse(content_type='application/vnd.ms-excel')
  430. response['Content-Disposition'] = 'attachment; filename=UID' + time.strftime('-%Y-%m-%d-%H-%M-%S',
  431. time.localtime()) + '.xls'
  432. workbook = xlwt.Workbook(encoding='utf-8')
  433. sheet1 = workbook.add_sheet('UID')
  434. # row1 = [u'设备UID']
  435. # for i in range(0, len(row1)):
  436. # sheet1.write(0, i, row1[i])
  437. num = 1
  438. updates = []
  439. updates_uid = []
  440. now_time = int(time.time())
  441. for item in uid_qs:
  442. uid = item['uid__uid']
  443. mac = item['uid__mac']
  444. index = mac.rfind(':')
  445. sheet1.write(num, 0, mac[0:index])
  446. sheet1.write(num, 1, mac[index:])
  447. sheet1.write(num, 2, uid)
  448. num += 1
  449. uidModel = UIDModel(
  450. id=item['uid__id'],
  451. uid=item['uid__uid'],
  452. mac=item['uid__mac'],
  453. uid_extra=item['uid__uid_extra'],
  454. status=2,
  455. add_time=item['uid__add_time'],
  456. update_time=now_time,
  457. area=item['uid__area']
  458. )
  459. updates.append(uidModel)
  460. order_uid = OrderUIDModel(uid=uidModel, order=order, add_time=now_time, update_time=now_time)
  461. updates_uid.append(order_uid)
  462. if len(updates) % 5000 == 0:
  463. UIDModel.objects.bulk_update(updates, fields=["status"])
  464. OrderUIDModel.objects.bulk_create(updates_uid)
  465. updates.clear()
  466. updates_uid.clear()
  467. # print(item['uid__uid'])
  468. if len(updates) > 0:
  469. UIDModel.objects.bulk_update(updates, fields=["status"])
  470. OrderUIDModel.objects.bulk_create(updates_uid)
  471. updates.clear()
  472. updates_uid.clear()
  473. UIDModel.objects.bulk_update(updates, fields=["status"])
  474. workbook.save(response)
  475. return response
  476. def download_zip(self, uid_qs, order):
  477. dir_name = 'static/' + time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime())
  478. path = '/'.join((BASE_DIR, dir_name)).replace('\\', '/') + '/'
  479. if not os.path.exists(path):
  480. os.mkdir(path)
  481. filename = time.strftime('_%Y_%m_%d_%H_%M_%S', time.localtime())
  482. txt_filename = 'UID' + filename + '.txt'
  483. excel_filename = 'UID' + filename + '.xls'
  484. txt_file = open(path + txt_filename, 'w+')
  485. workbook = xlwt.Workbook(encoding='utf-8')
  486. sheet1 = workbook.add_sheet('UID')
  487. num = 1
  488. updates = []
  489. updates_uid = []
  490. content = ''
  491. now_time = int(time.time())
  492. for i in range(len(uid_qs)):
  493. # print(item)
  494. item = uid_qs[i]
  495. uid = item['uid__uid']
  496. mac = item['uid__mac']
  497. index = mac.rfind(':')
  498. tmp = mac[0:index] + '\t' + mac[index:]
  499. content += tmp + '\t'
  500. content += item['uid__uid'].strip()
  501. content += '\r\n'
  502. sheet1.write(num, 0, mac[0:index])
  503. sheet1.write(num, 1, mac[index:])
  504. sheet1.write(num, 2, uid)
  505. num += 1
  506. uidModel = UIDModel(
  507. id=item['uid__id'],
  508. uid=item['uid__uid'],
  509. mac=item['uid__mac'],
  510. uid_extra=item['uid__uid_extra'],
  511. status=2,
  512. add_time=item['uid__add_time'],
  513. update_time=now_time,
  514. area=item['uid__area']
  515. )
  516. updates.append(uidModel)
  517. order_uid = OrderUIDModel(uid=uidModel, order=order, add_time=now_time, update_time=now_time)
  518. updates_uid.append(order_uid)
  519. if len(updates) % 5000 == 0:
  520. UIDModel.objects.bulk_update(updates, fields=["status"])
  521. OrderUIDModel.objects.bulk_create(updates_uid)
  522. updates.clear()
  523. updates_uid.clear()
  524. # print(item['uid__uid'])
  525. if len(updates) > 0:
  526. UIDModel.objects.bulk_update(updates, fields=["status"])
  527. OrderUIDModel.objects.bulk_create(updates_uid)
  528. updates.clear()
  529. updates_uid.clear()
  530. del updates
  531. del updates_uid
  532. content = content[0:len(content) - 1]
  533. txt_file.write(content)
  534. txt_file.close()
  535. workbook.save(path + excel_filename)
  536. zip_name = path[0:path.rfind('/')] + '.zip'
  537. return self.get_zip(path, os.listdir(path), zip_name)
  538. def get_zip(self, path, files, zip_name):
  539. zp = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED)
  540. for file in files:
  541. zp.write(filename=(path + file), arcname=str(file))
  542. zp.close()
  543. response = StreamingHttpResponse(open(zip_name, 'rb'))
  544. response['content_type'] = "application/octet-stream"
  545. response['Content-Disposition'] = 'attachment; filename=UID' + time.strftime('_%Y_%m_%d_%H_%M_%S',
  546. time.localtime()) + '.zip'
  547. return response
  548. class DownloadSerialNumberFileView(View):
  549. @method_decorator(csrf_exempt)
  550. def dispatch(self, request, *args, **kwargs):
  551. return super(DownloadSerialNumberFileView, self).dispatch(request, *args, **kwargs)
  552. def get(self, request, *args, **kwargs):
  553. request.encoding = 'utf-8'
  554. request_dict = request.GET
  555. return self.validate(request_dict)
  556. def post(self, request, *args, **kwargs):
  557. request.encoding = 'utf-8'
  558. request_dict = request.POST
  559. return self.validate(request_dict)
  560. def validate(self, request_dict):
  561. token = request_dict.get('token', None)
  562. quantity = int(request_dict.get('quantity', None))
  563. fileType = request_dict.get('fileType', None)
  564. order_number = request_dict.get('order_number', None)
  565. board = request_dict.get('board', None)
  566. plan = request_dict.get('plan', None)
  567. checksum = request_dict.get('checksum', None)
  568. ic_model = request_dict.get('ic_model', None)
  569. order_quantity = request_dict.get('order_quantity', None)
  570. company_id = request_dict.get('company_id', None)
  571. response = ResponseObject()
  572. # print(area)
  573. # print(quantity)
  574. token = TokenObject(token)
  575. if token.code != 0:
  576. return response.json(token.code)
  577. if not order_number or not board or not plan or not checksum or not ic_model or not order_quantity or not fileType or not company_id:
  578. return response.json(444)
  579. # redis加锁,防止同时进行其他操作
  580. redisObj = RedisObject()
  581. serial_operate_lock_key = 'serial_operate_lock'
  582. isLock = redisObj.CONN.setnx(serial_operate_lock_key, 1)
  583. if not isLock:
  584. return response.json(5)
  585. redisObj.CONN.expire(serial_operate_lock_key, 60)
  586. if quantity > 0:
  587. # 保存订单信息
  588. now_time = int(time.time())
  589. order = {
  590. 'order_number': order_number,
  591. 'board': board,
  592. 'plan': plan,
  593. 'checksum': checksum,
  594. 'ic_model': ic_model,
  595. 'quantity': order_quantity,
  596. 'add_time': now_time
  597. }
  598. tmp = OrderTaskModel.objects.create(**order)
  599. print(tmp)
  600. order = OrderTaskModel.objects.filter(order_number=order_number).order_by('-add_time')[0]
  601. user_qs = UserModel.objects.filter(id=token.userID)
  602. if not user_qs.exists():
  603. return response.json(9)
  604. user = user_qs[0]
  605. result = UserSerialNumberModel.objects.filter(user__id=user.id,
  606. serial_number__use_status=1).aggregate(
  607. num=Count('serial_number__use_status'))
  608. us_qs = UserSerialNumberModel.objects.filter(user__id=user.id,
  609. serial_number__use_status=1).values('serial_number__serial_number')
  610. sns = []
  611. for us in us_qs:
  612. sns.append(us['serial_number__serial_number'])
  613. cs_qs = CompanySerialModel.objects.filter(serial_number__in=sns, status=1, company__secret=company_id).values('serial_number', 'company__mark')
  614. sns = []
  615. mark = ""
  616. if cs_qs.exists():
  617. for cs in cs_qs:
  618. sns.append(cs['serial_number'])
  619. mark = cs_qs[0]['company__mark']
  620. sn_qs = SerialNumberModel.objects.filter(serial_number__in=sns)
  621. count = result['num']
  622. if count < quantity:
  623. return response.json(14)
  624. if sn_qs.exists():
  625. sn_qs = sn_qs[0: quantity]
  626. if fileType == 'txt':
  627. # return self.download_txt(uid_values, uid_qs, order)
  628. # return self.download_excel(uid_values, order)
  629. fileTypeName = 'NewFile'
  630. return self.download_zip(sn_qs, order , fileTypeName, mark)
  631. else:
  632. return response.json(444, 'fileType')
  633. else:
  634. return response.json(444, '111')
  635. else:
  636. return response.json(444, '222')
  637. def download_zip(self, sn_qs, order , fileTypeName, mark):
  638. dir_name = 'static/' + time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime())
  639. path = '/'.join((BASE_DIR, dir_name)).replace('\\', '/') + '/'
  640. if not os.path.exists(path):
  641. os.mkdir(path)
  642. filename = time.strftime('_%Y_%m_%d_%H_%M_%S', time.localtime())
  643. txt_filename = 'SerialNumber' + fileTypeName +'_'+ filename + '.txt'
  644. excel_filename = 'SerialNumber' + fileTypeName + '_' + filename + '.xls'
  645. txt_file = open(path + txt_filename, 'w+')
  646. workbook = xlwt.Workbook(encoding='utf-8')
  647. sheet1 = workbook.add_sheet('SerialNumber')
  648. num = 0
  649. updates = []
  650. company_serial_updates = []
  651. updates_serial_number = []
  652. content = ''
  653. now_time = int(time.time())
  654. mac_qs = MacModel.objects.filter()
  655. mac = mac_qs.values('value')[0]['value']
  656. for i in range(len(sn_qs)):
  657. # print(item)
  658. item = sn_qs[i]
  659. serial_number = item.serial_number
  660. # xls文件写入内容
  661. sheet1.write(num, 0, serial_number + mark)
  662. sheet1.write(num, 1, mac)
  663. # txt文件写入内容
  664. content += serial_number.strip() + mark + ' ' + mac + '\n'
  665. num += 1
  666. mac = CommonService.updateMac(mac) # mac地址值+1
  667. serialNumberModel = SerialNumberModel(
  668. id=item.id,
  669. serial_number=serial_number,
  670. status=item.status,
  671. use_status=2,
  672. add_time=now_time
  673. )
  674. updates.append(serialNumberModel)
  675. company_serial_updates.append(serial_number) # 获取序列号
  676. order_serial_number = OrderSerialNumberModel(serial_number=item, order=order, add_time=now_time, update_time=now_time)
  677. updates_serial_number.append(order_serial_number)
  678. if len(updates) % 5000 == 0:
  679. bulk_update(updates)
  680. OrderSerialNumberModel.objects.bulk_create(updates_serial_number)
  681. updates.clear()
  682. updates_serial_number.clear()
  683. mac_qs.update(value=mac, update_time=now_time) # 更新mac表数据
  684. CompanySerialModel.objects.filter(serial_number__in=company_serial_updates).update(status=2) # 更新序列号状态
  685. if len(updates) > 0:
  686. bulk_update(updates)
  687. OrderSerialNumberModel.objects.bulk_create(updates_serial_number)
  688. updates.clear()
  689. updates_serial_number.clear()
  690. del updates
  691. del updates_serial_number
  692. content = content[0:len(content) - 1]
  693. txt_file.write(content)
  694. txt_file.close()
  695. workbook.save(path + excel_filename)
  696. zip_name = path[0:path.rfind('/')] + '.zip'
  697. return self.get_zip(path, os.listdir(path), zip_name , fileTypeName)
  698. def get_zip(self, path, files, zip_name, fileTypeName ):
  699. zp = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED)
  700. for file in files:
  701. zp.write(filename=(path + file), arcname=str(file))
  702. zp.close()
  703. response = StreamingHttpResponse(open(zip_name, 'rb'))
  704. response['content_type'] = "application/octet-stream"
  705. response['Content-Disposition'] = 'attachment; filename=SerialNumber_'+ fileTypeName + time.strftime('_%Y_%m_%d_%H_%M_%S',
  706. time.localtime()) + '.zip'
  707. serial_operate_lock_key = 'serial_operate_lock'
  708. redisObj = RedisObject()
  709. redisObj.del_data(key=serial_operate_lock_key) # redis解锁
  710. return response