collect_coins_for_dealers.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. """
  4. ..2017/12/19 更改以dotenv来适应不同环境的环境变量,解决分机部署问题
  5. 每小时汇总总的线下投币数量
  6. cd .. && python collect_coins_for_dealers.py
  7. 技术要点:
  8. #REVIEW0:
  9. 1、没有注册的设备,不要进行汇总。
  10. 2、建议访问内存,不要访问数据库。先得到所有的经销商,然后内存获取经销商所有的地址组,然后得到组内所有设备,然后汇总。
  11. 3、变量名称建议采用驼峰方式命令;
  12. 4、从memcache中获取值的时候,如果能够批量,尽量用批量,因为批量的效率远高于单个获取;
  13. 5、给组或者经销商的汇总的时候,汇总完毕一次set
  14. 6、隔天跨小时的时候,需要特殊处理 判断
  15. 7、make_rpt_into_db,最好等这个脚本干完后,在执行。通过硬配置解决这个。
  16. """
  17. import datetime
  18. import sys
  19. import re
  20. from base import init_env, get_logger
  21. init_env(interactive = False)
  22. logger = get_logger(__name__)
  23. from apps.web.device.models import Group, Device, OfflineReportDealers
  24. from apps import reportCache
  25. def check_offline_coins(dealersWithGroupIds, partnerGroupIds, stringDate, update = True):
  26. from apps.web.core.accounting import devCoinTmpl, ownerCoinTmpl, groupCoinTmpl
  27. mc = reportCache
  28. dealerCoinDict = {}
  29. groupCoinDict = {}
  30. for ownerId, groupIds in dealersWithGroupIds.items():
  31. ownerCoins = 0
  32. for groupId in list(set(groupIds)):
  33. devNos = Device.get_devNos_by_group([groupId])
  34. keys = [devCoinTmpl(devNo, stringDate) for devNo in devNos]
  35. valueDict = mc.get_multi(keys)
  36. listCoins = [int(coins) for coins in valueDict.values()]
  37. allDevCoinsByGroup = sum(listCoins)
  38. oldValue = mc.get(groupCoinTmpl(groupId, stringDate))
  39. if not oldValue:
  40. oldValue = 0
  41. else:
  42. oldValue = int(oldValue)
  43. if oldValue != allDevCoinsByGroup:
  44. logger.info(
  45. 'not equal. ownerId=%s,groupId=%s,oldValue=%s,nowValue=%s' % (
  46. ownerId, groupId, oldValue, allDevCoinsByGroup))
  47. else:
  48. logger.info(
  49. 'ownerId=%s,groupId=%s,oldValue=%s,nowValue=%s' % (
  50. ownerId, groupId, oldValue, allDevCoinsByGroup))
  51. groupCoinDict[groupCoinTmpl(groupId, stringDate)] = allDevCoinsByGroup
  52. if update:
  53. mc.set(groupCoinTmpl(groupId, stringDate), str(int(allDevCoinsByGroup)))
  54. ownerCoins = ownerCoins + int(allDevCoinsByGroup)
  55. dealerCoinDict[ownerCoinTmpl(ownerId, stringDate)] = ownerCoins
  56. for partnerId, groupIds in partnerGroupIds.items():
  57. partnerCoinsByGroup = 0
  58. for groupId in list(set(groupIds)):
  59. if groupCoinTmpl(groupId, stringDate) in groupCoinDict:
  60. groupCoin = groupCoinDict[groupCoinTmpl(groupId, stringDate)]
  61. else:
  62. groupCoin = 0
  63. logger.info(
  64. 'allocated as partner. partnerId = %s; groupId = %s; coin = %s' % (partnerId, groupId, groupCoin))
  65. partnerCoinsByGroup = partnerCoinsByGroup + int(groupCoin)
  66. if ownerCoinTmpl(partnerId, stringDate) in dealerCoinDict:
  67. dealerCoinDict[ownerCoinTmpl(partnerId, stringDate)] = dealerCoinDict[
  68. ownerCoinTmpl(partnerId,
  69. stringDate)] + partnerCoinsByGroup
  70. else:
  71. dealerCoinDict[ownerCoinTmpl(partnerId, stringDate)] = partnerCoinsByGroup
  72. for dealerKey, coin in dealerCoinDict.items():
  73. oldValue = mc.get(dealerKey)
  74. if not oldValue:
  75. oldValue = 0
  76. else:
  77. oldValue = int(oldValue)
  78. if oldValue != coin:
  79. logger.info(
  80. 'not equal. ownerKey=%s,oldValue=%s,nowValue=%s' % (
  81. dealerKey, oldValue, coin))
  82. else:
  83. logger.info(
  84. 'ownerKey=%s,nowValue=%s' % (
  85. dealerKey, coin))
  86. if update:
  87. mc.set(dealerKey, str(int(coin)))
  88. def main(dateFmtStr):
  89. dealerId = None
  90. if len(sys.argv) >= 2:
  91. dealerId = str(sys.argv[1])
  92. if dateFmtStr:
  93. reportDate = datetime.datetime.strptime(dateFmtStr, "%Y-%m-%d")
  94. else:
  95. reportDate = datetime.datetime.now() - datetime.timedelta(days = 1)
  96. if dealerId:
  97. dealer_id_list = [dealerId]
  98. else:
  99. dealer_id_list = OfflineReportDealers.get_rpt_dealIds(reportDate.strftime("%Y-%m-%d"))
  100. # if dealerId:
  101. # dealers = Dealer.get_collection().find({'_id': ObjectId(dealerId)})
  102. # else:
  103. # dealers = Dealer.get_collection().find({})
  104. #
  105. # dealers = [dealer for dealer in dealers]
  106. dealersWithGroupIds = {}
  107. partnerGroupIds = {}
  108. for _dealerId in dealer_id_list:
  109. dealersWithGroupIds[_dealerId] = Group.get_group_ids_of_dealer(_dealerId)
  110. partnerGroupIds[_dealerId] = Group.get_group_ids_of_partner(_dealerId)
  111. check_offline_coins(dealersWithGroupIds, partnerGroupIds, reportDate.strftime("%Y-%m-%d"))
  112. logger.info('Over!')
  113. if __name__ == '__main__':
  114. dateFmtStr = None
  115. index = 1
  116. regex = re.compile(r'\d{4}-\d{2}-\d{2}')
  117. for arg in sys.argv[1:]:
  118. m = regex.search(arg)
  119. if m and m.group():
  120. dateFmtStr = arg
  121. sys.argv.pop(index)
  122. break
  123. index += 1
  124. main(dateFmtStr)