# -*- coding: utf-8 -*- # !/usr/bin/env python import logging from typing import Any from apilib.monetary import RMB from apilib.utils_json import json_dumps from apps.web.agent.define import AGENT_INCOME_SOURCE from apps.web.agent.models import AgentIncomeReport, Agent logger = logging.getLogger(__name__) def record_agent_income(agentId, source, source_key, amount, detail, date=None, **kwargs): # type:(str, str, str, RMB, dict, str, **Any)->bool """ 记录代理商的收入 :param agentId: :param detail: :param source: :param amount: :param date: :return: """ try: if amount == RMB(0): logger.warn('`record_agent_income` agent(id=%s) amount=0 found' % (agentId,)) return False record_id = detail.get('recharge_record_id') if not record_id: logger.error('no recharge_record_id provided') return False logger.info('[recordAgentIncome] agent(id={}), amount={}, detail={}, source={}' .format(agentId, amount, json_dumps(detail), source)) transaction_id = 'incr_{}_{}'.format(source, str(record_id)) success = Agent.prepare_sellet_income(agentId, transaction_id, source, source_key, amount, True) if not success: logger.error( '[recordAgentIncome] duplicate operation({}) or agent not exists.'.format( transaction_id, agentId)) return False if date: AgentIncomeReport(agentId=agentId, source=source, amount=amount, date=date, detail=detail, **kwargs).save() else: AgentIncomeReport(agentId=agentId, source=source, amount=amount, detail=detail, **kwargs).save() return Agent.commit_sellet_income(agentId, transaction_id) except Exception as e: logger.exception(e) return False def update_agent_income_stats(recordId, agentId, amount): """ 更新代理商的收益报表 :param recordId: :param agentId: :param amount: :return: """ AgentIncomeReport.get_collection().update_one( {'detail.recharge_record_id': recordId, 'agentId': agentId}, {'$inc': {'amount': amount.mongo_amount}}) def record_agent_withdraw_fee(agentId, source_key, amount, detail): # type:(str, str, RMB, dict)->bool """ 记录代理商旗下经销商的提现手续费差收入 """ return record_agent_income(agentId=agentId, source=AGENT_INCOME_SOURCE.DEALER_WITHDRAW_FEE, source_key=source_key, amount=amount, detail=detail) def record_agent_traffic_card_earning(agentId, source_key, detail): # type:(str, str, dict)->bool try: if 'agent_earning' not in detail: logger.error('no earned provided') return False earned = RMB(detail['agent_earning']) if earned <= RMB(0): return True return record_agent_income(agentId=agentId, source=AGENT_INCOME_SOURCE.DEALER_CARD_FEE, source_key=source_key, amount=earned, detail=detail) except Exception as e: logger.exception(e) return False def record_agent_api_quota_earning(agentId, source_key, detail): # type:(str, str, dict)->bool try: if 'agent_earning' not in detail: logger.error('no earned provided') return False earned = RMB(detail['agent_earning']) if earned <= RMB(0): return True return record_agent_income(agentId=agentId, source=AGENT_INCOME_SOURCE.DEALER_API_QUOTA, source_key=source_key, amount=earned, detail=detail) except Exception as e: logger.exception(e) return False def record_agent_disable_ad_earning(agentId, source_key, detail): # type:(str, str, dict)->bool try: if 'agent_earning' not in detail: logger.error('no earned provided') return False earned = RMB(detail['agent_earning']) if earned <= RMB(0): return True return record_agent_income(agentId=agentId, source=AGENT_INCOME_SOURCE.DEALER_DISABLE_AD, source_key=source_key, amount=earned, detail=detail) except Exception as e: logger.exception(e) return False