SerialNumberController.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import logging
  4. import random
  5. import time
  6. from django.db import transaction
  7. from django.views import View
  8. from Model.models import SerialNumberModel, CompanySerialModel, UIDCompanySerialModel, CompanyModel, RegionModel, \
  9. CountryModel, UIDModel, RegionCountryModel
  10. from Object.RedisObject import RedisObject
  11. from Object.uidManageResponseObject import uidManageResponseObject
  12. from Object.TokenObject import TokenObject
  13. from Service.AlgorithmService import AlgorithmBaseOn35
  14. from Service.CommonService import CommonService
  15. from Service.ModelService import ModelService
  16. class SerialNumberView(View):
  17. def get(self, request, *args, **kwargs):
  18. request.encoding = 'utf-8'
  19. operation = kwargs.get('operation', None)
  20. request_dict = request.GET
  21. return self.validate(request_dict, operation)
  22. def post(self, request, *args, **kwargs):
  23. request.encoding = 'utf-8'
  24. operation = kwargs.get('operation', None)
  25. request_dict = request.POST
  26. return self.validate(request_dict, operation)
  27. def validate(self, request_dict, operation):
  28. token = TokenObject(request_dict.get('token', None))
  29. response = uidManageResponseObject()
  30. if operation == 'getUID':
  31. return self.do_get_uid(request_dict, response)
  32. elif operation == 'getSerial':
  33. return self.do_get_serial_number(request_dict, response)
  34. else:
  35. if token.code != 0:
  36. return response.json(token.code)
  37. if operation == 'create':
  38. return self.do_create(request_dict, response)
  39. elif operation == 'list':
  40. return self.do_list(token.userID, request_dict, response)
  41. elif operation == 'update':
  42. return self.do_update(token.userID, request_dict, response)
  43. elif operation == 'attachUID':
  44. return self.do_attach_uid(request_dict, response)
  45. elif operation == 'detachUID':
  46. return self.do_detach_uid(token.userID, request_dict, response)
  47. else:
  48. return response.json(404)
  49. def do_create(self, request_dict, response):
  50. quantity = int(request_dict.get('quantity', None))
  51. if not quantity:
  52. return response.json(444)
  53. start_time = time.strftime('%Y-%m-%d %H:%M:%S')
  54. print('start create ' + start_time)
  55. tmp = []
  56. algorithm = AlgorithmBaseOn35()
  57. sum = SerialNumberModel.objects.count()
  58. for i in range(quantity):
  59. serial_number = algorithm.getLetter(sum)
  60. tmp_len = 6 - len(serial_number)
  61. # 前面补0
  62. for j in range(tmp_len):
  63. serial_number = '0' + serial_number
  64. tmp.append(serial_number)
  65. sum += 1
  66. # 把序列号的顺序打乱
  67. random.shuffle(tmp)
  68. data = []
  69. now_time = int(time.time())
  70. for item in tmp:
  71. data.append(SerialNumberModel(serial_number=item, add_time=now_time))
  72. if len(data) == 10000:
  73. SerialNumberModel.objects.bulk_create(data)
  74. data.clear()
  75. if len(data) > 0:
  76. SerialNumberModel.objects.bulk_create(data)
  77. data.clear()
  78. start_time = time.strftime('%Y-%m-%d %H:%M:%S')
  79. print('start create ' + start_time)
  80. redis = RedisObject()
  81. redis.del_data(key='serial_number_count')
  82. return response.json(0)
  83. # 提供给pc端获取序列号
  84. def do_get_serial_number(self, request_dict, response):
  85. quantity = request_dict.get('quantity', None)
  86. company_id = request_dict.get('company_id', None)
  87. token = request_dict.get('token', None)
  88. time_stamp = request_dict.get('time_stamp', None)
  89. if token and time_stamp and quantity and company_id:
  90. token = int(CommonService.decode_data(token))
  91. time_stamp = int(time_stamp)
  92. now_time = int(time.time())
  93. distance = now_time - time_stamp
  94. if token != time_stamp or distance > 300 or distance < 0:
  95. return response.json(404)
  96. redisObject = RedisObject()
  97. key = 'serial_lock'
  98. value = redisObject.lpop(key)
  99. count = 0
  100. while value is False and count < 5:
  101. time.sleep(1)
  102. value = redisObject.lpop(key)
  103. count += 1
  104. # if count == 5 and value is False: 暂时注释
  105. # return response.json(5)
  106. quantity = int(quantity)
  107. company_serial_qs = CompanySerialModel.objects.filter(company__secret=company_id, status=0)
  108. if not company_serial_qs.exists():
  109. redisObject.rpush(key, value)
  110. return response.json(373)
  111. # 存在对应的企业
  112. company_serial_qs = company_serial_qs[0:quantity]
  113. #company_serial_qs = company_serial_qs.values('id', 'serial_number__serial_number', 'company__mark')
  114. data = []
  115. ids = []
  116. for serial in company_serial_qs:
  117. ids.append(serial.id)
  118. data.append(serial.serial_number.serial_number + serial.company.mark)
  119. CompanySerialModel.objects.filter(id__in=ids).update(status=1)
  120. redisObject.rpush(key, value)
  121. return response.json(0, data)
  122. else:
  123. return response.json(444)
  124. def do_list(self, userID, request_dict, response):
  125. # perm = ModelService.check_perm_uid_manage(userID, 0)
  126. # if not perm:
  127. # return response.json(309)
  128. page = request_dict.get('page', None)
  129. line = request_dict.get('limit', None)
  130. serial_number = request_dict.get('serial_number', None)
  131. status = request_dict.get('status', None)
  132. if page and line:
  133. page = int(page)
  134. line = int(line)
  135. serial_qs = SerialNumberModel.objects.filter()
  136. if serial_number:
  137. serial_qs = serial_qs.filter(serial_number__contains=serial_number)
  138. if status:
  139. serial_qs = serial_qs.filter(status=status)
  140. count = serial_qs.count()
  141. start = (page - 1) * line
  142. end = start + line
  143. serial_qs = serial_qs[start: end].values()
  144. res = {
  145. 'count': count,
  146. 'data': list(serial_qs)
  147. }
  148. return response.json(0, res)
  149. else:
  150. return response.json(444)
  151. @transaction.atomic
  152. def do_attach_uid(self, request_dict, response):
  153. serial_number = request_dict.get('serial_number', None)
  154. country_id = request_dict.get('country_id', None)
  155. company_id = request_dict.get('company_id', None)
  156. if serial_number and len(serial_number) == 9 and country_id and company_id:
  157. mark = serial_number[6:9]
  158. serial = serial_number[0:6]
  159. savePoint = transaction.savepoint()
  160. try:
  161. try:
  162. # 判断序列号是否已和企业关联
  163. company_serial_qs = CompanySerialModel.objects.filter(company__secret=company_id,
  164. serial_number__serial_number=serial)
  165. if not company_serial_qs.exists():
  166. return response.json(173)
  167. region_country_qs = RegionCountryModel.objects.filter(number=country_id)
  168. endpoint = 'a2rqy12o004ad8-ats.iot.us-east-1.amazonaws.com'
  169. if region_country_qs.exists():
  170. user_region = region_country_qs[0]
  171. if user_region.region_id == 1:
  172. endpoint = 'a250bbr0p9u7as-ats.iot.cn-northwest-1.amazonaws.com.cn'
  173. elif user_region.region_id == 2:
  174. endpoint = 'a2rqy12o004ad8-ats.iot.ap-southeast-1.amazonaws.com'
  175. elif user_region.region_id == 3:
  176. endpoint = 'a2rqy12o004ad8-ats.iot.eu-west-1.amazonaws.com'
  177. # 当序列号已关联UID
  178. company_serial = company_serial_qs[0]
  179. if company_serial.status == 0:
  180. # 该序列号未绑定企业
  181. return response.json(173)
  182. elif company_serial.status == 1:
  183. # 确定所在区域
  184. country_qs = CountryModel.objects.filter(number=country_id)
  185. if not country_qs.exists():
  186. return response.json(374)
  187. region = country_qs.values('region_id')[0]
  188. count = 0
  189. while count < 3:
  190. uid_qs = UIDModel.objects.filter(vpg__company_id=company_serial.company.id, vpg__region_id=region['region_id'],
  191. status=0)
  192. if uid_qs.exists():
  193. uid = uid_qs[0]
  194. print(uid)
  195. # uid.status = 2
  196. # uid.update_time = int(time.time())
  197. result = UIDModel.objects.filter(id=uid.id, status=0).update(**{
  198. 'status': 2, 'update_time': int(time.time())
  199. })
  200. if int(result) <= 0:
  201. count += 1
  202. continue
  203. now_time = int(time.time())
  204. uid_serial = UIDCompanySerialModel(uid_id=uid.id, company_serial_id=company_serial.id,
  205. add_time=now_time, update_time=now_time)
  206. uid_serial.save()
  207. company_serial.status = 2
  208. company_serial.save()
  209. res = {
  210. 'uid': CommonService.encode_data(uid.uid),
  211. 'mac': CommonService.encode_data(uid.mac),
  212. 'extra': uid.uid_extra,
  213. 'endpoint': endpoint
  214. }
  215. return response.json(0, res)
  216. else:
  217. return response.json(375)
  218. return response.json(5)
  219. else:
  220. uid_qs = UIDCompanySerialModel.objects.filter(company_serial_id=company_serial.id)
  221. if uid_qs.exists():
  222. uid = uid_qs.values('uid__uid', 'uid__mac', 'uid__uid_extra')[0]
  223. res = {
  224. 'uid': CommonService.encode_data(uid['uid__uid']),
  225. 'mac': CommonService.encode_data(uid['uid__mac']),
  226. 'extra': uid['uid__uid_extra'],
  227. 'endpoint': endpoint
  228. }
  229. return response.json(0, res)
  230. else:
  231. return response.json(173)
  232. except Exception as e:
  233. # print('--------------------------error 5000')
  234. # print(repr(e))
  235. if savePoint:
  236. transaction.rollback(savePoint)
  237. djangoLogger = logging.getLogger('django')
  238. djangoLogger.exception(repr(e))
  239. return response.json(176, str(e))
  240. except Exception as e:
  241. # print('--------------------------error 5001')
  242. # print(repr(e))
  243. djangoLogger = logging.getLogger('django')
  244. djangoLogger.exception(repr(e))
  245. return response.json(176, str(e))
  246. else:
  247. return response.json(444)
  248. def do_get_uid(self, request_dict, response):
  249. serial_number = request_dict.get('serial_number', None)
  250. token = request_dict.get('token', None)
  251. time_stamp = request_dict.get('time_stamp', None)
  252. if token and time_stamp and serial_number and len(serial_number) == 9:
  253. token = int(CommonService.decode_data(token))
  254. time_stamp = int(time_stamp)
  255. now_time = int(time.time())
  256. distance = now_time - time_stamp
  257. if token != time_stamp or distance > 300 or distance < 0:
  258. return response.json(404)
  259. mark = serial_number[6:9]
  260. serial = serial_number[0:6]
  261. uid_company_serial_qs = UIDCompanySerialModel.objects.filter(company_serial__company__mark=mark, company_serial__serial_number__serial_number=serial)
  262. if uid_company_serial_qs.exists():
  263. uid = uid_company_serial_qs.values('uid__uid', 'uid__mac', 'uid__uid_extra')[0]
  264. res = {
  265. 'uid': CommonService.encode_data(uid['uid__uid']),
  266. 'mac': CommonService.encode_data(uid['uid__mac']),
  267. 'extra': uid['uid__uid_extra']
  268. }
  269. return response.json(0, res)
  270. else:
  271. return response.json(173)
  272. else:
  273. return response.json(444)
  274. def do_detach_uid(self, userID, request_dict, response):
  275. uid = request_dict.get('uid', None)
  276. if uid:
  277. uid = CommonService.decode_data(uid)
  278. uid_serial_qs = UIDCompanySerialModel.objects.filter(uid__uid=uid)
  279. if uid_serial_qs.exists():
  280. uid_serial = uid_serial_qs[0]
  281. company_serial_qs = CompanySerialModel.objects.filter(id=uid_serial.company_serial.id)
  282. if company_serial_qs.exists():
  283. company_serial = company_serial_qs[0]
  284. company_serial.status = 1
  285. company_serial.save()
  286. uid_qs = UIDModel.objects.filter(uid=uid)
  287. if uid_qs.exists():
  288. uid = uid_qs[0]
  289. uid.status = 0
  290. uid.save()
  291. uid_serial.delete()
  292. return response.json(0)
  293. else:
  294. return response.json(173)
  295. else:
  296. return response.json(444)
  297. def do_update(self, userID, request_dict, response):
  298. # perm = ModelService.check_perm_uid_manage(userID, 0)
  299. # if not perm:
  300. # return response.json(309)
  301. id = request_dict.get('id', None)
  302. status = request_dict.get('status', None)
  303. if id and status:
  304. serial_number_qs = SerialNumberModel.objects.filter(id=id)
  305. if serial_number_qs.exists():
  306. serial_number_qs.update(**{'status': status})
  307. return response.json(0)
  308. else:
  309. return response.json(173)
  310. else:
  311. return response.json(444)