UnicomComboTaskController.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : UnicomComboTaskController.py
  4. @Time : 2022/6/30 16:23
  5. @Author : stephen
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import datetime
  10. import logging
  11. import time
  12. from django.db import transaction
  13. from django.db.models import Q
  14. from django.views import View
  15. from Model.models import UnicomComboOrderInfo, UnicomCombo, Order_Model, UnicomDeviceInfo
  16. from Object.ResponseObject import ResponseObject
  17. from Object.UnicomObject import UnicomObjeect
  18. class UnicomComboTaskView(View):
  19. def get(self, request, *args, **kwargs):
  20. request.encoding = 'utf-8'
  21. operation = kwargs.get('operation')
  22. return self.validation(request.GET, request, operation)
  23. def post(self, request, *args, **kwargs):
  24. request.encoding = 'utf-8'
  25. operation = kwargs.get('operation')
  26. return self.validation(request.POST, request, operation)
  27. def validation(self, request_dict, request, operation):
  28. response = ResponseObject()
  29. print(request)
  30. if operation == 'check-activate':
  31. return self.check_activate_combo(request_dict, response)
  32. elif operation == 'check-flow':
  33. return self.check_flow_usage(response)
  34. elif operation == 'check-flow-expire':
  35. return self.check_flow_expire(response)
  36. elif operation == 'check-expire':
  37. today = datetime.datetime.today()
  38. year = today.year
  39. month = today.month
  40. self.query_unused_combo_and_activate(request_dict.get('iccid'), year, month, '666')
  41. return response.json(0)
  42. @classmethod
  43. def check_activate_combo(cls, request_dict, response):
  44. """
  45. 定时检查是否有次月激活套餐
  46. @param request_dict:
  47. @param response:
  48. @return:
  49. """
  50. logger = logging.getLogger('info')
  51. print(request_dict)
  52. logger.info('--->进入监控次月激活联通套餐')
  53. now_time = int(time.time())
  54. combo_order_info_qs = UnicomComboOrderInfo.objects.filter(status=0, next_month_activate=True,
  55. activation_time__lte=now_time,
  56. expire_time__gte=now_time, is_del=0).values()
  57. if not combo_order_info_qs.exists():
  58. return response.json(0)
  59. try:
  60. today = datetime.datetime.today()
  61. year = today.year
  62. month = today.month
  63. with transaction.atomic():
  64. unicom_api = UnicomObjeect()
  65. for item in combo_order_info_qs:
  66. if item['order_id']:
  67. order_id = item['order_id']
  68. order_qs = Order_Model.objects.filter(orderID=order_id, status=1)
  69. if not order_qs.exists():
  70. continue
  71. combo_order_qs = UnicomComboOrderInfo.objects.filter(status=1, iccid=item['iccid'])
  72. # 当前已有套餐正在使用则跳出当前循环
  73. if combo_order_qs.exists():
  74. continue
  75. combo_id = item['combo_id']
  76. combo_qs = UnicomCombo.objects.filter(id=combo_id).values()
  77. if not combo_qs.exists():
  78. continue
  79. # 查询当月用量情况
  80. flow_total_usage = unicom_api.get_flow_usage_total(year, month, item['iccid'])
  81. flow_total_usage = str(flow_total_usage)
  82. iccid = item['iccid']
  83. # 检查激活iccid
  84. unicom_api.change_device_to_activate(iccid)
  85. cls.query_unused_combo_and_activate(iccid, year, month, flow_total_usage)
  86. logger.info('激活成功,订单编号:{}'.format(order_id))
  87. return response.json(0)
  88. except Exception as e:
  89. logger.info('次月激活套餐异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  90. return response.json(177, repr(e))
  91. @classmethod
  92. def check_flow_usage(cls, response):
  93. """
  94. 检查流量使用情况
  95. @return:
  96. """
  97. logger = logging.getLogger('info')
  98. logger.info('--->进入监控流量使用情况')
  99. try:
  100. combo_order_qs = UnicomComboOrderInfo.objects.filter(status=1, is_del=False).values()
  101. if not combo_order_qs.exists():
  102. return response.json(0)
  103. today = datetime.datetime.today()
  104. year = today.year
  105. month = today.month
  106. unicom_api = UnicomObjeect()
  107. now_time = int(time.time())
  108. for item in combo_order_qs:
  109. iccid = item['iccid']
  110. usage_flow = float(item['flow_total_usage']) if item['flow_total_usage'] else 0.0
  111. combo_id = item['combo_id']
  112. combo_qs = UnicomCombo.objects.filter(id=combo_id).values()
  113. if combo_qs.exists():
  114. combo_qs = combo_qs.first()
  115. flow_total = combo_qs['flow_total']
  116. # 查询当前月用量历史
  117. month_usage_flow = unicom_api.get_flow_usage_total(year, month, iccid)
  118. logger.info('--->{}-{},iccid:{};套餐总值:{},激活时当月用量值:{},月已用量:{}'
  119. .format(year, month, iccid, flow_total, usage_flow, month_usage_flow))
  120. is_expire = False
  121. if item['year'] == year and item['month'] == month:
  122. if month_usage_flow > 0:
  123. # 初始套餐已使用流量 + 套餐总流量
  124. flow = usage_flow + flow_total
  125. if month_usage_flow >= flow:
  126. is_expire = True
  127. else:
  128. activate_year = item['year']
  129. activate_month = item['month']
  130. # 上月使用流量
  131. last_usage_flow = unicom_api.get_flow_usage_total(activate_year, activate_month, iccid)
  132. # 上月套餐实际使用量
  133. actual_usage_flow = last_usage_flow - usage_flow
  134. # 剩余
  135. surplus_flow = flow_total - actual_usage_flow
  136. if month_usage_flow > 0:
  137. if month_usage_flow >= surplus_flow:
  138. is_expire = True
  139. # 检查是否有当月未使用套餐 没有则停卡
  140. if is_expire:
  141. UnicomComboOrderInfo.objects.filter(id=item['id']).update(status=2, updated_time=now_time)
  142. activate_status = cls.query_unused_combo_and_activate(iccid, year, month,
  143. month_usage_flow)
  144. if not activate_status:
  145. # 停用
  146. unicom_api.change_device_to_disable(iccid)
  147. return response.json(0)
  148. except Exception as e:
  149. logger.info('检测流量用量详情异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  150. return response.json(177, repr(e))
  151. @staticmethod
  152. def query_unused_combo_and_activate(iccid, year, month, usage_flow):
  153. """
  154. 查询未使用套餐并激活
  155. @param iccid:
  156. @param year:
  157. @param month:
  158. @param usage_flow:
  159. @return:
  160. """
  161. logger = logging.getLogger('info')
  162. try:
  163. now_time = int(time.time())
  164. combo_order_qs = UnicomComboOrderInfo.objects \
  165. .filter(expire_time__gt=now_time, activation_time__lte=now_time, status=0, iccid=iccid) \
  166. .order_by('created_time')
  167. if not combo_order_qs.exists():
  168. return False
  169. combo_order = combo_order_qs.first()
  170. if not combo_order.order_id:
  171. return False
  172. order_qs = Order_Model.objects.filter(orderID=combo_order.order_id, status=1)
  173. if not order_qs.exists():
  174. return False
  175. upd_data = {
  176. 'status': 1,
  177. 'year': year,
  178. 'month': month,
  179. 'flow_total_usage': str(usage_flow),
  180. 'updated_time': now_time,
  181. }
  182. UnicomComboOrderInfo.objects.filter(id=combo_order.id).update(**upd_data)
  183. return True
  184. except Exception as e:
  185. logger.info('检测流量用量详情异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  186. return False
  187. @classmethod
  188. def check_flow_expire(cls, response):
  189. """
  190. 检查流量到期停卡操作
  191. @param response:
  192. @return:
  193. """
  194. logger = logging.getLogger('info')
  195. logger.info('--->进入监控流量到期停卡或激活叠加包')
  196. now_time = int(time.time())
  197. combo_order_qs = UnicomComboOrderInfo.objects.filter(~Q(status=2), expire_time__lte=now_time,
  198. is_del=False).values()
  199. today = datetime.datetime.today()
  200. year = today.year
  201. month = today.month
  202. if not combo_order_qs.exists():
  203. return response.json(0)
  204. iccid_list = []
  205. with transaction.atomic():
  206. for item in combo_order_qs:
  207. try:
  208. icc_id = item['iccid']
  209. um_device_qs = UnicomDeviceInfo.objects.filter(iccid=icc_id)
  210. if not um_device_qs.exists():
  211. continue
  212. UnicomComboOrderInfo.objects.filter(id=item['id']).update(status=2)
  213. iccid_list.append(icc_id)
  214. logger.info('--->当前流量套餐已过期,iccid:{}'.format(icc_id))
  215. except Exception as e:
  216. logger.info('监控流量到期异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  217. continue
  218. # set无序不重复元素集
  219. iccid_list = list(set(iccid_list))
  220. unicom_api = UnicomObjeect()
  221. for item in iccid_list:
  222. activate_combo_qs = UnicomComboOrderInfo.objects.filter(iccid=item, status=1, expire_time__gt=now_time,
  223. is_del=False).values()
  224. if activate_combo_qs.exists():
  225. continue
  226. usage_flow = unicom_api.get_flow_usage_total(year, month, item)
  227. result = cls.query_unused_combo_and_activate(item, year, month, usage_flow)
  228. if not result:
  229. # 停用设备
  230. unicom_api.change_device_to_disable(item)
  231. unicom_api.change_device_to_activate(item)
  232. return response.json(0)