dealer_income_report.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. # coding=utf-8
  2. import datetime
  3. import os
  4. from collections import OrderedDict
  5. import pandas
  6. from base import init_env
  7. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "configs.testing")
  8. init_env(interactive = False)
  9. from apps.web.dealer.models import Dealer
  10. from apps.web.dealer.proxy import DealerIncomeProxy
  11. from apps.web.device.models import Group
  12. from apilib.monetary import RMB
  13. # 前台传入参数
  14. USER_NAME = "17625905488"
  15. GROUP_ID = "5f3baceb81958aa4eaf66d9e"
  16. GROUP_ID = None
  17. START_TIME = "2020-07-01 00:00:00"
  18. END_TIME = "2020-08-25 00:00:00"
  19. # 通过时间 或者通过 地址 来聚合
  20. AGGREGATE_BY = "time"
  21. d = Dealer.objects.filter(username=USER_NAME).order_by("-dateTimeAdded").first()
  22. """
  23. 1. 物业需要导出 数据报表 主要是包含收益以及其他信息
  24. 2. 导出的时候可以选择是按地址分类还是按时间分类
  25. 3. 地址分类的 是一个地址一条记录 时间分类的是 一天一条记录导出
  26. 4. 导出从电脑端进行导出,导出格式为excel
  27. """
  28. groupIds =[_id for _id in Group.get_group_ids_of_dealer_and_partner(ownerId=str(d.id)) if not GROUP_ID or _id == GROUP_ID]
  29. filters = {
  30. "groupId__in": groupIds
  31. }
  32. s = datetime.datetime.strptime(START_TIME, "%Y-%m-%d %H:%M:%S")
  33. filters.update({"dateTimeAdded__gte": s})
  34. e = datetime.datetime.strptime(END_TIME, "%Y-%m-%d %H:%M:%S")
  35. filters.update({"dateTimeAdded__lt": e})
  36. records = DealerIncomeProxy.objects.filter(
  37. **filters
  38. )
  39. dealerCache = dict()
  40. # 接下来处理的是以什么分类聚合的问题
  41. def handle_records(records):
  42. totalIncome = RMB(0)
  43. actualTotalIncome = RMB(0)
  44. partDict = dict()
  45. for record in records:
  46. totalIncome += RMB(record.totalAmount)
  47. actualTotalIncome += RMB(sum(record.actualAmountMap.values(), RMB(0)))
  48. for part in record.partition:
  49. if part["role"] == "agent":
  50. continue
  51. if RMB(part["money"]) == RMB(0.00):
  52. continue
  53. partDict[part["id"]] = partDict.setdefault(part["id"], RMB(0)) + part["money"]
  54. ledgerInfo = ""
  55. # from pprint import pprint
  56. print partDict
  57. for k, _v in partDict.items():
  58. dealer = Dealer.objects.filter(id=k).only("nickname", "username").first()
  59. ledgerInfo += "{}-{}-{}\r\n".format(dealer.nickname, dealer.username, _v)
  60. return {
  61. "totalIncome": totalIncome,
  62. "actualTotalIncome": actualTotalIncome,
  63. "ledgerInfo": ledgerInfo
  64. }
  65. if AGGREGATE_BY == "time":
  66. res = {(s+datetime.timedelta(day)).strftime("%Y-%m-%d"): list() for day in range((e-s).days)}
  67. for record in records:
  68. res[record.date].append(record)
  69. data = list()
  70. for key, items in res.items():
  71. d = handle_records(items)
  72. d.update({"time": key})
  73. data.append(d)
  74. writeDataList = list()
  75. a = RMB(0)
  76. b = RMB(0)
  77. for v in sorted(data, key=lambda x: x["time"]):
  78. tempData = [
  79. (u"日期", v.get("time")),
  80. (u"总收益", "{0:.2f}".format(float(v.get("totalIncome")))),
  81. (u"总分帐金额", "{0:.2f}".format(float(v.get("actualTotalIncome")))),
  82. (u"分账明细", v.get("ledgerInfo"))
  83. ]
  84. writeDataList.append(OrderedDict(tempData))
  85. a += v.get("totalIncome")
  86. b += v.get("actualTotalIncome")
  87. else:
  88. tempData = [
  89. (u"日期", u"总计"),
  90. (u"总收益", "{:.2f}".format(float(a))),
  91. (u"总分帐金额", "{:.2f}".format(float(b))),
  92. (u"分账明细", u"")
  93. ]
  94. writeDataList.append(OrderedDict(tempData))
  95. df = pandas.DataFrame(writeDataList)
  96. df.to_excel("time_test.xlsx", sheet_name='sheet1', index=False)
  97. elif AGGREGATE_BY == "group":
  98. res = {g: list() for g in groupIds}
  99. for record in records:
  100. res[str(record.groupId)].append(record)
  101. data = list()
  102. for key, items in res.items():
  103. d = handle_records(items)
  104. group = Group.get_group(key)
  105. d.update({"groupName": group.get("groupName")})
  106. data.append(d)
  107. writeDataList = list()
  108. a = RMB(0)
  109. b = RMB(0)
  110. for v in sorted(data, key=lambda x: x["groupName"]):
  111. tempData = [
  112. (u"地址名称", v.get("groupName")),
  113. (u"总收益", "{0:.2f}".format(float(v.get("totalIncome")))),
  114. (u"总分帐金额", "{0:.2f}".format(float(v.get("actualTotalIncome")))),
  115. (u"分账明细", v.get("ledgerInfo"))
  116. ]
  117. a += v.get("totalIncome")
  118. b += v.get("actualTotalIncome")
  119. writeDataList.append(OrderedDict(tempData))
  120. else:
  121. tempData = [
  122. (u"地址名称", u"总计"),
  123. (u"总收益", "{:.2f}".format(float(a))),
  124. (u"总分帐金额", "{:.2f}".format(float(b))),
  125. (u"分账明细", u"")
  126. ]
  127. writeDataList.append(OrderedDict(tempData))
  128. df = pandas.DataFrame(writeDataList)
  129. df.to_excel("group_test.xlsx", sheet_name='sheet1', index=False)
  130. else:
  131. print "please choose the type of aggregate!"