fix: _get_exchange_rates/_load_usage_log_bills env取sor.env,无则ServerEnv()兜底

This commit is contained in:
yumoqing 2026-07-21 17:52:18 +08:00
parent 5030e0640c
commit 33447fbbe5

View File

@ -7,6 +7,8 @@ from datetime import datetime, timedelta
from appPublic.uniqueID import getID from appPublic.uniqueID import getID
from appPublic.dictObject import DictObject from appPublic.dictObject import DictObject
from appPublic.log import info from appPublic.log import info
from ahserver.serverenv import ServerEnv
from sqlor.dbpools import get_sor_context
MODULE_NAME = "sage_datamart" MODULE_NAME = "sage_datamart"
@ -113,32 +115,30 @@ async def sync_call_fact(sor, last_sync=None):
async def _load_usage_log_bills(sor, last_sync): async def _load_usage_log_bills(sor, last_sync):
"""从 product_usage_log 预取与 llmusage 关联的实际计费记录。 """从 product_usage_log 预取与 llmusage 关联的实际计费记录。"""
env = sor.env if hasattr(sor, 'env') and sor.env is not None else ServerEnv()
product_usage_log 通过 source_ref_table='llmusage' + source_ref_id=<luid> 关联 llmusage
返回 {llmusage.id: {'sell_price': float, 'purchase_currency': str|None}, ...}
"""
usage_log_map = {} usage_log_map = {}
try: try:
sql = """ async with get_sor_context(env, '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
@ -146,17 +146,19 @@ async def _load_usage_log_bills(sor, last_sync):
async def _get_exchange_rates(sor, stat_date): async def _get_exchange_rates(sor, stat_date):
"""查询汇率表,返回 {currency: mid_rate} 字典""" """查询汇率表,返回 {currency: mid_rate} 字典"""
env = sor.env if hasattr(sor, 'env') and sor.env is not None else ServerEnv()
rates = {'CNY': 1.0} rates = {'CNY': 1.0}
try: try:
sql = """SELECT from_currency, mid_rate FROM exchange_rate async with get_sor_context(env, 'accounting') as acc_sor:
WHERE to_currency = 'CNY' AND effective_date <= ${d}$ sql = """SELECT from_currency, mid_rate FROM exchange_rate
ORDER BY effective_date DESC""" WHERE to_currency = 'CNY' AND effective_date <= ${d}$
rows = await sor.sqlExe(sql, {'d': stat_date}) ORDER BY effective_date DESC"""
for r in rows: rows = await acc_sor.sqlExe(sql, {'d': stat_date})
cur = r.from_currency if hasattr(r, 'from_currency') else r['from_currency'] for r in rows:
rate = r.mid_rate if hasattr(r, 'mid_rate') else r['mid_rate'] cur = r.from_currency if hasattr(r, 'from_currency') else r['from_currency']
if cur not in rates and rate: rate = r.mid_rate if hasattr(r, 'mid_rate') else r['mid_rate']
rates[cur] = float(rate) if cur not in rates and 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