# -*- coding: utf-8 -*- # !/usr/bin/env python """ 生成报表 """ import datetime import re import sys from bson import ObjectId from base import init_env, get_logger logger = get_logger(__name__) init_env(interactive = False) from apps import reportCache from apps.web.dealer.models import Dealer from apps.web.device.models import Group, Device def check_offline_coins(dealersWithGroupIds, partnerGroupIds, stringDate): from apps.web.core.accounting import devCoinTmpl, ownerCoinTmpl, 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) listCoins = [int(coins) for coins in valueDict.values()] allDevCoinsByGroup = sum(listCoins) oldValue = mc.get(groupCoinTmpl(groupId, stringDate)) if not oldValue: oldValue = 0 else: oldValue = int(oldValue) if oldValue != allDevCoinsByGroup: logger.info( 'not equal. ownerId=%s,groupId=%s,oldValue=%s,nowValue=%s' % ( ownerId, groupId, oldValue, allDevCoinsByGroup)) else: logger.info( 'ownerId=%s,groupId=%s,oldValue=%s,nowValue=%s' % ( ownerId, groupId, oldValue, allDevCoinsByGroup)) groupCoinDict[groupCoinTmpl(groupId, stringDate)] = allDevCoinsByGroup ownerCoins = ownerCoins + int(allDevCoinsByGroup) dealerCoinDict[ownerCoinTmpl(ownerId, stringDate)] = ownerCoins for partnerId, groupIds in partnerGroupIds.items(): partnerCoinsByGroup = 0 for groupId in list(set(groupIds)): if groupCoinTmpl(groupId, stringDate) in groupCoinDict: groupCoin = groupCoinDict[groupCoinTmpl(groupId, stringDate)] else: groupCoin = 0 logger.info( 'allocated as partner. partnerId = %s; groupId = %s; coin = %s' % (partnerId, groupId, groupCoin)) partnerCoinsByGroup = partnerCoinsByGroup + int(groupCoin) if ownerCoinTmpl(partnerId, stringDate) in dealerCoinDict: dealerCoinDict[ownerCoinTmpl(partnerId, stringDate)] = dealerCoinDict[ ownerCoinTmpl(partnerId, stringDate)] + partnerCoinsByGroup else: dealerCoinDict[ownerCoinTmpl(partnerId, stringDate)] = partnerCoinsByGroup for dealerKey, coin in dealerCoinDict.items(): oldValue = mc.get(dealerKey) if not oldValue: oldValue = 0 else: oldValue = int(oldValue) if oldValue != coin: logger.info( 'not equal. ownerKey=%s,oldValue=%s,nowValue=%s' % ( dealerKey, oldValue, coin)) else: logger.info( 'ownerKey=%s,nowValue=%s' % ( dealerKey, coin)) def main(dateFmtStr): dealerId = None if len(sys.argv) >= 2: dealerId = str(sys.argv[1]) if dateFmtStr: reportDate = datetime.datetime.strptime(dateFmtStr, "%Y-%m-%d") else: reportDate = datetime.datetime.now() - datetime.timedelta(days = 1) if dealerId: dealers = Dealer.get_collection().find({'_id': ObjectId(dealerId)}) else: dealers = Dealer.get_collection().find({}) dealers = [dealer for dealer in dealers] dealersWithGroupIds = {} partnerGroupIds = {} for dealer in dealers: dealersWithGroupIds[str(dealer['_id'])] = Group.get_group_ids_of_dealer(str(dealer['_id'])) partnerGroupIds[str(dealer['_id'])] = Group.get_group_ids_of_partner(str(dealer['_id'])) check_offline_coins(dealersWithGroupIds, partnerGroupIds, reportDate.strftime("%Y-%m-%d")) if __name__ == '__main__': dateFmtStr = None index = 1 regex = re.compile(r'\d{4}-\d{2}-\d{2}') for arg in sys.argv[1:]: m = regex.search(arg) if m and m.group(): dateFmtStr = arg sys.argv.pop(index) break index += 1 main(dateFmtStr)