feat: calculate semi-inbound cost based on BOM code

Co-authored-by: aider (openai/DeepSeek-V3.2-Thinking) <aider@aider.chat>
This commit is contained in:
dxc
2026-03-02 16:47:49 +08:00
parent a5fcbd70f8
commit 71e763bcb6
2 changed files with 40 additions and 11 deletions

View File

@ -156,8 +156,14 @@ class SemiInboundService:
in_qty = float(data.get('in_quantity') or 0)
raw_cost = float(data.get('raw_material_cost') or 0)
# 【重要修改】:把前端的 unit_total_cost单件成本存入原数据库的 manual_cost 字段中
unit_cost = float(data.get('unit_total_cost') or raw_cost)
bom_code = data.get('bom_code')
bom_version = data.get('bom_version')
# 根据是否有BOM决定单价
if bom_code and bom_version:
# 使用BOM成本作为单价
unit_cost = SemiInboundService.calculate_bom_cost(bom_code, bom_version)
else:
unit_cost = raw_cost
total_value = unit_cost * in_qty
next_global_id = 0
@ -304,13 +310,23 @@ class SemiInboundService:
if 'raw_material_cost' in data:
stock.raw_material_cost = float(data['raw_material_cost'])
if 'unit_total_cost' in data:
stock.manual_cost = float(data['unit_total_cost']) # 映射到 manual_cost 物理字段
# 决定单件成本有BOM用BOM成本否则用raw_material_cost
bom_code = data.get('bom_code', stock.bom_code)
bom_version = data.get('bom_version', stock.bom_version)
raw_cost = float(data.get('raw_material_cost', stock.raw_material_cost or 0))
if bom_code and bom_version:
try:
unit_cost = SemiInboundService.calculate_bom_cost(bom_code, bom_version)
except Exception:
unit_cost = raw_cost
else:
unit_cost = raw_cost
stock.manual_cost = unit_cost
if 'unit_total_cost' in data or qty_changed:
qty = float(stock.in_quantity or 1)
# 使用存入 manual_cost 的单价计算总价
stock.total_price = float(stock.manual_cost or 0) * qty
stock.total_price = unit_cost * qty
db.session.commit()
return stock