123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- # -*- 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)
|