feat: API調整訂單與販賣機訂單同步強制使用warehouse_code,更新API對接文件,及優化生產與配方模組UI顯示
All checks were successful
ERP-Deploy-Demo / deploy-demo (push) Successful in 55s

This commit is contained in:
2026-03-03 14:28:15 +08:00
parent 58bd995cd8
commit 183583c739
19 changed files with 486 additions and 89 deletions

View File

@@ -46,14 +46,51 @@ class RecipeController extends Controller
$perPage = $defaultPerPage;
}
$recipes = $query->paginate($perPage)->withQueryString();
$recipes = $query->with('items')->paginate($perPage)->withQueryString();
// Manual Hydration
$productIds = $recipes->pluck('product_id')->unique()->filter()->toArray();
$products = $this->inventoryService->getProductsByIds($productIds)->keyBy('id');
$productIds = collect();
$itemProductIds = collect();
foreach ($recipes as $recipe) {
$productIds->push($recipe->product_id);
if ($recipe->items) {
$itemProductIds = $itemProductIds->merge($recipe->items->pluck('product_id'));
}
}
$allProductIds = array_unique(array_merge(
$productIds->unique()->filter()->toArray(),
$itemProductIds->unique()->filter()->toArray()
));
$products = $this->inventoryService->getProductsByIds($allProductIds)->keyBy('id');
$recipes->getCollection()->transform(function ($recipe) use ($products) {
$recipe->product = $products->get($recipe->product_id);
$totalCost = 0;
if ($recipe->items) {
foreach ($recipe->items as $item) {
$itemProduct = $products->get($item->product_id);
if ($itemProduct) {
$baseCost = $itemProduct->cost_price ?? 0;
$conversionRate = 1;
if ($item->unit_id == $itemProduct->large_unit_id && !is_null($itemProduct->conversion_rate)) {
$conversionRate = $itemProduct->conversion_rate;
} elseif ($item->unit_id == $itemProduct->purchase_unit_id && !is_null($itemProduct->conversion_rate_purchase)) {
$conversionRate = $itemProduct->conversion_rate_purchase;
}
$totalCost += ($item->quantity * $baseCost * $conversionRate);
}
}
}
$recipe->estimated_total_cost = $totalCost;
$recipe->estimated_unit_cost = $recipe->yield_quantity > 0 ? $totalCost / $recipe->yield_quantity : 0;
unset($recipe->items);
return $recipe;
});