SerialNumberController.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  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 Controller.DetectController import DetectControllerView
  9. from Controller.DeviceConfirmRegion import Device_Region
  10. from Model.models import SerialNumberModel, CompanySerialModel, UIDCompanySerialModel, CompanyModel, RegionModel, \
  11. CountryModel, UIDModel, Device_Info, iotdeviceInfoModel, UidPushModel
  12. from Object.RedisObject import RedisObject
  13. from Object.uidManageResponseObject import uidManageResponseObject
  14. from Object.TokenObject import TokenObject
  15. from Service.AlgorithmService import AlgorithmBaseOn35
  16. from Service.CommonService import CommonService
  17. from Ansjer.config import CRCKey
  18. from Service.ModelService import ModelService
  19. class SerialNumberView(View):
  20. def get(self, request, *args, **kwargs):
  21. request.encoding = 'utf-8'
  22. operation = kwargs.get('operation', None)
  23. request_dict = request.GET
  24. return self.validate(request_dict, operation, request)
  25. def post(self, request, *args, **kwargs):
  26. request.encoding = 'utf-8'
  27. operation = kwargs.get('operation', None)
  28. request_dict = request.POST
  29. return self.validate(request_dict, operation, request)
  30. def validate(self, request_dict, operation, request):
  31. token = TokenObject(request_dict.get('token', None))
  32. response = uidManageResponseObject()
  33. if operation == 'getUID':
  34. return self.do_get_uid(request_dict, response)
  35. elif operation == 'getSerial':
  36. return self.do_get_serial_number(request_dict, response)
  37. elif operation == 'attachUID':
  38. return self.do_attach_uid(request_dict, response, request)
  39. elif operation == 'detachUID':
  40. return self.do_detach_uid(request_dict, response)
  41. elif operation == 'create':
  42. return self.do_create(request_dict, response)
  43. else:
  44. if token.code != 0:
  45. return response.json(token.code)
  46. # if operation == 'create':
  47. # return self.do_create(request_dict, response)
  48. elif operation == 'list':
  49. return self.do_list(token.userID, request_dict, response)
  50. elif operation == 'update':
  51. return self.do_update(token.userID, request_dict, response)
  52. else:
  53. return response.json(404)
  54. def do_create(self, request_dict, response):
  55. quantity = int(request_dict.get('quantity', 0))
  56. p2p = int(request_dict.get('p2p', 0))
  57. if not quantity:
  58. return response.json(444)
  59. try:
  60. try:
  61. sum = SerialNumberModel.objects.last().id
  62. except:
  63. sum = 0
  64. serial_number_bulk = []
  65. now_time = int(time.time())
  66. algorithm = AlgorithmBaseOn35()
  67. for i in range(quantity):
  68. serial_number = algorithm.getLetter(sum)
  69. sum += 1 # sum每次递增1
  70. # 前面补0至六位
  71. serial_number = (6 - len(serial_number)) * '0' + serial_number
  72. serial_number_bulk.append(SerialNumberModel(serial_number=serial_number, add_time=now_time, p2p=p2p))
  73. # 开启事务写入
  74. with transaction.atomic():
  75. SerialNumberModel.objects.bulk_create(serial_number_bulk)
  76. return response.json(0)
  77. except Exception as e:
  78. print(e)
  79. return response.json(500, repr(e))
  80. # 提供给pc端获取序列号
  81. def do_get_serial_number(self, request_dict, response):
  82. quantity = request_dict.get('quantity', None)
  83. company_id = request_dict.get('company_id', None)
  84. token = request_dict.get('token', None)
  85. time_stamp = request_dict.get('time_stamp', None)
  86. p2p_type = request_dict.get('p2p_type', None)
  87. if token and time_stamp and quantity and company_id:
  88. token = int(CommonService.decode_data(token))
  89. time_stamp = int(time_stamp)
  90. now_time = int(time.time())
  91. distance = now_time - time_stamp
  92. if token != time_stamp or distance > 60000 or distance < -60000: # 为了全球化时间控制在一天内
  93. return response.json(404)
  94. redisObject = RedisObject()
  95. key = 'serial_lock'
  96. value = redisObject.lpop(key)
  97. count = 0
  98. while value is False and count < 5:
  99. time.sleep(1)
  100. value = redisObject.lpop(key)
  101. count += 1
  102. if count == 5 and value is False: # 暂时注释
  103. return response.json(5)
  104. quantity = int(quantity)
  105. company_serial_qs = CompanySerialModel.objects.filter(company__secret=company_id, status=0, p2p=p2p_type)
  106. if not company_serial_qs.exists():
  107. redisObject.rpush(key, value)
  108. return response.json(373)
  109. # 存在对应的企业
  110. company_serial_qs = company_serial_qs[0:quantity]
  111. # company_serial_qs = company_serial_qs.values('id', 'serial_number__serial_number', 'company__mark')
  112. data = []
  113. ids = []
  114. for serial in company_serial_qs:
  115. ids.append(serial.id)
  116. data.append(serial.serial_number + serial.company.mark)
  117. CompanySerialModel.objects.filter(id__in=ids).update(status=1)
  118. redisObject.rpush(key, value)
  119. return response.json(0, data)
  120. else:
  121. return response.json(444)
  122. def do_list(self, userID, request_dict, response):
  123. # perm = ModelService.check_perm_uid_manage(userID, 0)
  124. # if not perm:
  125. # return response.json(309)
  126. page = request_dict.get('page', None)
  127. line = request_dict.get('limit', None)
  128. serial_number = request_dict.get('serial_number', None)
  129. status = request_dict.get('status', None)
  130. if page and line:
  131. page = int(page)
  132. line = int(line)
  133. serial_qs = SerialNumberModel.objects.filter().order_by('-id')
  134. if serial_number:
  135. serial_qs = serial_qs.filter(serial_number__contains=serial_number)
  136. if status:
  137. serial_qs = serial_qs.filter(status=status)
  138. count = serial_qs.count()
  139. start = (page - 1) * line
  140. end = start + line
  141. serial_qs = serial_qs[start: end].values()
  142. res = {
  143. 'count': count,
  144. 'data': list(serial_qs)
  145. }
  146. return response.json(0, res)
  147. else:
  148. return response.json(444)
  149. @transaction.atomic
  150. def do_attach_uid(self, request_dict, response, request):
  151. serial_number = request_dict.get('serial_number', None)
  152. country_id = request_dict.get('country_id', None)
  153. company_id = request_dict.get('company_id', None)
  154. token = request_dict.get('token', None)
  155. time_stamp = request_dict.get('time_stamp', None)
  156. if serial_number and len(serial_number) == 9 and company_id:
  157. token = int(CommonService.decode_data(token))
  158. time_stamp = int(time_stamp)
  159. now_time = int(time.time())
  160. distance = now_time - time_stamp
  161. if token != time_stamp or distance > 60000 or distance < -60000: # 为了全球化时间控制在一天内
  162. return response.json(404)
  163. mark = serial_number[6:9]
  164. serial = serial_number[0:6]
  165. savePoint = transaction.savepoint()
  166. try:
  167. try:
  168. if not country_id:
  169. ip = CommonService.get_ip_address(request)
  170. country_id = Device_Region().get_device_region(ip)
  171. # 判断序列号是否已和企业关联
  172. company_serial_qs = CompanySerialModel.objects.filter(company__secret=company_id,
  173. serial_number=serial)
  174. if not company_serial_qs.exists():
  175. return response.json(173)
  176. # 当序列号已关联UID
  177. company_serial = company_serial_qs[0]
  178. if company_serial.status == 0:
  179. # 该序列号未绑定企业
  180. return response.json(173)
  181. elif company_serial.status == 1:
  182. count = 0
  183. while count < 3:
  184. p2p = SerialNumberModel.objects.filter(serial_number=serial).values('p2p')
  185. print('此序列号的p2p类型:', p2p[0]['p2p'])
  186. uid_qs = UIDModel.objects.filter(vpg__company_id=company_serial.company.id,
  187. vpg__region_id=country_id,
  188. status=0, p2p_type=p2p[0]['p2p']).order_by('id')[0:10]
  189. # uid_qs:未进行绑定的uid列表
  190. if uid_qs.exists():
  191. uid = uid_qs[0]
  192. # uid.status = 2
  193. # uid.update_time = int(time.time())
  194. result = UIDModel.objects.filter(id=uid.id, status=0).update(**{
  195. 'status': 2, 'update_time': int(time.time())
  196. })
  197. if int(result) <= 0:
  198. count += 1
  199. continue
  200. now_time = int(time.time())
  201. uid_serial = UIDCompanySerialModel(uid_id=uid.id, company_serial_id=company_serial.id,
  202. add_time=now_time, update_time=now_time)
  203. uid_serial.save()
  204. company_serial.status = 2
  205. company_serial.save()
  206. dev = Device_Info.objects.filter(UID=uid.uid)
  207. if dev.exists():
  208. dev.update(serial_number=serial_number)
  209. full_uid_code = uid.uid__full_uid_code
  210. if uid.platform in CRCKey.keys():
  211. full_uid_code += ':'+CRCKey[uid.platform]
  212. res = {
  213. 'full_uid_code': CommonService.encode_data(full_uid_code),
  214. 'uid': CommonService.encode_data(uid.uid),
  215. 'mac': CommonService.encode_data(uid.mac),
  216. 'extra': uid.uid_extra,
  217. 'platform': uid.platform,
  218. 'initString': uid.init_string,
  219. 'initStringApp': uid.init_string_app,
  220. }
  221. return response.json(0, res)
  222. else:
  223. return response.json(375)
  224. return response.json(5)
  225. else:
  226. uid_qs = UIDCompanySerialModel.objects.filter(company_serial_id=company_serial.id)
  227. if uid_qs.exists():
  228. uid = uid_qs.values('uid__uid', 'uid__mac', 'uid__uid_extra', 'uid__full_uid_code',
  229. 'uid__platform', 'uid__init_string', 'uid__init_string_app')[0]
  230. full_uid_code = uid['uid__full_uid_code']
  231. if uid['uid__platform'] in CRCKey.keys():
  232. full_uid_code += ':'+CRCKey[uid['uid__platform']]
  233. res = {
  234. 'full_uid_code': CommonService.encode_data(full_uid_code),
  235. 'uid': CommonService.encode_data(uid['uid__uid']),
  236. 'mac': CommonService.encode_data(uid['uid__mac']),
  237. 'extra': uid['uid__uid_extra'],
  238. 'platform': uid['uid__platform'],
  239. 'initString': uid['uid__init_string'],
  240. 'initStringApp': uid['uid__init_string_app'],
  241. }
  242. return response.json(0, res)
  243. else:
  244. return response.json(173)
  245. except Exception as e:
  246. # print('--------------------------error 5000')
  247. # print(repr(e))
  248. if savePoint:
  249. transaction.rollback(savePoint)
  250. djangoLogger = logging.getLogger('django')
  251. djangoLogger.exception(repr(e))
  252. return response.json(176, str(e))
  253. except Exception as e:
  254. # print('--------------------------error 5001')
  255. # print(repr(e))
  256. djangoLogger = logging.getLogger('django')
  257. djangoLogger.exception(repr(e))
  258. return response.json(176, str(e))
  259. else:
  260. return response.json(444)
  261. def do_get_uid(self, request_dict, response):
  262. serial_number = request_dict.get('serial_number', None)
  263. token = request_dict.get('token', None)
  264. time_stamp = request_dict.get('time_stamp', None)
  265. if token and time_stamp and serial_number and len(serial_number) == 9:
  266. token = int(CommonService.decode_data(token))
  267. time_stamp = int(time_stamp)
  268. now_time = int(time.time())
  269. distance = now_time - time_stamp
  270. if token != time_stamp or distance > 60000 or distance < -60000: # 为了全球化时间控制在一天内
  271. return response.json(404)
  272. mark = serial_number[6:9]
  273. serial = serial_number[0:6]
  274. uid_company_serial_qs = UIDCompanySerialModel.objects.filter(company_serial__company__mark=mark,
  275. company_serial__serial_number__serial_number=serial)
  276. if uid_company_serial_qs.exists():
  277. uid = uid_company_serial_qs.values('uid__uid', 'uid__mac', 'uid__uid_extra')[0]
  278. res = {
  279. 'uid': CommonService.encode_data(uid['uid__uid']),
  280. 'mac': CommonService.encode_data(uid['uid__mac']),
  281. 'extra': uid['uid__uid_extra']
  282. }
  283. return response.json(0, res)
  284. else:
  285. return response.json(173)
  286. else:
  287. return response.json(444)
  288. def do_detach_uid(self, request_dict, response):
  289. serial_number = request_dict.get('serial_number', None)
  290. token = request_dict.get('token', None)
  291. time_stamp = request_dict.get('time_stamp', None)
  292. if token and time_stamp and serial_number:
  293. token = int(CommonService.decode_data(token))
  294. time_stamp = int(time_stamp)
  295. now_time = int(time.time())
  296. distance = now_time - time_stamp
  297. if token != time_stamp or distance > 60000 or distance < -60000: # 为了全球化时间控制在一天内
  298. return response.json(404)
  299. serial = serial_number[0:6]
  300. uid_serial_qs = UIDCompanySerialModel.objects.filter(company_serial__serial_number=serial)
  301. if uid_serial_qs.exists():
  302. uid_serial = uid_serial_qs[0]
  303. iot = iotdeviceInfoModel.objects.filter(serial_number=serial)
  304. # iot = iotdeviceInfoModel.objects.filter(thing_name="Ansjer_Device_" + serial_number)
  305. if iot.exists():
  306. iot.delete()
  307. company_serial_qs = CompanySerialModel.objects.filter(id=uid_serial.company_serial.id)
  308. if company_serial_qs.exists():
  309. company_serial = company_serial_qs[0]
  310. company_serial.status = 1
  311. company_serial.save()
  312. mark = company_serial.company.mark
  313. dv_qs = Device_Info.objects.filter(serial_number=serial_number + mark)
  314. if dv_qs.exists():
  315. # a.主用户删除设备
  316. uid = dv_qs[0].UID
  317. dv_qs.delete()
  318. # 删除设备影子信息uid_set 外键关联删除设备推送配置信息 uid_push
  319. up_qs = UidPushModel.objects.filter(uid_set__uid=uid)
  320. DetectControllerView().do_delete_redis(uid)
  321. if up_qs.count() > 1:
  322. UidPushModel.objects.filter(uid_set__uid=uid).delete()
  323. else:
  324. up_qs.delete()
  325. uid_qs = UIDModel.objects.filter(uid=uid_serial.uid.uid)
  326. if uid_qs.exists():
  327. uid = uid_qs[0]
  328. uid.status = 0
  329. uid.save()
  330. uid_serial.delete()
  331. else:
  332. return response.json(173)
  333. else:
  334. return response.json(444)
  335. def do_update(self, userID, request_dict, response):
  336. # perm = ModelService.check_perm_uid_manage(userID, 0)
  337. # if not perm:
  338. # return response.json(309)
  339. id = request_dict.get('id', None)
  340. status = request_dict.get('status', None)
  341. p2p = request_dict.get('p2p', None)
  342. if id and status:
  343. serial_number_qs = SerialNumberModel.objects.filter(id=id)
  344. if serial_number_qs.exists():
  345. serial_number_qs.update(**{'status': status, 'p2p': p2p})
  346. return response.json(0)
  347. else:
  348. return response.json(173)
  349. else:
  350. return response.json(444)