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
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