2026-01-16 17:36:37 +08:00
|
|
|
<?php
|
|
|
|
|
|
2026-01-26 10:37:47 +08:00
|
|
|
namespace App\Modules\Core\Controllers;
|
2026-01-16 17:36:37 +08:00
|
|
|
|
|
|
|
|
use App\Http\Controllers\Controller;
|
2026-01-26 10:37:47 +08:00
|
|
|
|
2026-01-16 17:36:37 +08:00
|
|
|
use Illuminate\Http\Request;
|
|
|
|
|
use Inertia\Inertia;
|
|
|
|
|
use Spatie\Activitylog\Models\Activity;
|
|
|
|
|
|
|
|
|
|
class ActivityLogController extends Controller
|
|
|
|
|
{
|
2026-01-19 17:07:45 +08:00
|
|
|
private function getSubjectMap()
|
|
|
|
|
{
|
|
|
|
|
return [
|
2026-01-26 10:37:47 +08:00
|
|
|
'App\Modules\Core\Models\User' => '使用者',
|
|
|
|
|
'App\Modules\Core\Models\Role' => '角色',
|
|
|
|
|
'App\Modules\Inventory\Models\Product' => '商品',
|
|
|
|
|
'App\Modules\Procurement\Models\Vendor' => '廠商',
|
|
|
|
|
'App\Modules\Inventory\Models\Category' => '商品分類',
|
|
|
|
|
'App\Modules\Inventory\Models\Unit' => '單位',
|
|
|
|
|
'App\Modules\Procurement\Models\PurchaseOrder' => '採購單',
|
|
|
|
|
'App\Modules\Inventory\Models\Warehouse' => '倉庫',
|
|
|
|
|
'App\Modules\Inventory\Models\Inventory' => '庫存',
|
|
|
|
|
'App\Modules\Finance\Models\UtilityFee' => '公共事業費',
|
2026-01-27 17:40:56 +08:00
|
|
|
'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' => '工單品項',
|
2026-02-04 15:12:10 +08:00
|
|
|
'App\Modules\Inventory\Models\InventoryCountDoc' => '庫存盤點單',
|
2026-02-04 16:56:08 +08:00
|
|
|
'App\Modules\Inventory\Models\InventoryAdjustDoc' => '庫存盤調單',
|
2026-02-04 17:51:29 +08:00
|
|
|
'App\Modules\Inventory\Models\InventoryTransferOrder' => '庫存調撥單',
|
2026-01-19 17:07:45 +08:00
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-16 17:36:37 +08:00
|
|
|
public function index(Request $request)
|
|
|
|
|
{
|
2026-01-19 09:30:02 +08:00
|
|
|
$perPage = $request->input('per_page', 10);
|
|
|
|
|
$sortBy = $request->input('sort_by', 'created_at');
|
|
|
|
|
$sortOrder = $request->input('sort_order', 'desc');
|
|
|
|
|
|
2026-01-19 17:07:45 +08:00
|
|
|
$search = $request->input('search');
|
|
|
|
|
$dateStart = $request->input('date_start');
|
|
|
|
|
$dateEnd = $request->input('date_end');
|
|
|
|
|
$event = $request->input('event');
|
|
|
|
|
$subjectType = $request->input('subject_type');
|
|
|
|
|
$causerId = $request->input('causer_id');
|
|
|
|
|
|
2026-01-19 09:30:02 +08:00
|
|
|
$query = Activity::with('causer');
|
|
|
|
|
|
2026-01-19 17:07:45 +08:00
|
|
|
if ($search) {
|
|
|
|
|
$query->where(function ($q) use ($search) {
|
|
|
|
|
$q->where('description', 'like', "%{$search}%")
|
|
|
|
|
->orWhere('log_name', 'like', "%{$search}%")
|
|
|
|
|
->orWhere('properties', 'like', "%{$search}%");
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($dateStart) {
|
|
|
|
|
$query->whereDate('created_at', '>=', $dateStart);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($dateEnd) {
|
|
|
|
|
$query->whereDate('created_at', '<=', $dateEnd);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($event) {
|
|
|
|
|
$query->where('event', $event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($subjectType) {
|
|
|
|
|
$query->where('subject_type', $subjectType);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($causerId) {
|
|
|
|
|
$query->where('causer_id', $causerId);
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-19 09:30:02 +08:00
|
|
|
if ($sortBy === 'created_at') {
|
|
|
|
|
$query->orderBy($sortBy, $sortOrder);
|
|
|
|
|
} else {
|
|
|
|
|
$query->latest();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$activities = $query->paginate($perPage)
|
2026-02-04 17:51:29 +08:00
|
|
|
->withQueryString()
|
2026-01-16 17:36:37 +08:00
|
|
|
->through(function ($activity) {
|
2026-01-19 17:07:45 +08:00
|
|
|
$subjectMap = $this->getSubjectMap();
|
2026-01-16 17:36:37 +08:00
|
|
|
|
|
|
|
|
$eventMap = [
|
|
|
|
|
'created' => '新增',
|
|
|
|
|
'updated' => '更新',
|
|
|
|
|
'deleted' => '刪除',
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
return [
|
|
|
|
|
'id' => $activity->id,
|
|
|
|
|
'description' => $eventMap[$activity->event] ?? $activity->event,
|
|
|
|
|
'subject_type' => $subjectMap[$activity->subject_type] ?? class_basename($activity->subject_type),
|
|
|
|
|
'event' => $activity->event,
|
|
|
|
|
'causer' => $activity->causer ? $activity->causer->name : 'System',
|
|
|
|
|
'created_at' => $activity->created_at->format('Y-m-d H:i:s'),
|
|
|
|
|
'properties' => $activity->properties,
|
|
|
|
|
];
|
|
|
|
|
});
|
|
|
|
|
|
2026-01-26 14:59:24 +08:00
|
|
|
// 準備用於前端篩選的主題類型
|
2026-01-19 17:07:45 +08:00
|
|
|
$subjectTypes = collect($this->getSubjectMap())->map(function ($label, $value) {
|
|
|
|
|
return ['label' => $label, 'value' => $value];
|
|
|
|
|
})->values();
|
|
|
|
|
|
2026-01-26 14:59:24 +08:00
|
|
|
// 取得用於操作者篩選的使用者
|
2026-01-26 10:37:47 +08:00
|
|
|
$users = \App\Modules\Core\Models\User::select('id', 'name')->orderBy('name')->get()
|
2026-01-19 17:07:45 +08:00
|
|
|
->map(function ($user) {
|
|
|
|
|
return ['label' => $user->name, 'value' => (string) $user->id];
|
|
|
|
|
});
|
|
|
|
|
|
2026-01-16 17:36:37 +08:00
|
|
|
return Inertia::render('Admin/ActivityLog/Index', [
|
|
|
|
|
'activities' => $activities,
|
|
|
|
|
'filters' => [
|
|
|
|
|
'per_page' => $request->input('per_page', '10'),
|
2026-01-19 09:30:02 +08:00
|
|
|
'sort_by' => $request->input('sort_by'),
|
|
|
|
|
'sort_order' => $request->input('sort_order'),
|
2026-01-19 17:07:45 +08:00
|
|
|
'search' => $request->input('search'),
|
|
|
|
|
'date_start' => $request->input('date_start'),
|
|
|
|
|
'date_end' => $request->input('date_end'),
|
|
|
|
|
'event' => $request->input('event'),
|
|
|
|
|
'subject_type' => $request->input('subject_type'),
|
|
|
|
|
'causer_id' => $request->input('causer_id'),
|
2026-01-16 17:36:37 +08:00
|
|
|
],
|
2026-01-19 17:07:45 +08:00
|
|
|
'subject_types' => $subjectTypes,
|
|
|
|
|
'users' => $users,
|
2026-01-16 17:36:37 +08:00
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
}
|