fix: correct cost calculation for semi and product exports

Co-authored-by: aider (openai/DeepSeek-V3.2-Thinking) <aider@aider.chat>
This commit is contained in:
dxc
2026-03-02 12:22:45 +08:00
parent d7dff943fc
commit 16350842f8

View File

@ -421,21 +421,16 @@ class MaterialBaseService:
semi_max_prices = {}
for stock, base in list_semi:
# 兼容如果有 unit_total_cost 字段则用,否则用 原料+人工
if hasattr(stock, 'unit_total_cost') and stock.unit_total_cost is not None:
price = float(stock.unit_total_cost)
else:
price = float(stock.raw_material_cost or 0) + float(stock.manual_cost or 0)
# 半成品的单价直接取自 manual_cost 字段(单件总成本)
price = float(stock.manual_cost or 0)
if price > semi_max_prices.get(base.id, 0):
semi_max_prices[base.id] = price
product_max_prices = {}
for stock, base in list_product:
if hasattr(stock, 'unit_total_cost') and stock.unit_total_cost is not None:
price = float(stock.unit_total_cost)
else:
price = float(stock.raw_material_cost or 0) + float(stock.manual_cost or 0)
# 成品的单价直接取自 manual_cost 字段(单件总成本)
price = float(stock.manual_cost or 0)
if price > product_max_prices.get(base.id, 0):
product_max_prices[base.id] = price
@ -486,11 +481,11 @@ class MaterialBaseService:
# 处理半成品
for stock, base in list_semi:
qty = float(stock.stock_quantity or 0)
# 使用该物料的全局最高单价作为成本
highest_cost = get_highest_price(base.id)
# 半成品的单价直接取自 manual_cost 字段(单件总成本
unit_cost = float(stock.manual_cost or 0)
total_val_excl = qty * highest_cost
total_val_incl = qty * highest_cost # 半成品无税
total_val_excl = qty * unit_cost
total_val_incl = qty * unit_cost # 半成品无税
ident = stock.batch_number or stock.serial_number or stock.barcode or stock.sku
@ -503,21 +498,21 @@ class MaterialBaseService:
"date": stock.production_date,
"qty": qty,
"avail": float(stock.available_quantity or 0),
"price_excl": highest_cost,
"price_excl": unit_cost,
"total_val_excl": total_val_excl,
"tax": 0.0,
"price_incl": highest_cost,
"price_incl": unit_cost,
"total_val": total_val_incl
})
# 处理成品
for stock, base in list_product:
qty = float(stock.stock_quantity or 0)
# 使用该物料的全局最高单价作为成本
highest_cost = get_highest_price(base.id)
# 成品的单价直接取自 manual_cost 字段(单件总成本
unit_cost = float(stock.manual_cost or 0)
total_val_excl = qty * highest_cost
total_val_incl = qty * highest_cost
total_val_excl = qty * unit_cost
total_val_incl = qty * unit_cost
ident = stock.serial_number or stock.barcode or stock.sku
@ -530,10 +525,10 @@ class MaterialBaseService:
"date": stock.production_date,
"qty": qty,
"avail": float(stock.available_quantity or 0),
"price_excl": highest_cost,
"price_excl": unit_cost,
"total_val_excl": total_val_excl,
"tax": 0.0,
"price_incl": highest_cost,
"price_incl": unit_cost,
"total_val": total_val_incl
})