更新:優化配方詳情彈窗 UI 與一般修正
This commit is contained in:
@@ -188,4 +188,118 @@ class RecipeController extends Controller
|
||||
$recipe->delete();
|
||||
return redirect()->back()->with('success', '配方已刪除');
|
||||
}
|
||||
|
||||
/**
|
||||
* 獲取配方詳細資料 (API)
|
||||
*/
|
||||
/**
|
||||
* 獲取配方詳細資料 (API)
|
||||
*/
|
||||
public function show(Recipe $recipe)
|
||||
{
|
||||
// Manual Hydration for strict modularity
|
||||
$recipe->product = $this->inventoryService->getProduct($recipe->product_id);
|
||||
|
||||
$items = $recipe->items;
|
||||
$productIds = $items->pluck('product_id')->unique()->toArray();
|
||||
$products = $this->inventoryService->getProductsByIds($productIds)->keyBy('id');
|
||||
$units = $this->inventoryService->getUnits()->keyBy('id');
|
||||
|
||||
foreach ($items as $item) {
|
||||
$item->product = $products->get($item->product_id);
|
||||
$item->unit = $units->get($item->unit_id);
|
||||
}
|
||||
|
||||
return response()->json($recipe);
|
||||
}
|
||||
|
||||
/**
|
||||
* 獲取商品最新有效配方 (API)
|
||||
*/
|
||||
public function getLatestByProduct($productId)
|
||||
{
|
||||
// 放寬條件,只要 product_id 相符就抓最新的
|
||||
$recipe = Recipe::where('product_id', (int)$productId)
|
||||
->orderBy('created_at', 'desc')
|
||||
->first();
|
||||
|
||||
if (!$recipe) {
|
||||
return response()->json(null);
|
||||
}
|
||||
|
||||
// Load items with product info
|
||||
$items = $recipe->items;
|
||||
$productIds = $items->pluck('product_id')->unique()->toArray();
|
||||
$products = $this->inventoryService->getProductsByIds($productIds)->keyBy('id');
|
||||
|
||||
$formattedItems = $items->map(function ($item) use ($products) {
|
||||
$product = $products->get($item->product_id);
|
||||
return [
|
||||
'product_id' => $item->product_id,
|
||||
'product_name' => $product->name ?? '未知商品',
|
||||
'product_code' => $product->code ?? '',
|
||||
'quantity' => $item->quantity,
|
||||
'unit_id' => $item->unit_id,
|
||||
'unit_name' => $product->baseUnit->name ?? '',
|
||||
];
|
||||
});
|
||||
|
||||
return response()->json([
|
||||
'id' => $recipe->id,
|
||||
'name' => $recipe->name,
|
||||
'code' => $recipe->code,
|
||||
'yield_quantity' => $recipe->yield_quantity,
|
||||
'items' => $formattedItems,
|
||||
]);
|
||||
}
|
||||
/**
|
||||
* 獲取商品所有有效配方列表 (API)
|
||||
*/
|
||||
public function getByProduct($productId)
|
||||
{
|
||||
$recipes = Recipe::where('product_id', (int)$productId)
|
||||
->where('is_active', true)
|
||||
->orderBy('created_at', 'desc')
|
||||
->get();
|
||||
|
||||
if ($recipes->isEmpty()) {
|
||||
return response()->json([]);
|
||||
}
|
||||
|
||||
// 預先載入必要的關聯與數據
|
||||
// 為了效能,我們只在列表顯示基本資訊,詳細 Item 資料等選中後再透過 getLatestByProduct (或是重構為 getDetails) 獲取
|
||||
// 不過為了前端方便,若配方不多,直接回傳完整結構也可以。
|
||||
// 這裡選擇回傳完整結構,因為配方通常不會太多
|
||||
|
||||
$recipes->load('items');
|
||||
|
||||
// 收集所有 recipe items 中的 product ids
|
||||
$allProductIds = $recipes->pluck('items')->flatten()->pluck('product_id')->unique()->toArray();
|
||||
$products = $this->inventoryService->getProductsByIds($allProductIds)->keyBy('id');
|
||||
|
||||
$result = $recipes->map(function ($recipe) use ($products) {
|
||||
$formattedItems = $recipe->items->map(function ($item) use ($products) {
|
||||
$product = $products->get($item->product_id);
|
||||
return [
|
||||
'product_id' => $item->product_id,
|
||||
'product_name' => $product->name ?? '未知商品',
|
||||
'product_code' => $product->code ?? '',
|
||||
'quantity' => $item->quantity,
|
||||
'unit_id' => $item->unit_id,
|
||||
'unit_name' => $product->baseUnit->name ?? '',
|
||||
];
|
||||
});
|
||||
|
||||
return [
|
||||
'id' => $recipe->id,
|
||||
'name' => $recipe->name,
|
||||
'code' => $recipe->code,
|
||||
'yield_quantity' => $recipe->yield_quantity,
|
||||
'items' => $formattedItems,
|
||||
'created_at' => $recipe->created_at->toIso8601String(),
|
||||
];
|
||||
});
|
||||
|
||||
return response()->json($result);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user