WXTechController.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  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, request)
  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.get_uid_by_serial_number(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, request):
  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', 'card_type')
  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. ip = CommonService.get_ip_address(request)
  167. experience_history_vo = {'iccid': iccid, 'experience_type': 0, 'do_time': int(time.time())}
  168. app_user_id = unicom_device_qs['user_id'] if unicom_device_qs['user_id'] else user_id
  169. if unicom_device_qs['card_type'] == 0 or unicom_device_qs['card_type'] == 3: # 珠海联通 鼎芯电信
  170. flow_combo_qs = UnicomCombo.objects.filter(combo_type=1, is_del=False, status=0).order_by('sort')
  171. free_result = False
  172. if flow_combo_qs.exists():
  173. # 生成免费体验套餐
  174. free_result = UnicomComboView() \
  175. .generate_flow_package(serial_no, flow_combo_qs.first().id, app_user_id)
  176. UnicomComboExperienceHistory.objects.create(**experience_history_vo)
  177. if not unicom_device_qs['user_id']:
  178. UnicomDeviceInfo.objects.filter(iccid=iccid) \
  179. .update(user_id=app_user_id, updated_time=int(time.time()))
  180. factory_result = cls.activate_flow_package(serial_no, ip, app_user_id) # 检测并激活出厂无限流量
  181. cls.save_log(ip, 0, '{}激活免费套餐{},出厂无限流量{}'.format(serial_no, free_result, factory_result))
  182. return response.json(0)
  183. elif unicom_device_qs['card_type'] == 1: # 五兴电信
  184. data = {'iccid': iccid, 'operator': WXOperatorEnum(int(operator)).value,
  185. 'startType': str(WXStartTypeEnum.EFFECTIVE_IMMEDIATELY.value), 'packageCode': COMBO_ID}
  186. wx_tech = WXTechObject()
  187. # 请求五兴API创建套餐接口
  188. res = wx_tech.create_order_package(**data)
  189. LOGGER.info('*****五兴创建体验套餐信息:{}'.format(res))
  190. if res['code'] == '0':
  191. trade_no = res['data']['orderNumber']
  192. UnicomComboExperienceHistory.objects.create(**experience_history_vo)
  193. order_res = cls.created_order(serial_no, user_id, trade_no, pay_type=10)
  194. UnicomDeviceInfo.objects.filter(serial_no=serial_no) \
  195. .update(user_id=user_id, updated_time=int(time.time()))
  196. LOGGER.info('*****系统创建体验订单:{}'.format(order_res))
  197. factory_result = cls.activate_flow_package(serial_no, ip, app_user_id) # 检测并激活出厂无限流量
  198. cls.save_log(ip, 0, '{}激活免费套餐{},出厂无限流量{}'.format(serial_no, True, factory_result))
  199. return response.json(0)
  200. return response.json(10063)
  201. except Exception as e:
  202. LOGGER.info('*****WXTechController.create_order_package:errLine:{}, errMsg:{}'
  203. .format(e.__traceback__.tb_lineno, repr(e)))
  204. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  205. @classmethod
  206. def created_order(cls, serial_no, user_id, trade_no, combo_id=None, pay_type=10, order_type=3):
  207. """
  208. 创建系统订单
  209. """
  210. combo_info_qs = UnicomCombo.objects.filter(is_del=False)
  211. if combo_id:
  212. combo_info_qs = combo_info_qs.filter(id=int(combo_id))
  213. else:
  214. combo_info_qs = combo_info_qs.filter(combo_type=1, status=0)
  215. combo_info_qs = combo_info_qs.values('id', 'combo_name', 'price', 'virtual_price', 'remark') \
  216. .order_by('sort')
  217. if not combo_info_qs.exists():
  218. return False
  219. combo_info_vo = combo_info_qs[0]
  220. n_time = int(time.time())
  221. # 根据序列号获取UID
  222. uid = CommonService.get_uid_by_serial_number(serial_no)
  223. order_id = CommonService.createOrderID()
  224. # 生成订单必须添加该字段
  225. rank_id, ai_rank_id = UnicomComboView().get_cloud_or_ai_combo()
  226. order_dict = {'orderID': order_id, 'UID': uid, 'rank_id': rank_id, 'ai_rank_id': ai_rank_id,
  227. 'userID_id': user_id, 'desc': combo_info_vo['combo_name'], 'payType': pay_type,
  228. 'payTime': n_time, 'price': combo_info_vo['price'], 'addTime': n_time,
  229. 'updTime': n_time, 'status': 1, 'currency': 'CNY',
  230. 'unify_combo_id': str(combo_info_vo['id']), 'order_type': order_type,
  231. 'store_meal_name': combo_info_vo['combo_name'],
  232. 'trade_no': trade_no}
  233. Order_Model.objects.create(**order_dict)
  234. return order_id
  235. @classmethod
  236. def delete_card_package(cls, request_dict, response):
  237. """
  238. PC工具清空卡片的所有套餐订购记录
  239. """
  240. try:
  241. LOGGER.info('*****WXTechController.delete_card_package:params:{}'.format(request_dict))
  242. sign = request_dict.get('sign', None)
  243. serial_no = request_dict.get('serialNo', None)
  244. time_stamp = request_dict.get('timeStamp', None)
  245. if not CommonService.check_time_stamp_token(sign, time_stamp):
  246. return response.json(13)
  247. # 查询是否注册iccid
  248. unicom_device_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_no) \
  249. .values('serial_no', 'user_id', 'iccid')
  250. if not unicom_device_qs.exists():
  251. return response.json(173)
  252. iccid = unicom_device_qs[0]['iccid']
  253. data = {'iccids': iccid, 'operator': WXOperatorEnum.TELECOM.value}
  254. wx_tech = WXTechObject()
  255. res = wx_tech.delete_card_package(**data)
  256. if res['code'] == '0':
  257. UnicomComboExperienceHistory.objects.filter(iccid=iccid).delete()
  258. return response.json(0)
  259. return response.json(177)
  260. except Exception as e:
  261. LOGGER.info('*****WXTechController.delete_card_package:errLine:{}, errMsg:{}'
  262. .format(e.__traceback__.tb_lineno, repr(e)))
  263. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  264. @classmethod
  265. def wx_exchange_package(cls, request_dict, response, request, user_id):
  266. """
  267. 使用兑换码订购五兴五年流量套餐包
  268. """
  269. ip = CommonService.get_ip_address(request)
  270. try:
  271. code = request_dict.get('code')
  272. serial_number = request_dict.get('serialNumber')
  273. LOGGER.info('*****WXTechController.wx_exchange_package:params,{}'.format(request_dict))
  274. if not all([code, serial_number]):
  275. return response.json(444) # 参数缺失
  276. # 校验兑换码格式是否正确
  277. if not (code.isalnum() and len(code) == 10):
  278. return response.json(10067) # 兑换码格式错误
  279. device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number) \
  280. .values('iccid', 'card_type')
  281. if not device_info_qs.exists():
  282. return response.json(173) # 设备信息不存在
  283. # 查询兑换码信息
  284. exchange_code_qs = ExchangeCode.objects.filter(code=code, status=False) \
  285. .values('package_id', 'expire_time', 'package_type')
  286. if not exchange_code_qs.exists():
  287. return response.json(10066) # 兑换码无效
  288. combo_id = exchange_code_qs[0]['package_id']
  289. # 获取五兴套餐套餐编码
  290. package_info_qs = UnicomCombo.objects.filter(id=combo_id, is_del=False) \
  291. .values('package_id')
  292. if not package_info_qs.exists():
  293. return response.json(173)
  294. package_code = package_info_qs[0]['package_id']
  295. iccid = device_info_qs[0]['iccid']
  296. # 兑换码套餐类型
  297. card_type = device_info_qs[0]['card_type']
  298. if card_type == 0 or card_type == 3: # 联通联通和鼎芯电信无限流量兑换码
  299. order_type = 2 if card_type == 0 else 5
  300. result = cls.exchange_unicom_package(serial_number, iccid,
  301. user_id, combo_id, order_type)
  302. if result:
  303. exchange_code_qs.update(status=True, updated_time=int(time.time()))
  304. # 校验是否两个重叠无限流量套餐 修改套餐数据
  305. UnicomComboView().update_flow_package_order_by_iccid(iccid)
  306. cls.save_log(ip, 10065, '兑换成功{},{}'.format(serial_number, code))
  307. return response.json(10065)
  308. elif card_type == 1: # 五兴电信无限流量兑换码
  309. # 五兴订购流量包请求参数
  310. data = {'iccid': iccid, 'operator': WXOperatorEnum.TELECOM.value,
  311. 'startType': str(WXStartTypeEnum.EFFECTIVE_IMMEDIATELY.value), 'packageCode': package_code}
  312. wx_tech = WXTechObject()
  313. # 请求五兴API订购套餐接口
  314. res = wx_tech.create_order_package(**data)
  315. LOGGER.info('*****五兴订购年卡套餐结果:{}'.format(res))
  316. if res['code'] == '0':
  317. trade_no = res['data']['orderNumber']
  318. cls.created_order(serial_number, user_id, trade_no, combo_id, 11)
  319. exchange_code_qs.update(status=True, updated_time=int(time.time()))
  320. cls.save_log(ip, 10065, '兑换成功{},{}'.format(serial_number, code))
  321. return response.json(10065)
  322. cls.save_log(ip, 10068, '兑换失败{},{}'.format(serial_number, code))
  323. return response.json(10068)
  324. except Exception as e:
  325. LOGGER.info('*****WXTechController.wx_exchange_package:errLine:{}, errMsg:{}'
  326. .format(e.__traceback__.tb_lineno, repr(e)))
  327. cls.save_log(ip, 500, '兑换内部错误')
  328. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  329. @classmethod
  330. def exchange_unicom_package(cls, serial_number, iccid, user_id, combo_id, order_type=2):
  331. try:
  332. # 通过兑换码创建订单记录
  333. order_id = cls.created_order(serial_number, user_id, 'ansjer', combo_id, 11, order_type)
  334. # 根据订单信息创建流量套餐包
  335. UnicomComboView.create_combo_order_info(order_id, 0, iccid, combo_id)
  336. return True
  337. except Exception as e:
  338. LOGGER.info('*****WXTechController.exchange_unicom_package:errLine:{}, errMsg:{}'
  339. .format(e.__traceback__.tb_lineno, repr(e)))
  340. return False
  341. @staticmethod
  342. def save_log(ip, code, operation):
  343. """
  344. 保存操作日志
  345. @param ip: ip地址
  346. @param code: 状态码
  347. @param operation: 操作说明
  348. @return: 保存结果
  349. """
  350. try:
  351. log = {
  352. 'ip': ip,
  353. 'user_id': 1,
  354. 'status': code,
  355. 'time': int(time.time()),
  356. 'operation': operation,
  357. 'url': 'unicom/open/wxtech/exchangePackage',
  358. }
  359. LogModel.objects.create(**log)
  360. return True
  361. except Exception as e:
  362. LOGGER.info('*****WXTechController.save_log:errLine:{}, errMsg:{}'
  363. .format(e.__traceback__.tb_lineno, repr(e)))
  364. return False
  365. @classmethod
  366. def get_package_by_serial_number(cls, request_dict, response, request, user_id):
  367. """
  368. 根据序列号获取无限流量套餐信息
  369. """
  370. try:
  371. serial_number = request_dict.get('serialNumber', None)
  372. if not serial_number:
  373. return response.json(444)
  374. serial_package_qs = SerialNumberPackage.objects.filter(serial_number=serial_number, status=1)
  375. data = {}
  376. if not serial_package_qs:
  377. return response.json(0, data)
  378. serial_package = serial_package_qs.first()
  379. package_id = serial_package.package_id
  380. package_info_qs = UnicomCombo.objects.filter(id=package_id).values('combo_name')
  381. if not package_info_qs.exists():
  382. return response.json(0, data)
  383. result = {'comboName': package_info_qs[0]['combo_name']}
  384. return response.json(110, result)
  385. except Exception as e:
  386. LOGGER.info('*****WXTechController.get_package_by_serial_number:errLine:{}, errMsg:{}'
  387. .format(e.__traceback__.tb_lineno, repr(e)))
  388. return response.json(503)
  389. @classmethod
  390. def create_4G_flow_package(cls, request_dict, response, request, user_id):
  391. """
  392. 创建4G流量套餐(出厂序列号绑定套餐)
  393. """
  394. ip = CommonService.get_ip_address(request)
  395. serial_number = ''
  396. try:
  397. serial_number = request_dict.get('serialNumber')
  398. if not serial_number:
  399. return response.json(0)
  400. device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number) \
  401. .values('iccid', 'card_type')
  402. if not device_info_qs.exists():
  403. return response.json(173) # 设备信息不存在
  404. serial_package_qs = SerialNumberPackage.objects.filter(serial_number=serial_number, status=1)
  405. if not serial_package_qs:
  406. return response.json(10064)
  407. combo_id = serial_package_qs.first().package_id
  408. # 获取餐套餐信息
  409. package_info_qs = UnicomCombo.objects.filter(id=combo_id, is_del=False) \
  410. .values('package_id', 'combo_name')
  411. if not package_info_qs.exists():
  412. return response.json(173)
  413. # 得到五兴电信运营商套餐编码
  414. package_code = package_info_qs[0]['package_id']
  415. combo_name = package_info_qs[0]['combo_name']
  416. iccid = device_info_qs[0]['iccid']
  417. n_time = int(time.time())
  418. # 兑换码套餐类型
  419. card_type = device_info_qs[0]['card_type']
  420. if card_type == 0 or card_type == 3: # 订购联通流量套餐
  421. order_type = 2 if card_type == 0 else 5
  422. result = cls.exchange_unicom_package(serial_number, iccid,
  423. user_id, combo_id, order_type)
  424. serial_package_qs.update(status=2, updated_time=n_time, updated_by=user_id)
  425. if result:
  426. cls.save_log(ip, 10071, '{}领取{}成功{}'.format(serial_number, combo_name, user_id))
  427. return response.json(10071)
  428. elif card_type == 1: # 订购五兴电信流量套餐
  429. # 五兴订购流量包请求参数
  430. data = {'iccid': iccid, 'operator': WXOperatorEnum.TELECOM.value,
  431. 'startType': str(WXStartTypeEnum.EFFECTIVE_IMMEDIATELY.value), 'packageCode': package_code}
  432. wx_tech = WXTechObject()
  433. # 请求五兴API订购套餐接口
  434. res = wx_tech.create_order_package(**data)
  435. LOGGER.info('*****五兴订购套餐结果:{}'.format(res))
  436. if res['code'] == '0':
  437. trade_no = res['data']['orderNumber']
  438. cls.created_order(serial_number, user_id, trade_no, combo_id, 11)
  439. serial_package_qs.update(status=2, updated_time=n_time, updated_by=user_id)
  440. cls.save_log(ip, 10071, '{}领取{}成功{}'.format(serial_number, combo_name, user_id))
  441. return response.json(10071)
  442. cls.save_log(ip, 10064, '无效卡类型{}领取{}失败{}'.format(serial_number, combo_name, user_id))
  443. return response.json(10064)
  444. except Exception as e:
  445. LOGGER.info('*****WXTechController.wx_exchange_package:errLine:{}, errMsg:{}'
  446. .format(e.__traceback__.tb_lineno, repr(e)))
  447. cls.save_log(ip, 500, f'{serial_number}领取流量套餐异常')
  448. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  449. @classmethod
  450. def activate_flow_package(cls, serial_number, ip, user_id):
  451. """
  452. 激活序列号出厂绑定无限流量套餐
  453. @param serial_number: 9位序列号
  454. @param ip: ip地址
  455. @param user_id: 用户id
  456. @return: True | False
  457. """
  458. try:
  459. if not serial_number:
  460. return False
  461. serial_package_qs = SerialNumberPackage.objects.filter(serial_number=serial_number, status=1)
  462. if not serial_package_qs:
  463. return False
  464. device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number) \
  465. .values('iccid', 'card_type')
  466. if not device_info_qs.exists():
  467. LOGGER.info('*****激活无限流量iccid不存在:{}'.format(serial_number))
  468. return False
  469. combo_id = serial_package_qs.first().package_id
  470. # 获取餐套餐信息
  471. package_info_qs = UnicomCombo.objects.filter(id=combo_id, is_del=False) \
  472. .values('package_id', 'combo_name')
  473. if not package_info_qs.exists():
  474. return False
  475. # 得到五兴电信运营商套餐编码
  476. n_time = int(time.time())
  477. iccid = device_info_qs[0]['iccid']
  478. package_code = package_info_qs[0]['package_id']
  479. combo_name = package_info_qs[0]['combo_name']
  480. # 兑换码套餐类型
  481. card_type = device_info_qs[0]['card_type']
  482. if card_type == 0 or card_type == 3: # 订购联通流量套餐
  483. order_type = 2 if card_type == 0 else 5
  484. result = cls.exchange_unicom_package(serial_number, iccid,
  485. user_id, combo_id, order_type)
  486. serial_package_qs.update(status=2, updated_time=n_time, updated_by=user_id)
  487. if result:
  488. cls.save_log(ip, 10071, '{}领取{}成功{}'.format(serial_number, combo_name, user_id))
  489. return True
  490. elif card_type == 1: # 订购五兴电信流量套餐
  491. # 五兴订购流量包请求参数
  492. data = {'iccid': iccid, 'operator': WXOperatorEnum.TELECOM.value,
  493. 'startType': str(WXStartTypeEnum.EFFECTIVE_IMMEDIATELY.value), 'packageCode': package_code}
  494. wx_tech = WXTechObject()
  495. # 请求五兴API订购套餐接口
  496. res = wx_tech.create_order_package(**data)
  497. LOGGER.info('*****五兴订购套餐结果:{}'.format(res))
  498. if res['code'] == '0':
  499. trade_no = res['data']['orderNumber']
  500. cls.created_order(serial_number, user_id, trade_no, combo_id, 11)
  501. serial_package_qs.update(status=2, updated_time=n_time, updated_by=user_id)
  502. cls.save_log(ip, 10071, '{}领取{}成功{}'.format(serial_number, combo_name, user_id))
  503. return True
  504. cls.save_log(ip, 10064, '无效卡类型{}领取{}失败{}'.format(serial_number, combo_name, user_id))
  505. return False
  506. except Exception as e:
  507. LOGGER.info('*****WXTechController.activate_flow_package:errLine:{}, errMsg:{}'
  508. .format(e.__traceback__.tb_lineno, repr(e)))
  509. cls.save_log(ip, 500, f'{serial_number}领取流量套餐异常')
  510. return False