From 16350842f826ffea43285cd3e097acbc2458961a Mon Sep 17 00:00:00 2001 From: dxc Date: Mon, 2 Mar 2026 12:22:45 +0800 Subject: [PATCH] fix: correct cost calculation for semi and product exports Co-authored-by: aider (openai/DeepSeek-V3.2-Thinking) --- .../app/services/inbound/base_service.py | 39 ++++++++----------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/inventory-backend/app/services/inbound/base_service.py b/inventory-backend/app/services/inbound/base_service.py index 6dec304..a96fb42 100644 --- a/inventory-backend/app/services/inbound/base_service.py +++ b/inventory-backend/app/services/inbound/base_service.py @@ -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 }) @@ -709,4 +704,4 @@ class MaterialBaseService: except Exception as e: traceback.print_exc() - raise e \ No newline at end of file + raise e