FileController.py 29 KB

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