123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- # 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实例化会失败
- """
|