SerialManageController.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. #!/usr/bin/python3.6
  2. # -*- coding: utf-8 -*-
  3. #
  4. # Copyright (C) 2022 #
  5. # @Time : 2022/3/9 9:20
  6. # @Author : ming
  7. # @Email : zhangdongming@asj6.wecom.work
  8. # @File : SurveysManageController.py
  9. # @Software: PyCharm
  10. import json
  11. import time
  12. import requests
  13. from django.db import transaction
  14. from django.utils.decorators import method_decorator
  15. from django.views.decorators.csrf import csrf_exempt
  16. from django.views.generic.base import View
  17. from Model.models import CompanyModel, VPGModel, UIDModel, UIDCompanySerialModel, CompanySerialModel, \
  18. LogModel, iotdeviceInfoModel
  19. from Object.ResponseObject import ResponseObject
  20. from Object.TokenObject import TokenObject
  21. from Service.CommonService import CommonService
  22. from Ansjer.config import SERVER_DOMAIN_TEST, SERVER_DOMAIN_CN, SERVER_DOMAIN_US, SERVER_DOMAIN_EUR
  23. class SerialView(View):
  24. @method_decorator(csrf_exempt)
  25. def dispatch(self, *args, **kwargs):
  26. return super(SerialView, self).dispatch(*args, **kwargs)
  27. def get(self, request, *args, **kwargs):
  28. request.encoding = 'utf-8'
  29. operation = kwargs.get('operation')
  30. return self.validation(request.GET, request, operation)
  31. def post(self, request, *args, **kwargs):
  32. request.encoding = 'utf-8'
  33. operation = kwargs.get('operation')
  34. return self.validation(request.POST, request, operation)
  35. def validation(self, request_dict, request, operation):
  36. response = ResponseObject()
  37. if operation == 'uploadUid':
  38. return self.uploadUid(request, request_dict, response)
  39. elif operation == 'getSerialData':
  40. return self.getSerialData(request_dict, response)
  41. else:
  42. token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
  43. if token.code != 0:
  44. return response.json(token.code)
  45. response = ResponseObject(returntype='pc')
  46. if operation == 'company-page':
  47. return self.company_page(request_dict, response)
  48. if operation == 'number/page':
  49. return self.serial_page(request_dict, response)
  50. if operation == 'syncSerial': # 同步序列号数据
  51. return self.sync_serial(request_dict, response)
  52. if operation == 'vpg-info/page':
  53. return self.vpg_page(request_dict, response)
  54. if operation == 'uid-info/page':
  55. return self.uid_page(request_dict, response)
  56. return response.json(0)
  57. @classmethod
  58. def uploadUid(cls, request, request_dict, response):
  59. uid_list = request_dict.get('uid_list', None)
  60. vpg_id = request_dict.get('vpg_id', None)
  61. p2p_type = request_dict.get('p2p_type', None)
  62. platform = request_dict.get('platform', '')
  63. init_string = request_dict.get('init_string', '')
  64. init_string_app = request_dict.get('init_string_app', '')
  65. if not all([vpg_id, p2p_type]):
  66. return response.json(444)
  67. p2p_type = int(p2p_type)
  68. # 尚云必须输入平台和初始化字符
  69. if p2p_type == 1 and (not platform or not platform or not init_string_app):
  70. return response.json(444)
  71. p2p = '尚云' if p2p_type == 1 else 'tutk'
  72. add_time = update_time = int(time.time())
  73. try:
  74. # 根据vpg关联的region确定area
  75. region = VPGModel.objects.filter(id=vpg_id).values('region__name')[0]['region__name']
  76. area = 0 if region in ['中国', '测试'] else 1
  77. uid_list = uid_list.splitlines() # 按行('\r', '\r\n', \n')切割字符串返回列表
  78. bulk = []
  79. for uid in uid_list:
  80. UID = UIDModel(
  81. mac='',
  82. uid_extra='',
  83. status=0,
  84. add_time=add_time,
  85. update_time=update_time,
  86. area=area, # 关联vgp表已有区域信息,可以考虑去掉
  87. vpg_id=vpg_id,
  88. p2p_type=p2p_type,
  89. platform=platform,
  90. init_string=init_string,
  91. init_string_app=init_string_app
  92. )
  93. # 尚云完整uid,eg.ACN-000005-FHCGR,VRWEDU -> ACN000005FHCGR,必须包含','
  94. if p2p == '尚云':
  95. if '-' in uid and ',' in uid:
  96. UID.full_uid_code = uid
  97. uid_split = uid.split('-')
  98. uid = uid_split[0] + uid_split[1] + uid_split[2].split(',')[0]
  99. else:
  100. return response.json(376)
  101. # tutk uid长度为14或20
  102. elif len(uid) != 14 and len(uid) != 20:
  103. return response.json(376)
  104. UID.uid = uid
  105. bulk.append(UID)
  106. ip = CommonService.get_ip_address(request)
  107. content = json.loads(json.dumps(request_dict))
  108. log = {
  109. 'ip': ip,
  110. 'user_id': 1,
  111. 'status': 200,
  112. 'time': add_time,
  113. 'url': 'serial/uploadUid',
  114. 'content': json.dumps(content),
  115. 'operation': '上传{}个{}uid到vpg {}'.format(len(uid_list), p2p, vpg_id),
  116. }
  117. with transaction.atomic():
  118. LogModel.objects.create(**log) # 记录操作日志
  119. UIDModel.objects.bulk_create(bulk) # 批量写入uid数据
  120. uid_count = UIDModel.objects.filter(vpg_id=vpg_id).count() # 获取族群下uid的数量
  121. VPGModel.objects.filter(id=vpg_id).update(uid_count=uid_count) # 更新vgp表的uid_count
  122. return response.json(0)
  123. except Exception as e:
  124. print(e)
  125. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  126. @classmethod
  127. def company_page(cls, request_dict, response):
  128. isSelect = request_dict.get('isSelect', None)
  129. if isSelect:
  130. # 获取企业名称作为选项
  131. company_qs = CompanyModel.objects.all().values('id', 'name')
  132. return response.json(0, {'list': list(company_qs)})
  133. pageNo = request_dict.get('pageNo', None)
  134. pageSize = request_dict.get('pageSize', None)
  135. if not all([pageNo, pageSize]):
  136. return response.json(444)
  137. page = int(pageNo)
  138. line = int(pageSize)
  139. try:
  140. request_qs = CompanyModel.objects.all()
  141. if not request_qs.exists():
  142. return response.json(0, {'list': '', 'total': 0})
  143. total = request_qs.count()
  144. company_page = request_qs[(page - 1) * line:page * line].values()
  145. return response.json(0, {'list': list(company_page), 'total': total})
  146. except Exception as e:
  147. print(e)
  148. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  149. @classmethod
  150. def serial_page(cls, request_dict, response):
  151. company_name = request_dict.get('companyName', None)
  152. serial_number = request_dict.get('serialNumber', None)
  153. status = request_dict.get('status', None)
  154. pageNo = request_dict.get('pageNo', None)
  155. pageSize = request_dict.get('pageSize', None)
  156. if not all([pageNo, pageSize]):
  157. return response.json(444)
  158. page = int(pageNo)
  159. line = int(pageSize)
  160. try:
  161. company_serial_qs = CompanySerialModel.objects.filter()
  162. if company_name:
  163. company_serial_qs = company_serial_qs.filter(company__name=company_name)
  164. if serial_number:
  165. company_serial_qs = company_serial_qs.filter(serial_number__contains=serial_number)
  166. if status:
  167. status = int(status)
  168. company_serial_qs = company_serial_qs.filter(status=status)
  169. if not company_serial_qs.exists():
  170. return response.json(0, {'list': '', 'total': 0})
  171. total = company_serial_qs.count()
  172. serial_number_page = company_serial_qs.order_by('-serial_number')[(page - 1) * line:page * line]. \
  173. values('serial_number', 'company__name', 'status', 'add_time', 'update_time')
  174. return response.json(0, {'list': list(serial_number_page), 'total': total})
  175. except Exception as e:
  176. print(e)
  177. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  178. @staticmethod
  179. def sync_serial(request_dict, response):
  180. serial = request_dict.get('serial', None)
  181. sync_region = request_dict.get('syncRegion', None)
  182. if not all([serial, sync_region]):
  183. return response.json(444)
  184. url = ''
  185. if sync_region == 'test':
  186. url = SERVER_DOMAIN_TEST
  187. elif sync_region == 'cn':
  188. url = SERVER_DOMAIN_CN
  189. elif sync_region == 'us':
  190. url = SERVER_DOMAIN_US
  191. elif sync_region == 'eu':
  192. url = SERVER_DOMAIN_EUR
  193. try:
  194. # 请求需要同步的地区获取数据
  195. url = url + 'serial/getSerialData'
  196. data = {'serial': serial}
  197. req = requests.post(url=url, data=data, timeout=5)
  198. if req.status_code != 200:
  199. return response.json(503)
  200. req = req.json()
  201. if req['result_code'] != 0:
  202. return response.json(173)
  203. res_data = req['result']['res_data']
  204. return response.json(0)
  205. except Exception as e:
  206. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  207. @staticmethod
  208. def getSerialData(request_dict, response):
  209. serial = request_dict.get('serial', None)
  210. if not serial:
  211. return response.json(444)
  212. try:
  213. # 查询绑定的uid数据
  214. uid_company_serial_qs = UIDCompanySerialModel.objects.filter(company_serial__serial_number=serial).\
  215. values('uid__uid', 'uid__mac', 'uid__uid_extra', 'uid__status', 'uid__add_time', 'uid__update_time',
  216. 'uid__area', 'uid__vpg', 'uid__p2p_type', 'uid__full_uid_code', 'uid__platform', 'uid__init_string',
  217. 'uid__init_string_app')
  218. if not uid_company_serial_qs.exists():
  219. return response.json(173)
  220. res_data = {
  221. 'uid': uid_company_serial_qs[0]['uid__uid'],
  222. 'mac': uid_company_serial_qs[0]['uid__mac'],
  223. 'uid_extra': uid_company_serial_qs[0]['uid__uid_extra'],
  224. 'status': uid_company_serial_qs[0]['uid__status'],
  225. 'add_time': uid_company_serial_qs[0]['uid__add_time'],
  226. 'update_time': uid_company_serial_qs[0]['uid__update_time'],
  227. 'area': uid_company_serial_qs[0]['uid__area'],
  228. 'vpg': uid_company_serial_qs[0]['uid__vpg'],
  229. 'p2p_type': uid_company_serial_qs[0]['uid__p2p_type'],
  230. 'full_uid_code': uid_company_serial_qs[0]['uid__full_uid_code'],
  231. 'platform': uid_company_serial_qs[0]['uid__platform'],
  232. 'init_string': uid_company_serial_qs[0]['uid__init_string'],
  233. 'init_string_app': uid_company_serial_qs[0]['uid__init_string_app']
  234. }
  235. # 查询iot数据
  236. iot_device_info_qs = iotdeviceInfoModel.objects.filter(serial_number=serial).values(
  237. 'certificate_id', 'certificate_pem', 'public_key', 'private_key', 'thing_name',
  238. 'thing_groups', 'endpoint', 'token_iot_number')
  239. if iot_device_info_qs.exists():
  240. res_data['certificate_id'] = iot_device_info_qs[0]['certificate_id']
  241. res_data['certificate_pem'] = iot_device_info_qs[0]['certificate_pem']
  242. res_data['public_key'] = iot_device_info_qs[0]['public_key']
  243. res_data['private_key'] = iot_device_info_qs[0]['private_key']
  244. res_data['thing_name'] = iot_device_info_qs[0]['thing_name']
  245. res_data['thing_groups'] = iot_device_info_qs[0]['thing_groups']
  246. res_data['endpoint'] = iot_device_info_qs[0]['endpoint']
  247. res_data['token_iot_number'] = iot_device_info_qs[0]['token_iot_number']
  248. # 修改序列号状态为占用
  249. CompanySerialModel.objects.filter(serial_number=serial).update(status=3)
  250. return response.json(0, {'res_data': res_data})
  251. except Exception as e:
  252. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  253. @classmethod
  254. def vpg_page(cls, request_dict, response):
  255. isSelect = request_dict.get('isSelect', None)
  256. if isSelect:
  257. # 获取vpg id作为选项
  258. vpg_qs = VPGModel.objects.all().values('id')
  259. return response.json(0, {'list': list(vpg_qs)})
  260. pageNo = request_dict.get('pageNo', None)
  261. pageSize = request_dict.get('pageSize', None)
  262. if not all([pageNo, pageSize]):
  263. return response.json(444)
  264. page = int(pageNo)
  265. line = int(pageSize)
  266. try:
  267. query = VPGModel.objects.filter()
  268. if not query.exists():
  269. return response.json(0, {'list': '', 'total': 0})
  270. total = query.count()
  271. vpg_page = query[(page - 1) * line:page * line] \
  272. .values('id', 'name',
  273. 'region__name',
  274. 'region_id',
  275. 'company__name',
  276. 'add_time',
  277. 'update_time',
  278. 'company__secret',
  279. 'uid_count')
  280. if vpg_page.exists():
  281. for vpg in vpg_page:
  282. vpg['shangyun_use_count'] = UIDModel.objects.filter(vpg=vpg['id'], status=2, p2p_type=1).count()
  283. vpg['shangyun_unuse_count'] = UIDModel.objects.filter(vpg=vpg['id'], status=0, p2p_type=1).count()
  284. vpg['tutk_use_count'] = UIDModel.objects.filter(vpg=vpg['id'], status=2, p2p_type=2).count()
  285. vpg['tutk_unuse_count'] = UIDModel.objects.filter(vpg=vpg['id'], status=0, p2p_type=2).count()
  286. return response.json(0, {'list': list(vpg_page), 'total': total})
  287. return response.json(173)
  288. except Exception as e:
  289. print(e)
  290. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  291. @classmethod
  292. def uid_page(cls, request_dict, response):
  293. vpg_id = request_dict.get('vpg_id', None)
  294. status = request_dict.get('status', None)
  295. serial_number = request_dict.get('serialNumber', None)
  296. uid = request_dict.get('uid', None)
  297. p2p_type = request_dict.get('p2pType', None)
  298. pageNo = request_dict.get('pageNo', None)
  299. pageSize = request_dict.get('pageSize', None)
  300. if not all([pageNo, pageSize]):
  301. return response.json(444)
  302. page = int(pageNo)
  303. line = int(pageSize)
  304. try:
  305. query = UIDModel.objects.filter()
  306. if serial_number:
  307. company_serial_qs = CompanySerialModel.objects.filter(serial_number__contains=serial_number).values()
  308. if company_serial_qs.exists():
  309. cs_id = str(company_serial_qs[0]['id'])
  310. uid_company_serial_qs = UIDCompanySerialModel.objects.filter(company_serial_id=cs_id).values(
  311. 'uid_id')
  312. if uid_company_serial_qs.exists():
  313. uid_id = uid_company_serial_qs[0]['uid_id']
  314. query = query.filter(id=uid_id)
  315. else:
  316. return response.json(0, {'list': '', 'total': 0})
  317. if vpg_id:
  318. query = query.filter(vpg_id=int(vpg_id))
  319. if status:
  320. query = query.filter(status=int(status))
  321. if uid:
  322. query = query.filter(uid__contains=uid)
  323. if p2p_type:
  324. query = query.filter(p2p_type=int(p2p_type))
  325. if not query.exists():
  326. return response.json(0, {'list': '', 'total': 0})
  327. total = query.count()
  328. uid_page = query[(page - 1) * line:page * line]
  329. result_list = []
  330. if not uid_page.exists():
  331. return response.json(0, {'list': '', 'total': 0})
  332. for vo in uid_page:
  333. uid_company_serial_qs = UIDCompanySerialModel.objects.filter(uid_id=vo.id).values('uid_id',
  334. 'company_serial_id')
  335. serial = None
  336. if uid_company_serial_qs.exists():
  337. company_serial_id = uid_company_serial_qs[0]['company_serial_id']
  338. company_serial_qs = CompanySerialModel.objects.filter(id=company_serial_id).values()
  339. if company_serial_qs.exists():
  340. serial = str(company_serial_qs[0]['serial_number'])
  341. result_list.append({
  342. 'vpg_id': vo.vpg_id,
  343. 'id': vo.id,
  344. 'uid': vo.uid,
  345. 'serial': serial,
  346. 'status': vo.status,
  347. 'area': vo.area,
  348. 'p2pType': vo.p2p_type,
  349. 'platform': vo.platform,
  350. 'fullUidCode': vo.full_uid_code,
  351. 'init_string': vo.init_string,
  352. 'init_string_app': vo.init_string_app,
  353. 'addTime': vo.add_time,
  354. 'updateTime': vo.update_time,
  355. })
  356. return response.json(0, {'list': result_list, 'total': total})
  357. except Exception as e:
  358. print(e)
  359. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))