proxy.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import logging
  4. from typing import Any
  5. from apilib.monetary import RMB
  6. from apilib.utils_json import json_dumps
  7. from apps.web.agent.define import AGENT_INCOME_SOURCE
  8. from apps.web.agent.models import AgentIncomeReport, Agent
  9. logger = logging.getLogger(__name__)
  10. def record_agent_income(agentId, source, source_key, amount, detail, date=None, **kwargs):
  11. # type:(str, str, str, RMB, dict, str, **Any)->bool
  12. """
  13. 记录代理商的收入
  14. :param agentId:
  15. :param detail:
  16. :param source:
  17. :param amount:
  18. :param date:
  19. :return:
  20. """
  21. try:
  22. if amount == RMB(0):
  23. logger.warn('`record_agent_income` agent(id=%s) amount=0 found' % (agentId,))
  24. return False
  25. record_id = detail.get('recharge_record_id')
  26. if not record_id:
  27. logger.error('no recharge_record_id provided')
  28. return False
  29. logger.info('[recordAgentIncome] agent(id={}), amount={}, detail={}, source={}'
  30. .format(agentId, amount, json_dumps(detail), source))
  31. transaction_id = 'incr_{}_{}'.format(source, str(record_id))
  32. success = Agent.prepare_sellet_income(agentId, transaction_id, source, source_key, amount, True)
  33. if not success:
  34. logger.error(
  35. '[recordAgentIncome] duplicate operation({}) or agent<id={}> not exists.'.format(
  36. transaction_id, agentId))
  37. return False
  38. if date:
  39. AgentIncomeReport(agentId=agentId, source=source, amount=amount, date=date, detail=detail,
  40. **kwargs).save()
  41. else:
  42. AgentIncomeReport(agentId=agentId, source=source, amount=amount, detail=detail, **kwargs).save()
  43. return Agent.commit_sellet_income(agentId, transaction_id)
  44. except Exception as e:
  45. logger.exception(e)
  46. return False
  47. def update_agent_income_stats(recordId, agentId, amount):
  48. """
  49. 更新代理商的收益报表
  50. :param recordId:
  51. :param agentId:
  52. :param amount:
  53. :return:
  54. """
  55. AgentIncomeReport.get_collection().update_one(
  56. {'detail.recharge_record_id': recordId, 'agentId': agentId},
  57. {'$inc': {'amount': amount.mongo_amount}})
  58. def record_agent_withdraw_fee(agentId, source_key, amount, detail):
  59. # type:(str, str, RMB, dict)->bool
  60. """
  61. 记录代理商旗下经销商的提现手续费差收入
  62. """
  63. return record_agent_income(agentId=agentId, source=AGENT_INCOME_SOURCE.DEALER_WITHDRAW_FEE,
  64. source_key=source_key, amount=amount, detail=detail)
  65. def record_agent_traffic_card_earning(agentId, source_key, detail):
  66. # type:(str, str, dict)->bool
  67. try:
  68. if 'agent_earning' not in detail:
  69. logger.error('no earned provided')
  70. return False
  71. earned = RMB(detail['agent_earning'])
  72. if earned <= RMB(0):
  73. return True
  74. return record_agent_income(agentId=agentId, source=AGENT_INCOME_SOURCE.DEALER_CARD_FEE,
  75. source_key=source_key, amount=earned, detail=detail)
  76. except Exception as e:
  77. logger.exception(e)
  78. return False
  79. def record_agent_api_quota_earning(agentId, source_key, detail):
  80. # type:(str, str, dict)->bool
  81. try:
  82. if 'agent_earning' not in detail:
  83. logger.error('no earned provided')
  84. return False
  85. earned = RMB(detail['agent_earning'])
  86. if earned <= RMB(0):
  87. return True
  88. return record_agent_income(agentId=agentId, source=AGENT_INCOME_SOURCE.DEALER_API_QUOTA,
  89. source_key=source_key, amount=earned, detail=detail)
  90. except Exception as e:
  91. logger.exception(e)
  92. return False
  93. def record_agent_disable_ad_earning(agentId, source_key, detail):
  94. # type:(str, str, dict)->bool
  95. try:
  96. if 'agent_earning' not in detail:
  97. logger.error('no earned provided')
  98. return False
  99. earned = RMB(detail['agent_earning'])
  100. if earned <= RMB(0):
  101. return True
  102. return record_agent_income(agentId=agentId, source=AGENT_INCOME_SOURCE.DEALER_DISABLE_AD,
  103. source_key=source_key, amount=earned, detail=detail)
  104. except Exception as e:
  105. logger.exception(e)
  106. return False