feat(supplier): 供应商成本补平台内供应商供货价
- 优先 product_supplier_mapping.supply_price(统一供货价,平台内/外部) - 无供货价则外部供应商走合同折扣 supply_contract_items - 无映射回退 product.providerid
This commit is contained in:
parent
1cf2f62d74
commit
d423f4ffd2
@ -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
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user