feat(supplier): 供应商成本补平台内供应商供货价

- 优先 product_supplier_mapping.supply_price(统一供货价,平台内/外部)
- 无供货价则外部供应商走合同折扣 supply_contract_items
- 无映射回退 product.providerid
This commit is contained in:
ymq 2026-08-26 17:12:47 +08:00
parent 1cf2f62d74
commit d423f4ffd2

View File

@ -1442,37 +1442,60 @@ class ProductManager:
pass pass
amount = original_amount * discount amount = original_amount * discount
# 3. 供应商折扣(supplychain 模块,成本侧)→ cost # 3. 供应商成本(supplychain 模块,成本侧)→ cost
# 供应商折扣是平台进货折扣,与客户折扣独立,不取 min。 # 供应商成本是平台进货成本,与客户折扣独立,不取 min。
# 优先 product_supplier_mapping 供货价 supply_price(平台内/外部统一);
# 无供货价则按外部供应商合同折扣 supply_contract_items 算。
cost = original_amount cost = original_amount
try: try:
supplier_id = product.get('providerid') or '' dbname = self._get_dbname()
if not supplier_id: mapping = None
# 从 supplychain 的产品→供应商映射查首选供应商 async with DBPools().sqlorContext(dbname) as sor:
dbname = self._get_dbname() maps = await sor.R('product_supplier_mapping', {'product_id': pid})
async with DBPools().sqlorContext(dbname) as sor: if maps:
maps = await sor.R('product_supplier_mapping', pref = [m for m in maps
{'product_id': pid}) if str(getattr(m, 'is_preferred', '')) == '1'] or maps
if maps: mapping = pref[0]
pref = [m for m in maps
if str(getattr(m, 'is_preferred', '')) == '1'] or maps if mapping is not None:
supplier_id = (getattr(pref[0], 'external_supplier_id', '') # 首选供应商映射:优先直接供货价
or getattr(pref[0], 'supplier_org_id', '') supply_price = getattr(mapping, 'supply_price', None)
or '') if supply_price not in (None, '', 0):
if supplier_id: cost = float(supply_price)
sc = await env.calculate_sale_amounts(None, { else:
'resellerid': resellerid, supplier_id = (getattr(mapping, 'external_supplier_id', '')
'supplier_id': supplier_id, or product.get('providerid') or '')
'productid': pid, if supplier_id:
'prodtypeid': product.get('category_id') or '', sc = await env.calculate_sale_amounts(None, {
'quantity': 1, 'resellerid': resellerid,
'unit_price': original_amount, 'supplier_id': supplier_id,
}) 'productid': pid,
if sc: 'prodtypeid': product.get('category_id') or '',
sc_data = json.loads(sc) if isinstance(sc, str) else sc 'quantity': 1,
sc_data = sc_data.get('data', {}) if isinstance(sc_data, dict) else {} 'unit_price': original_amount,
supply_discount = float(sc_data.get('supply_discount', 1.0) or 1.0) })
cost = original_amount * supply_discount 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: except Exception:
cost = original_amount cost = original_amount