WXTechController.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  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, SerialNumberPackage
  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 WXTechControllerView(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. elif operation == 'packageRefund':
  48. return self.wx_package_refund(request_dict, ResponseObject('cn'))
  49. token_code, user_id, response = CommonService \
  50. .verify_token_get_user_id(request_dict, request)
  51. if token_code != 0:
  52. return response.json(token_code)
  53. if operation == 'getCardsInfo':
  54. return self.get_cards_info(request_dict, response)
  55. elif operation == 'getExperiencePackage':
  56. return self.get_experience_package(request_dict, response)
  57. elif operation == 'createOrder':
  58. return self.create_order_package(user_id, request_dict, response)
  59. elif operation == 'exchangePackage':
  60. return self.wx_exchange_package(request_dict, response, request, user_id)
  61. elif operation == 'getPackageBySerialNumber':
  62. return self.get_package_by_serial_number(request_dict, response, request, user_id)
  63. elif operation == 'create4GFlowPackage':
  64. return self.create_4G_flow_package(request_dict, response, request, user_id)
  65. @classmethod
  66. def wx_package_refund(cls, request_dict, response):
  67. """
  68. 五兴套餐退订
  69. """
  70. try:
  71. serial_number = request_dict.get('serialNumber', None)
  72. if not serial_number:
  73. return response(444)
  74. device_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number).values('iccid')
  75. if not device_qs.exists():
  76. return response(173)
  77. uid = CommonService.query_uid_with_serial(serial_number)
  78. order_info_qs = Order_Model.objects.filter(UID=uid, order_type=3).values('trade_no') \
  79. .order_by('-payTime')
  80. if not order_info_qs.exists():
  81. return response(173)
  82. iccid = device_qs[0]['iccid']
  83. trade_no = order_info_qs[0]['trade_no']
  84. data = {'iccid': iccid, 'operator': 3, 'orderNumber': trade_no}
  85. wx_tech = WXTechObject()
  86. res = wx_tech.package_refund(**data)
  87. if res['code'] == '0':
  88. return response.json(0)
  89. return response.json(10059)
  90. except Exception as e:
  91. LOGGER.info('*****WXTechController.get_cards_info:errLine:{}, errMsg:{}'
  92. .format(e.__traceback__.tb_lineno, repr(e)))
  93. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  94. @classmethod
  95. def get_cards_info(cls, request_dict, response):
  96. """
  97. 五兴单卡获取信息
  98. """
  99. try:
  100. LOGGER.info('*****WXTechController.get_cards_info:params:{}'.format(request_dict))
  101. iccid = request_dict.get('iccid', None)
  102. operator = int(request_dict.get('operator', 3))
  103. if not iccid:
  104. return response.json(444)
  105. data = {'iccid': iccid, 'operator': operator}
  106. wx_tech = WXTechObject()
  107. return response.json(0, wx_tech.get_cards_info(**data))
  108. except Exception as e:
  109. LOGGER.info('*****WXTechController.get_cards_info:errLine:{}, errMsg:{}'
  110. .format(e.__traceback__.tb_lineno, repr(e)))
  111. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  112. @classmethod
  113. def get_experience_package(cls, request_dict, response):
  114. """
  115. 获取体验套餐
  116. """
  117. try:
  118. LOGGER.info('*****WXTechController.get_experience_package:params{}'.format(request_dict))
  119. serial_no = request_dict.get('serialNo', None)
  120. if not serial_no:
  121. return response.json(444)
  122. serial_no = serial_no[0:9]
  123. # 查询是否注册iccid
  124. unicom_device_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_no) \
  125. .values('serial_no', 'user_id', 'iccid')
  126. if not unicom_device_qs.exists():
  127. return response.json(173)
  128. unicom_device_qs = unicom_device_qs.first()
  129. iccid = unicom_device_qs['iccid']
  130. # 查看是否体验过免费套餐
  131. experience_history_qs = UnicomComboExperienceHistory.objects.filter(iccid=iccid)
  132. if experience_history_qs.exists():
  133. return response.json(10062)
  134. combo_info_qs = UnicomCombo.objects.filter(combo_type=1, status=0, is_del=False) \
  135. .values('combo_name')
  136. if not combo_info_qs.exists():
  137. return response.json(173)
  138. result = {'comboName': combo_info_qs[0]['combo_name']}
  139. return response.json(0, result)
  140. except Exception as e:
  141. LOGGER.info('*****WXTechController.get_experience_package:errLine:{}, errMsg:{}'
  142. .format(e.__traceback__.tb_lineno, repr(e)))
  143. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  144. @classmethod
  145. def create_order_package(cls, user_id, request_dict, response):
  146. """
  147. 五兴电信领取1G15天流量体验包
  148. """
  149. try:
  150. LOGGER.info('*****WXTechController.create_order_package:params:{}'.format(request_dict))
  151. serial_no = request_dict.get('serialNo', None)
  152. operator = request_dict.get('operator', None)
  153. if not all([operator, serial_no]):
  154. return response.json(444)
  155. serial_no = serial_no[0:9]
  156. unicom_device_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_no) \
  157. .values('serial_no', 'user_id', 'iccid')
  158. if not unicom_device_qs.exists():
  159. return response.json(173)
  160. unicom_device_qs = unicom_device_qs.first()
  161. iccid = unicom_device_qs['iccid']
  162. # 查看是否体验过免费套餐
  163. experience_history_qs = UnicomComboExperienceHistory.objects.filter(iccid=iccid)
  164. if experience_history_qs.exists():
  165. return response.json(10062)
  166. data = {'iccid': iccid, 'operator': WXOperatorEnum(int(operator)).value,
  167. 'startType': str(WXStartTypeEnum.EFFECTIVE_IMMEDIATELY.value), 'packageCode': COMBO_ID}
  168. wx_tech = WXTechObject()
  169. # 请求五兴API创建套餐接口
  170. res = wx_tech.create_order_package(**data)
  171. LOGGER.info('*****五兴创建体验套餐信息:{}'.format(res))
  172. if res['code'] == '0':
  173. trade_no = res['data']['orderNumber']
  174. experience_history_vo = {'iccid': iccid, 'experience_type': 0, 'do_time': int(time.time())}
  175. UnicomComboExperienceHistory.objects.create(**experience_history_vo)
  176. order_res = cls.created_order(serial_no, user_id, trade_no, pay_type=10)
  177. UnicomDeviceInfo.objects.filter(serial_no=serial_no) \
  178. .update(user_id=user_id, updated_time=int(time.time()))
  179. LOGGER.info('*****系统创建体验订单:{}'.format(order_res))
  180. return response.json(0)
  181. return response.json(10063)
  182. except Exception as e:
  183. LOGGER.info('*****WXTechController.create_order_package:errLine:{}, errMsg:{}'
  184. .format(e.__traceback__.tb_lineno, repr(e)))
  185. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  186. @classmethod
  187. def created_order(cls, serial_no, user_id, trade_no, combo_id=None, pay_type=10, order_type=3):
  188. """
  189. 创建系统订单
  190. """
  191. combo_info_qs = UnicomCombo.objects.filter(is_del=False)
  192. if combo_id:
  193. combo_info_qs = combo_info_qs.filter(id=int(combo_id))
  194. else:
  195. combo_info_qs = combo_info_qs.filter(combo_type=1, status=0)
  196. combo_info_qs = combo_info_qs.values('id', 'combo_name', 'price', 'virtual_price', 'remark') \
  197. .order_by('sort')
  198. if not combo_info_qs.exists():
  199. return False
  200. combo_info_vo = combo_info_qs[0]
  201. n_time = int(time.time())
  202. # 根据序列号获取UID
  203. uid = CommonService.query_uid_with_serial(serial_no)
  204. order_id = CommonService.createOrderID()
  205. # 生成订单必须添加该字段
  206. rank_id, ai_rank_id = UnicomComboView().get_cloud_or_ai_combo()
  207. order_dict = {'orderID': order_id, 'UID': uid, 'rank_id': rank_id, 'ai_rank_id': ai_rank_id,
  208. 'userID_id': user_id, 'desc': combo_info_vo['combo_name'], 'payType': pay_type,
  209. 'payTime': n_time, 'price': combo_info_vo['price'], 'addTime': n_time,
  210. 'updTime': n_time, 'status': 1, 'currency': 'CNY',
  211. 'unify_combo_id': str(combo_info_vo['id']), 'order_type': order_type,
  212. 'store_meal_name': combo_info_vo['combo_name'],
  213. 'trade_no': trade_no}
  214. Order_Model.objects.create(**order_dict)
  215. return order_id
  216. @classmethod
  217. def delete_card_package(cls, request_dict, response):
  218. """
  219. PC工具清空卡片的所有套餐订购记录
  220. """
  221. try:
  222. LOGGER.info('*****WXTechController.delete_card_package:params:{}'.format(request_dict))
  223. sign = request_dict.get('sign', None)
  224. serial_no = request_dict.get('serialNo', None)
  225. time_stamp = request_dict.get('timeStamp', None)
  226. if not CommonService.check_time_stamp_token(sign, time_stamp):
  227. return response.json(13)
  228. # 查询是否注册iccid
  229. unicom_device_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_no) \
  230. .values('serial_no', 'user_id', 'iccid')
  231. if not unicom_device_qs.exists():
  232. return response.json(173)
  233. iccid = unicom_device_qs[0]['iccid']
  234. data = {'iccids': iccid, 'operator': WXOperatorEnum.TELECOM.value}
  235. wx_tech = WXTechObject()
  236. res = wx_tech.delete_card_package(**data)
  237. if res['code'] == '0':
  238. UnicomComboExperienceHistory.objects.filter(iccid=iccid).delete()
  239. return response.json(0)
  240. return response.json(177)
  241. except Exception as e:
  242. LOGGER.info('*****WXTechController.delete_card_package:errLine:{}, errMsg:{}'
  243. .format(e.__traceback__.tb_lineno, repr(e)))
  244. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  245. @classmethod
  246. def wx_exchange_package(cls, request_dict, response, request, user_id):
  247. """
  248. 使用兑换码订购五兴五年流量套餐包
  249. """
  250. ip = CommonService.get_ip_address(request)
  251. try:
  252. code = request_dict.get('code')
  253. serial_number = request_dict.get('serialNumber')
  254. LOGGER.info('*****WXTechController.wx_exchange_package:params,{}'.format(request_dict))
  255. if not all([code, serial_number]):
  256. return response.json(444) # 参数缺失
  257. # 校验兑换码格式是否正确
  258. if not (code.isalnum() and len(code) == 10):
  259. return response.json(10067) # 兑换码格式错误
  260. device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number) \
  261. .values('iccid', 'card_type')
  262. if not device_info_qs.exists():
  263. return response.json(173) # 设备信息不存在
  264. # 查询兑换码信息
  265. exchange_code_qs = ExchangeCode.objects.filter(code=code, status=False) \
  266. .values('package_id', 'expire_time', 'package_type')
  267. if not exchange_code_qs.exists():
  268. return response.json(10066) # 兑换码无效
  269. combo_id = exchange_code_qs[0]['package_id']
  270. # 获取五兴套餐套餐编码
  271. package_info_qs = UnicomCombo.objects.filter(id=combo_id, is_del=False) \
  272. .values('package_id')
  273. if not package_info_qs.exists():
  274. return response.json(173)
  275. package_code = package_info_qs[0]['package_id']
  276. iccid = device_info_qs[0]['iccid']
  277. # 兑换码套餐类型
  278. card_type = device_info_qs[0]['card_type']
  279. if card_type == 0: # 联通无限流量兑换码
  280. result = cls.exchange_unicom_package(serial_number, iccid,
  281. user_id, combo_id)
  282. if result:
  283. exchange_code_qs.update(status=True, updated_time=int(time.time()))
  284. cls.save_log(ip, 10065, '兑换成功{},{}'.format(serial_number, code))
  285. return response.json(10065)
  286. elif card_type == 1: # 五兴电信无限流量兑换码
  287. # 五兴订购流量包请求参数
  288. data = {'iccid': iccid, 'operator': WXOperatorEnum.TELECOM.value,
  289. 'startType': str(WXStartTypeEnum.EFFECTIVE_IMMEDIATELY.value), 'packageCode': package_code}
  290. wx_tech = WXTechObject()
  291. # 请求五兴API订购套餐接口
  292. res = wx_tech.create_order_package(**data)
  293. LOGGER.info('*****五兴订购年卡套餐结果:{}'.format(res))
  294. if res['code'] == '0':
  295. trade_no = res['data']['orderNumber']
  296. cls.created_order(serial_number, user_id, trade_no, combo_id, 11)
  297. exchange_code_qs.update(status=True, updated_time=int(time.time()))
  298. cls.save_log(ip, 10065, '兑换成功{},{}'.format(serial_number, code))
  299. return response.json(10065)
  300. cls.save_log(ip, 10068, '兑换失败{},{}'.format(serial_number, code))
  301. return response.json(10068)
  302. except Exception as e:
  303. LOGGER.info('*****WXTechController.wx_exchange_package:errLine:{}, errMsg:{}'
  304. .format(e.__traceback__.tb_lineno, repr(e)))
  305. cls.save_log(ip, 500, '兑换内部错误')
  306. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  307. @classmethod
  308. def exchange_unicom_package(cls, serial_number, iccid, user_id, combo_id):
  309. try:
  310. # 通过兑换码创建订单记录
  311. order_id = cls.created_order(serial_number, user_id, 'ansjer', combo_id, 11, 2)
  312. # 根据订单信息创建流量套餐包
  313. UnicomComboView.create_combo_order_info(order_id, 0, iccid, combo_id)
  314. return True
  315. except Exception as e:
  316. LOGGER.info('*****WXTechController.exchange_unicom_package:errLine:{}, errMsg:{}'
  317. .format(e.__traceback__.tb_lineno, repr(e)))
  318. return False
  319. @staticmethod
  320. def save_log(ip, code, operation):
  321. """
  322. 保存操作日志
  323. @param ip: ip地址
  324. @param code: 状态码
  325. @param operation: 操作说明
  326. @return: 保存结果
  327. """
  328. try:
  329. log = {
  330. 'ip': ip,
  331. 'user_id': 1,
  332. 'status': code,
  333. 'time': int(time.time()),
  334. 'operation': operation,
  335. 'url': 'unicom/open/wxtech/exchangePackage',
  336. }
  337. LogModel.objects.create(**log)
  338. return True
  339. except Exception as e:
  340. LOGGER.info('*****WXTechController.save_log:errLine:{}, errMsg:{}'
  341. .format(e.__traceback__.tb_lineno, repr(e)))
  342. return False
  343. @classmethod
  344. def get_package_by_serial_number(cls, request_dict, response, request, user_id):
  345. """
  346. 根据序列号获取无限流量套餐信息
  347. """
  348. try:
  349. serial_number = request_dict.get('serialNumber', None)
  350. if not serial_number:
  351. return response.json(444)
  352. serial_package_qs = SerialNumberPackage.objects.filter(serial_number=serial_number, status=1)
  353. data = {}
  354. if not serial_package_qs:
  355. return response.json(0, data)
  356. serial_package = serial_package_qs.first()
  357. package_id = serial_package.package_id
  358. package_info_qs = UnicomCombo.objects.filter(id=package_id).values('combo_name')
  359. if not package_info_qs.exists():
  360. return response.json(0, data)
  361. result = {'comboName': package_info_qs[0]['combo_name']}
  362. return response.json(110, result)
  363. except Exception as e:
  364. LOGGER.info('*****WXTechController.get_package_by_serial_number:errLine:{}, errMsg:{}'
  365. .format(e.__traceback__.tb_lineno, repr(e)))
  366. return response.json(503)
  367. @classmethod
  368. def create_4G_flow_package(cls, request_dict, response, request, user_id):
  369. """
  370. 创建4G流量套餐(出厂序列号绑定套餐)
  371. """
  372. ip = CommonService.get_ip_address(request)
  373. serial_number = ''
  374. try:
  375. serial_number = request_dict.get('serialNumber')
  376. if not serial_number:
  377. return response.json(0)
  378. device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number) \
  379. .values('iccid', 'card_type')
  380. if not device_info_qs.exists():
  381. return response.json(173) # 设备信息不存在
  382. serial_package_qs = SerialNumberPackage.objects.filter(serial_number=serial_number, status=1)
  383. if not serial_package_qs:
  384. return response.json(10064)
  385. combo_id = serial_package_qs.first().package_id
  386. # 获取餐套餐信息
  387. package_info_qs = UnicomCombo.objects.filter(id=combo_id, is_del=False) \
  388. .values('package_id', 'combo_name')
  389. if not package_info_qs.exists():
  390. return response.json(173)
  391. # 得到五兴电信运营商套餐编码
  392. package_code = package_info_qs[0]['package_id']
  393. combo_name = package_info_qs[0]['combo_name']
  394. iccid = device_info_qs[0]['iccid']
  395. n_time = int(time.time())
  396. # 兑换码套餐类型
  397. card_type = device_info_qs[0]['card_type']
  398. if card_type == 0: # 订购联通流量套餐
  399. result = cls.exchange_unicom_package(serial_number, iccid,
  400. user_id, combo_id)
  401. serial_package_qs.update(status=2, updated_time=n_time, updated_by=user_id)
  402. if result:
  403. cls.save_log(ip, 10071, '{}领取{}成功{}'.format(serial_number, combo_name, user_id))
  404. return response.json(10071)
  405. elif card_type == 1: # 订购五兴电信流量套餐
  406. # 五兴订购流量包请求参数
  407. data = {'iccid': iccid, 'operator': WXOperatorEnum.TELECOM.value,
  408. 'startType': str(WXStartTypeEnum.EFFECTIVE_IMMEDIATELY.value), 'packageCode': package_code}
  409. wx_tech = WXTechObject()
  410. # 请求五兴API订购套餐接口
  411. res = wx_tech.create_order_package(**data)
  412. LOGGER.info('*****五兴订购套餐结果:{}'.format(res))
  413. if res['code'] == '0':
  414. trade_no = res['data']['orderNumber']
  415. cls.created_order(serial_number, user_id, trade_no, combo_id, 11)
  416. serial_package_qs.update(status=2, updated_time=n_time, updated_by=user_id)
  417. cls.save_log(ip, 10071, '{}领取{}成功{}'.format(serial_number, combo_name, user_id))
  418. return response.json(10071)
  419. cls.save_log(ip, 10064, '无效卡类型{}领取{}失败{}'.format(serial_number, combo_name, user_id))
  420. return response.json(10064)
  421. except Exception as e:
  422. LOGGER.info('*****WXTechController.wx_exchange_package:errLine:{}, errMsg:{}'
  423. .format(e.__traceback__.tb_lineno, repr(e)))
  424. cls.save_log(ip, 500, f'{serial_number}领取流量套餐异常')
  425. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  426. @classmethod
  427. def activate_flow_package(cls, serial_number, ip, user_id):
  428. """
  429. 激活序列号出厂绑定无限流量套餐
  430. @param serial_number: 9位序列号
  431. @param ip: ip地址
  432. @param user_id: 用户id
  433. @return: True | False
  434. """
  435. try:
  436. if not serial_number:
  437. return False
  438. serial_package_qs = SerialNumberPackage.objects.filter(serial_number=serial_number, status=1)
  439. if not serial_package_qs:
  440. return False
  441. device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number) \
  442. .values('iccid', 'card_type')
  443. if not device_info_qs.exists():
  444. LOGGER.info('*****激活无限流量iccid不存在:{}'.format(serial_number))
  445. return False
  446. combo_id = serial_package_qs.first().package_id
  447. # 获取餐套餐信息
  448. package_info_qs = UnicomCombo.objects.filter(id=combo_id, is_del=False) \
  449. .values('package_id', 'combo_name')
  450. if not package_info_qs.exists():
  451. return False
  452. # 得到五兴电信运营商套餐编码
  453. n_time = int(time.time())
  454. iccid = device_info_qs[0]['iccid']
  455. package_code = package_info_qs[0]['package_id']
  456. combo_name = package_info_qs[0]['combo_name']
  457. # 兑换码套餐类型
  458. card_type = device_info_qs[0]['card_type']
  459. if card_type == 0: # 订购联通流量套餐
  460. result = cls.exchange_unicom_package(serial_number, iccid,
  461. user_id, combo_id)
  462. serial_package_qs.update(status=2, updated_time=n_time, updated_by=user_id)
  463. if result:
  464. cls.save_log(ip, 10071, '{}领取{}成功{}'.format(serial_number, combo_name, user_id))
  465. return True
  466. elif card_type == 1: # 订购五兴电信流量套餐
  467. # 五兴订购流量包请求参数
  468. data = {'iccid': iccid, 'operator': WXOperatorEnum.TELECOM.value,
  469. 'startType': str(WXStartTypeEnum.EFFECTIVE_IMMEDIATELY.value), 'packageCode': package_code}
  470. wx_tech = WXTechObject()
  471. # 请求五兴API订购套餐接口
  472. res = wx_tech.create_order_package(**data)
  473. LOGGER.info('*****五兴订购套餐结果:{}'.format(res))
  474. if res['code'] == '0':
  475. trade_no = res['data']['orderNumber']
  476. cls.created_order(serial_number, user_id, trade_no, combo_id, 11)
  477. serial_package_qs.update(status=2, updated_time=n_time, updated_by=user_id)
  478. cls.save_log(ip, 10071, '{}领取{}成功{}'.format(serial_number, combo_name, user_id))
  479. return True
  480. cls.save_log(ip, 10064, '无效卡类型{}领取{}失败{}'.format(serial_number, combo_name, user_id))
  481. return False
  482. except Exception as e:
  483. LOGGER.info('*****WXTechController.activate_flow_package:errLine:{}, errMsg:{}'
  484. .format(e.__traceback__.tb_lineno, repr(e)))
  485. cls.save_log(ip, 500, f'{serial_number}领取流量套餐异常')
  486. return False