check_total_income_one.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import os
  5. import sys
  6. PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..')
  7. sys.path.insert(0, PROJECT_ROOT)
  8. from script.base import init_env
  9. os.environ["DJANGO_SETTINGS_MODULE"] = "configs.production"
  10. init_env(False)
  11. from apps.web.core.db import copy_document_classes
  12. from apps.web.dealer.proxy import DealerIncomeProxy
  13. from apps.web.common.models import WithdrawRecord
  14. from apps.web.dealer.models import Dealer, DealerRechargeRecord
  15. from apilib.monetary import RMB
  16. begin = datetime.datetime(2017, 1, 1, 0, 0, 0)
  17. end = datetime.datetime(2089, 1, 1, 0, 0, 0)
  18. check_date = datetime.datetime(2022, 6, 1, 0, 0, 0)
  19. def calc_auto_sim(ownerId, begin_time, end_time):
  20. simAutoFee = 0.0
  21. ds = DealerRechargeRecord.objects(dealerId=ownerId, status='Paid', name__contains=u'自动续费',
  22. createdTime__gte=begin_time, createdTime__lt=end_time)
  23. for _ in ds:
  24. simAutoFee += (float(_.totalFee) / 100)
  25. return simAutoFee
  26. def calc_withdraw(ownerId, begin_time, end_time):
  27. ws = WithdrawRecord.objects(ownerId=ownerId, status__nin=[0, 4, 5],
  28. postTime__gte=begin_time, postTime__lt=end_time)
  29. withdraw = 0.0
  30. for _ in ws:
  31. if _.refunded:
  32. print('refunded')
  33. else:
  34. withdraw += float(str(_.amount))
  35. # print('withdraw is: {}'.format(withdraw))
  36. return withdraw
  37. def calc_dealer_income_proxy(ownerId, begin_time, end_time):
  38. if begin_time < check_date:
  39. his_model_cls = copy_document_classes(DealerIncomeProxy, '{}_his'.format(DealerIncomeProxy.__name__),
  40. 'report_his')
  41. his_data = his_model_cls.sum_by_dealer(dealerId=ownerId,
  42. **{'dateTimeAdded__gte': begin_time,
  43. 'dateTimeAdded__lt': check_date if check_date < end_time else end_time})
  44. else:
  45. his_data = 0
  46. if begin_time > check_date:
  47. now_data = DealerIncomeProxy.sum_by_dealer(dealerId=ownerId,
  48. **{'dateTimeAdded__gte': begin_time, 'dateTimeAdded__lt': end_time})
  49. else:
  50. if check_date > end_time:
  51. now_data = 0
  52. else:
  53. now_data = DealerIncomeProxy.sum_by_dealer(dealerId=ownerId,
  54. **{'dateTimeAdded__gte': check_date,
  55. 'dateTimeAdded__lt': end_time})
  56. return float(str(his_data)), float(str(now_data)), float(str(his_data)) + float(str(now_data))
  57. def total_balance(dealer):
  58. total = RMB(0)
  59. for income_type in dealer.INCOME_TYPE_LIST:
  60. total += dealer.sub_balance(income_type, only_ledger=False)
  61. return total
  62. def check_one_dealer(ownerId, begin_wallet, begin_time):
  63. end_time = datetime.datetime.now()
  64. dealer = Dealer.objects(id=ownerId).first()
  65. wallet = float(total_balance(dealer))
  66. withdraw = calc_withdraw(ownerId, begin_time, end_time)
  67. auto_sim = calc_auto_sim(ownerId, begin_time, end_time)
  68. total = withdraw + wallet + auto_sim - begin_wallet
  69. his_income, now_income, total_income = calc_dealer_income_proxy(ownerId, begin_time, end_time)
  70. print '--------------------------------------------------------------------------------------------------------------------------'
  71. print ''
  72. print '对账结果如下({}):'.format(begin_time.strftime('%Y-%m-%d %H:%M:%S'))
  73. print 'begin_wallet = {}, wallet={}, withdraw={}, autoSim={}'.format(str(begin_wallet), str(wallet),
  74. str(withdraw), str(auto_sim))
  75. print 'his = {}, now = {}, total income = {}, calc income = {}'.format(str(his_income), str(now_income),
  76. str(total_income), str(total))
  77. print 'check result is: {}; id = {}'.format(round(total_income, 2) == round(total, 2), ownerId)
  78. print 'diff is: {}; id = {}'.format((round(total_income, 2) - round(total, 2)), ownerId)
  79. print '--------------------------------------------------------------------------------------------------------------------------'
  80. def calc_begin(ownerId, begin_time, end_time):
  81. # ws = WithdrawRecord.objects(ownerId=ownerId, postTime__gte=begin_time, postTime__lt=end_time).first()
  82. # if ws:
  83. # return float(ws.balance), ws.postTime
  84. # else:
  85. # raise Exception('no withdraw.')
  86. # sys.exit(0)
  87. return float(0), begin_time
  88. from bson import ObjectId
  89. done_list = [
  90. ]
  91. if __name__ == '__main__':
  92. _list = []
  93. ownerIds = sys.argv[1:]
  94. if ownerIds:
  95. for ownerId in ownerIds:
  96. _list.append(ownerId)
  97. else:
  98. _list = [str(item.id) for item in Dealer.objects(id__nin = done_list).all().only('id')]
  99. #print _list
  100. for ownerId in _list:
  101. try:
  102. check_one_dealer(ownerId, 0, begin)
  103. except Exception as e:
  104. print('id={}, e={}'.format(ownerId, str(e)))