From 075b9f1c98b8d032cc6bf1da9f9360553d086b0f Mon Sep 17 00:00:00 2001 From: sky121113 Date: Thu, 5 Feb 2026 15:58:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(product):=20=E6=96=B0=E5=A2=9E=E5=95=86?= =?UTF-8?q?=E5=93=81=E8=A9=B3=E6=83=85=E6=9F=A5=E7=9C=8B=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ProductController.php | 44 ++++ app/Modules/Inventory/Routes/web.php | 1 + .../js/Components/Product/ProductTable.tsx | 22 +- resources/js/Pages/Product/Show.tsx | 204 ++++++++++++++++++ 4 files changed, 260 insertions(+), 11 deletions(-) create mode 100644 resources/js/Pages/Product/Show.tsx diff --git a/app/Modules/Inventory/Controllers/ProductController.php b/app/Modules/Inventory/Controllers/ProductController.php index 4ba8ef5..cbd349b 100644 --- a/app/Modules/Inventory/Controllers/ProductController.php +++ b/app/Modules/Inventory/Controllers/ProductController.php @@ -113,6 +113,50 @@ class ProductController extends Controller ]); } + /** + * 顯示指定的資源。 + */ + public function show(Product $product): Response + { + return Inertia::render('Product/Show', [ + 'product' => (object) [ + 'id' => (string) $product->id, + 'code' => $product->code, + 'barcode' => $product->barcode, + 'name' => $product->name, + 'categoryId' => $product->category_id, + 'category' => $product->category ? (object) [ + 'id' => $product->category->id, + 'name' => $product->category->name, + ] : null, + 'brand' => $product->brand, + 'specification' => $product->specification, + 'baseUnitId' => $product->base_unit_id, + 'baseUnit' => $product->baseUnit ? (object) [ + 'id' => $product->baseUnit->id, + 'name' => $product->baseUnit->name, + ] : null, + 'largeUnitId' => $product->large_unit_id, + 'largeUnit' => $product->largeUnit ? (object) [ + 'id' => $product->largeUnit->id, + 'name' => $product->largeUnit->name, + ] : null, + 'purchaseUnitId' => $product->purchase_unit_id, + 'purchaseUnit' => $product->purchaseUnit ? (object) [ + 'id' => $product->purchaseUnit->id, + 'name' => $product->purchaseUnit->name, + ] : null, + 'conversionRate' => (float) $product->conversion_rate, + 'location' => $product->location, + 'cost_price' => (float) $product->cost_price, + 'price' => (float) $product->price, + 'member_price' => (float) $product->member_price, + 'wholesale_price' => (float) $product->wholesale_price, + 'is_active' => (bool) $product->is_active, + ] + ]); + } + /** * 顯示建立表單。 */ diff --git a/app/Modules/Inventory/Routes/web.php b/app/Modules/Inventory/Routes/web.php index 4e7dbd9..cd13237 100644 --- a/app/Modules/Inventory/Routes/web.php +++ b/app/Modules/Inventory/Routes/web.php @@ -34,6 +34,7 @@ Route::middleware('auth')->group(function () { Route::post('/products/import', [ProductController::class, 'import'])->middleware('permission:products.create')->name('products.import'); Route::get('/products', [ProductController::class, 'index'])->name('products.index'); Route::get('/products/create', [ProductController::class, 'create'])->middleware('permission:products.create')->name('products.create'); + Route::get('/products/{product}', [ProductController::class, 'show'])->name('products.show'); Route::get('/products/{product}/edit', [ProductController::class, 'edit'])->middleware('permission:products.edit')->name('products.edit'); Route::post('/products', [ProductController::class, 'store'])->middleware('permission:products.create')->name('products.store'); Route::put('/products/{product}', [ProductController::class, 'update'])->middleware('permission:products.edit')->name('products.update'); diff --git a/resources/js/Components/Product/ProductTable.tsx b/resources/js/Components/Product/ProductTable.tsx index 808fa78..1e4bc9c 100644 --- a/resources/js/Components/Product/ProductTable.tsx +++ b/resources/js/Components/Product/ProductTable.tsx @@ -8,7 +8,7 @@ import { } from "@/Components/ui/table"; import { Button } from "@/Components/ui/button"; import { Badge } from "@/Components/ui/badge"; -import { Pencil, Trash2, ArrowUpDown, ArrowUp, ArrowDown } from "lucide-react"; +import { Pencil, Trash2, ArrowUpDown, ArrowUp, ArrowDown, Eye } from "lucide-react"; import { Tooltip, TooltipContent, @@ -162,16 +162,16 @@ export default function ProductTable({
- {/* - - */} + + + + + +
+
+

+ + 商品詳細資訊 +

+

查看商品的完整規格、單位換算與價格資產

+
+
+ + + + + +
+
+
+ +
+ {/* 左側:基本資料 */} +
+
+
+ +

基本資料

+
+
+
+ +

{product.name}

+
+
+ +

{product.code}

+
+
+ +

{product.barcode || "-"}

+
+
+ +

{product.brand || "-"}

+
+
+ +
+ {product.category?.name || "未分類"} +
+
+
+ +
+ + {product.is_active ? "啟用中" : "已停用"} + +
+
+
+
+ + {/* 規格與儲位 */} +
+
+ +

規格與儲位

+
+
+
+ +

{product.specification || "-"}

+
+
+ +

{product.location || "-"}

+
+
+
+
+ + {/* 右側:單位與價格 */} +
+ {/* 單位與換算 */} +
+
+ +

單位與換算

+
+
+
+ +

{product.baseUnit?.name || "-"}

+
+ {product.largeUnit && ( + <> +
+ +

{product.largeUnit?.name || "-"}

+
+
+ 1 {product.largeUnit.name} = {product.conversionRate} {product.baseUnit?.name} +
+ + )} +
+ +

{product.purchaseUnit?.name || product.baseUnit?.name || "-"}

+
+
+
+ + {/* 價格資訊 */} + +
+
+ +

價格資產

+
+
+
+ + ${product.cost_price.toLocaleString(undefined, { minimumFractionDigits: 2 })} +
+
+ + ${product.price.toLocaleString(undefined, { minimumFractionDigits: 2 })} +
+
+ + ${product.member_price.toLocaleString(undefined, { minimumFractionDigits: 2 })} +
+
+ + ${product.wholesale_price.toLocaleString(undefined, { minimumFractionDigits: 2 })} +
+
+
+
+
+
+ + + ); +}