# -*- coding: utf-8 -*- # !/usr/bin/env python """ 生成报表 """ import datetime import getopt import sys from bson import ObjectId try: options, args = getopt.getopt(sys.argv[1:], 'l:d:e:t:o:', ['log=', 'debug=', 'env=', 'date=', 'ownerId=']) except getopt.GetoptError as e: print(str(e)) sys.exit() log_file = None platform_env = 'testing' report_date = (datetime.datetime.now() - datetime.timedelta(days = 1)).strftime("%Y-%m-%d") ownerId = None for name, value in options: if name in ('-l', '--log'): log_file = value if name in ('-e', '--env'): platform_env = value if name in ('-t', '--date'): report_date = datetime.datetime.strptime(value, "%Y-%m-%d").strftime("%Y-%m-%d") if name in ('-o', '--ownerId'): ownerId = value import os os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'configs.{env}'.format(env = platform_env)) from base import init_env, setup_logger, get_logger init_env(interactive = False) if log_file: logger = setup_logger(filename = log_file, namespace = __name__) else: logger = get_logger(__name__) from apps.web.dealer.models import Dealer from apps.web.device.models import Group, Device from apps import reportCache def check_offline_coins(dealersWithGroupIds, stringDate, update = True): from apps.web.core.accounting import devCoinTmpl, groupCoinTmpl mc = reportCache dealerCoinDict = {} groupCoinDict = {} for ownerId, groupIds in dealersWithGroupIds.items(): ownerCoins = 0 for groupId in list(set(groupIds)): devNos = Device.get_devNos_by_group([groupId]) keys = [devCoinTmpl(devNo, stringDate) for devNo in devNos] valueDict = mc.get_multi(keys) recalc_group_coins = 0 for devNo, coins in valueDict.iteritems(): recalc_group_coins = recalc_group_coins + int(float(coins)) mc_group_conins = mc.get(groupCoinTmpl(groupId, stringDate)) if mc_group_conins: real_group_coins = int(mc_group_conins) else: real_group_coins = 0 if real_group_coins != recalc_group_coins: logger.error( 'groupId = {}, real = {}, recalc = {}'.format(groupId, real_group_coins, recalc_group_coins)) else: logger.debug('groupId = {}, coins = {}'.format(groupId, real_group_coins)) if ownerId: dealers = Dealer.get_collection().find({'_id': ObjectId(ownerId)}, {'_id': 1}) else: dealers = Dealer.get_collection().find({}, {'_id': 1}) dealers = [dealer for dealer in dealers] dealersWithGroupIds = {} for dealer in dealers: dealerId = str(dealer['_id']) dealersWithGroupIds[dealerId] = Group.get_group_ids_of_dealer(dealerId) devDict = {dealerId: Device.get_devNos_by_group(groupIds) for dealerId, groupIds in dealersWithGroupIds.items()} check_offline_coins(dealersWithGroupIds, report_date)