FileController.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import base64
  4. import json
  5. import time
  6. import xlwt
  7. from django.http import StreamingHttpResponse, HttpResponse, QueryDict
  8. from django.utils.decorators import method_decorator
  9. from django.views import View
  10. from django.views.decorators.csrf import csrf_exempt
  11. from django.db import transaction
  12. from Model.models import UIDModel, UserUIDModel, UserModel, LogModel, MacModel, OrderTaskModel, OrderUIDModel
  13. from Object.RedisObject import RedisObject
  14. from Object.TokenObject import TokenObject
  15. from Object.ResponseObject import ResponseObject
  16. from Service.CommonService import CommonService
  17. class UploadUIDFileView(View):
  18. @method_decorator(csrf_exempt)
  19. def dispatch(self, request, *args, **kwargs):
  20. return super(UploadUIDFileView, self).dispatch(request, *args, **kwargs)
  21. def get(self, request, *args, **kwargs):
  22. request.encoding = 'utf-8'
  23. request_dict = request.GET
  24. fileName = request.FILES.get('fileName', None)
  25. return self.validate(fileName, request_dict, request)
  26. def post(self, request, *args, **kwargs):
  27. request.encoding = 'utf-8'
  28. request_dict = request.POST
  29. fileName = request.FILES.get('fileName', None)
  30. return self.validate(fileName, request_dict, request)
  31. def validate(self, fileName, request_dict, request):
  32. token = request_dict.get('token', None)
  33. area = request_dict.get('area', None)
  34. isReset = request_dict.get('isReset', 0)
  35. content = request_dict.get('fileName', None)
  36. print('content')
  37. print(content)
  38. content = base64.b64decode(content).decode().strip()
  39. content = content[3:(len(content) - 3)]
  40. uids = content.split('\n')
  41. # print(uids)
  42. # print(len(uids))
  43. response = ResponseObject()
  44. tko = TokenObject(token)
  45. if tko.code != 0:
  46. return response.json(tko.code)
  47. # if not fileName and not area:
  48. # return response.json(444, 'fileName,area')
  49. data = {}
  50. duplicate = []
  51. for line in uids:
  52. if len(line) < 20:
  53. continue
  54. if data.__contains__(line):
  55. duplicate.append(line)
  56. else:
  57. data[line] = ''
  58. if isReset == 0:
  59. return self.do_insert(data, duplicate, area, response, request, tko)
  60. else:
  61. return self.do_reset(data, response, area, request, tko)
  62. @transaction.atomic
  63. def do_insert(self, data, duplicate, area, response, request, token):
  64. bulk = []
  65. count = 0
  66. add_time = int(time.time())
  67. update_time = int(time.time())
  68. keys = data.keys()
  69. # 获取最新的mac
  70. mac = MacModel.objects.filter().values('id', 'value', 'is_active')[0]
  71. if not mac['is_active']:
  72. return response.json(175)
  73. # redisObject = RedisObject(db=3)
  74. key = ''
  75. tmpMac = mac['value']
  76. savePoint = None
  77. for item in keys:
  78. key = item.strip()
  79. # value = redisObject.get_data(key)
  80. # if value is False:
  81. # # redisObject.set_data(key, '1', 600)
  82. # else:
  83. # duplicate.append(key)
  84. # continue
  85. bulk.append(UIDModel(
  86. uid=item.strip(),
  87. uid_extra='',
  88. status=0,
  89. add_time=add_time,
  90. update_time=update_time,
  91. area=area,
  92. mac=mac['value']
  93. ))
  94. try:
  95. try:
  96. if (count % 5000) == 0:
  97. savePoint = transaction.savepoint()
  98. UIDModel.objects.bulk_create(bulk)
  99. bulk.clear()
  100. data = {
  101. 'value': mac['value'],
  102. 'is_active': tmpMac is not None
  103. }
  104. MacModel.objects.filter().update(**data)
  105. except Exception as e:
  106. # print('--------------------------error 5000')
  107. # print(repr(e))
  108. if savePoint:
  109. transaction.rollback(savePoint)
  110. return response.json(174, str(e))
  111. else:
  112. savePoint = None
  113. except Exception as e:
  114. # print('--------------------------error 5001')
  115. # print(repr(e))
  116. return response.json(174, str(e))
  117. count += 1
  118. tmpMac = CommonService.updateMac(mac['value'])
  119. if tmpMac is None:
  120. # 能分配的mac已用完
  121. break
  122. else:
  123. mac['value'] = tmpMac
  124. # 当bulk不足5000时,还有数据要插入
  125. try:
  126. try:
  127. savePoint = transaction.savepoint() # 事务保存点
  128. if len(bulk) > 0:
  129. UIDModel.objects.bulk_create(bulk)
  130. bulk.clear()
  131. except Exception as e:
  132. # print('--------------------------error')
  133. # print(repr(e))
  134. if savePoint:
  135. transaction.rollback(savePoint)
  136. return response.json(174)
  137. else:
  138. del data
  139. del bulk
  140. data = {
  141. 'value': mac['value'],
  142. 'is_active': tmpMac is not None
  143. }
  144. MacModel.objects.filter().update(**data)
  145. except Exception as e:
  146. # print('--------------------------error 1111')
  147. # print(repr(e))
  148. return response.json(174)
  149. # print('重复:')
  150. # print(duplicate)
  151. operation = self.formatOperation(operation='上传', quantity=int(count), area=int(area))
  152. print(operation)
  153. self.add_log(request, operation, token)
  154. if tmpMac is None:
  155. return response.json(175, {'last_uid': key})
  156. return response.json(0, {'count': count, 'duplicate_count': len(duplicate), 'data': duplicate})
  157. def do_reset(self, data, response, area, request, token):
  158. keys = data.keys()
  159. uids = []
  160. count = 0
  161. for key in keys:
  162. uids.append(key.strip())
  163. if len(uids) % 5000 == 0:
  164. count += self.do_update_uid_status(uids, area)
  165. uids.clear()
  166. if len(uids) > 0:
  167. count += self.do_update_uid_status(uids, area)
  168. uids.clear()
  169. operation = self.formatOperation('重置', int(count), int(area))
  170. self.add_log(request, operation, token)
  171. return response.json(0)
  172. def do_update_uid_status(self, uids, area):
  173. uid_qs = UIDModel.objects.filter(uid__in=uids, area=area, status=2)
  174. if uid_qs.exists():
  175. uid_ids = []
  176. for uid in uid_qs:
  177. if uid.status == 2:
  178. uid.status = 1
  179. uid_ids.append(uid.id)
  180. UIDModel.objects.bulk_update(uid_qs, fields=['status'])
  181. try:
  182. OrderUIDModel.objects.filter(uid__id__in=tuple(uid_ids)).delete()
  183. except Exception as e:
  184. print(e)
  185. return uid_qs.count()
  186. return 0
  187. def add_log(self, request, operation, token):
  188. ip = CommonService.get_ip_address(request)
  189. now_time = time.time()
  190. content = json.dumps(request.POST)
  191. user_qs = UserModel.objects.filter(id=token.userID)
  192. log = {
  193. 'status': 200,
  194. 'content': content,
  195. 'ip': ip,
  196. 'time': now_time,
  197. 'url': 'upload',
  198. 'operation': operation,
  199. 'user': user_qs[0]
  200. }
  201. try:
  202. LogModel.objects.create(**log)
  203. except Exception as e:
  204. print('出错')
  205. print(repr(e))
  206. def formatOperation(self, operation, quantity, area):
  207. str = '{operation}{quantity}个{area}UID'
  208. if area == 0:
  209. return str.format(operation=operation, quantity=quantity, area='国内')
  210. else:
  211. return str.format(operation=operation, quantity=quantity, area='国外')
  212. class DownloadUIDFileView(View):
  213. @method_decorator(csrf_exempt)
  214. def dispatch(self, request, *args, **kwargs):
  215. return super(DownloadUIDFileView, self).dispatch(request, *args, **kwargs)
  216. def get(self, request, *args, **kwargs):
  217. request.encoding = 'utf-8'
  218. request_dict = request.GET
  219. return self.validate(request_dict)
  220. def post(self, request, *args, **kwargs):
  221. request.encoding = 'utf-8'
  222. request_dict = request.POST
  223. return self.validate(request_dict)
  224. def validate(self, request_dict):
  225. token = request_dict.get('token', None)
  226. area = request_dict.get('area', None)
  227. quantity = int(request_dict.get('quantity', None))
  228. fileType = request_dict.get('fileType', None)
  229. order_number = request_dict.get('order_number', None)
  230. board = request_dict.get('board', None)
  231. plan = request_dict.get('plan', None)
  232. checksum = request_dict.get('checksum', None)
  233. ic_model = request_dict.get('ic_model', None)
  234. order_quantity = request_dict.get('order_quantity', None)
  235. response = ResponseObject()
  236. # print(area)
  237. # print(quantity)
  238. token = TokenObject(token)
  239. if token.code != 0:
  240. return response.json(token.code)
  241. 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:
  242. return response.json(444)
  243. area = int(area)
  244. if area >= 0 and quantity > 0:
  245. # 保存订单信息
  246. order = {
  247. 'order_number': order_number,
  248. 'board': board,
  249. 'plan': plan,
  250. 'checksum': checksum,
  251. 'ic_model': ic_model,
  252. 'quantity': order_quantity
  253. }
  254. tmp = OrderTaskModel.objects.update_or_create(defaults={'order_number': order_number}, **order)
  255. print(tmp)
  256. order = OrderTaskModel.objects.filter(order_number=order_number)[0]
  257. uid_qs = UserUIDModel.objects.filter(user__id=token.userID, uid__status=1, uid__area=area)
  258. uid_values = uid_qs.values('uid__id', 'uid__uid', 'uid__mac', 'uid__uid_extra', 'uid__add_time', 'uid__update_time', 'uid__area')
  259. count = uid_values.count()
  260. if count < quantity:
  261. return response.json(444, '设备UID不足')
  262. if uid_values.exists():
  263. uid_values = uid_values[0:quantity]
  264. uid_qs = uid_qs[0: quantity]
  265. if fileType == 'txt':
  266. return self.download_txt(uid_values, uid_qs, order)
  267. elif fileType == 'excel':
  268. return self.download_excel(uid_values)
  269. else:
  270. return response.json(444, 'fileType')
  271. else:
  272. return response.json(444, '111')
  273. else:
  274. return response.json(444, '222')
  275. def download_txt(self, uid_values, uid_qs, order):
  276. updates = []
  277. updates_uid = []
  278. content = ''
  279. now_time = int(time.time())
  280. for i in range(len(uid_values)):
  281. # print(item)
  282. item = uid_values[i]
  283. mac: str = item['uid__mac']
  284. index = mac.rfind(':')
  285. tmp = mac[0:index] + ' ' + mac[index:]
  286. content += tmp + ' '
  287. content += item['uid__uid']
  288. content += '\r\n'
  289. uidModel = UIDModel(
  290. id=item['uid__id'],
  291. uid=item['uid__uid'],
  292. mac=item['uid__mac'],
  293. uid_extra=item['uid__uid_extra'],
  294. status=2,
  295. add_time=item['uid__add_time'],
  296. update_time=now_time,
  297. area=item['uid__area']
  298. )
  299. updates.append(uidModel)
  300. order_uid = OrderUIDModel(uid=uidModel, order=order, add_time=now_time, update_time=now_time)
  301. updates_uid.append(order_uid)
  302. if len(updates) % 5000 == 0:
  303. UIDModel.objects.bulk_update(updates, fields=["status"])
  304. OrderUIDModel.objects.bulk_create(updates_uid)
  305. updates.clear()
  306. updates_uid.clear()
  307. # print(item['uid__uid'])
  308. if len(updates) > 0:
  309. UIDModel.objects.bulk_update(updates, fields=["status"])
  310. OrderUIDModel.objects.bulk_create(updates_uid)
  311. updates.clear()
  312. updates_uid.clear()
  313. del updates
  314. del updates_uid
  315. content = content[0:len(content) - 1]
  316. response = StreamingHttpResponse(content)
  317. response['Content-Type'] = 'application/octet-stream'
  318. response['Content-Disposition'] = 'attachment;filename=UID'+time.strftime('-%Y-%m-%d-%H-%M-%S', time.localtime()) + '.txt'
  319. return response
  320. def download_excel(self, uid_qs):
  321. response = HttpResponse(content_type='application/vnd.ms-excel')
  322. response['Content-Disposition'] = 'attachment; filename=UID' + time.strftime('-%Y-%m-%d-%H-%M-%S', time.localtime()) + '.xls'
  323. workbook = xlwt.Workbook(encoding='utf-8')
  324. sheet1 = workbook.add_sheet('UID')
  325. row1 = [u'设备UID']
  326. for i in range(0, len(row1)):
  327. sheet1.write(0, i, row1[i])
  328. num = 1
  329. updates = []
  330. for item in uid_qs:
  331. uid = item['uid']
  332. sheet1.write(num, 0, uid)
  333. num += 1
  334. updates.append(UIDModel(
  335. id=item['id'],
  336. uid=item['uid'],
  337. uid_extra=item['uid_extra'],
  338. status=1,
  339. add_time=item['add_time'],
  340. update_time=item['update_time'],
  341. area=item['area']
  342. ))
  343. UIDModel.objects.bulk_update(updates, fields=["status"])
  344. workbook.save(response)
  345. return response