UnicomComboController.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : UnicomComboController.py
  4. @Time : 2022/6/23 9:18
  5. @Author : stephen
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import json
  10. import logging
  11. import time
  12. from django.db import transaction
  13. from django.http import HttpResponse
  14. from django.views.generic.base import View
  15. from Model.models import UnicomDeviceInfo, UnicomCombo, Pay_Type
  16. from Object.ResponseObject import ResponseObject
  17. from Object.TokenObject import TokenObject
  18. from Object.UnicomObject import UnicomObjeect
  19. class UnicomComboView(View):
  20. def get(self, request, *args, **kwargs):
  21. request.encoding = 'utf-8'
  22. operation = kwargs.get('operation')
  23. return self.validation(request.GET, request, operation)
  24. def post(self, request, *args, **kwargs):
  25. request.encoding = 'utf-8'
  26. operation = kwargs.get('operation')
  27. return self.validation(request.POST, request, operation)
  28. def validation(self, request_dict, request, operation):
  29. if operation == 'buy-notify':
  30. return self.package_callback_notify(request_dict, request)
  31. elif operation == 'device-queue-monitoring':
  32. return self.device_queue_monitoring_push(request_dict, request)
  33. elif operation == 'device-status-change':
  34. return self.device_status_change_push(request_dict, request)
  35. else:
  36. token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
  37. lang = request_dict.get('lang', token.lang)
  38. response = ResponseObject(lang)
  39. if token.code != 0:
  40. return response.json(token.code)
  41. user_id = token.userID
  42. if operation == 'device-bind':
  43. return self.device_add(user_id, request_dict, response)
  44. elif operation == 'combo-save':
  45. return self.save_unicom_combo(request_dict, response)
  46. elif operation == 'combo-list':
  47. return self.query_package_list(response)
  48. @classmethod
  49. def device_add(cls, user_id, request_dict, response):
  50. """
  51. 设备绑定iccid
  52. @param user_id:
  53. @param request_dict:
  54. @param response:
  55. @return:
  56. """
  57. iccid = request_dict.get('iccid', None)
  58. uid = request_dict.get('uid', None)
  59. if not all([iccid, uid]):
  60. return response.json(444)
  61. n_time = int(time.time())
  62. try:
  63. # 待完善代码 根据uid与用户id验证系统设备
  64. unicom_device_qs = UnicomDeviceInfo.objects.filter(iccid=iccid)
  65. if unicom_device_qs.exists():
  66. return response.json(174)
  67. unicom_obj = UnicomObjeect()
  68. result = unicom_obj.verify_device(iccid=iccid)
  69. if result.status_code == 200 and result.text:
  70. res_dict = json.loads(result.text)
  71. if res_dict['success']:
  72. if res_dict['data']['status'] == 0:
  73. return response.json(173)
  74. params = {'user_id': user_id, 'iccid': iccid, 'uid': uid, 'updated_time': n_time,
  75. 'created_time': n_time}
  76. UnicomDeviceInfo.objects.create(**params)
  77. return response.json(0)
  78. else:
  79. return response.json(173)
  80. except Exception as e:
  81. print(e)
  82. return response.json(177, repr(e))
  83. @classmethod
  84. def save_unicom_combo(cls, request_dict, response):
  85. """
  86. 联通套餐保存
  87. @param request_dict:
  88. @param response:
  89. @return:
  90. """
  91. combo_id = request_dict.get('id', None)
  92. combo_name = request_dict.get('comboName', None)
  93. flow_total = request_dict.get('flowTotal', None)
  94. expiration_days = request_dict.get('expirationDays', None)
  95. expiration_type = request_dict.get('expirationType', None)
  96. price = request_dict.get('price', None)
  97. remark = request_dict.get('remark', None)
  98. pay_type = request_dict.get('payType', '').split(',')
  99. if not all([pay_type, combo_name, flow_total, expiration_days, expiration_type, price]):
  100. return response.json(444)
  101. try:
  102. flow_total = int(flow_total)
  103. expiration_days = int(expiration_days)
  104. expiration_type = int(expiration_type)
  105. with transaction.atomic():
  106. re_data = {
  107. 'combo_name': combo_name,
  108. 'flow_total': flow_total,
  109. 'expiration_days': expiration_days,
  110. 'expiration_type': expiration_type,
  111. 'price': price,
  112. }
  113. if remark:
  114. re_data['remark'] = remark
  115. if combo_id:
  116. UnicomCombo.objects.filter(id=combo_id).update(**re_data)
  117. UnicomCombo.objects.get(id=combo_id).pay_type.set(pay_type)
  118. return response.json(0)
  119. UnicomCombo.objects.create(**re_data).pay_type.set(pay_type)
  120. return response.json(0)
  121. except Exception as e:
  122. print(e)
  123. return response.json(177, repr(e))
  124. @classmethod
  125. def query_package_list(cls, response):
  126. """
  127. 查询套餐列表
  128. @return:
  129. """
  130. try:
  131. combo_qs = UnicomCombo.objects.filter(is_show=1, status=0, is_del=False) \
  132. .order_by('sort').values('id', 'combo_name',
  133. 'flow_total',
  134. 'expiration_days',
  135. 'expiration_type', 'price',
  136. 'remark')
  137. if not combo_qs.exists():
  138. return response.json(0, [])
  139. combo_list = []
  140. for item in combo_qs:
  141. # 获取支付方式列表
  142. pay_type_qs = Pay_Type.objects.filter(unicomcombo=item['id']).values('id', 'payment')
  143. combo_list.append({
  144. 'id': item['id'],
  145. 'comboName': item['combo_name'],
  146. 'flowTotal': item['flow_total'],
  147. 'expirationDays': item['expiration_days'],
  148. 'expirationType': item['expiration_type'],
  149. 'price': item['price'],
  150. 'remark': item['remark'],
  151. 'payTypes': list(pay_type_qs),
  152. })
  153. return response.json(0, combo_list)
  154. except Exception as e:
  155. print(e)
  156. return response.json(177, repr(e))
  157. @classmethod
  158. def buy_package(cls):
  159. """
  160. 购买套餐
  161. @return:
  162. """
  163. pass
  164. @classmethod
  165. def query_device_usage_history(cls):
  166. """
  167. 查询用量历史
  168. @return:
  169. """
  170. @staticmethod
  171. def package_callback_notify(request_dict, request):
  172. """
  173. 异步套餐订购回调
  174. @param request_dict:
  175. @param request:
  176. @return:
  177. """
  178. logger = logging.getLogger('info')
  179. try:
  180. logger.info('联通异步套餐订购回调参数{}'.format(request_dict))
  181. body = request.body.decode("utf-8")
  182. if body:
  183. dict_data = json.loads(body)
  184. sign = dict_data['sign']
  185. logger.info('设备订购异步回调请求参数{}'.format(dict_data))
  186. dict_data.pop('sign')
  187. unicom_obj = UnicomObjeect()
  188. generate_sign = unicom_obj.createSign(**dict_data)
  189. logger.info('设备订购请求签名{}'.format(sign))
  190. logger.info('设备订购生成签名{}'.format(generate_sign))
  191. r_data = {'success': True, 'msg': '成功'}
  192. return HttpResponse(json.dumps(r_data, ensure_ascii=False), content_type="application/json,charset=utf-8")
  193. except Exception as e:
  194. print(repr(e))
  195. r_data = {'success': False, 'msg': '失败'}
  196. return HttpResponse(json.dumps(r_data, ensure_ascii=False), content_type="application/json,charset=utf-8")
  197. @staticmethod
  198. def device_queue_monitoring_push(request_dict, request):
  199. """
  200. 设备套餐队列用完或者到期推送
  201. @param request_dict:
  202. @param request:
  203. @return:
  204. """
  205. logger = logging.getLogger('info')
  206. try:
  207. logger.info('设备套餐队列推送{}'.format(request_dict))
  208. body = request.body.decode("utf-8")
  209. if body:
  210. dict_data = json.loads(body)
  211. sign = dict_data['sign']
  212. logger.info('设备套餐队列回调请求参数{}'.format(dict_data))
  213. dict_data.pop('sign')
  214. unicom_obj = UnicomObjeect()
  215. generate_sign = unicom_obj.createSign(**dict_data)
  216. logger.info('设备套餐队列请求签名{}'.format(sign))
  217. logger.info('设备套餐队列生成签名{}'.format(generate_sign))
  218. r_data = {'success': True, 'msg': '成功'}
  219. return HttpResponse(json.dumps(r_data, ensure_ascii=False), content_type="application/json,charset=utf-8")
  220. except Exception as e:
  221. print(repr(e))
  222. r_data = {'success': False, 'msg': '失败'}
  223. return HttpResponse(json.dumps(r_data, ensure_ascii=False), content_type="application/json,charset=utf-8")
  224. @staticmethod
  225. def device_status_change_push(request_dict, request):
  226. """
  227. 设备状态变更推送执行场景说明
  228. @param request_dict:
  229. @param request:
  230. @return:
  231. """
  232. logger = logging.getLogger('info')
  233. try:
  234. logger.info('设备状态变更推送{}'.format(request_dict))
  235. body = request.body.decode("utf-8")
  236. if body:
  237. dict_data = json.loads(body)
  238. sign = dict_data['sign']
  239. logger.info('设备状态变更推送请求参数{}'.format(dict_data))
  240. dict_data.pop('sign')
  241. unicom_obj = UnicomObjeect()
  242. generate_sign = unicom_obj.createSign(**dict_data)
  243. logger.info('设备状态变更推送请求签名{}'.format(sign))
  244. logger.info('设备状态变更推送生成签名{}'.format(generate_sign))
  245. r_data = {'success': True, 'msg': '成功'}
  246. return HttpResponse(json.dumps(r_data, ensure_ascii=False), content_type="application/json,charset=utf-8")
  247. except Exception as e:
  248. print(repr(e))
  249. r_data = {'success': False, 'msg': '失败'}
  250. return HttpResponse(json.dumps(r_data, ensure_ascii=False), content_type="application/json,charset=utf-8")