transaction.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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, RefundDealerRechargeRecord
  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. if record.product == DealerRechargeRecord.ProductType.SimCard:
  16. post_sim_recharge(record, verifyAccount)
  17. elif record.product == DealerRechargeRecord.ProductType.ApiCost:
  18. post_ApiCost_recharge(record, verifyAccount)
  19. elif record.product == DealerRechargeRecord.ProductType.DisableAd:
  20. post_disableAd_recharge(record, verifyAccount)
  21. def post_sim_recharge(record, verifyAccount = False):
  22. # type: (DealerRechargeRecord, bool)->None
  23. logger.debug('post recharge devices. record = {}'.format(repr(record)))
  24. try:
  25. dealer = Dealer.objects(id = str(record.dealerId)).first() # type: Optional[Dealer]
  26. for item in record.settleInfo['partition']:
  27. record_agent_traffic_card_earning(agentId = item['id'],
  28. source_key = record.withdrawSourceKey,
  29. detail = {
  30. 'recharge_record_id': record.id,
  31. 'name': dealer.nickname,
  32. 'sum_of_price': RMB.fen_to_yuan(record.totalFee),
  33. 'agent_earning': RMB.fen_to_yuan(item['earned']),
  34. 'itemNum': len(record.items)
  35. })
  36. except Exception as e:
  37. logger.exception('save recharge record failure. error = %s; record = %s' % (e, repr(record)))
  38. dev_no_list = [item['devNo'] for item in record.items]
  39. try:
  40. Device.get_collection().update_many({'devNo': {'$in': dev_no_list}},
  41. {'$set': {'simStatus': 'chargedUnupdated'}}, upsert = False)
  42. except Exception as e:
  43. logger.exception(e)
  44. finally:
  45. Device.invalid_many_device_cache(dev_no_list)
  46. def post_sim_verify_order(dealer, verify_order, verifyAccount = False):
  47. for item in verify_order.settleInfo['partition']:
  48. record_agent_traffic_card_earning(agentId = item['id'],
  49. source_key = verify_order.withdrawSourceKey,
  50. detail = {
  51. 'reconcile': True,
  52. 'recharge_record_id': verify_order.id,
  53. 'name': dealer.nickname,
  54. 'sum_of_price': RMB.fen_to_yuan(verify_order.totalFee),
  55. 'agent_earning': RMB.fen_to_yuan(item['earned'])
  56. })
  57. def post_ApiCost_recharge(record, verifyAccount = False):
  58. # type: (DealerRechargeRecord, bool)->None
  59. logger.debug('post recharge devices. record = {}'.format(repr(record)))
  60. dealer = Dealer.objects(id = str(record.dealerId)).first() # type: Optional[Dealer]
  61. try:
  62. for item in record.settleInfo['partition']:
  63. record_agent_api_quota_earning(agentId = item['id'],
  64. source_key = record.withdrawSourceKey,
  65. detail = {
  66. 'recharge_record_id': record.id,
  67. 'name': dealer.nickname,
  68. 'sum_of_price': RMB.fen_to_yuan(record.totalFee),
  69. 'agent_earning': RMB.fen_to_yuan(item['earned']),
  70. 'itemNum': len(record.items)
  71. })
  72. except Exception as e:
  73. logger.exception('save recharge record failure. error = %s; record = %s' % (e, repr(record)))
  74. try:
  75. for item in record.items:
  76. dealer.update_api_app(**{'inc__apiDeviceMax': item.get('needQuota', 0)})
  77. Device.switch_api_mode(item.get('trunOnList', []), isApi = True)
  78. except Exception as e:
  79. logger.exception(e)
  80. def post_disableAd_recharge(record, verifyAccount = False):
  81. # type: (DealerRechargeRecord, bool)->None
  82. logger.debug('post recharge devices. record = {}'.format(repr(record)))
  83. dealer = Dealer.objects(id = str(record.dealerId)).first() # type: Optional[Dealer]
  84. try:
  85. for item in record.settleInfo['partition']:
  86. record_agent_disable_ad_earning(agentId = item['id'],
  87. source_key = record.withdrawSourceKey,
  88. detail = {
  89. 'recharge_record_id': record.id,
  90. 'name': dealer.nickname,
  91. 'sum_of_price': RMB.fen_to_yuan(record.totalFee),
  92. 'agent_earning': RMB.fen_to_yuan(item['earned']),
  93. 'itemNum': len(record.items)
  94. })
  95. except Exception as e:
  96. logger.exception('save recharge record failure. error = %s; record = %s' % (e, repr(record)))
  97. try:
  98. now = datetime.datetime.now()
  99. for item in record.items:
  100. dev = Device.objects.filter(logicalCode = item['logicalCode']).first()
  101. if dev.disableADExpireDate and dev.disableADExpireDate > now:
  102. dev.disableADExpireDate = dev.disableADExpireDate + relativedelta(months = int(item['cycle']))
  103. else:
  104. dev.disableADExpireDate = now + relativedelta(months = int(item['cycle']))
  105. dev.save()
  106. Device.invalid_device_cache(dev.devNo)
  107. except Exception as e:
  108. logger.exception(e)
  109. def refund_post_pay(refundOrder, finishedTime):
  110. pass
  111. # refund_recharge_order = refundOrder.refund_order # type: RefundDealerRechargeRecord
  112. # 退款实际结束, 更新状态和时间
  113. # refund_recharge_order.finishedTime = refundOrder.finishedTime
  114. # refund_recharge_order.result = RefundDealerRechargeRecord.Status.SUCCESS
  115. # refund_recharge_order.save()
  116. # TODO: 代理商收益调整