From 4c959efc8b9f791043db9e52eaf03a09e3f51db4 Mon Sep 17 00:00:00 2001
From: sky121113
Date: Tue, 27 Jan 2026 17:40:56 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E8=A3=9C=E9=BD=8A=E7=94=9F=E7=94=A2?=
=?UTF-8?q?=E7=AE=A1=E7=90=86=E8=88=87=E9=80=B2=E8=B2=A8=E5=96=AE=E6=AC=8A?=
=?UTF-8?q?=E9=99=90=E3=80=81=E5=8A=9F=E8=83=BD=E5=AF=A6=E4=BD=9C=E5=8F=8A?=
=?UTF-8?q?=20UI=20=E5=84=AA=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Controllers/ActivityLogController.php | 5 ++++
.../Core/Controllers/RoleController.php | 4 +++
.../Controllers/GoodsReceiptController.php | 17 ++++++++++++
database/seeders/PermissionSeeder.php | 26 ++++++++++++++++---
.../ActivityLog/ActivityDetailDialog.tsx | 20 +++++++++++++-
resources/js/Pages/Admin/Role/Create.tsx | 5 +++-
resources/js/Pages/Admin/Role/Edit.tsx | 5 +++-
resources/js/Pages/Production/Index.tsx | 19 ++++++++++++--
.../js/Pages/Production/Recipe/Index.tsx | 14 +++++-----
9 files changed, 100 insertions(+), 15 deletions(-)
diff --git a/app/Modules/Core/Controllers/ActivityLogController.php b/app/Modules/Core/Controllers/ActivityLogController.php
index 7358403..ac5ec6f 100644
--- a/app/Modules/Core/Controllers/ActivityLogController.php
+++ b/app/Modules/Core/Controllers/ActivityLogController.php
@@ -23,6 +23,11 @@ class ActivityLogController extends Controller
'App\Modules\Inventory\Models\Warehouse' => '倉庫',
'App\Modules\Inventory\Models\Inventory' => '庫存',
'App\Modules\Finance\Models\UtilityFee' => '公共事業費',
+ 'App\Modules\Inventory\Models\GoodsReceipt' => '進貨單',
+ 'App\Modules\Production\Models\ProductionOrder' => '生產工單',
+ 'App\Modules\Production\Models\Recipe' => '生產配方',
+ 'App\Modules\Production\Models\RecipeItem' => '配方品項',
+ 'App\Modules\Production\Models\ProductionOrderItem' => '工單品項',
];
}
diff --git a/app/Modules/Core/Controllers/RoleController.php b/app/Modules/Core/Controllers/RoleController.php
index 4942d0e..f54d214 100644
--- a/app/Modules/Core/Controllers/RoleController.php
+++ b/app/Modules/Core/Controllers/RoleController.php
@@ -178,8 +178,12 @@ class RoleController extends Controller
'inventory' => '庫存管理',
'vendors' => '廠商資料管理',
'purchase_orders' => '採購單管理',
+ 'goods_receipts' => '進貨單管理',
+ 'production_orders' => '生產工單管理',
+ 'recipes' => '配方管理',
'users' => '使用者管理',
'roles' => '角色與權限',
+ 'system' => '系統管理',
'utility_fees' => '公共事業費管理',
'accounting' => '會計報表',
];
diff --git a/app/Modules/Inventory/Controllers/GoodsReceiptController.php b/app/Modules/Inventory/Controllers/GoodsReceiptController.php
index 40d14c4..3e221b9 100644
--- a/app/Modules/Inventory/Controllers/GoodsReceiptController.php
+++ b/app/Modules/Inventory/Controllers/GoodsReceiptController.php
@@ -228,4 +228,21 @@ class GoodsReceiptController extends Controller
return response()->json($vendors);
}
+
+ /**
+ * 刪除進貨單
+ */
+ public function destroy(GoodsReceipt $goodsReceipt)
+ {
+ // 只有有權限的人可以刪除
+ if (!auth()->user()->can('goods_receipts.delete')) {
+ return redirect()->back()->with('error', '您沒有權限刪除進貨單');
+ }
+
+ // 簡單刪除邏輯:刪除進貨單(品項由資料庫級聯刪除或手動處理)
+ // 注意:實務上可能需要處理已入庫的庫存回滾,但在這個簡易 ERP 中通常是行政刪除
+ $goodsReceipt->delete();
+
+ return redirect()->route('goods-receipts.index')->with('success', '進貨單已刪除');
+ }
}
diff --git a/database/seeders/PermissionSeeder.php b/database/seeders/PermissionSeeder.php
index c3ea1b8..d07794a 100644
--- a/database/seeders/PermissionSeeder.php
+++ b/database/seeders/PermissionSeeder.php
@@ -37,10 +37,25 @@ class PermissionSeeder extends Seeder
'inventory.view_cost', // 查看成本與價值
'inventory.adjust',
'inventory.transfer',
+ 'inventory.delete',
// 進貨單管理
'goods_receipts.view',
'goods_receipts.create',
+ 'goods_receipts.edit',
+ 'goods_receipts.delete',
+
+ // 生產工單管理
+ 'production_orders.view',
+ 'production_orders.create',
+ 'production_orders.edit',
+ 'production_orders.delete',
+
+ // 配方管理
+ 'recipes.view',
+ 'recipes.create',
+ 'recipes.edit',
+ 'recipes.delete',
// 供應商管理
'vendors.view',
@@ -101,8 +116,10 @@ class PermissionSeeder extends Seeder
'products.view', 'products.create', 'products.edit', 'products.delete',
'purchase_orders.view', 'purchase_orders.create', 'purchase_orders.edit',
'purchase_orders.delete', 'purchase_orders.publish',
- 'inventory.view', 'inventory.view_cost', 'inventory.adjust', 'inventory.transfer',
- 'goods_receipts.view', 'goods_receipts.create',
+ 'inventory.view', 'inventory.view_cost', 'inventory.adjust', 'inventory.transfer', 'inventory.delete',
+ 'goods_receipts.view', 'goods_receipts.create', 'goods_receipts.edit', 'goods_receipts.delete',
+ 'production_orders.view', 'production_orders.create', 'production_orders.edit', 'production_orders.delete',
+ 'recipes.view', 'recipes.create', 'recipes.edit', 'recipes.delete',
'vendors.view', 'vendors.create', 'vendors.edit', 'vendors.delete',
'warehouses.view', 'warehouses.create', 'warehouses.edit', 'warehouses.delete',
'users.view', 'users.create', 'users.edit',
@@ -115,8 +132,9 @@ class PermissionSeeder extends Seeder
// warehouse-manager 管理庫存與倉庫
$warehouseManager->givePermissionTo([
'products.view',
- 'inventory.view', 'inventory.adjust', 'inventory.transfer',
- 'goods_receipts.view', 'goods_receipts.create',
+ 'inventory.view', 'inventory.adjust', 'inventory.transfer', 'inventory.delete',
+ 'goods_receipts.view', 'goods_receipts.create', 'goods_receipts.edit', 'goods_receipts.delete',
+ 'production_orders.view', 'production_orders.create', 'production_orders.edit',
'warehouses.view', 'warehouses.create', 'warehouses.edit',
]);
diff --git a/resources/js/Components/ActivityLog/ActivityDetailDialog.tsx b/resources/js/Components/ActivityLog/ActivityDetailDialog.tsx
index fba4884..6d7fca2 100644
--- a/resources/js/Components/ActivityLog/ActivityDetailDialog.tsx
+++ b/resources/js/Components/ActivityLog/ActivityDetailDialog.tsx
@@ -114,10 +114,24 @@ const fieldLabels: Record = {
transaction_date: '費用日期',
category: '費用類別',
amount: '金額',
+ // 進貨單欄位
+ gr_number: '進貨單號',
+ received_date: '入庫日期',
+ type: '入庫類型',
+ remarks: '備註',
+ // 生產管理欄位
+ production_number: '工單編號',
+ production_date: '生產日期',
+ actual_quantity: '實際產量',
+ consumption_status: '物料消耗狀態',
+ recipe_id: '生產配方',
+ recipe_name: '配方名稱',
+ yield_quantity: '預期產量',
};
-// 採購單狀態對照表
+// 狀態翻譯對照表
const statusMap: Record = {
+ // 採購單狀態
draft: '草稿',
pending: '待審核',
approved: '已核准',
@@ -125,6 +139,10 @@ const statusMap: Record = {
received: '已收貨',
cancelled: '已取消',
completed: '已完成',
+ // 生產工單狀態
+ planned: '已計畫',
+ in_progress: '生產中',
+ // completed 已定義
};
// 庫存品質狀態對照表
diff --git a/resources/js/Pages/Admin/Role/Create.tsx b/resources/js/Pages/Admin/Role/Create.tsx
index 76088d5..34f86ca 100644
--- a/resources/js/Pages/Admin/Role/Create.tsx
+++ b/resources/js/Pages/Admin/Role/Create.tsx
@@ -71,10 +71,13 @@ export default function RoleCreate({ groupedPermissions }: Props) {
'edit': '編輯',
'delete': '刪除',
'publish': '發布',
- 'adjust': '新增 / 調整',
+ 'adjust': '調整',
'transfer': '調撥',
'safety_stock': '安全庫存設定',
'export': '匯出',
+ 'complete': '完成',
+ 'view_cost': '檢視成本',
+ 'view_logs': '檢視日誌',
};
return map[action] || action;
diff --git a/resources/js/Pages/Admin/Role/Edit.tsx b/resources/js/Pages/Admin/Role/Edit.tsx
index 3f10b72..649e216 100644
--- a/resources/js/Pages/Admin/Role/Edit.tsx
+++ b/resources/js/Pages/Admin/Role/Edit.tsx
@@ -78,10 +78,13 @@ export default function RoleEdit({ role, groupedPermissions, currentPermissions
'edit': '編輯',
'delete': '刪除',
'publish': '發布',
- 'adjust': '新增 / 調整',
+ 'adjust': '調整',
'transfer': '調撥',
'safety_stock': '安全庫存設定',
'export': '匯出',
+ 'complete': '完成',
+ 'view_cost': '檢視成本',
+ 'view_logs': '檢視日誌',
};
return map[action] || action;
diff --git a/resources/js/Pages/Production/Index.tsx b/resources/js/Pages/Production/Index.tsx
index 5e8c869..3ef377e 100644
--- a/resources/js/Pages/Production/Index.tsx
+++ b/resources/js/Pages/Production/Index.tsx
@@ -3,7 +3,7 @@
*/
import { useState, useEffect } from "react";
-import { Plus, Factory, Search, RotateCcw, Eye, Pencil } from 'lucide-react';
+import { Plus, Factory, Search, RotateCcw, Eye, Pencil, Trash2 } from 'lucide-react';
import { Button } from "@/Components/ui/button";
import AuthenticatedLayout from "@/Layouts/AuthenticatedLayout";
import { Head, router, Link } from "@inertiajs/react";
@@ -266,6 +266,21 @@ export default function ProductionIndex({ productionOrders, filters }: Props) {
+
+
+
@@ -298,6 +313,6 @@ export default function ProductionIndex({ productionOrders, filters }: Props) {
-
+
);
}
diff --git a/resources/js/Pages/Production/Recipe/Index.tsx b/resources/js/Pages/Production/Recipe/Index.tsx
index e5c27dd..b584ba0 100644
--- a/resources/js/Pages/Production/Recipe/Index.tsx
+++ b/resources/js/Pages/Production/Recipe/Index.tsx
@@ -110,12 +110,14 @@ export default function RecipeIndex({ recipes, filters }: Props) {
-
-
-
+
+
+
+
+