WXTechController.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  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. LogModel
  16. from Object.Enums.WXOperatorEnum import WXOperatorEnum
  17. from Object.Enums.WXStartTypeEnum import WXStartTypeEnum
  18. from Object.ResponseObject import ResponseObject
  19. from Object.WXTechObject import WXTechObject
  20. from Service.CommonService import CommonService
  21. # 五兴科技电信套餐编码 1G-15天流量包
  22. COMBO_ID = 'DX-DX-FDX-JCB-1G-15天-4DX-ASJ-YTC-AT-2022123020221230144615'
  23. class WXTechController(View):
  24. class SmartSocketView(View):
  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 delete(self, request, *args, **kwargs):
  34. request.encoding = 'utf-8'
  35. operation = kwargs.get('operation')
  36. delete = QueryDict(request.body)
  37. if not delete:
  38. delete = request.GET
  39. return self.validation(delete, request, operation)
  40. def put(self, request, *args, **kwargs):
  41. request.encoding = 'utf-8'
  42. operation = kwargs.get('operation')
  43. put = QueryDict(request.body)
  44. return self.validation(put, request, operation)
  45. def validation(self, request_dict, request, operation):
  46. if operation == 'deleteCardPackage':
  47. return self.delete_card_package(request_dict, ResponseObject('cn'))
  48. elif operation == 'packageRefund':
  49. return self.wx_package_refund(request_dict, ResponseObject('cn'))
  50. token_code, user_id, response = CommonService \
  51. .verify_token_get_user_id(request_dict, request)
  52. if token_code != 0:
  53. return response.json(token_code)
  54. if operation == 'getCardsInfo':
  55. return self.get_cards_info(request_dict, response)
  56. elif operation == 'getExperiencePackage':
  57. return self.get_experience_package(request_dict, response)
  58. elif operation == 'createOrder':
  59. return self.create_order_package(request_dict, response)
  60. elif operation == 'exchangePackage':
  61. return self.wx_exchange_package(request_dict, response, request, user_id)
  62. @classmethod
  63. def wx_package_refund(cls, request_dict, response):
  64. """
  65. 五兴套餐退订
  66. """
  67. try:
  68. serial_number = request_dict.get('serialNumber', None)
  69. if not serial_number:
  70. return response(444)
  71. device_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number).values('iccid')
  72. if not device_qs.exists():
  73. return response(173)
  74. uid = CommonService.query_uid_with_serial(serial_number)
  75. order_info_qs = Order_Model.objects.filter(UID=uid, order_type=3).values('trade_no') \
  76. .order_by('-payTime')
  77. if not order_info_qs.exists():
  78. return response(173)
  79. iccid = device_qs[0]['iccid']
  80. trade_no = order_info_qs[0]['trade_no']
  81. data = {'iccid': iccid, 'operator': 3, 'orderNumber': trade_no}
  82. wx_tech = WXTechObject()
  83. res = wx_tech.package_refund(**data)
  84. if res['code'] == '0':
  85. return response.json(0)
  86. return response.json(10059)
  87. except Exception as e:
  88. LOGGER.info('*****WXTechController.get_cards_info:errLine:{}, errMsg:{}'
  89. .format(e.__traceback__.tb_lineno, repr(e)))
  90. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  91. @classmethod
  92. def get_cards_info(cls, request_dict, response):
  93. """
  94. 五兴单卡获取信息
  95. """
  96. try:
  97. LOGGER.info('*****WXTechController.get_cards_info:params:{}'.format(request_dict))
  98. iccid = request_dict.get('iccid', None)
  99. operator = int(request_dict.get('operator', 3))
  100. if not iccid:
  101. return response.json(444)
  102. data = {'iccid': iccid, 'operator': operator}
  103. wx_tech = WXTechObject()
  104. return response.json(0, wx_tech.get_cards_info(**data))
  105. except Exception as e:
  106. LOGGER.info('*****WXTechController.get_cards_info:errLine:{}, errMsg:{}'
  107. .format(e.__traceback__.tb_lineno, repr(e)))
  108. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  109. @classmethod
  110. def get_experience_package(cls, request_dict, response):
  111. """
  112. 获取体验套餐
  113. """
  114. try:
  115. LOGGER.info('*****WXTechController.get_experience_package:params{}'.format(request_dict))
  116. serial_no = request_dict.get('serialNo', None)
  117. if not serial_no:
  118. return response.json(444)
  119. # 查询是否注册iccid
  120. unicom_device_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_no) \
  121. .values('serial_no', 'user_id', 'iccid')
  122. if not unicom_device_qs.exists():
  123. return response.json(173)
  124. unicom_device_qs = unicom_device_qs.first()
  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. combo_info_qs = UnicomCombo.objects.filter(combo_type=1, status=0, is_del=False) \
  131. .values('combo_name')
  132. if not combo_info_qs.exists():
  133. return response.json(173)
  134. result = {'comboName': combo_info_qs[0]['combo_name']}
  135. return response.json(0, result)
  136. except Exception as e:
  137. LOGGER.info('*****WXTechController.get_experience_package:errLine:{}, errMsg:{}'
  138. .format(e.__traceback__.tb_lineno, repr(e)))
  139. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  140. @classmethod
  141. def create_order_package(cls, request_dict, response):
  142. """
  143. 五兴电信领取1G15天流量体验包
  144. """
  145. try:
  146. LOGGER.info('*****WXTechController.create_order_package:params:{}'.format(request_dict))
  147. serial_no = request_dict.get('serialNo', None)
  148. operator = request_dict.get('operator', None)
  149. if not all([operator, serial_no]):
  150. return response.json(444)
  151. unicom_device_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_no) \
  152. .values('serial_no', 'user_id', 'iccid')
  153. if not unicom_device_qs.exists():
  154. return response.json(173)
  155. unicom_device_qs = unicom_device_qs.first()
  156. user_id = unicom_device_qs['user_id']
  157. iccid = unicom_device_qs['iccid']
  158. # 查看是否体验过免费套餐
  159. experience_history_qs = UnicomComboExperienceHistory.objects.filter(iccid=iccid)
  160. if experience_history_qs.exists():
  161. return response.json(10062)
  162. data = {'iccid': iccid, 'operator': WXOperatorEnum(int(operator)).value,
  163. 'startType': str(WXStartTypeEnum.EFFECTIVE_IMMEDIATELY.value), 'packageCode': COMBO_ID}
  164. wx_tech = WXTechObject()
  165. # 请求五兴API创建套餐接口
  166. res = wx_tech.create_order_package(**data)
  167. LOGGER.info('*****五兴创建体验套餐信息:{}'.format(res))
  168. if res['code'] == '0':
  169. trade_no = res['data']['orderNumber']
  170. experience_history_vo = {'iccid': iccid, 'experience_type': 0, 'do_time': int(time.time())}
  171. UnicomComboExperienceHistory.objects.create(**experience_history_vo)
  172. order_res = cls.created_order(serial_no, user_id, trade_no, pay_type=10)
  173. LOGGER.info('*****系统创建体验订单:{}'.format(order_res))
  174. return response.json(0)
  175. return response.json(10063)
  176. except Exception as e:
  177. LOGGER.info('*****WXTechController.create_order_package:errLine:{}, errMsg:{}'
  178. .format(e.__traceback__.tb_lineno, repr(e)))
  179. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  180. @classmethod
  181. def created_order(cls, serial_no, user_id, trade_no, combo_id=None, pay_type=10):
  182. """
  183. 创建系统订单
  184. """
  185. combo_info_qs = UnicomCombo.objects.filter(is_del=False)
  186. if combo_id:
  187. combo_info_qs = combo_info_qs.filter(id=int(combo_id))
  188. else:
  189. combo_info_qs = combo_info_qs.filter(combo_type=1, status=0)
  190. combo_info_qs = combo_info_qs.values('id', 'combo_name', 'price', 'virtual_price', 'remark') \
  191. .order_by('sort')
  192. if not combo_info_qs.exists():
  193. return False
  194. combo_info_vo = combo_info_qs[0]
  195. n_time = int(time.time())
  196. # 根据序列号获取UID
  197. uid = CommonService.query_uid_with_serial(serial_no)
  198. order_id = CommonService.createOrderID()
  199. # 生成订单必须添加该字段
  200. rank_id, ai_rank_id = UnicomComboView().get_cloud_or_ai_combo()
  201. order_dict = {'orderID': order_id, 'UID': uid, 'rank_id': rank_id, 'ai_rank_id': ai_rank_id,
  202. 'userID_id': user_id, 'desc': combo_info_vo['combo_name'], 'payType': pay_type,
  203. 'payTime': n_time, 'price': combo_info_vo['price'], 'addTime': n_time,
  204. 'updTime': n_time, 'status': 1, 'currency': 'CNY',
  205. 'unify_combo_id': str(combo_info_vo['id']), 'order_type': 3,
  206. 'store_meal_name': combo_info_vo['combo_name'],
  207. 'trade_no': trade_no}
  208. Order_Model.objects.create(**order_dict)
  209. return order_id
  210. @classmethod
  211. def delete_card_package(cls, request_dict, response):
  212. """
  213. PC工具清空卡片的所有套餐订购记录
  214. """
  215. try:
  216. LOGGER.info('*****WXTechController.delete_card_package:params:{}'.format(request_dict))
  217. sign = request_dict.get('sign', None)
  218. serial_no = request_dict.get('serialNo', None)
  219. time_stamp = request_dict.get('timeStamp', None)
  220. if not CommonService.check_time_stamp_token(sign, time_stamp):
  221. return response.json(13)
  222. # 查询是否注册iccid
  223. unicom_device_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_no) \
  224. .values('serial_no', 'user_id', 'iccid')
  225. if not unicom_device_qs.exists():
  226. return response.json(173)
  227. iccid = unicom_device_qs[0]['iccid']
  228. data = {'iccids': iccid, 'operator': WXOperatorEnum.TELECOM.value}
  229. wx_tech = WXTechObject()
  230. res = wx_tech.delete_card_package(**data)
  231. if res['code'] == '0':
  232. UnicomComboExperienceHistory.objects.filter(iccid=iccid).delete()
  233. return response.json(0)
  234. return response.json(177)
  235. except Exception as e:
  236. LOGGER.info('*****WXTechController.delete_card_package:errLine:{}, errMsg:{}'
  237. .format(e.__traceback__.tb_lineno, repr(e)))
  238. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  239. @classmethod
  240. def wx_exchange_package(cls, request_dict, response, request, user_id):
  241. """
  242. 使用兑换码订购五兴五年流量套餐包
  243. """
  244. ip = CommonService.get_ip_address(request)
  245. try:
  246. code = request_dict.get('code')
  247. serial_number = request_dict.get('serialNumber')
  248. LOGGER.info('*****WXTechController.wx_exchange_package:params,{}'.format(request_dict))
  249. if not all([code, serial_number]):
  250. return response.json(444) # 参数缺失
  251. # 校验兑换码格式是否正确
  252. if not (code.isalnum() and len(code) == 10):
  253. return response.json(10040) # 兑换码格式错误
  254. device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number) \
  255. .values('iccid', 'card_type')
  256. if not device_info_qs.exists():
  257. return response.json(173) # 设备信息不存在
  258. # 查询兑换码信息
  259. exchange_code_qs = ExchangeCode.objects.filter(code=code, status=False) \
  260. .values('package_id', 'expire_time', 'package_type')
  261. if not exchange_code_qs.exists():
  262. return response.json(10040) # 兑换码无效
  263. combo_id = exchange_code_qs[0]['package_id']
  264. # 获取五兴套餐套餐编码
  265. package_info_qs = UnicomCombo.objects.filter(id=combo_id, is_del=False) \
  266. .values('package_id')
  267. if not package_info_qs.exists():
  268. return response.json(173)
  269. package_code = package_info_qs[0]['package_id']
  270. iccid = device_info_qs[0]['iccid']
  271. # 兑换码套餐类型
  272. card_type = device_info_qs[0]['card_type']
  273. if card_type == 0: # 联通无限流量兑换码
  274. result = cls.exchange_unicom_package(serial_number, iccid,
  275. user_id, combo_id)
  276. if result:
  277. exchange_code_qs.update(status=True, updated_time=int(time.time()))
  278. cls.save_log(ip, 200, '兑换成功{},{}'.format(serial_number, code))
  279. return response.json(0)
  280. elif card_type == 1: # 五兴电信无限流量兑换码
  281. # 五兴订购流量包请求参数
  282. data = {'iccid': iccid, 'operator': WXOperatorEnum.TELECOM.value,
  283. 'startType': str(WXStartTypeEnum.EFFECTIVE_IMMEDIATELY.value), 'packageCode': package_code}
  284. wx_tech = WXTechObject()
  285. # 请求五兴API订购套餐接口
  286. res = wx_tech.create_order_package(**data)
  287. LOGGER.info('*****五兴订购年卡套餐结果:{}'.format(res))
  288. if res['code'] == '0':
  289. trade_no = res['data']['orderNumber']
  290. cls.created_order(serial_number, user_id, trade_no, combo_id, 11)
  291. exchange_code_qs.update(status=True, updated_time=int(time.time()))
  292. cls.save_log(ip, 200, '兑换成功{},{}'.format(serial_number, code))
  293. return response.json(0)
  294. cls.save_log(ip, 10040, '兑换失败{},{}'.format(serial_number, code))
  295. return response.json(10040)
  296. except Exception as e:
  297. LOGGER.info('*****WXTechController.wx_exchange_package:errLine:{}, errMsg:{}'
  298. .format(e.__traceback__.tb_lineno, repr(e)))
  299. cls.save_log(ip, 500, '兑换内部错误')
  300. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  301. @classmethod
  302. def exchange_unicom_package(cls, serial_number, iccid, user_id, combo_id):
  303. try:
  304. # 通过兑换码创建订单记录
  305. order_id = cls.created_order(serial_number, user_id, 'ansjer', combo_id, 11)
  306. # 根据订单信息创建流量套餐包
  307. UnicomComboView.create_combo_order_info(order_id, 0, iccid, combo_id)
  308. return True
  309. except Exception as e:
  310. LOGGER.info('*****WXTechController.exchange_unicom_package:errLine:{}, errMsg:{}'
  311. .format(e.__traceback__.tb_lineno, repr(e)))
  312. return False
  313. @staticmethod
  314. def save_log(ip, code, operation):
  315. """
  316. 保存操作日志
  317. @param ip: ip地址
  318. @param code: 状态码
  319. @param operation: 操作说明
  320. @return: 保存结果
  321. """
  322. try:
  323. log = {
  324. 'ip': ip,
  325. 'user_id': 1,
  326. 'status': code,
  327. 'time': int(time.time()),
  328. 'operation': operation,
  329. 'url': 'unicom/open/wxtech/exchangePackage',
  330. }
  331. LogModel.objects.create(**log)
  332. return True
  333. except Exception as e:
  334. LOGGER.info('*****WXTechController.save_log:errLine:{}, errMsg:{}'
  335. .format(e.__traceback__.tb_lineno, repr(e)))
  336. return False