transaction.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import logging
  5. from dateutil.relativedelta import relativedelta
  6. from typing import Optional
  7. from apilib.monetary import RMB
  8. from apps.web.agent.proxy import record_agent_traffic_card_earning, record_agent_api_quota_earning, \
  9. record_agent_disable_ad_earning
  10. from apps.web.dealer.models import DealerRechargeRecord, Dealer
  11. from apps.web.device.models import Device
  12. logger = logging.getLogger(__name__)
  13. def post_pay(record, verifyAccount = False):
  14. # type: (DealerRechargeRecord, bool)->None
  15. record.reload()
  16. if record.is_close:
  17. logger.warning('{} check close.'.format(repr(record)))
  18. return
  19. if record.product == DealerRechargeRecord.ProductType.SimCard:
  20. post_sim_recharge(record, verifyAccount)
  21. elif record.product == DealerRechargeRecord.ProductType.ApiCost:
  22. post_ApiCost_recharge(record, verifyAccount)
  23. elif record.product == DealerRechargeRecord.ProductType.DisableAd:
  24. post_disableAd_recharge(record, verifyAccount)
  25. def post_sim_recharge(record, verifyAccount = False):
  26. # type: (DealerRechargeRecord, bool)->None
  27. logger.debug('post recharge devices. record = {}'.format(repr(record)))
  28. try:
  29. dealer = Dealer.objects(id = str(record.dealerId)).first() # type: Optional[Dealer]
  30. for item in record.settleInfo['partition']:
  31. record_agent_traffic_card_earning(agentId = item['id'],
  32. source_key = record.withdrawSourceKey,
  33. detail = {
  34. 'recharge_record_id': record.id,
  35. 'name': dealer.nickname,
  36. 'sum_of_price': RMB.fen_to_yuan(record.totalFee),
  37. 'agent_earning': RMB.fen_to_yuan(item['earned']),
  38. 'itemNum': len(record.items)
  39. })
  40. except Exception as e:
  41. logger.exception('save recharge record failure. error = %s; record = %s' % (e, repr(record)))
  42. dev_no_list = [item['devNo'] for item in record.items]
  43. try:
  44. Device.get_collection().update_many({'devNo': {'$in': dev_no_list}},
  45. {'$set': {'simStatus': 'chargedUnupdated'}}, upsert = False)
  46. except Exception as e:
  47. logger.exception(e)
  48. finally:
  49. Device.invalid_many_device_cache(dev_no_list)
  50. def post_sim_verify_order(dealer, verify_order, verifyAccount = False):
  51. for item in verify_order.settleInfo['partition']:
  52. record_agent_traffic_card_earning(agentId = item['id'],
  53. source_key = verify_order.withdrawSourceKey,
  54. detail = {
  55. 'reconcile': True,
  56. 'recharge_record_id': verify_order.id,
  57. 'name': dealer.nickname,
  58. 'sum_of_price': RMB.fen_to_yuan(verify_order.totalFee),
  59. 'agent_earning': RMB.fen_to_yuan(item['earned'])
  60. })
  61. def post_ApiCost_recharge(record, verifyAccount = False):
  62. # type: (DealerRechargeRecord, bool)->None
  63. logger.debug('post recharge devices. record = {}'.format(repr(record)))
  64. dealer = Dealer.objects(id = str(record.dealerId)).first() # type: Optional[Dealer]
  65. try:
  66. for item in record.settleInfo['partition']:
  67. record_agent_api_quota_earning(agentId = item['id'],
  68. source_key = record.withdrawSourceKey,
  69. detail = {
  70. 'recharge_record_id': record.id,
  71. 'name': dealer.nickname,
  72. 'sum_of_price': RMB.fen_to_yuan(record.totalFee),
  73. 'agent_earning': RMB.fen_to_yuan(item['earned']),
  74. 'itemNum': len(record.items)
  75. })
  76. except Exception as e:
  77. logger.exception('save recharge record failure. error = %s; record = %s' % (e, repr(record)))
  78. try:
  79. for item in record.items:
  80. dealer.update_api_app(**{'inc__apiDeviceMax': item.get('needQuota', 0)})
  81. Device.switch_api_mode(item.get('trunOnList', []), isApi = True)
  82. except Exception as e:
  83. logger.exception(e)
  84. def post_disableAd_recharge(record, verifyAccount = False):
  85. # type: (DealerRechargeRecord, bool)->None
  86. logger.debug('post recharge devices. record = {}'.format(repr(record)))
  87. dealer = Dealer.objects(id = str(record.dealerId)).first() # type: Optional[Dealer]
  88. try:
  89. for item in record.settleInfo['partition']:
  90. record_agent_disable_ad_earning(agentId = item['id'],
  91. source_key = record.withdrawSourceKey,
  92. detail = {
  93. 'recharge_record_id': record.id,
  94. 'name': dealer.nickname,
  95. 'sum_of_price': RMB.fen_to_yuan(record.totalFee),
  96. 'agent_earning': RMB.fen_to_yuan(item['earned']),
  97. 'itemNum': len(record.items)
  98. })
  99. except Exception as e:
  100. logger.exception('save recharge record failure. error = %s; record = %s' % (e, repr(record)))
  101. try:
  102. now = datetime.datetime.now()
  103. for item in record.items:
  104. dev = Device.objects.filter(logicalCode = item['logicalCode']).first()
  105. if dev.disableADExpireDate and dev.disableADExpireDate > now:
  106. dev.disableADExpireDate = dev.disableADExpireDate + relativedelta(months = int(item['cycle']))
  107. else:
  108. dev.disableADExpireDate = now + relativedelta(months = int(item['cycle']))
  109. dev.save()
  110. Device.invalid_device_cache(dev.devNo)
  111. except Exception as e:
  112. logger.exception(e)