SerialNumberController.py 17 KB

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