From b193b402ee70284e1dd9f832cf278ea817d8b2b8 Mon Sep 17 00:00:00 2001 From: ymq Date: Wed, 26 Aug 2026 15:50:41 +0800 Subject: [PATCH] =?UTF-8?q?fix(buffered=5Fcharging):=20=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=20get=5Fppid=5Fpricing=20=E7=BC=93=E5=AD=98=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E7=9A=84=20dict?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit get_ppid_pricing 第一次返回 DictObject(sqlor 行对象),经 cache_set 序列化到 Redis 后, 缓存命中时 cache_get 返回 dict(JSON 反序列化)。buffered_charging 原用 r.pricing_data 属性访问,缓存命中时崩 'dict' object has no attribute 'pricing_data'。 影响:任何走 buffered_charging 的计费(calculate_product_cost 等)第二次调用必崩。 改为兼容 hasattr/dict/下标三种访问。 --- pricing/pricing.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pricing/pricing.py b/pricing/pricing.py index d441f54..98cc0fe 100644 --- a/pricing/pricing.py +++ b/pricing/pricing.py @@ -461,8 +461,15 @@ class PricingProgram: async def buffered_charging(ppid, data): r = await PricingProgram.get_ppid_pricing(ppid) - prices = PricingProgram.get_pricing_from_ymalstr(data, - r.pricing_data) + # get_ppid_pricing 缓存命中时返回 dict(Redis JSON 反序列化), + # 未命中时返回 DictObject(sqlor 行对象),两者都要兼容。 + if hasattr(r, 'pricing_data'): + pricing_data = r.pricing_data + elif isinstance(r, dict): + pricing_data = r.get('pricing_data') + else: + pricing_data = r['pricing_data'] + prices = PricingProgram.get_pricing_from_ymalstr(data, pricing_data) amt = 0.0 for p in prices: p.cost = p.amount # discount removed