check_collect_offline_coins.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. """
  4. 生成报表
  5. """
  6. import datetime
  7. import re
  8. import sys
  9. from bson import ObjectId
  10. from base import init_env, get_logger
  11. logger = get_logger(__name__)
  12. init_env(interactive = False)
  13. from apps import reportCache
  14. from apps.web.dealer.models import Dealer
  15. from apps.web.device.models import Group, Device
  16. def check_offline_coins(dealersWithGroupIds, partnerGroupIds, stringDate):
  17. from apps.web.core.accounting import devCoinTmpl, ownerCoinTmpl, groupCoinTmpl
  18. mc = reportCache
  19. dealerCoinDict = {}
  20. groupCoinDict = {}
  21. for ownerId, groupIds in dealersWithGroupIds.items():
  22. ownerCoins = 0
  23. for groupId in list(set(groupIds)):
  24. devNos = Device.get_devNos_by_group([groupId])
  25. keys = [devCoinTmpl(devNo, stringDate) for devNo in devNos]
  26. valueDict = mc.get_multi(keys)
  27. listCoins = [int(coins) for coins in valueDict.values()]
  28. allDevCoinsByGroup = sum(listCoins)
  29. oldValue = mc.get(groupCoinTmpl(groupId, stringDate))
  30. if not oldValue:
  31. oldValue = 0
  32. else:
  33. oldValue = int(oldValue)
  34. if oldValue != allDevCoinsByGroup:
  35. logger.info(
  36. 'not equal. ownerId=%s,groupId=%s,oldValue=%s,nowValue=%s' % (
  37. ownerId, groupId, oldValue, allDevCoinsByGroup))
  38. else:
  39. logger.info(
  40. 'ownerId=%s,groupId=%s,oldValue=%s,nowValue=%s' % (
  41. ownerId, groupId, oldValue, allDevCoinsByGroup))
  42. groupCoinDict[groupCoinTmpl(groupId, stringDate)] = allDevCoinsByGroup
  43. ownerCoins = ownerCoins + int(allDevCoinsByGroup)
  44. dealerCoinDict[ownerCoinTmpl(ownerId, stringDate)] = ownerCoins
  45. for partnerId, groupIds in partnerGroupIds.items():
  46. partnerCoinsByGroup = 0
  47. for groupId in list(set(groupIds)):
  48. if groupCoinTmpl(groupId, stringDate) in groupCoinDict:
  49. groupCoin = groupCoinDict[groupCoinTmpl(groupId, stringDate)]
  50. else:
  51. groupCoin = 0
  52. logger.info(
  53. 'allocated as partner. partnerId = %s; groupId = %s; coin = %s' % (partnerId, groupId, groupCoin))
  54. partnerCoinsByGroup = partnerCoinsByGroup + int(groupCoin)
  55. if ownerCoinTmpl(partnerId, stringDate) in dealerCoinDict:
  56. dealerCoinDict[ownerCoinTmpl(partnerId, stringDate)] = dealerCoinDict[
  57. ownerCoinTmpl(partnerId,
  58. stringDate)] + partnerCoinsByGroup
  59. else:
  60. dealerCoinDict[ownerCoinTmpl(partnerId, stringDate)] = partnerCoinsByGroup
  61. for dealerKey, coin in dealerCoinDict.items():
  62. oldValue = mc.get(dealerKey)
  63. if not oldValue:
  64. oldValue = 0
  65. else:
  66. oldValue = int(oldValue)
  67. if oldValue != coin:
  68. logger.info(
  69. 'not equal. ownerKey=%s,oldValue=%s,nowValue=%s' % (
  70. dealerKey, oldValue, coin))
  71. else:
  72. logger.info(
  73. 'ownerKey=%s,nowValue=%s' % (
  74. dealerKey, coin))
  75. def main(dateFmtStr):
  76. dealerId = None
  77. if len(sys.argv) >= 2:
  78. dealerId = str(sys.argv[1])
  79. if dateFmtStr:
  80. reportDate = datetime.datetime.strptime(dateFmtStr, "%Y-%m-%d")
  81. else:
  82. reportDate = datetime.datetime.now() - datetime.timedelta(days = 1)
  83. if dealerId:
  84. dealers = Dealer.get_collection().find({'_id': ObjectId(dealerId)})
  85. else:
  86. dealers = Dealer.get_collection().find({})
  87. dealers = [dealer for dealer in dealers]
  88. dealersWithGroupIds = {}
  89. partnerGroupIds = {}
  90. for dealer in dealers:
  91. dealersWithGroupIds[str(dealer['_id'])] = Group.get_group_ids_of_dealer(str(dealer['_id']))
  92. partnerGroupIds[str(dealer['_id'])] = Group.get_group_ids_of_partner(str(dealer['_id']))
  93. check_offline_coins(dealersWithGroupIds, partnerGroupIds, reportDate.strftime("%Y-%m-%d"))
  94. if __name__ == '__main__':
  95. dateFmtStr = None
  96. index = 1
  97. regex = re.compile(r'\d{4}-\d{2}-\d{2}')
  98. for arg in sys.argv[1:]:
  99. m = regex.search(arg)
  100. if m and m.group():
  101. dateFmtStr = arg
  102. sys.argv.pop(index)
  103. break
  104. index += 1
  105. main(dateFmtStr)