# -*- coding: utf-8 -*- # !/usr/bin/env python import datetime import logging from dateutil.relativedelta import relativedelta from typing import Optional from apilib.monetary import RMB from apps.web.agent.proxy import record_agent_traffic_card_earning, record_agent_api_quota_earning, \ record_agent_disable_ad_earning from apps.web.dealer.models import DealerRechargeRecord, Dealer from apps.web.device.models import Device logger = logging.getLogger(__name__) def post_pay(record, verifyAccount = False): # type: (DealerRechargeRecord, bool)->None record.reload() if record.is_close: logger.warning('{} check close.'.format(repr(record))) return if record.product == DealerRechargeRecord.ProductType.SimCard: post_sim_recharge(record, verifyAccount) elif record.product == DealerRechargeRecord.ProductType.ApiCost: post_ApiCost_recharge(record, verifyAccount) elif record.product == DealerRechargeRecord.ProductType.DisableAd: post_disableAd_recharge(record, verifyAccount) def post_sim_recharge(record, verifyAccount = False): # type: (DealerRechargeRecord, bool)->None logger.debug('post recharge devices. record = {}'.format(repr(record))) try: dealer = Dealer.objects(id = str(record.dealerId)).first() # type: Optional[Dealer] for item in record.settleInfo['partition']: record_agent_traffic_card_earning(agentId = item['id'], source_key = record.withdrawSourceKey, detail = { 'recharge_record_id': record.id, 'name': dealer.nickname, 'sum_of_price': RMB.fen_to_yuan(record.totalFee), 'agent_earning': RMB.fen_to_yuan(item['earned']), 'itemNum': len(record.items) }) except Exception as e: logger.exception('save recharge record failure. error = %s; record = %s' % (e, repr(record))) dev_no_list = [item['devNo'] for item in record.items] try: Device.get_collection().update_many({'devNo': {'$in': dev_no_list}}, {'$set': {'simStatus': 'chargedUnupdated'}}, upsert = False) except Exception as e: logger.exception(e) finally: Device.invalid_many_device_cache(dev_no_list) def post_sim_verify_order(dealer, verify_order, verifyAccount = False): for item in verify_order.settleInfo['partition']: record_agent_traffic_card_earning(agentId = item['id'], source_key = verify_order.withdrawSourceKey, detail = { 'reconcile': True, 'recharge_record_id': verify_order.id, 'name': dealer.nickname, 'sum_of_price': RMB.fen_to_yuan(verify_order.totalFee), 'agent_earning': RMB.fen_to_yuan(item['earned']) }) def post_ApiCost_recharge(record, verifyAccount = False): # type: (DealerRechargeRecord, bool)->None logger.debug('post recharge devices. record = {}'.format(repr(record))) dealer = Dealer.objects(id = str(record.dealerId)).first() # type: Optional[Dealer] try: for item in record.settleInfo['partition']: record_agent_api_quota_earning(agentId = item['id'], source_key = record.withdrawSourceKey, detail = { 'recharge_record_id': record.id, 'name': dealer.nickname, 'sum_of_price': RMB.fen_to_yuan(record.totalFee), 'agent_earning': RMB.fen_to_yuan(item['earned']), 'itemNum': len(record.items) }) except Exception as e: logger.exception('save recharge record failure. error = %s; record = %s' % (e, repr(record))) try: for item in record.items: dealer.update_api_app(**{'inc__apiDeviceMax': item.get('needQuota', 0)}) Device.switch_api_mode(item.get('trunOnList', []), isApi = True) except Exception as e: logger.exception(e) def post_disableAd_recharge(record, verifyAccount = False): # type: (DealerRechargeRecord, bool)->None logger.debug('post recharge devices. record = {}'.format(repr(record))) dealer = Dealer.objects(id = str(record.dealerId)).first() # type: Optional[Dealer] try: for item in record.settleInfo['partition']: record_agent_disable_ad_earning(agentId = item['id'], source_key = record.withdrawSourceKey, detail = { 'recharge_record_id': record.id, 'name': dealer.nickname, 'sum_of_price': RMB.fen_to_yuan(record.totalFee), 'agent_earning': RMB.fen_to_yuan(item['earned']), 'itemNum': len(record.items) }) except Exception as e: logger.exception('save recharge record failure. error = %s; record = %s' % (e, repr(record))) try: now = datetime.datetime.now() for item in record.items: dev = Device.objects.filter(logicalCode = item['logicalCode']).first() if dev.disableADExpireDate and dev.disableADExpireDate > now: dev.disableADExpireDate = dev.disableADExpireDate + relativedelta(months = int(item['cycle'])) else: dev.disableADExpireDate = now + relativedelta(months = int(item['cycle'])) dev.save() Device.invalid_device_cache(dev.devNo) except Exception as e: logger.exception(e)