SerialManageController.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  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, UidSetModel
  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. elif operation == 'unbindUid': # 解绑序列号
  42. return self.unbind_uid(request_dict, response)
  43. else:
  44. token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
  45. if token.code != 0:
  46. return response.json(token.code)
  47. response = ResponseObject(returntype='pc')
  48. if operation == 'company-page':
  49. return self.company_page(request_dict, response)
  50. if operation == 'number/page':
  51. return self.serial_page(request_dict, response)
  52. if operation == 'syncSerial': # 同步序列号数据
  53. return self.sync_serial(request, request_dict, response)
  54. if operation == 'vpg-info/page':
  55. return self.vpg_page(request_dict, response)
  56. if operation == 'uid-info/page':
  57. return self.uid_page(request_dict, response)
  58. return response.json(414)
  59. @classmethod
  60. def uploadUid(cls, request, request_dict, response):
  61. uid_list = request_dict.get('uid_list', None)
  62. vpg_id = request_dict.get('vpg_id', None)
  63. p2p_type = request_dict.get('p2p_type', None)
  64. platform = request_dict.get('platform', '')
  65. init_string = request_dict.get('init_string', '')
  66. init_string_app = request_dict.get('init_string_app', '')
  67. if not all([vpg_id, p2p_type]):
  68. return response.json(444)
  69. p2p_type = int(p2p_type)
  70. # 尚云必须输入平台和初始化字符
  71. if p2p_type == 1 and (not platform or not platform or not init_string_app):
  72. return response.json(444)
  73. p2p = '尚云' if p2p_type == 1 else 'tutk'
  74. add_time = update_time = int(time.time())
  75. try:
  76. # 根据vpg关联的region确定area
  77. region = VPGModel.objects.filter(id=vpg_id).values('region__name')[0]['region__name']
  78. area = 0 if region in ['中国', '测试'] else 1
  79. uid_list = uid_list.splitlines() # 按行('\r', '\r\n', \n')切割字符串返回列表
  80. bulk = []
  81. for uid in uid_list:
  82. UID = UIDModel(
  83. mac='',
  84. uid_extra='',
  85. status=0,
  86. add_time=add_time,
  87. update_time=update_time,
  88. area=area, # 关联vgp表已有区域信息,可以考虑去掉
  89. vpg_id=vpg_id,
  90. p2p_type=p2p_type,
  91. platform=platform,
  92. init_string=init_string,
  93. init_string_app=init_string_app
  94. )
  95. # 尚云完整uid,eg.ACN-000005-FHCGR,VRWEDU -> ACN000005FHCGR,必须包含','
  96. if p2p == '尚云':
  97. if '-' in uid and ',' in uid:
  98. UID.full_uid_code = uid
  99. uid_split = uid.split('-')
  100. uid = uid_split[0] + uid_split[1] + uid_split[2].split(',')[0]
  101. else:
  102. return response.json(376)
  103. # tutk uid长度为14或20
  104. elif len(uid) != 14 and len(uid) != 20:
  105. return response.json(376)
  106. UID.uid = uid
  107. bulk.append(UID)
  108. ip = CommonService.get_ip_address(request)
  109. content = json.loads(json.dumps(request_dict))
  110. log = {
  111. 'ip': ip,
  112. 'user_id': 1,
  113. 'status': 200,
  114. 'time': add_time,
  115. 'url': 'serial/uploadUid',
  116. 'content': json.dumps(content),
  117. 'operation': '上传{}个{}uid到vpg {}'.format(len(uid_list), p2p, vpg_id),
  118. }
  119. with transaction.atomic():
  120. LogModel.objects.create(**log) # 记录操作日志
  121. UIDModel.objects.bulk_create(bulk) # 批量写入uid数据
  122. uid_count = UIDModel.objects.filter(vpg_id=vpg_id).count() # 获取族群下uid的数量
  123. VPGModel.objects.filter(id=vpg_id).update(uid_count=uid_count) # 更新vgp表的uid_count
  124. return response.json(0)
  125. except Exception as e:
  126. print(e)
  127. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  128. @classmethod
  129. def company_page(cls, request_dict, response):
  130. isSelect = request_dict.get('isSelect', None)
  131. if isSelect:
  132. # 获取企业名称作为选项
  133. company_qs = CompanyModel.objects.all().values('id', 'name')
  134. return response.json(0, {'list': list(company_qs)})
  135. pageNo = request_dict.get('pageNo', None)
  136. pageSize = request_dict.get('pageSize', None)
  137. if not all([pageNo, pageSize]):
  138. return response.json(444)
  139. page = int(pageNo)
  140. line = int(pageSize)
  141. try:
  142. request_qs = CompanyModel.objects.all()
  143. if not request_qs.exists():
  144. return response.json(0, {'list': '', 'total': 0})
  145. total = request_qs.count()
  146. company_page = request_qs[(page - 1) * line:page * line].values()
  147. return response.json(0, {'list': list(company_page), 'total': total})
  148. except Exception as e:
  149. print(e)
  150. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  151. @classmethod
  152. def serial_page(cls, request_dict, response):
  153. company_name = request_dict.get('companyName', None)
  154. serial_number = request_dict.get('serialNumber', None)
  155. status = request_dict.get('status', None)
  156. pageNo = request_dict.get('pageNo', None)
  157. pageSize = request_dict.get('pageSize', None)
  158. if not all([pageNo, pageSize]):
  159. return response.json(444)
  160. page = int(pageNo)
  161. line = int(pageSize)
  162. try:
  163. company_serial_qs = CompanySerialModel.objects.filter()
  164. if company_name:
  165. company_serial_qs = company_serial_qs.filter(company__name=company_name)
  166. if serial_number:
  167. company_serial_qs = company_serial_qs.filter(serial_number__contains=serial_number)
  168. if status:
  169. status = int(status)
  170. company_serial_qs = company_serial_qs.filter(status=status)
  171. if not company_serial_qs.exists():
  172. return response.json(0, {'list': '', 'total': 0})
  173. total = company_serial_qs.count()
  174. serial_number_page = company_serial_qs.order_by('-serial_number')[(page - 1) * line:page * line]. \
  175. values('serial_number', 'company__name', 'status', 'add_time', 'update_time')
  176. return response.json(0, {'list': list(serial_number_page), 'total': total})
  177. except Exception as e:
  178. print(e)
  179. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  180. @staticmethod
  181. def sync_serial(request, request_dict, response):
  182. serial = request_dict.get('serial', None)
  183. sync_region = request_dict.get('syncRegion', None)
  184. if not all([serial, sync_region]):
  185. return response.json(444)
  186. # 判断序列号是否已绑定uid
  187. uid_company_serial_qs = UIDCompanySerialModel.objects.filter(company_serial__serial_number=serial)
  188. if uid_company_serial_qs.exists():
  189. return response.json(174)
  190. if sync_region == 'test':
  191. url = SERVER_DOMAIN_TEST
  192. elif sync_region == 'cn':
  193. url = SERVER_DOMAIN_CN
  194. elif sync_region == 'us':
  195. url = SERVER_DOMAIN_US
  196. elif sync_region == 'eu':
  197. url = SERVER_DOMAIN_EUR
  198. else:
  199. return response.json(444)
  200. try:
  201. # 请求需要同步的地区获取数据
  202. url = url + 'serial/getSerialData'
  203. data = {'serial': serial}
  204. req = requests.post(url=url, data=data, timeout=5)
  205. if req.status_code != 200:
  206. return response.json(503)
  207. req = req.json()
  208. if req['result_code'] != 0:
  209. return response.json(173)
  210. res_data = req['result']['res_data']
  211. # 查询是否存在该uid,存在修改状态为已使用,否则写入数据
  212. uid = res_data['uid']
  213. uid_qs = UIDModel.objects.filter(uid=uid).values('id')
  214. with transaction.atomic():
  215. if uid_qs.exists():
  216. uid_qs.update(status=2)
  217. uid_id = uid_qs[0]['id']
  218. else:
  219. uid_data = {
  220. 'uid': uid,
  221. 'mac': res_data['mac'],
  222. 'uid_extra': res_data['uid_extra'],
  223. 'status': res_data['status'],
  224. 'add_time': res_data['add_time'],
  225. 'update_time': res_data['update_time'],
  226. 'area': res_data['area'],
  227. 'vpg_id': res_data['vpg_id'],
  228. 'p2p_type': res_data['p2p_type'],
  229. 'full_uid_code': res_data['full_uid_code'],
  230. 'platform': res_data['platform'],
  231. 'init_string': res_data['init_string'],
  232. 'init_string_app': res_data['init_string_app']
  233. }
  234. uid_obj = UIDModel.objects.create(**uid_data)
  235. uid_id = uid_obj.id
  236. # 查询tb_company_serial表id
  237. company_serial_qs = CompanySerialModel.objects.filter(serial_number=serial).values('id')
  238. company_serial_id = company_serial_qs[0]['id']
  239. # 序列号绑定uid
  240. now_time = int(time.time())
  241. UIDCompanySerialModel.objects.create(add_time=now_time, update_time=now_time,
  242. uid_id=uid_id, company_serial_id=company_serial_id)
  243. # 修改序列号状态为绑定uid
  244. company_serial_qs.update(status=2)
  245. # 同步iot数据
  246. if res_data.get('certificate_id'):
  247. iot_device_info_qs = iotdeviceInfoModel.objects.filter(serial_number=serial).\
  248. values('certificate_id')
  249. iot_data = {
  250. 'certificate_id': res_data['certificate_id'],
  251. 'certificate_pem': res_data['certificate_pem'],
  252. 'public_key': res_data['public_key'],
  253. 'private_key': res_data['private_key'],
  254. 'thing_name': res_data['thing_name'],
  255. 'thing_groups': res_data['thing_groups'],
  256. 'endpoint': res_data['endpoint'],
  257. 'token_iot_number': res_data['token_iot_number']
  258. }
  259. if iot_device_info_qs.exists():
  260. if iot_device_info_qs[0]['certificate_id'] != res_data['certificate_id']:
  261. iot_device_info_qs.update(**iot_data)
  262. else:
  263. iot_data['serial_number'] = serial
  264. iotdeviceInfoModel.objects.create(**iot_data)
  265. # 同步uid_set数据
  266. if res_data.get('ucode') is not None:
  267. uid_set_qs = UidSetModel.objects.filter(uid=uid)
  268. uid_set_data = {
  269. 'ucode': res_data['ucode'],
  270. 'version': res_data['version'],
  271. 'tz': res_data['tz'],
  272. 'ip': res_data['ip'],
  273. 'is_human': res_data['is_human'],
  274. 'is_custom_voice': res_data['is_custom_voice'],
  275. 'double_wifi': res_data['double_wifi'],
  276. 'isSupportFourPoint': res_data['isSupportFourPoint'],
  277. 'mobile_4g': res_data['mobile_4g'],
  278. 'is_ptz': res_data['is_ptz'],
  279. 'is_ai': res_data['is_ai'],
  280. 'cloud_vod': res_data['cloud_vod'],
  281. 'is_alexa': res_data['is_alexa'],
  282. 'ai_type': res_data['ai_type']
  283. }
  284. if uid_set_qs.exists():
  285. iot_device_info_qs.update(**uid_set_data)
  286. else:
  287. UidSetModel.objects.create(**uid_set_data)
  288. # 记录操作日志
  289. ip = CommonService.get_ip_address(request)
  290. content = json.loads(json.dumps(request_dict))
  291. log = {
  292. 'ip': ip,
  293. 'user_id': 1,
  294. 'status': 200,
  295. 'time': now_time,
  296. 'url': 'serial/syncSerial',
  297. 'content': json.dumps(content),
  298. 'operation': '序列号{}同步{}服数据'.format(serial, sync_region)
  299. }
  300. LogModel.objects.create(**log)
  301. return response.json(0)
  302. except Exception as e:
  303. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  304. @staticmethod
  305. def getSerialData(request_dict, response):
  306. serial = request_dict.get('serial', None)
  307. if not serial:
  308. return response.json(444)
  309. try:
  310. # 查询绑定的uid数据
  311. uid_company_serial_qs = UIDCompanySerialModel.objects.filter(company_serial__serial_number=serial).\
  312. values('uid__uid', 'uid__mac', 'uid__uid_extra', 'uid__status', 'uid__add_time', 'uid__update_time',
  313. 'uid__area', 'uid__vpg_id', 'uid__p2p_type', 'uid__full_uid_code', 'uid__platform',
  314. 'uid__init_string', 'uid__init_string_app')
  315. if not uid_company_serial_qs.exists():
  316. return response.json(173)
  317. uid = uid_company_serial_qs[0]['uid__uid']
  318. res_data = {
  319. 'uid': uid,
  320. 'mac': uid_company_serial_qs[0]['uid__mac'],
  321. 'uid_extra': uid_company_serial_qs[0]['uid__uid_extra'],
  322. 'status': uid_company_serial_qs[0]['uid__status'],
  323. 'add_time': uid_company_serial_qs[0]['uid__add_time'],
  324. 'update_time': uid_company_serial_qs[0]['uid__update_time'],
  325. 'area': uid_company_serial_qs[0]['uid__area'],
  326. 'vpg_id': uid_company_serial_qs[0]['uid__vpg_id'],
  327. 'p2p_type': uid_company_serial_qs[0]['uid__p2p_type'],
  328. 'full_uid_code': uid_company_serial_qs[0]['uid__full_uid_code'],
  329. 'platform': uid_company_serial_qs[0]['uid__platform'],
  330. 'init_string': uid_company_serial_qs[0]['uid__init_string'],
  331. 'init_string_app': uid_company_serial_qs[0]['uid__init_string_app']
  332. }
  333. # 查询iot数据
  334. iot_device_info_qs = iotdeviceInfoModel.objects.filter(serial_number=serial).values(
  335. 'certificate_id', 'certificate_pem', 'public_key', 'private_key', 'thing_name',
  336. 'thing_groups', 'endpoint', 'token_iot_number')
  337. if iot_device_info_qs.exists():
  338. res_data['certificate_id'] = iot_device_info_qs[0]['certificate_id']
  339. res_data['certificate_pem'] = iot_device_info_qs[0]['certificate_pem']
  340. res_data['public_key'] = iot_device_info_qs[0]['public_key']
  341. res_data['private_key'] = iot_device_info_qs[0]['private_key']
  342. res_data['thing_name'] = iot_device_info_qs[0]['thing_name']
  343. res_data['thing_groups'] = iot_device_info_qs[0]['thing_groups']
  344. res_data['endpoint'] = iot_device_info_qs[0]['endpoint']
  345. res_data['token_iot_number'] = iot_device_info_qs[0]['token_iot_number']
  346. # 查询uid_set数据
  347. uid_set_qs = UidSetModel.objects.filter(uid=uid).values(
  348. 'ucode', 'version', 'tz', 'ip', 'is_human', 'is_custom_voice', 'double_wifi', 'isSupportFourPoint',
  349. 'mobile_4g', 'is_ptz', 'is_ai', 'cloud_vod', 'is_alexa', 'ai_type')
  350. if uid_set_qs.exists():
  351. res_data['ucode'] = uid_set_qs[0]['ucode']
  352. res_data['version'] = uid_set_qs[0]['version']
  353. res_data['tz'] = uid_set_qs[0]['tz']
  354. res_data['ip'] = uid_set_qs[0]['ip']
  355. res_data['is_human'] = uid_set_qs[0]['is_human']
  356. res_data['is_custom_voice'] = uid_set_qs[0]['is_custom_voice']
  357. res_data['double_wifi'] = uid_set_qs[0]['double_wifi']
  358. res_data['isSupportFourPoint'] = uid_set_qs[0]['isSupportFourPoint']
  359. res_data['mobile_4g'] = uid_set_qs[0]['mobile_4g']
  360. res_data['is_ptz'] = uid_set_qs[0]['is_ptz']
  361. res_data['is_ai'] = uid_set_qs[0]['is_ai']
  362. res_data['cloud_vod'] = uid_set_qs[0]['cloud_vod']
  363. res_data['is_alexa'] = uid_set_qs[0]['is_alexa']
  364. res_data['ai_type'] = uid_set_qs[0]['ai_type']
  365. # 修改序列号状态为占用,uid状态为3(数据被同步)
  366. CompanySerialModel.objects.filter(serial_number=serial).update(status=3)
  367. UIDModel.objects.filter(uid=uid).update(status=3)
  368. return response.json(0, {'res_data': res_data})
  369. except Exception as e:
  370. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  371. @classmethod
  372. def vpg_page(cls, request_dict, response):
  373. isSelect = request_dict.get('isSelect', None)
  374. if isSelect:
  375. # 获取vpg id作为选项
  376. vpg_qs = VPGModel.objects.all().values('id')
  377. return response.json(0, {'list': list(vpg_qs)})
  378. pageNo = request_dict.get('pageNo', None)
  379. pageSize = request_dict.get('pageSize', None)
  380. if not all([pageNo, pageSize]):
  381. return response.json(444)
  382. page = int(pageNo)
  383. line = int(pageSize)
  384. try:
  385. query = VPGModel.objects.filter()
  386. if not query.exists():
  387. return response.json(0, {'list': '', 'total': 0})
  388. total = query.count()
  389. vpg_page = query[(page - 1) * line:page * line] \
  390. .values('id', 'name',
  391. 'region__name',
  392. 'region_id',
  393. 'company__name',
  394. 'add_time',
  395. 'update_time',
  396. 'company__secret',
  397. 'uid_count')
  398. if vpg_page.exists():
  399. for vpg in vpg_page:
  400. vpg['shangyun_use_count'] = UIDModel.objects.filter(vpg=vpg['id'], status=2, p2p_type=1).count()
  401. vpg['shangyun_unuse_count'] = UIDModel.objects.filter(vpg=vpg['id'], status=0, p2p_type=1).count()
  402. vpg['tutk_use_count'] = UIDModel.objects.filter(vpg=vpg['id'], status=2, p2p_type=2).count()
  403. vpg['tutk_unuse_count'] = UIDModel.objects.filter(vpg=vpg['id'], status=0, p2p_type=2).count()
  404. return response.json(0, {'list': list(vpg_page), 'total': total})
  405. return response.json(173)
  406. except Exception as e:
  407. print(e)
  408. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  409. @classmethod
  410. def uid_page(cls, request_dict, response):
  411. vpg_id = request_dict.get('vpg_id', None)
  412. status = request_dict.get('status', None)
  413. serial_number = request_dict.get('serialNumber', None)
  414. uid = request_dict.get('uid', None)
  415. p2p_type = request_dict.get('p2pType', None)
  416. pageNo = request_dict.get('pageNo', None)
  417. pageSize = request_dict.get('pageSize', None)
  418. if not all([pageNo, pageSize]):
  419. return response.json(444)
  420. page = int(pageNo)
  421. line = int(pageSize)
  422. try:
  423. query = UIDModel.objects.filter()
  424. if serial_number:
  425. company_serial_qs = CompanySerialModel.objects.filter(serial_number__contains=serial_number).values()
  426. if company_serial_qs.exists():
  427. cs_id = str(company_serial_qs[0]['id'])
  428. uid_company_serial_qs = UIDCompanySerialModel.objects.filter(company_serial_id=cs_id).values(
  429. 'uid_id')
  430. if uid_company_serial_qs.exists():
  431. uid_id = uid_company_serial_qs[0]['uid_id']
  432. query = query.filter(id=uid_id)
  433. else:
  434. return response.json(0, {'list': '', 'total': 0})
  435. if vpg_id:
  436. query = query.filter(vpg_id=int(vpg_id))
  437. if status:
  438. query = query.filter(status=int(status))
  439. if uid:
  440. query = query.filter(uid__contains=uid)
  441. if p2p_type:
  442. query = query.filter(p2p_type=int(p2p_type))
  443. if not query.exists():
  444. return response.json(0, {'list': '', 'total': 0})
  445. total = query.count()
  446. uid_page = query[(page - 1) * line:page * line]
  447. result_list = []
  448. if not uid_page.exists():
  449. return response.json(0, {'list': '', 'total': 0})
  450. for vo in uid_page:
  451. uid_company_serial_qs = UIDCompanySerialModel.objects.filter(uid_id=vo.id).values('uid_id',
  452. 'company_serial_id')
  453. serial = None
  454. if uid_company_serial_qs.exists():
  455. company_serial_id = uid_company_serial_qs[0]['company_serial_id']
  456. company_serial_qs = CompanySerialModel.objects.filter(id=company_serial_id).values()
  457. if company_serial_qs.exists():
  458. serial = str(company_serial_qs[0]['serial_number'])
  459. result_list.append({
  460. 'vpg_id': vo.vpg_id,
  461. 'id': vo.id,
  462. 'uid': vo.uid,
  463. 'serial': serial,
  464. 'status': vo.status,
  465. 'area': vo.area,
  466. 'p2pType': vo.p2p_type,
  467. 'platform': vo.platform,
  468. 'fullUidCode': vo.full_uid_code,
  469. 'init_string': vo.init_string,
  470. 'init_string_app': vo.init_string_app,
  471. 'addTime': vo.add_time,
  472. 'updateTime': vo.update_time,
  473. })
  474. return response.json(0, {'list': result_list, 'total': total})
  475. except Exception as e:
  476. print(e)
  477. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  478. def unbind_uid(self, request_dict, response):
  479. serial_number = request_dict.get('serialNumber', None)
  480. try:
  481. # Step 1: 查找并更新序列号状态
  482. CompanySerialModel.objects.filter(serial_number=serial_number).update(status=3,
  483. update_time=int(time.time()))
  484. # Step 2: 解绑UID与序列号的关联
  485. UIDCompanySerialModel.objects.filter(company_serial__serial_number=serial_number).delete()
  486. except CompanySerialModel.DoesNotExist:
  487. return response.json(173)
  488. return response.json(0)