- 實作 InventoryAnalysisController 與 TurnoverService - 新增庫存分析前端頁面 (Inventory/Analysis/Index.tsx) - 整合路由與選單 - 統一分頁邏輯與狀態顯示 - 更新 UI Consistency Skill 文件
187 lines
15 KiB
PHP
187 lines
15 KiB
PHP
<?php
|
|
|
|
use Illuminate\Support\Facades\Route;
|
|
use App\Modules\Inventory\Controllers\CategoryController;
|
|
use App\Modules\Inventory\Controllers\UnitController;
|
|
use App\Modules\Inventory\Controllers\ProductController;
|
|
use App\Modules\Inventory\Controllers\WarehouseController;
|
|
use App\Modules\Inventory\Controllers\InventoryController;
|
|
use App\Modules\Inventory\Controllers\SafetyStockController;
|
|
use App\Modules\Inventory\Controllers\TransferOrderController;
|
|
use App\Modules\Inventory\Controllers\CountDocController;
|
|
use App\Modules\Inventory\Controllers\AdjustDocController;
|
|
|
|
use App\Modules\Inventory\Controllers\InventoryReportController;
|
|
|
|
use App\Modules\Inventory\Controllers\StockQueryController;
|
|
use App\Modules\Inventory\Controllers\InventoryAnalysisController;
|
|
|
|
Route::middleware('auth')->group(function () {
|
|
|
|
// 即時庫存查詢
|
|
Route::middleware('permission:inventory.view')->group(function () {
|
|
Route::get('/inventory/stock-query', [StockQueryController::class, 'index'])->name('inventory.stock-query.index');
|
|
Route::get('/inventory/stock-query/export', [StockQueryController::class, 'export'])->name('inventory.stock-query.export');
|
|
});
|
|
|
|
// 庫存報表
|
|
Route::middleware('permission:inventory_report.view')->group(function () {
|
|
Route::get('/inventory/report', [InventoryReportController::class, 'index'])->name('inventory.report.index');
|
|
Route::get('/inventory/report/export', [InventoryReportController::class, 'export'])
|
|
->middleware('permission:inventory_report.export')
|
|
->name('inventory.report.export');
|
|
Route::get('/inventory/report/{product}', [InventoryReportController::class, 'show'])->name('inventory.report.show');
|
|
});
|
|
|
|
// 庫存分析 (Inventory Analysis)
|
|
Route::middleware('permission:inventory_report.view')->group(function () {
|
|
Route::get('/inventory/analysis', [InventoryAnalysisController::class, 'index'])->name('inventory.analysis.index');
|
|
});
|
|
|
|
// 類別管理 (用於商品對話框) - 需要商品權限
|
|
Route::middleware('permission:products.view')->group(function () {
|
|
Route::get('/categories', [CategoryController::class, 'index'])->name('categories.index');
|
|
Route::post('/categories', [CategoryController::class, 'store'])->middleware('permission:products.create')->name('categories.store');
|
|
Route::put('/categories/{category}', [CategoryController::class, 'update'])->middleware('permission:products.edit')->name('categories.update');
|
|
Route::delete('/categories/{category}', [CategoryController::class, 'destroy'])->middleware('permission:products.delete')->name('categories.destroy');
|
|
});
|
|
|
|
// 單位管理 - 需要商品權限
|
|
Route::middleware('permission:products.view')->group(function () {
|
|
Route::post('/units', [UnitController::class, 'store'])->middleware('permission:products.create')->name('units.store');
|
|
Route::put('/units/{unit}', [UnitController::class, 'update'])->middleware('permission:products.edit')->name('units.update');
|
|
Route::delete('/units/{unit}', [UnitController::class, 'destroy'])->middleware('permission:products.delete')->name('units.destroy');
|
|
});
|
|
|
|
// 商品管理
|
|
Route::middleware('permission:products.view')->group(function () {
|
|
Route::get('/products/template', [ProductController::class, 'template'])->name('products.template');
|
|
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');
|
|
Route::delete('/products/{product}', [ProductController::class, 'destroy'])->middleware('permission:products.delete')->name('products.destroy');
|
|
});
|
|
|
|
// 倉庫管理
|
|
Route::middleware('permission:warehouses.view')->group(function () {
|
|
Route::get('/warehouses', [WarehouseController::class, 'index'])->name('warehouses.index');
|
|
Route::post('/warehouses', [WarehouseController::class, 'store'])->middleware('permission:warehouses.create')->name('warehouses.store');
|
|
Route::put('/warehouses/{warehouse}', [WarehouseController::class, 'update'])->middleware('permission:warehouses.edit')->name('warehouses.update');
|
|
Route::delete('/warehouses/{warehouse}', [WarehouseController::class, 'destroy'])->middleware('permission:warehouses.delete')->name('warehouses.destroy');
|
|
|
|
// 倉庫庫存管理 - 需要庫存權限
|
|
Route::middleware('permission:inventory.view')->group(function () {
|
|
Route::get('/warehouses/{warehouse}/inventory', [InventoryController::class, 'index'])->name('warehouses.inventory.index');
|
|
Route::get('/warehouses/{warehouse}/inventory-history', [InventoryController::class, 'history'])->name('warehouses.inventory.history');
|
|
|
|
Route::middleware('permission:inventory.adjust')->group(function () {
|
|
Route::get('/warehouses/{warehouse}/inventory/create', [InventoryController::class, 'create'])->name('warehouses.inventory.create');
|
|
Route::post('/warehouses/{warehouse}/inventory', [InventoryController::class, 'store'])->name('warehouses.inventory.store');
|
|
Route::get('/warehouses/inventory/template', [InventoryController::class, 'template'])->name('warehouses.inventory.template');
|
|
Route::post('/warehouses/{warehouse}/inventory/import', [InventoryController::class, 'import'])->name('warehouses.inventory.import');
|
|
Route::get('/warehouses/{warehouse}/inventory/{inventoryId}/edit', [InventoryController::class, 'edit'])->name('warehouses.inventory.edit');
|
|
Route::put('/warehouses/{warehouse}/inventory/{inventoryId}', [InventoryController::class, 'update'])->name('warehouses.inventory.update');
|
|
Route::delete('/warehouses/{warehouse}/inventory/{inventoryId}', [InventoryController::class, 'destroy'])->name('warehouses.inventory.destroy');
|
|
});
|
|
|
|
// API: 取得商品在特定倉庫的所有批號
|
|
Route::get('/api/warehouses/{warehouse}/inventory/batches/{productId}', [InventoryController::class, 'getBatches'])
|
|
->name('api.warehouses.inventory.batches');
|
|
});
|
|
|
|
// 安全庫存設定
|
|
Route::middleware('permission:inventory.view')->group(function () {
|
|
Route::get('/warehouses/{warehouse}/safety-stock', [SafetyStockController::class, 'index'])->name('warehouses.safety-stock.index');
|
|
Route::middleware('permission:inventory.safety_stock')->group(function () {
|
|
Route::post('/warehouses/{warehouse}/safety-stock', [SafetyStockController::class, 'store'])->name('warehouses.safety-stock.store');
|
|
Route::put('/warehouses/{warehouse}/safety-stock/{safetyStock}', [SafetyStockController::class, 'update'])->name('warehouses.safety-stock.update');
|
|
Route::delete('/warehouses/{warehouse}/safety-stock/{safetyStock}', [SafetyStockController::class, 'destroy'])->name('warehouses.safety-stock.destroy');
|
|
});
|
|
});
|
|
});
|
|
|
|
// 庫存盤點 (Stock Counting) - Global
|
|
Route::middleware('permission:inventory_count.view')->group(function () {
|
|
Route::get('/inventory/count-docs', [CountDocController::class, 'index'])->name('inventory.count.index');
|
|
Route::get('/inventory/count-docs/{doc}', [CountDocController::class, 'show'])->name('inventory.count.show');
|
|
Route::get('/inventory/count-docs/{doc}/print', [CountDocController::class, 'print'])->name('inventory.count.print');
|
|
});
|
|
Route::post('/inventory/count-docs', [CountDocController::class, 'store'])->middleware('permission:inventory_count.create')->name('inventory.count.store');
|
|
Route::put('/inventory/count-docs/{doc}', [CountDocController::class, 'update'])->middleware('permission:inventory_count.edit')->name('inventory.count.update');
|
|
Route::delete('/inventory/count-docs/{doc}', [CountDocController::class, 'destroy'])->middleware('permission:inventory_count.delete')->name('inventory.count.destroy');
|
|
Route::put('/inventory/count-docs/{doc}/reopen', [CountDocController::class, 'reopen'])->middleware('permission:inventory_count.edit')->name('inventory.count.reopen');
|
|
|
|
// 庫存盤調 (Stock Adjustment) - Global
|
|
Route::middleware('permission:inventory_adjust.view')->group(function () {
|
|
Route::get('/inventory/adjust-docs', [AdjustDocController::class, 'index'])->name('inventory.adjust.index');
|
|
Route::get('/inventory/adjust-docs/get-pending-counts', [AdjustDocController::class, 'getPendingCounts'])->name('inventory.adjust.pending-counts');
|
|
Route::get('/inventory/adjust-docs/{doc}', [AdjustDocController::class, 'show'])->name('inventory.adjust.show');
|
|
});
|
|
Route::post('/inventory/adjust-docs', [AdjustDocController::class, 'store'])->middleware('permission:inventory_adjust.create')->name('inventory.adjust.store');
|
|
Route::put('/inventory/adjust-docs/{doc}', [AdjustDocController::class, 'update'])->middleware('permission:inventory_adjust.edit')->name('inventory.adjust.update');
|
|
Route::delete('/inventory/adjust-docs/{doc}', [AdjustDocController::class, 'destroy'])->middleware('permission:inventory_adjust.delete')->name('inventory.adjust.destroy');
|
|
|
|
// 撥補單/調撥單 (Transfer Order) - Global
|
|
Route::middleware('permission:inventory_transfer.view')->group(function () {
|
|
Route::get('/inventory/transfer-orders', [TransferOrderController::class, 'index'])->name('inventory.transfer.index');
|
|
Route::get('/inventory/transfer-orders/{order}', [TransferOrderController::class, 'show'])->name('inventory.transfer.show');
|
|
});
|
|
Route::post('/inventory/transfer-orders', [TransferOrderController::class, 'store'])->middleware('permission:inventory_transfer.create')->name('inventory.transfer.store');
|
|
Route::put('/inventory/transfer-orders/{order}', [TransferOrderController::class, 'update'])->middleware('permission:inventory_transfer.edit')->name('inventory.transfer.update');
|
|
Route::delete('/inventory/transfer-orders/{order}', [TransferOrderController::class, 'destroy'])->middleware('permission:inventory_transfer.delete')->name('inventory.transfer.destroy');
|
|
Route::get('/api/warehouses/{warehouse}/inventories', [TransferOrderController::class, 'getWarehouseInventories'])
|
|
->middleware('permission:inventory.view')
|
|
->name('api.warehouses.inventories');
|
|
|
|
// 調撥單匯入明細
|
|
Route::post('/inventory/transfer-orders/{order}/import', [TransferOrderController::class, 'importItems'])
|
|
->middleware('permission:inventory_transfer.edit')
|
|
->name('inventory.transfer.import-items');
|
|
|
|
// 下載調撥單匯入範本
|
|
Route::get('/inventory/transfer-orders/template/download', [TransferOrderController::class, 'template'])
|
|
->middleware('permission:inventory_transfer.view')
|
|
->name('inventory.transfer.template');
|
|
|
|
// 門市叫貨申請 (Store Requisitions)
|
|
Route::middleware('permission:store_requisitions.view')->group(function () {
|
|
Route::get('/store-requisitions', [\App\Modules\Inventory\Controllers\StoreRequisitionController::class, 'index'])->name('store-requisitions.index');
|
|
|
|
Route::middleware('permission:store_requisitions.create')->group(function () {
|
|
Route::get('/store-requisitions/create', [\App\Modules\Inventory\Controllers\StoreRequisitionController::class, 'create'])->name('store-requisitions.create');
|
|
Route::post('/store-requisitions', [\App\Modules\Inventory\Controllers\StoreRequisitionController::class, 'store'])->name('store-requisitions.store');
|
|
});
|
|
|
|
Route::get('/store-requisitions/{id}', [\App\Modules\Inventory\Controllers\StoreRequisitionController::class, 'show'])->name('store-requisitions.show');
|
|
|
|
Route::middleware('permission:store_requisitions.edit')->group(function () {
|
|
Route::get('/store-requisitions/{id}/edit', [\App\Modules\Inventory\Controllers\StoreRequisitionController::class, 'edit'])->name('store-requisitions.edit');
|
|
Route::put('/store-requisitions/{id}', [\App\Modules\Inventory\Controllers\StoreRequisitionController::class, 'update'])->name('store-requisitions.update');
|
|
});
|
|
|
|
Route::post('/store-requisitions/{id}/submit', [\App\Modules\Inventory\Controllers\StoreRequisitionController::class, 'submit'])->name('store-requisitions.submit');
|
|
|
|
Route::middleware('permission:store_requisitions.approve')->group(function () {
|
|
Route::post('/store-requisitions/{id}/approve', [\App\Modules\Inventory\Controllers\StoreRequisitionController::class, 'approve'])->name('store-requisitions.approve');
|
|
Route::post('/store-requisitions/{id}/reject', [\App\Modules\Inventory\Controllers\StoreRequisitionController::class, 'reject'])->name('store-requisitions.reject');
|
|
});
|
|
|
|
Route::delete('/store-requisitions/{id}', [\App\Modules\Inventory\Controllers\StoreRequisitionController::class, 'destroy'])->middleware('permission:store_requisitions.delete')->name('store-requisitions.destroy');
|
|
});
|
|
|
|
// 進貨單 (Goods Receipts)
|
|
Route::middleware('permission:goods_receipts.view')->group(function () {
|
|
Route::get('/goods-receipts', [\App\Modules\Inventory\Controllers\GoodsReceiptController::class, 'index'])->name('goods-receipts.index');
|
|
Route::get('/goods-receipts/create', [\App\Modules\Inventory\Controllers\GoodsReceiptController::class, 'create'])->middleware('permission:goods_receipts.create')->name('goods-receipts.create');
|
|
Route::get('/goods-receipts/{goods_receipt}', [\App\Modules\Inventory\Controllers\GoodsReceiptController::class, 'show'])->name('goods-receipts.show');
|
|
Route::post('/goods-receipts', [\App\Modules\Inventory\Controllers\GoodsReceiptController::class, 'store'])->middleware('permission:goods_receipts.create')->name('goods-receipts.store');
|
|
Route::get('/api/goods-receipts/search-pos', [\App\Modules\Inventory\Controllers\GoodsReceiptController::class, 'searchPOs'])->name('goods-receipts.search-pos');
|
|
Route::get('/api/goods-receipts/search-products', [\App\Modules\Inventory\Controllers\GoodsReceiptController::class, 'searchProducts'])->name('goods-receipts.search-products');
|
|
Route::get('/api/goods-receipts/search-vendors', [\App\Modules\Inventory\Controllers\GoodsReceiptController::class, 'searchVendors'])->name('goods-receipts.search-vendors');
|
|
});
|
|
});
|