From d423f4ffd22fc4cc76ef2b87cd59ecc6a28ea95a Mon Sep 17 00:00:00 2001 From: ymq Date: Wed, 26 Aug 2026 17:12:47 +0800 Subject: [PATCH] =?UTF-8?q?feat(supplier):=20=E4=BE=9B=E5=BA=94=E5=95=86?= =?UTF-8?q?=E6=88=90=E6=9C=AC=E8=A1=A5=E5=B9=B3=E5=8F=B0=E5=86=85=E4=BE=9B?= =?UTF-8?q?=E5=BA=94=E5=95=86=E4=BE=9B=E8=B4=A7=E4=BB=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优先 product_supplier_mapping.supply_price(统一供货价,平台内/外部) - 无供货价则外部供应商走合同折扣 supply_contract_items - 无映射回退 product.providerid --- product_management/core.py | 81 ++++++++++++++++++++++++-------------- 1 file changed, 52 insertions(+), 29 deletions(-) diff --git a/product_management/core.py b/product_management/core.py index 3a17dfa..6ca269a 100644 --- a/product_management/core.py +++ b/product_management/core.py @@ -1442,37 +1442,60 @@ class ProductManager: pass amount = original_amount * discount - # 3. 供应商折扣(supplychain 模块,成本侧)→ cost - # 供应商折扣是平台进货折扣,与客户折扣独立,不取 min。 + # 3. 供应商成本(supplychain 模块,成本侧)→ cost + # 供应商成本是平台进货成本,与客户折扣独立,不取 min。 + # 优先 product_supplier_mapping 供货价 supply_price(平台内/外部统一); + # 无供货价则按外部供应商合同折扣 supply_contract_items 算。 cost = original_amount try: - supplier_id = product.get('providerid') or '' - if not supplier_id: - # 从 supplychain 的产品→供应商映射查首选供应商 - dbname = self._get_dbname() - async with DBPools().sqlorContext(dbname) as sor: - maps = await sor.R('product_supplier_mapping', - {'product_id': pid}) - if maps: - pref = [m for m in maps - if str(getattr(m, 'is_preferred', '')) == '1'] or maps - supplier_id = (getattr(pref[0], 'external_supplier_id', '') - or getattr(pref[0], 'supplier_org_id', '') - or '') - if supplier_id: - sc = await env.calculate_sale_amounts(None, { - 'resellerid': resellerid, - 'supplier_id': supplier_id, - 'productid': pid, - 'prodtypeid': product.get('category_id') or '', - 'quantity': 1, - 'unit_price': original_amount, - }) - if sc: - sc_data = json.loads(sc) if isinstance(sc, str) else sc - sc_data = sc_data.get('data', {}) if isinstance(sc_data, dict) else {} - supply_discount = float(sc_data.get('supply_discount', 1.0) or 1.0) - cost = original_amount * supply_discount + dbname = self._get_dbname() + mapping = None + async with DBPools().sqlorContext(dbname) as sor: + maps = await sor.R('product_supplier_mapping', {'product_id': pid}) + if maps: + pref = [m for m in maps + if str(getattr(m, 'is_preferred', '')) == '1'] or maps + mapping = pref[0] + + if mapping is not None: + # 首选供应商映射:优先直接供货价 + supply_price = getattr(mapping, 'supply_price', None) + if supply_price not in (None, '', 0): + cost = float(supply_price) + else: + supplier_id = (getattr(mapping, 'external_supplier_id', '') + or product.get('providerid') or '') + if supplier_id: + sc = await env.calculate_sale_amounts(None, { + 'resellerid': resellerid, + 'supplier_id': supplier_id, + 'productid': pid, + 'prodtypeid': product.get('category_id') or '', + 'quantity': 1, + 'unit_price': original_amount, + }) + if sc: + sc_data = json.loads(sc) if isinstance(sc, str) else sc + sc_data = sc_data.get('data', {}) if isinstance(sc_data, dict) else {} + supply_discount = float(sc_data.get('supply_discount', 1.0) or 1.0) + cost = original_amount * supply_discount + else: + # 无映射,回退 product.providerid(外部供应商走合同折扣) + supplier_id = product.get('providerid') or '' + if supplier_id: + sc = await env.calculate_sale_amounts(None, { + 'resellerid': resellerid, + 'supplier_id': supplier_id, + 'productid': pid, + 'prodtypeid': product.get('category_id') or '', + 'quantity': 1, + 'unit_price': original_amount, + }) + if sc: + sc_data = json.loads(sc) if isinstance(sc, str) else sc + sc_data = sc_data.get('data', {}) if isinstance(sc_data, dict) else {} + supply_discount = float(sc_data.get('supply_discount', 1.0) or 1.0) + cost = original_amount * supply_discount except Exception: cost = original_amount