# coding=utf-8 import datetime from base import init_env from bson import ObjectId from collections import namedtuple, defaultdict init_env(True) from apilib.monetary import RMB from apps.web.dealer.models import Dealer from apps.web.dealer.proxy import DealerIncomeProxy from apps.web.common.transaction import WithdrawStatus from apps.web.common.models import WithdrawRecord from apps.web.user.models import RechargeRecord RawInfo = namedtuple("RawInfo", ["dealer", "st", "et"]) def welcome(): dealerId = raw_input(u"请输入经销商ID(必填):") print(u"日期格式如: xxxx-xx-xx") startTime = raw_input(u"请输入统计起始时间(回车跳过):") or "2017-01-01" endTime = raw_input(u"请输入统计结束时间(回车跳过):") or datetime.datetime.now().strftime("%Y-%m-%d") dealer = Dealer.objects.get(id=dealerId) st = datetime.datetime.strptime(startTime, "%Y-%m-%d") et = datetime.datetime.strptime(endTime, "%Y-%m-%d") return RawInfo(dealer=dealer, st=st, et=et) def get_recharge_data(rawInfo): # type:(RawInfo) -> RechargeRecord records = RechargeRecord.objects.filter( ownerId=str(rawInfo.dealer.id), result="success", via__in=["recharge", "chargeCard", "chargeVirtualCard", "cash"] ) if rawInfo.st: records = records.filter( dateTimeAdded__gte=rawInfo.st, ) if rawInfo.et: records = records.filter( dateTimeAdded__lt=rawInfo.et ) return records def get_withdraw_data(rawInfo): # type:(RawInfo) -> WithdrawRecord records = WithdrawRecord.objects.filter( ownerId=str(rawInfo.dealer.id), status=WithdrawStatus.SUCCEEDED ) if rawInfo.st: records = records.filter( dateTimeAdded__gte=rawInfo.st, ) if rawInfo.et: records = records.filter( dateTimeAdded__lt=rawInfo.et ) return records def get_income_data(rawInfo): # type:(RawInfo) -> WithdrawRecord records = DealerIncomeProxy.objects.filter( dealerIds=rawInfo.dealer.id ) if rawInfo.st: records = records.filter( dateTimeAdded__gte=rawInfo.st, ) if rawInfo.et: records = records.filter( dateTimeAdded__lt=rawInfo.et ) return records if __name__ == '__main__': rawInfo = welcome() rechargeRecords = get_recharge_data(rawInfo) withdrawRecords = get_withdraw_data(rawInfo) incomeRecords = get_income_data(rawInfo) rechargeTotal = sum([item.money for item in rechargeRecords], RMB(0)) print "用户共充值 {}".format(rechargeTotal) withdrawTotal = sum([item.amount for item in withdrawRecords], RMB(0)) print "用户共提现 {}".format(withdrawTotal) _, incomeTotal = incomeRecords.sum_and_count('actualAmountMap.%s' % (str(rawInfo.dealer.id))) print "共记录收益 {}".format(incomeTotal)