UnicomDataController.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : UserDataController.py
  4. @Time : 2023/6/29 14:56
  5. @Author : peng
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. from django.db.models import Q, Sum
  10. from django.views.generic.base import View
  11. from Model.models import UnicomDeviceInfo, UnicomComboOrderInfo
  12. from Service.CommonService import CommonService
  13. from Object.RedisObject import RedisObject
  14. class UnicomDataView(View):
  15. def get(self, request, *args, **kwargs):
  16. request.encoding = 'utf-8'
  17. operation = kwargs.get('operation')
  18. return self.validation(request.GET, request, operation)
  19. def post(self, request, *args, **kwargs):
  20. request.encoding = 'utf-8'
  21. operation = kwargs.get('operation')
  22. return self.validation(request.POST, request, operation)
  23. def validation(self, request_dict, request, operation):
  24. token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
  25. if token_code != 0:
  26. return response.json(token_code)
  27. if operation == 'getFlowInfo': # 查询流量使用情况
  28. return self.get_flow_info(request_dict, response)
  29. elif operation == 'getMonthlyFlowInfo': # 查询流量使用情况
  30. return self.get_monthly_flow_info(request_dict, response)
  31. else:
  32. return response.json(414)
  33. @classmethod
  34. def get_flow_info(cls, request_dict, response):
  35. """
  36. 查询流量使用情况
  37. @param request_dict: 请求数据
  38. @request_dict year: 年
  39. @request_dict month: 月
  40. @request_dict query_type: 查询流量类型
  41. @request_dict iccid: 卡号
  42. @request_dict user_id: 用户id
  43. @request_dict page: 查询分页数
  44. @request_dict line: 查询条数
  45. @param response:响应对象
  46. @return:
  47. """
  48. query_type = request_dict.get('query_type', None)
  49. iccid = request_dict.get('iccid', None)
  50. user_id = request_dict.get('user_id', None)
  51. year = request_dict.get('year', None)
  52. month = request_dict.get('month', None)
  53. page = request_dict.get('page', None)
  54. line = request_dict.get('line', None)
  55. if not all([query_type, page, line]):
  56. return response.json(444)
  57. page = int(page)
  58. line = int(line)
  59. redis_obj = RedisObject()
  60. iccid_list = []
  61. try:
  62. if query_type == '1': # 查询联通测试流量信息
  63. iccid_qs = UnicomComboOrderInfo.objects.all()
  64. iccid_qs = iccid_qs.filter(combo__combo_type=1)
  65. if user_id:
  66. user_qs = UnicomDeviceInfo.objects.filter(user_id=user_id).values('iccid')
  67. if not user_qs.exists():
  68. return response.json(173)
  69. iccid_qs = iccid_qs.filter(iccid=user_qs[0]['iccid'])
  70. if iccid:
  71. iccid_qs = iccid_qs.filter(iccid=iccid)
  72. iccid_qs = iccid_qs.values('iccid', 'flow_total_usage')
  73. total_flow = iccid_qs.aggregate(total=Sum('flow_total_usage'))['total']
  74. count = iccid_qs.count()
  75. iccid_qs = iccid_qs[(page - 1) * line:page * line]
  76. for item in iccid_qs:
  77. user_qs = UnicomDeviceInfo.objects.filter(iccid=item['iccid']).values('user_id')
  78. item['user_id'] = user_qs[0]['user_id'] if user_qs.exists() else ''
  79. iccid_list.append(item)
  80. elif query_type == '2': # 查询联通月度流量信息
  81. iccid_qs = UnicomDeviceInfo.objects.filter(card_type=0)
  82. if iccid:
  83. iccid_qs = iccid_qs.filter(iccid=iccid)
  84. if user_id:
  85. iccid_qs = iccid_qs.filter(user_id=user_id)
  86. iccid_qs = iccid_qs.values('iccid').distinct().order_by('iccid')
  87. count = iccid_qs.count()
  88. iccid_qs = iccid_qs[(page - 1) * line:page * line]
  89. total_flow = 0
  90. for item in iccid_qs:
  91. item['flow_total_usage'] = 0
  92. key = 'monthly_flow_' + item['iccid']
  93. user_qs = UnicomDeviceInfo.objects.filter(iccid=item['iccid']).values('user_id')
  94. item['user_id'] = user_qs[0]['user_id'] if user_qs.exists() else ''
  95. if year and month:
  96. file = year + '-' + month
  97. flow = redis_obj.get_hash_data(key, file)
  98. flow = float(flow) if flow else 0
  99. item['flow_total_usage'] = flow
  100. else:
  101. flow_dict = redis_obj.get_all_hash_data(key)
  102. for k, v in flow_dict.items():
  103. item['flow_total_usage'] += float(v)
  104. iccid_list.append(item)
  105. item['flow_total_usage'] = round(item['flow_total_usage'], 2)
  106. total_flow += float(item['flow_total_usage'])
  107. else:
  108. return response.json(444)
  109. res = {
  110. 'iccidInfo': iccid_list,
  111. 'totalFlow': round(total_flow, 2),
  112. 'count': count
  113. }
  114. return response.json(0, res)
  115. except Exception as e:
  116. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  117. @classmethod
  118. def get_monthly_flow_info(cls, request_dict, response):
  119. """
  120. 查询月度流量使用情况
  121. @param request_dict: 请求数据
  122. @request_dict year: 年
  123. @request_dict month: 月
  124. @request_dict iccid: 卡号
  125. @param response:响应对象
  126. @return:
  127. """
  128. iccid = request_dict.get('iccid', None)
  129. year = request_dict.get('year', None)
  130. month = request_dict.get('month', None)
  131. page = request_dict.get('page', None)
  132. line = request_dict.get('line', None)
  133. redis_obj = RedisObject()
  134. data_list = []
  135. if not all([iccid, page, line]):
  136. return response.json(444)
  137. page = int(page)
  138. line = int(line)
  139. try:
  140. key = 'monthly_flow_' + iccid
  141. if year and month:
  142. file = year + '-' + month
  143. flow = redis_obj.get_hash_data(key, file)
  144. flow = flow if flow else 0
  145. data_list.append({file: flow})
  146. else:
  147. flow_dict = redis_obj.get_all_hash_data(key)
  148. for k, v in flow_dict.items():
  149. data_list.append({k.decode(): float(v)})
  150. res = {
  151. 'list': data_list[(page - 1) * line:page * line],
  152. 'count': len(data_list)
  153. }
  154. return response.json(0, res)
  155. except Exception as e:
  156. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))