test_offline_coins.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. """
  4. 生成报表
  5. """
  6. import datetime
  7. import getopt
  8. import sys
  9. from bson import ObjectId
  10. try:
  11. options, args = getopt.getopt(sys.argv[1:], 'l:d:e:t:o:',
  12. ['log=', 'debug=', 'env=', 'date=', 'ownerId='])
  13. except getopt.GetoptError as e:
  14. print(str(e))
  15. sys.exit()
  16. log_file = None
  17. platform_env = 'testing'
  18. report_date = (datetime.datetime.now() - datetime.timedelta(days = 1)).strftime("%Y-%m-%d")
  19. ownerId = None
  20. for name, value in options:
  21. if name in ('-l', '--log'):
  22. log_file = value
  23. if name in ('-e', '--env'):
  24. platform_env = value
  25. if name in ('-t', '--date'):
  26. report_date = datetime.datetime.strptime(value, "%Y-%m-%d").strftime("%Y-%m-%d")
  27. if name in ('-o', '--ownerId'):
  28. ownerId = value
  29. import os
  30. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'configs.{env}'.format(env = platform_env))
  31. from base import init_env, setup_logger, get_logger
  32. init_env(interactive = False)
  33. if log_file:
  34. logger = setup_logger(filename = log_file, namespace = __name__)
  35. else:
  36. logger = get_logger(__name__)
  37. from apps.web.dealer.models import Dealer
  38. from apps.web.device.models import Group, Device
  39. from apps import reportCache
  40. def check_offline_coins(dealersWithGroupIds, stringDate, update = True):
  41. from apps.web.core.accounting import devCoinTmpl, groupCoinTmpl
  42. mc = reportCache
  43. dealerCoinDict = {}
  44. groupCoinDict = {}
  45. for ownerId, groupIds in dealersWithGroupIds.items():
  46. ownerCoins = 0
  47. for groupId in list(set(groupIds)):
  48. devNos = Device.get_devNos_by_group([groupId])
  49. keys = [devCoinTmpl(devNo, stringDate) for devNo in devNos]
  50. valueDict = mc.get_multi(keys)
  51. recalc_group_coins = 0
  52. for devNo, coins in valueDict.iteritems():
  53. recalc_group_coins = recalc_group_coins + int(float(coins))
  54. mc_group_conins = mc.get(groupCoinTmpl(groupId, stringDate))
  55. if mc_group_conins:
  56. real_group_coins = int(mc_group_conins)
  57. else:
  58. real_group_coins = 0
  59. if real_group_coins != recalc_group_coins:
  60. logger.error(
  61. 'groupId = {}, real = {}, recalc = {}'.format(groupId, real_group_coins, recalc_group_coins))
  62. else:
  63. logger.debug('groupId = {}, coins = {}'.format(groupId, real_group_coins))
  64. if ownerId:
  65. dealers = Dealer.get_collection().find({'_id': ObjectId(ownerId)}, {'_id': 1})
  66. else:
  67. dealers = Dealer.get_collection().find({}, {'_id': 1})
  68. dealers = [dealer for dealer in dealers]
  69. dealersWithGroupIds = {}
  70. for dealer in dealers:
  71. dealerId = str(dealer['_id'])
  72. dealersWithGroupIds[dealerId] = Group.get_group_ids_of_dealer(dealerId)
  73. devDict = {dealerId: Device.get_devNos_by_group(groupIds) for dealerId, groupIds in dealersWithGroupIds.items()}
  74. check_offline_coins(dealersWithGroupIds, report_date)