sum_agent_and_dealer_balance.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. # coding=utf-8
  2. import sys
  3. import os
  4. import pandas
  5. import datetime
  6. from collections import OrderedDict
  7. from base import init_env
  8. env = sys.argv[1]
  9. os.environ.setdefault('DJANGO_SETTINGS_MODULE', env)
  10. init_env(interactive=False)
  11. from django.conf import settings
  12. from apps.web.agent.define import AgentConst
  13. from apps.web.dealer.models import Dealer
  14. from apps.web.agent.models import Agent
  15. from apps.web.dealer.define import DealerConst
  16. from apilib.monetary import sum_rmb
  17. from apps.web.core.payment import WithdrawGateway
  18. class BaseSum(object):
  19. def __init__(self, fieldMap, filters=None, checkKey=True):
  20. if filters is None:
  21. filters = dict()
  22. self._fieldMap = fieldMap
  23. self._filters = filters
  24. self._check = checkKey
  25. def __repr__(self):
  26. return self.__class__.__name__
  27. def sub_balance(self, obj, incomeType, no_check = False):
  28. balance_dict = getattr(obj, self._fieldMap.get(incomeType))
  29. balanceList = list()
  30. frozenBalanceList = list()
  31. for key, value in balance_dict.iteritems():
  32. if not WithdrawGateway.is_ledger(key):
  33. continue
  34. balanceList.append(self.get_balance(key, value, no_check))
  35. return sum_rmb(balanceList), sum_rmb(frozenBalanceList)
  36. def get_balance(self, key, value, no_check = False):
  37. if no_check or not self._check:
  38. return value.balance
  39. else:
  40. return value.balance if settings.MY_PRIMARY_AGENT_ID in key.split("-") else 0
  41. def get_frozen_balance(self, key, value, no_check):
  42. if no_check or not self._check:
  43. return value.frozenBalance
  44. else:
  45. return value.frozenBalance if settings.MY_PRIMARY_AGENT_ID in key.split("-") else 0
  46. def get_model_objects(self):
  47. return list()
  48. def get_sum_data(self):
  49. return list()
  50. class AgentSum(BaseSum):
  51. def get_model_objects(self):
  52. return Agent.objects.filter(**self._filters)
  53. def get_sum_data(self):
  54. dataList = list()
  55. total = float(0)
  56. totalFrozen = float(0)
  57. for agent in self.get_model_objects():
  58. adBalance, adFrozenBalance = self.sub_balance(agent, "ad", True)
  59. withdrawBalance, withdrawFrozenBalance = self.sub_balance(agent, "withdraw")
  60. deviceBalance, deviceFrozenBalance = self.sub_balance(agent, "device")
  61. trafficBalance, trafficFrozenBalance = self.sub_balance(agent, "traffic", True)
  62. totalBalance = adBalance + withdrawBalance + deviceBalance + trafficBalance
  63. totalFrozenBalance = adFrozenBalance + withdrawFrozenBalance + deviceFrozenBalance + trafficFrozenBalance
  64. total += float(totalBalance)
  65. totalFrozen += float(totalFrozenBalance)
  66. dataList.append(OrderedDict([
  67. (u"代理商", str(agent.nickname)),
  68. (u"联系方式", str(agent.username)),
  69. (u"广告余额", float(adBalance)),
  70. (u"广告余额(冻结)", float(adFrozenBalance)),
  71. (u"提现余额", float(withdrawBalance)),
  72. (u"提现余额(冻结)", float(withdrawFrozenBalance)),
  73. (u"设备余额", float(deviceBalance)),
  74. (u"设备余额(冻结)", float(deviceFrozenBalance)),
  75. (u"交通余额", float(trafficBalance)),
  76. (u"交通余额(冻结)", float(trafficFrozenBalance)),
  77. (u"余额", float(totalBalance)),
  78. (u"余额(冻结)", float(totalFrozenBalance)),
  79. ("", ""),
  80. (u"总余额", float(totalBalance + totalFrozenBalance))
  81. ]))
  82. dataList.insert(0, OrderedDict([]))
  83. dataList.insert(0, OrderedDict([
  84. (u"代理商", "总统计"),
  85. (u"联系方式", "没排除自己的"),
  86. (u"广告余额", ""),
  87. (u"广告余额(冻结)", ""),
  88. (u"提现余额", ""),
  89. (u"提现余额(冻结)", ""),
  90. (u"设备余额", ""),
  91. (u"设备余额(冻结)", ""),
  92. (u"交通余额", ""),
  93. (u"交通余额(冻结)", ""),
  94. (u"余额", float(total)),
  95. (u"余额(冻结)", float(totalFrozen)),
  96. ("", ""),
  97. (u"总余额", float(total+totalFrozen))
  98. ]))
  99. return dataList
  100. class DealerSum(BaseSum):
  101. def get_model_objects(self):
  102. # 实际运行的过程中 会有几个dealer 实例化失败 这个地方就先取ID, 看下是哪些dealer有问题
  103. dealerIds = Dealer.get_collection().find({}, {"_id": 1})
  104. for _item in dealerIds:
  105. try:
  106. dealer = Dealer.objects.filter(id=_item["_id"], **self._filters).first()
  107. except Exception as e:
  108. print _item
  109. continue
  110. if not dealer:
  111. print _item
  112. continue
  113. yield dealer
  114. def get_sum_data(self):
  115. dataList = list()
  116. total = float(0)
  117. totalFrozen = float(0)
  118. for dealer in self.get_model_objects():
  119. deviceBalance, deviceFrozenBalance = self.sub_balance(dealer, "device")
  120. adBalance, adFrozenBalance = self.sub_balance(dealer, "ad", True)
  121. totalBalance = deviceBalance + adBalance
  122. totalFrozenBalance = deviceFrozenBalance + adFrozenBalance
  123. total += float(totalBalance)
  124. totalFrozen += float(totalFrozenBalance)
  125. dataList.append(OrderedDict([
  126. (u"经销商", str(dealer.nickname)),
  127. (u"联系方式", str(dealer.username)),
  128. (u"设备余额", float(deviceBalance)),
  129. (u"设备余额(冻结)", float(deviceFrozenBalance)),
  130. (u"广告余额", float(adBalance)),
  131. (u"广告余额(冻结)", float(adFrozenBalance)),
  132. (u"余额", float(totalBalance)),
  133. (u"余额(冻结)", float(totalFrozenBalance)),
  134. (u"", ""),
  135. (u"总余额", float(totalBalance))
  136. ]))
  137. dataList.insert(0, OrderedDict([]))
  138. dataList.insert(0, OrderedDict([
  139. (u"经销商", "总统计"),
  140. (u"联系方式", "没排除自己的"),
  141. (u"设备余额", ""),
  142. (u"设备余额(冻结)", ""),
  143. (u"广告余额", ""),
  144. (u"广告余额(冻结)", ""),
  145. (u"余额", float(total)),
  146. (u"余额(冻结)", float(totalFrozen)),
  147. (u"", ""),
  148. (u"总余额", float(total+totalFrozen))
  149. ]))
  150. return dataList
  151. class SumContext(object):
  152. def __init__(self, strategy=None):
  153. self._strategy = strategy
  154. @property
  155. def strategy(self):
  156. return self._strategy
  157. @strategy.setter
  158. def strategy(self, strategy):
  159. if isinstance(strategy, BaseSum):
  160. self._strategy = strategy
  161. def sum_balance(self):
  162. return self.strategy.get_sum_data()
  163. class Writer(object):
  164. def __init__(self, path):
  165. if not os.path.exists(path):
  166. raise Exception("path is not exists!")
  167. filePath = os.path.join(path, str(datetime.date.today()))
  168. fileName = "{}.xlsx".format(filePath)
  169. self._writer = pandas.ExcelWriter(fileName)
  170. self._context = SumContext()
  171. def __enter__(self):
  172. return self
  173. def __exit__(self, exc_type, exc_val, exc_tb):
  174. if exc_val:
  175. print exc_val
  176. else:
  177. self._writer.save()
  178. @property
  179. def context(self):
  180. return self._context
  181. @property
  182. def write_data(self):
  183. return self.context.sum_balance()
  184. def write(self, sheetName=None):
  185. if sheetName is None:
  186. sheetName = str(self.context.strategy)
  187. dataForm = pandas.DataFrame(self.write_data)
  188. dataForm.to_excel(self._writer, sheet_name=sheetName, index=False)
  189. def sum_customer(path=None):
  190. if path is None:
  191. path = "/var/www/uploaded/sumIncome"
  192. with Writer(path=path) as w:
  193. w.context.strategy = AgentSum(fieldMap=AgentConst.MAP_TYPE_TO_FIELD, checkKey=True)
  194. w.write()
  195. w.context.strategy = DealerSum(fieldMap=DealerConst.MAP_TYPE_TO_FIELD, checkKey=True)
  196. w.write()
  197. if __name__ == '__main__':
  198. sum_customer("C:/Users/Administrator/Desktop")
  199. # sum_customer()
  200. """
  201. 现网经销商ID : {u'_id': ObjectId('5fbca3d5003048ffefab9188')} 应该是字段缺失 model实例化会失败
  202. """