SerialManageController.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  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. from django.db import transaction
  13. from django.utils.decorators import method_decorator
  14. from django.views.decorators.csrf import csrf_exempt
  15. from django.views.generic.base import View
  16. from Model.models import CompanyModel, VPGModel, UIDModel, UIDCompanySerialModel, CompanySerialModel, \
  17. LogModel
  18. from Object.ResponseObject import ResponseObject
  19. from Object.TokenObject import TokenObject
  20. from Service.CommonService import CommonService
  21. class SerialView(View):
  22. @method_decorator(csrf_exempt)
  23. def dispatch(self, *args, **kwargs):
  24. return super(SerialView, self).dispatch(*args, **kwargs)
  25. def get(self, request, *args, **kwargs):
  26. request.encoding = 'utf-8'
  27. operation = kwargs.get('operation')
  28. return self.validation(request.GET, request, operation)
  29. def post(self, request, *args, **kwargs):
  30. request.encoding = 'utf-8'
  31. operation = kwargs.get('operation')
  32. return self.validation(request.POST, request, operation)
  33. def validation(self, request_dict, request, operation):
  34. response = ResponseObject()
  35. if operation == 'uploadUid':
  36. return self.uploadUid(request, request_dict, response)
  37. else:
  38. token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
  39. if token.code != 0:
  40. return response.json(token.code)
  41. response = ResponseObject(returntype='pc')
  42. if operation == 'company-page':
  43. return self.company_page(request_dict, response)
  44. if operation == 'number/page':
  45. return self.serial_page(request_dict, response)
  46. if operation == 'syncSerial':
  47. return self.sync_serial(request_dict, response)
  48. if operation == 'vpg-info/page':
  49. return self.vpg_page(request_dict, response)
  50. if operation == 'uid-info/page':
  51. return self.uid_page(request_dict, response)
  52. return response.json(0)
  53. @classmethod
  54. def uploadUid(cls, request, request_dict, response):
  55. uid_list = request_dict.get('uid_list', None)
  56. vpg_id = request_dict.get('vpg_id', None)
  57. p2p_type = request_dict.get('p2p_type', None)
  58. platform = request_dict.get('platform', '')
  59. init_string = request_dict.get('init_string', '')
  60. init_string_app = request_dict.get('init_string_app', '')
  61. if not all([vpg_id, p2p_type]):
  62. return response.json(444)
  63. p2p_type = int(p2p_type)
  64. # 尚云必须输入平台和初始化字符
  65. if p2p_type == 1 and (not platform or not platform or not init_string_app):
  66. return response.json(444)
  67. p2p = '尚云' if p2p_type == 1 else 'tutk'
  68. add_time = update_time = int(time.time())
  69. try:
  70. # 根据vpg关联的region确定area
  71. region = VPGModel.objects.filter(id=vpg_id).values('region__name')[0]['region__name']
  72. area = 0 if region in ['中国', '测试'] else 1
  73. uid_list = uid_list.splitlines() # 按行('\r', '\r\n', \n')切割字符串返回列表
  74. bulk = []
  75. for uid in uid_list:
  76. UID = UIDModel(
  77. mac='',
  78. uid_extra='',
  79. status=0,
  80. add_time=add_time,
  81. update_time=update_time,
  82. area=area, # 关联vgp表已有区域信息,可以考虑去掉
  83. vpg_id=vpg_id,
  84. p2p_type=p2p_type,
  85. platform=platform,
  86. init_string=init_string,
  87. init_string_app=init_string_app
  88. )
  89. # 尚云完整uid,eg.ACN-000005-FHCGR,VRWEDU -> ACN000005FHCGR,必须包含','
  90. if p2p == '尚云':
  91. if '-' in uid and ',' in uid:
  92. UID.full_uid_code = uid
  93. uid_split = uid.split('-')
  94. uid = uid_split[0] + uid_split[1] + uid_split[2].split(',')[0]
  95. else:
  96. return response.json(376)
  97. # tutk uid长度为14或20
  98. elif len(uid) != 14 and len(uid) != 20:
  99. return response.json(376)
  100. UID.uid = uid
  101. bulk.append(UID)
  102. ip = CommonService.get_ip_address(request)
  103. content = json.loads(json.dumps(request_dict))
  104. log = {
  105. 'ip': ip,
  106. 'user_id': 1,
  107. 'status': 200,
  108. 'time': add_time,
  109. 'url': 'serial/uploadUid',
  110. 'content': json.dumps(content),
  111. 'operation': '上传{}个{}uid到vpg {}'.format(len(uid_list), p2p, vpg_id),
  112. }
  113. with transaction.atomic():
  114. LogModel.objects.create(**log) # 记录操作日志
  115. UIDModel.objects.bulk_create(bulk) # 批量写入uid数据
  116. uid_count = UIDModel.objects.filter(vpg_id=vpg_id).count() # 获取族群下uid的数量
  117. VPGModel.objects.filter(id=vpg_id).update(uid_count=uid_count) # 更新vgp表的uid_count
  118. return response.json(0)
  119. except Exception as e:
  120. print(e)
  121. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  122. @classmethod
  123. def company_page(cls, request_dict, response):
  124. isSelect = request_dict.get('isSelect', None)
  125. if isSelect:
  126. # 获取企业名称作为选项
  127. company_qs = CompanyModel.objects.all().values('id', 'name')
  128. return response.json(0, {'list': list(company_qs)})
  129. pageNo = request_dict.get('pageNo', None)
  130. pageSize = request_dict.get('pageSize', None)
  131. if not all([pageNo, pageSize]):
  132. return response.json(444)
  133. page = int(pageNo)
  134. line = int(pageSize)
  135. try:
  136. request_qs = CompanyModel.objects.all()
  137. if not request_qs.exists():
  138. return response.json(0, {'list': '', 'total': 0})
  139. total = request_qs.count()
  140. company_page = request_qs[(page - 1) * line:page * line].values()
  141. return response.json(0, {'list': list(company_page), 'total': total})
  142. except Exception as e:
  143. print(e)
  144. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  145. @classmethod
  146. def serial_page(cls, request_dict, response):
  147. company_name = request_dict.get('companyName', None)
  148. serial_number = request_dict.get('serialNumber', None)
  149. status = request_dict.get('status', None)
  150. pageNo = request_dict.get('pageNo', None)
  151. pageSize = request_dict.get('pageSize', None)
  152. if not all([pageNo, pageSize]):
  153. return response.json(444)
  154. page = int(pageNo)
  155. line = int(pageSize)
  156. try:
  157. company_serial_qs = CompanySerialModel.objects.filter()
  158. if company_name:
  159. company_serial_qs = company_serial_qs.filter(company__name=company_name)
  160. if serial_number:
  161. company_serial_qs = company_serial_qs.filter(serial_number__contains=serial_number)
  162. if status:
  163. status = int(status)
  164. company_serial_qs = company_serial_qs.filter(status=status)
  165. if not company_serial_qs.exists():
  166. return response.json(0, {'list': '', 'total': 0})
  167. total = company_serial_qs.count()
  168. serial_number_page = company_serial_qs.order_by('-serial_number')[(page - 1) * line:page * line]. \
  169. values('serial_number', 'company__name', 'status', 'add_time', 'update_time')
  170. return response.json(0, {'list': list(serial_number_page), 'total': total})
  171. except Exception as e:
  172. print(e)
  173. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  174. def sync_serial(self, request_dict, response):
  175. serial = request_dict.get('serial', None)
  176. sync_region = request_dict.get('syncRegion', None)
  177. if not all([serial, sync_region]):
  178. return response.json(444)
  179. @classmethod
  180. def vpg_page(cls, request_dict, response):
  181. isSelect = request_dict.get('isSelect', None)
  182. if isSelect:
  183. # 获取vpg id作为选项
  184. vpg_qs = VPGModel.objects.all().values('id')
  185. return response.json(0, {'list': list(vpg_qs)})
  186. pageNo = request_dict.get('pageNo', None)
  187. pageSize = request_dict.get('pageSize', None)
  188. if not all([pageNo, pageSize]):
  189. return response.json(444)
  190. page = int(pageNo)
  191. line = int(pageSize)
  192. try:
  193. query = VPGModel.objects.filter()
  194. if not query.exists():
  195. return response.json(0, {'list': '', 'total': 0})
  196. total = query.count()
  197. vpg_page = query[(page - 1) * line:page * line] \
  198. .values('id', 'name',
  199. 'region__name',
  200. 'region_id',
  201. 'company__name',
  202. 'add_time',
  203. 'update_time',
  204. 'company__secret',
  205. 'uid_count')
  206. if vpg_page.exists():
  207. for vpg in vpg_page:
  208. vpg['shangyun_use_count'] = UIDModel.objects.filter(vpg=vpg['id'], status=2, p2p_type=1).count()
  209. vpg['shangyun_unuse_count'] = UIDModel.objects.filter(vpg=vpg['id'], status=0, p2p_type=1).count()
  210. vpg['tutk_use_count'] = UIDModel.objects.filter(vpg=vpg['id'], status=2, p2p_type=2).count()
  211. vpg['tutk_unuse_count'] = UIDModel.objects.filter(vpg=vpg['id'], status=0, p2p_type=2).count()
  212. return response.json(0, {'list': list(vpg_page), 'total': total})
  213. return response.json(173)
  214. except Exception as e:
  215. print(e)
  216. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  217. @classmethod
  218. def uid_page(cls, request_dict, response):
  219. vpg_id = request_dict.get('vpg_id', None)
  220. status = request_dict.get('status', None)
  221. serial_number = request_dict.get('serialNumber', None)
  222. uid = request_dict.get('uid', None)
  223. p2p_type = request_dict.get('p2pType', None)
  224. pageNo = request_dict.get('pageNo', None)
  225. pageSize = request_dict.get('pageSize', None)
  226. if not all([pageNo, pageSize]):
  227. return response.json(444)
  228. page = int(pageNo)
  229. line = int(pageSize)
  230. try:
  231. query = UIDModel.objects.filter()
  232. if serial_number:
  233. company_serial_qs = CompanySerialModel.objects.filter(serial_number__contains=serial_number).values()
  234. if company_serial_qs.exists():
  235. cs_id = str(company_serial_qs[0]['id'])
  236. uid_company_serial_qs = UIDCompanySerialModel.objects.filter(company_serial_id=cs_id).values(
  237. 'uid_id')
  238. if uid_company_serial_qs.exists():
  239. uid_id = uid_company_serial_qs[0]['uid_id']
  240. query = query.filter(id=uid_id)
  241. else:
  242. return response.json(0, {'list': '', 'total': 0})
  243. if vpg_id:
  244. query = query.filter(vpg_id=int(vpg_id))
  245. if status:
  246. query = query.filter(status=int(status))
  247. if uid:
  248. query = query.filter(uid__contains=uid)
  249. if p2p_type:
  250. query = query.filter(p2p_type=int(p2p_type))
  251. if not query.exists():
  252. return response.json(0, {'list': '', 'total': 0})
  253. total = query.count()
  254. uid_page = query[(page - 1) * line:page * line]
  255. result_list = []
  256. if not uid_page.exists():
  257. return response.json(0, {'list': '', 'total': 0})
  258. for vo in uid_page:
  259. uid_company_serial_qs = UIDCompanySerialModel.objects.filter(uid_id=vo.id).values('uid_id',
  260. 'company_serial_id')
  261. serial = None
  262. if uid_company_serial_qs.exists():
  263. company_serial_id = uid_company_serial_qs[0]['company_serial_id']
  264. company_serial_qs = CompanySerialModel.objects.filter(id=company_serial_id).values()
  265. if company_serial_qs.exists():
  266. serial = str(company_serial_qs[0]['serial_number'])
  267. result_list.append({
  268. 'vpg_id': vo.vpg_id,
  269. 'id': vo.id,
  270. 'uid': vo.uid,
  271. 'serial': serial,
  272. 'status': vo.status,
  273. 'area': vo.area,
  274. 'p2pType': vo.p2p_type,
  275. 'platform': vo.platform,
  276. 'fullUidCode': vo.full_uid_code,
  277. 'init_string': vo.init_string,
  278. 'init_string_app': vo.init_string_app,
  279. 'addTime': vo.add_time,
  280. 'updateTime': vo.update_time,
  281. })
  282. return response.json(0, {'list': result_list, 'total': total})
  283. except Exception as e:
  284. print(e)
  285. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))