fix: _get_exchange_rates/_load_usage_log_bills直接用传入sor,去掉get_sor_context(None)导致的NoneType错误

This commit is contained in:
yumoqing 2026-07-21 17:45:12 +08:00
parent ed0107347e
commit 5030e0640c

View File

@ -118,50 +118,45 @@ async def _load_usage_log_bills(sor, last_sync):
product_usage_log 通过 source_ref_table='llmusage' + source_ref_id=<luid> 关联 llmusage product_usage_log 通过 source_ref_table='llmusage' + source_ref_id=<luid> 关联 llmusage
返回 {llmusage.id: {'sell_price': float, 'purchase_currency': str|None}, ...} 返回 {llmusage.id: {'sell_price': float, 'purchase_currency': str|None}, ...}
""" """
from sqlor.dbpools import get_sor_context
usage_log_map = {} usage_log_map = {}
try: try:
async with get_sor_context(sor.env if hasattr(sor, 'env') else None, sql = """
'product_management') as pm_sor: SELECT pul.source_ref_id,
sql = """ pul.sell_price,
SELECT pul.source_ref_id, ps.purchase_currency
pul.sell_price, FROM product_usage_log pul
ps.purchase_currency LEFT JOIN product_subscription ps ON ps.id = pul.subscription_id
FROM product_usage_log pul WHERE pul.source_ref_table = 'llmusage'
LEFT JOIN product_subscription ps ON ps.id = pul.subscription_id AND pul.use_time >= ${last_sync}$
WHERE pul.source_ref_table = 'llmusage' """
AND pul.use_time >= ${last_sync}$ rows = await sor.sqlExe(sql, {'last_sync': last_sync})
""" for r in rows:
rows = await pm_sor.sqlExe(sql, {'last_sync': last_sync}) ref_id = r.source_ref_id if hasattr(r, 'source_ref_id') else r['source_ref_id']
for r in rows: sell_price = r.sell_price if hasattr(r, 'sell_price') else r['sell_price']
ref_id = r.source_ref_id if hasattr(r, 'source_ref_id') else r['source_ref_id'] purchase_currency = r.purchase_currency if hasattr(r, 'purchase_currency') else r.get('purchase_currency')
sell_price = r.sell_price if hasattr(r, 'sell_price') else r['sell_price'] if ref_id:
purchase_currency = r.purchase_currency if hasattr(r, 'purchase_currency') else r.get('purchase_currency') usage_log_map[ref_id] = {
if ref_id: 'sell_price': float(sell_price) if sell_price else 0.0,
usage_log_map[ref_id] = { 'purchase_currency': purchase_currency,
'sell_price': float(sell_price) if sell_price else 0.0, }
'purchase_currency': purchase_currency,
}
except Exception as e: except Exception as e:
info('sage_datamart: product_usage_log lookup failed: ' + str(e)) info('sage_datamart: product_usage_log lookup failed: ' + str(e))
return usage_log_map return usage_log_map
async def _get_exchange_rates(sor, stat_date): async def _get_exchange_rates(sor, stat_date):
"""从 sage 库获取汇率表,返回 {currency: mid_rate} 字典""" """查询汇率表,返回 {currency: mid_rate} 字典"""
from sqlor.dbpools import get_sor_context
rates = {'CNY': 1.0} rates = {'CNY': 1.0}
try: try:
async with get_sor_context(sor.env if hasattr(sor, 'env') else None, 'accounting') as sage_sor: sql = """SELECT from_currency, mid_rate FROM exchange_rate
sql = """SELECT from_currency, mid_rate FROM exchange_rate WHERE to_currency = 'CNY' AND effective_date <= ${d}$
WHERE to_currency = 'CNY' AND effective_date <= ${d}$ ORDER BY effective_date DESC"""
ORDER BY effective_date DESC""" rows = await sor.sqlExe(sql, {'d': stat_date})
rows = await sage_sor.sqlExe(sql, {'d': stat_date}) for r in rows:
for r in rows: cur = r.from_currency if hasattr(r, 'from_currency') else r['from_currency']
cur = r.from_currency if hasattr(r, 'from_currency') else r['from_currency'] rate = r.mid_rate if hasattr(r, 'mid_rate') else r['mid_rate']
rate = r.mid_rate if hasattr(r, 'mid_rate') else r['mid_rate'] if cur not in rates and rate:
if cur not in rates and rate: rates[cur] = float(rate)
rates[cur] = float(rate)
except Exception as e: except Exception as e:
info('sage_datamart: exchange_rate lookup failed: ' + str(e)) info('sage_datamart: exchange_rate lookup failed: ' + str(e))
return rates return rates