WXTechController.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : WXTechController.py
  4. @Time : 2023/5/6 16:40
  5. @Author : stephen
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import time
  10. from django.http import QueryDict
  11. from django.views import View
  12. from Ansjer.config import LOGGER
  13. from Controller.UnicomCombo.UnicomComboController import UnicomComboView
  14. from Model.models import UnicomDeviceInfo, Order_Model, UnicomComboExperienceHistory, UnicomCombo, ExchangeCode
  15. from Object.Enums.WXOperatorEnum import WXOperatorEnum
  16. from Object.Enums.WXStartTypeEnum import WXStartTypeEnum
  17. from Object.ResponseObject import ResponseObject
  18. from Object.WXTechObject import WXTechObject
  19. from Service.CommonService import CommonService
  20. # 五兴科技电信套餐编码 1G-15天流量包
  21. COMBO_ID = 'DX-DX-FDX-JCB-1G-15天-4DX-ASJ-YTC-AT-2022123020221230144615'
  22. class WXTechController(View):
  23. class SmartSocketView(View):
  24. def get(self, request, *args, **kwargs):
  25. request.encoding = 'utf-8'
  26. operation = kwargs.get('operation')
  27. return self.validation(request.GET, request, operation)
  28. def post(self, request, *args, **kwargs):
  29. request.encoding = 'utf-8'
  30. operation = kwargs.get('operation')
  31. return self.validation(request.POST, request, operation)
  32. def delete(self, request, *args, **kwargs):
  33. request.encoding = 'utf-8'
  34. operation = kwargs.get('operation')
  35. delete = QueryDict(request.body)
  36. if not delete:
  37. delete = request.GET
  38. return self.validation(delete, request, operation)
  39. def put(self, request, *args, **kwargs):
  40. request.encoding = 'utf-8'
  41. operation = kwargs.get('operation')
  42. put = QueryDict(request.body)
  43. return self.validation(put, request, operation)
  44. def validation(self, request_dict, request, operation):
  45. if operation == 'deleteCardPackage':
  46. return self.delete_card_package(request_dict, ResponseObject('cn'))
  47. token_code, user_id, response = CommonService \
  48. .verify_token_get_user_id(request_dict, request)
  49. if token_code != 0:
  50. return response.json(token_code)
  51. if operation == 'getCardsInfo':
  52. return self.get_cards_info(request_dict, response)
  53. elif operation == 'getExperiencePackage':
  54. return self.get_experience_package(request_dict, response)
  55. elif operation == 'createOrder':
  56. return self.create_order_package(request_dict, response)
  57. elif operation == 'exchangePackage':
  58. return self.wx_exchange_package(request_dict, response)
  59. @classmethod
  60. def get_cards_info(cls, request_dict, response):
  61. """
  62. 五兴单卡获取信息
  63. """
  64. try:
  65. LOGGER.info('*****WXTechController.get_cards_info:params:{}'.format(request_dict))
  66. iccid = request_dict.get('iccid', None)
  67. operator = int(request_dict.get('operator', 3))
  68. if not iccid:
  69. return response.json(444)
  70. data = {'iccid': iccid, 'operator': operator}
  71. wx_tech = WXTechObject()
  72. return response.json(0, wx_tech.get_cards_info(**data))
  73. except Exception as e:
  74. LOGGER.info('*****WXTechController.get_cards_info:errLine:{}, errMsg:{}'
  75. .format(e.__traceback__.tb_lineno, repr(e)))
  76. return response.json(500, repr(e))
  77. @classmethod
  78. def get_experience_package(cls, request_dict, response):
  79. """
  80. 获取体验套餐
  81. """
  82. try:
  83. LOGGER.info('*****WXTechController.get_experience_package:params{}'.format(request_dict))
  84. serial_no = request_dict.get('serialNo', None)
  85. if not serial_no:
  86. return response.json(444)
  87. # 查询是否注册iccid
  88. unicom_device_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_no) \
  89. .values('serial_no', 'user_id', 'iccid')
  90. if not unicom_device_qs.exists():
  91. return response.json(173)
  92. unicom_device_qs = unicom_device_qs.first()
  93. iccid = unicom_device_qs['iccid']
  94. # 查看是否体验过免费套餐
  95. experience_history_qs = UnicomComboExperienceHistory.objects.filter(iccid=iccid)
  96. if experience_history_qs.exists():
  97. return response.json(10062)
  98. combo_info_qs = UnicomCombo.objects.filter(combo_type=1, status=0, is_del=False) \
  99. .values('combo_name')
  100. if not combo_info_qs.exists():
  101. return response.json(173)
  102. result = {'comboName': combo_info_qs[0]['combo_name']}
  103. return response.json(0, result)
  104. except Exception as e:
  105. LOGGER.info('*****WXTechController.get_experience_package:errLine:{}, errMsg:{}'
  106. .format(e.__traceback__.tb_lineno, repr(e)))
  107. return response.json(500, repr(e))
  108. @classmethod
  109. def create_order_package(cls, request_dict, response):
  110. """
  111. 五兴电信领取1G15天流量体验包
  112. """
  113. try:
  114. LOGGER.info('*****WXTechController.create_order_package:params:{}'.format(request_dict))
  115. serial_no = request_dict.get('serialNo', None)
  116. operator = request_dict.get('operator', None)
  117. if not all([operator, serial_no]):
  118. return response.json(444)
  119. unicom_device_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_no) \
  120. .values('serial_no', 'user_id', 'iccid')
  121. if not unicom_device_qs.exists():
  122. return response.json(173)
  123. unicom_device_qs = unicom_device_qs.first()
  124. user_id = unicom_device_qs['user_id']
  125. iccid = unicom_device_qs['iccid']
  126. # 查看是否体验过免费套餐
  127. experience_history_qs = UnicomComboExperienceHistory.objects.filter(iccid=iccid)
  128. if experience_history_qs.exists():
  129. return response.json(10062)
  130. data = {'iccid': iccid, 'operator': WXOperatorEnum(int(operator)).value,
  131. 'startType': str(WXStartTypeEnum.EFFECTIVE_IMMEDIATELY.value), 'packageCode': COMBO_ID}
  132. wx_tech = WXTechObject()
  133. # 请求五兴API创建套餐接口
  134. res = wx_tech.create_order_package(**data)
  135. LOGGER.info('*****五兴创建体验套餐信息:{}'.format(res))
  136. if res['code'] == '0':
  137. trade_no = res['data']['orderNumber']
  138. experience_history_vo = {'iccid': iccid, 'experience_type': 0, 'do_time': int(time.time())}
  139. UnicomComboExperienceHistory.objects.create(**experience_history_vo)
  140. order_res = cls.created_order(serial_no, user_id, trade_no)
  141. LOGGER.info('*****系统创建体验订单:{}'.format(order_res))
  142. return response.json(0)
  143. return response.json(10063)
  144. except Exception as e:
  145. LOGGER.info('*****WXTechController.create_order_package:errLine:{}, errMsg:{}'
  146. .format(e.__traceback__.tb_lineno, repr(e)))
  147. return response.json(500, repr(e))
  148. @classmethod
  149. def created_order(cls, serial_no, user_id, trade_no):
  150. """
  151. 创建系统订单
  152. """
  153. combo_info_qs = UnicomCombo.objects.filter(combo_type=1, status=0, is_del=False) \
  154. .values('id', 'combo_name', 'price', 'virtual_price', 'remark').order_by('sort')
  155. if not combo_info_qs.exists():
  156. return False
  157. combo_info_vo = combo_info_qs[0]
  158. n_time = int(time.time())
  159. # 根据序列号获取UID
  160. uid = CommonService.query_uid_with_serial(serial_no)
  161. order_id = CommonService.createOrderID()
  162. # 生成订单必须添加该字段
  163. rank_id, ai_rank_id = UnicomComboView().get_cloud_or_ai_combo()
  164. order_dict = {'orderID': order_id, 'UID': uid, 'rank_id': rank_id, 'ai_rank_id': ai_rank_id,
  165. 'userID_id': user_id, 'desc': combo_info_vo['combo_name'], 'payType': 10,
  166. 'payTime': n_time, 'price': combo_info_vo['price'], 'addTime': n_time,
  167. 'updTime': n_time, 'status': 1,
  168. 'unify_combo_id': str(combo_info_vo['id']), 'order_type': 3,
  169. 'store_meal_name': combo_info_vo['combo_name'],
  170. 'trade_no': trade_no}
  171. Order_Model.objects.create(**order_dict)
  172. return True
  173. @classmethod
  174. def delete_card_package(cls, request_dict, response):
  175. """
  176. PC工具清空卡片的所有套餐订购记录
  177. """
  178. try:
  179. LOGGER.info('*****WXTechController.delete_card_package:params:{}'.format(request_dict))
  180. sign = request_dict.get('sign', None)
  181. serial_no = request_dict.get('serialNo', None)
  182. time_stamp = request_dict.get('timeStamp', None)
  183. if not CommonService.check_time_stamp_token(sign, time_stamp):
  184. return response.json(13)
  185. # 查询是否注册iccid
  186. unicom_device_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_no) \
  187. .values('serial_no', 'user_id', 'iccid')
  188. if not unicom_device_qs.exists():
  189. return response.json(173)
  190. iccid = unicom_device_qs[0]['iccid']
  191. data = {'iccids': iccid, 'operator': WXOperatorEnum.TELECOM.value}
  192. wx_tech = WXTechObject()
  193. res = wx_tech.delete_card_package(**data)
  194. if res['code'] == '0':
  195. UnicomComboExperienceHistory.objects.filter(iccid=iccid).delete()
  196. return response.json(0)
  197. return response.json(177)
  198. except Exception as e:
  199. LOGGER.info('*****WXTechController.delete_card_package:errLine:{}, errMsg:{}'
  200. .format(e.__traceback__.tb_lineno, repr(e)))
  201. return response.json(500, repr(e))
  202. @classmethod
  203. def wx_exchange_package(cls, request_dict, response):
  204. """
  205. 五兴兑换套餐包
  206. """
  207. try:
  208. code = request_dict.get('code')
  209. serial_number = request_dict.get('serialNumber')
  210. if not all([code, serial_number]):
  211. return response.json(444) # 参数缺失
  212. # 校验兑换码格式是否正确
  213. if not (code.isalnum() and len(code) == 10):
  214. return response.json(10040) # 兑换码格式错误
  215. card_type = 1
  216. # 查询设备信息
  217. device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number, card_type=card_type) \
  218. .values('iccid')
  219. if not device_info_qs.exists():
  220. return response.json(173) # 设备信息不存在
  221. # 查询兑换码信息
  222. exchange_code_qs = ExchangeCode.objects.filter(code=code, status=False, package_type=card_type) \
  223. .values('package_id', 'expire_time')
  224. if not exchange_code_qs.exists():
  225. return response.json(10040) # 兑换码无效
  226. # 获取五兴套餐套餐编码
  227. package_info_qs = UnicomCombo.objects.filter(id=exchange_code_qs[0]['package_id'], is_del=False) \
  228. .values('package_id')
  229. if not package_info_qs.exists():
  230. return response.json(173)
  231. package_code = package_info_qs[0]['package_id']
  232. iccid = device_info_qs[0]['iccid']
  233. # 五兴订购流量包请求参数
  234. data = {'iccid': iccid, 'operator': WXOperatorEnum.TELECOM.value,
  235. 'startType': str(WXStartTypeEnum.EFFECTIVE_IMMEDIATELY.value), 'packageCode': package_code}
  236. wx_tech = WXTechObject()
  237. # 请求五兴API订购套餐接口
  238. res = wx_tech.create_order_package(**data)
  239. LOGGER.info('*****五兴订购年卡套餐结果:{}'.format(res))
  240. if res['code'] == '0':
  241. experience_history_vo = {'iccid': iccid, 'experience_type': 1, 'do_time': int(time.time())}
  242. UnicomComboExperienceHistory.objects.create(**experience_history_vo)
  243. exchange_code_qs.update(status=True)
  244. return response.json(0)
  245. return response.json(10040)
  246. except Exception as e:
  247. LOGGER.info('*****WXTechController.delete_card_package:errLine:{}, errMsg:{}'
  248. .format(e.__traceback__.tb_lineno, repr(e)))
  249. return response.json(500, repr(e))