# coding=utf-8 import sys import os import pandas import datetime from collections import OrderedDict from base import init_env env = sys.argv[1] os.environ.setdefault('DJANGO_SETTINGS_MODULE', env) init_env(interactive=False) from django.conf import settings from apps.web.agent.define import AgentConst from apps.web.dealer.models import Dealer from apps.web.agent.models import Agent from apps.web.dealer.define import DealerConst from apilib.monetary import sum_rmb from apps.web.core.payment import WithdrawGateway class BaseSum(object): def __init__(self, fieldMap, filters=None, checkKey=True): if filters is None: filters = dict() self._fieldMap = fieldMap self._filters = filters self._check = checkKey def __repr__(self): return self.__class__.__name__ def sub_balance(self, obj, incomeType, no_check = False): balance_dict = getattr(obj, self._fieldMap.get(incomeType)) balanceList = list() frozenBalanceList = list() for key, value in balance_dict.iteritems(): if not WithdrawGateway.is_ledger(key): continue balanceList.append(self.get_balance(key, value, no_check)) return sum_rmb(balanceList), sum_rmb(frozenBalanceList) def get_balance(self, key, value, no_check = False): if no_check or not self._check: return value.balance else: return value.balance if settings.MY_PRIMARY_AGENT_ID in key.split("-") else 0 def get_frozen_balance(self, key, value, no_check): if no_check or not self._check: return value.frozenBalance else: return value.frozenBalance if settings.MY_PRIMARY_AGENT_ID in key.split("-") else 0 def get_model_objects(self): return list() def get_sum_data(self): return list() class AgentSum(BaseSum): def get_model_objects(self): return Agent.objects.filter(**self._filters) def get_sum_data(self): dataList = list() total = float(0) totalFrozen = float(0) for agent in self.get_model_objects(): adBalance, adFrozenBalance = self.sub_balance(agent, "ad", True) withdrawBalance, withdrawFrozenBalance = self.sub_balance(agent, "withdraw") deviceBalance, deviceFrozenBalance = self.sub_balance(agent, "device") trafficBalance, trafficFrozenBalance = self.sub_balance(agent, "traffic", True) totalBalance = adBalance + withdrawBalance + deviceBalance + trafficBalance totalFrozenBalance = adFrozenBalance + withdrawFrozenBalance + deviceFrozenBalance + trafficFrozenBalance total += float(totalBalance) totalFrozen += float(totalFrozenBalance) dataList.append(OrderedDict([ (u"代理商", str(agent.nickname)), (u"联系方式", str(agent.username)), (u"广告余额", float(adBalance)), (u"广告余额(冻结)", float(adFrozenBalance)), (u"提现余额", float(withdrawBalance)), (u"提现余额(冻结)", float(withdrawFrozenBalance)), (u"设备余额", float(deviceBalance)), (u"设备余额(冻结)", float(deviceFrozenBalance)), (u"交通余额", float(trafficBalance)), (u"交通余额(冻结)", float(trafficFrozenBalance)), (u"余额", float(totalBalance)), (u"余额(冻结)", float(totalFrozenBalance)), ("", ""), (u"总余额", float(totalBalance + totalFrozenBalance)) ])) dataList.insert(0, OrderedDict([])) dataList.insert(0, OrderedDict([ (u"代理商", "总统计"), (u"联系方式", "没排除自己的"), (u"广告余额", ""), (u"广告余额(冻结)", ""), (u"提现余额", ""), (u"提现余额(冻结)", ""), (u"设备余额", ""), (u"设备余额(冻结)", ""), (u"交通余额", ""), (u"交通余额(冻结)", ""), (u"余额", float(total)), (u"余额(冻结)", float(totalFrozen)), ("", ""), (u"总余额", float(total+totalFrozen)) ])) return dataList class DealerSum(BaseSum): def get_model_objects(self): # 实际运行的过程中 会有几个dealer 实例化失败 这个地方就先取ID, 看下是哪些dealer有问题 dealerIds = Dealer.get_collection().find({}, {"_id": 1}) for _item in dealerIds: try: dealer = Dealer.objects.filter(id=_item["_id"], **self._filters).first() except Exception as e: print _item continue if not dealer: print _item continue yield dealer def get_sum_data(self): dataList = list() total = float(0) totalFrozen = float(0) for dealer in self.get_model_objects(): deviceBalance, deviceFrozenBalance = self.sub_balance(dealer, "device") adBalance, adFrozenBalance = self.sub_balance(dealer, "ad", True) totalBalance = deviceBalance + adBalance totalFrozenBalance = deviceFrozenBalance + adFrozenBalance total += float(totalBalance) totalFrozen += float(totalFrozenBalance) dataList.append(OrderedDict([ (u"经销商", str(dealer.nickname)), (u"联系方式", str(dealer.username)), (u"设备余额", float(deviceBalance)), (u"设备余额(冻结)", float(deviceFrozenBalance)), (u"广告余额", float(adBalance)), (u"广告余额(冻结)", float(adFrozenBalance)), (u"余额", float(totalBalance)), (u"余额(冻结)", float(totalFrozenBalance)), (u"", ""), (u"总余额", float(totalBalance)) ])) dataList.insert(0, OrderedDict([])) dataList.insert(0, OrderedDict([ (u"经销商", "总统计"), (u"联系方式", "没排除自己的"), (u"设备余额", ""), (u"设备余额(冻结)", ""), (u"广告余额", ""), (u"广告余额(冻结)", ""), (u"余额", float(total)), (u"余额(冻结)", float(totalFrozen)), (u"", ""), (u"总余额", float(total+totalFrozen)) ])) return dataList class SumContext(object): def __init__(self, strategy=None): self._strategy = strategy @property def strategy(self): return self._strategy @strategy.setter def strategy(self, strategy): if isinstance(strategy, BaseSum): self._strategy = strategy def sum_balance(self): return self.strategy.get_sum_data() class Writer(object): def __init__(self, path): if not os.path.exists(path): raise Exception("path is not exists!") filePath = os.path.join(path, str(datetime.date.today())) fileName = "{}.xlsx".format(filePath) self._writer = pandas.ExcelWriter(fileName) self._context = SumContext() def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): if exc_val: print exc_val else: self._writer.save() @property def context(self): return self._context @property def write_data(self): return self.context.sum_balance() def write(self, sheetName=None): if sheetName is None: sheetName = str(self.context.strategy) dataForm = pandas.DataFrame(self.write_data) dataForm.to_excel(self._writer, sheet_name=sheetName, index=False) def sum_customer(path=None): if path is None: path = "/var/www/uploaded/sumIncome" with Writer(path=path) as w: w.context.strategy = AgentSum(fieldMap=AgentConst.MAP_TYPE_TO_FIELD, checkKey=True) w.write() w.context.strategy = DealerSum(fieldMap=DealerConst.MAP_TYPE_TO_FIELD, checkKey=True) w.write() if __name__ == '__main__': sum_customer("C:/Users/Administrator/Desktop") # sum_customer() """ 现网经销商ID : {u'_id': ObjectId('5fbca3d5003048ffefab9188')} 应该是字段缺失 model实例化会失败 """