diff --git a/.agents/rules/rbac-rules.md b/.agents/rules/rbac-rules.md index 2d4b140..229e5ed 100644 --- a/.agents/rules/rbac-rules.md +++ b/.agents/rules/rbac-rules.md @@ -79,3 +79,13 @@ trigger: always_on ### 5.2 角色權限維護 - 初始建立後,該租戶的「管理員」角色即成為獨立資源,可由具有權限的帳號進行細部調整。 + +### 5.3 機台授權原則 (Machine Authorization) [CRITICAL] +- **以帳號為準**:機台授權是基於「帳號 (User)」而非「角色 (Role)」。 +- **授權層級**: + 1. **系統管理員 (isSystemAdmin = true)**:具備全系統所有機台之完整權限。 + 2. **租戶/公司帳號 (含管理員)**:僅能存取由「系統管理員」明確授權給該帳號的機台(透過 `machine_user` 關聯)。 + 3. **子帳號**:僅能存取由其「公司管理員」所授權的機台子集。 +- **實作要求**: + - `Machine` Model 的全域過濾器**不得**對「管理員 (Tenant Admin)」角色進行例外排除。 + - 所有的機台存取必須嚴格比對 `machine_user` 表,除非操作者為「系統管理員 (Super Admin)」。 diff --git a/app/Http/Controllers/Admin/MachineController.php b/app/Http/Controllers/Admin/MachineController.php index a1e0e6a..c28aa75 100644 --- a/app/Http/Controllers/Admin/MachineController.php +++ b/app/Http/Controllers/Admin/MachineController.php @@ -9,11 +9,13 @@ use Illuminate\View\View; class MachineController extends AdminController { /** - * 顯示所有機台列表 + * 顯示所有機台列表或效期管理 */ public function index(Request $request): View { - $per_page = $request->input('per_page', 10); + $tab = $request->input('tab', 'list'); + $per_page = $tab === 'list' ? $request->input('per_page', 10) : $request->input('per_page', 12); + $query = Machine::query(); // 搜尋:名稱或序號 @@ -24,14 +26,33 @@ class MachineController extends AdminController }); } - $machines = $query->when($request->status, function ($query, $status) { - return $query->where('status', $status); - }) - ->latest() - ->paginate($per_page) - ->withQueryString(); + if ($tab === 'list') { + $machines = $query->when($request->status, function ($query, $status) { + return $query->where('status', $status); + }) + ->latest() + ->paginate($per_page) + ->withQueryString(); - return view('admin.machines.index', compact('machines')); + return view('admin.machines.index', compact('machines', 'tab')); + } else { + // 效期管理模式:獲取機台及其貨道統計 + $machines = $query->withCount(['slots as total_slots']) + ->withCount(['slots as expired_count' => function ($q) { + $q->where('expiry_date', '<', now()->toDateString()); + }]) + ->withCount(['slots as pending_count' => function ($q) { + $q->whereNull('expiry_date'); + }]) + ->withCount(['slots as warning_count' => function ($q) { + $q->whereBetween('expiry_date', [now()->toDateString(), now()->addDays(7)->toDateString()]); + }]) + ->latest() + ->paginate($per_page) + ->withQueryString(); + + return view('admin.machines.index', compact('machines', 'tab')); + } } /** @@ -46,25 +67,38 @@ class MachineController extends AdminController return view('admin.machines.show', compact('machine')); } + /** - * 顯示所有機台日誌列表 + * AJAX: 取得機台抽屜面板所需的歷程日誌 */ - public function logs(Request $request): View + public function logsAjax(Request $request, Machine $machine) { - $per_page = $request->input('per_page', 10); - $logs = \App\Models\Machine\MachineLog::with('machine') + $per_page = $request->input('per_page', 20); + + $startDate = $request->get('start_date', now()->format('Y-m-d')); + $endDate = $request->get('end_date', now()->format('Y-m-d')); + + $logs = $machine->logs() ->when($request->level, function ($query, $level) { return $query->where('level', $level); }) - ->when($request->machine_id, function ($query, $machineId) { - return $query->where('machine_id', $machineId); + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $endDate) + ->when($request->type, function ($query, $type) { + return $query->where('type', $type); }) ->latest() - ->paginate($per_page)->withQueryString(); + ->paginate($per_page); - $machines = Machine::select('id', 'name')->get(); - - return view('admin.machines.logs', compact('logs', 'machines')); + return response()->json([ + 'success' => true, + 'data' => $logs->items(), + 'pagination' => [ + 'total' => $logs->total(), + 'current_page' => $logs->currentPage(), + 'last_page' => $logs->lastPage(), + ] + ]); } @@ -132,19 +166,77 @@ class MachineController extends AdminController } /** - * 機台使用率統計 (開發中) + * 機台使用率統計 */ public function utilization(Request $request): View { - return view('admin.machines.index', ['machines' => Machine::paginate(1)]); // Placeholder + // 取得當前使用者有權限的所有機台 (已透過 Global Scope 過濾) + $machines = Machine::all(); + + return view('admin.machines.utilization', [ + 'machines' => $machines + ]); } /** - * 機台到期管理 (開發中) + * AJAX: 取得機台所有貨道資訊 (供效期管理視覺化圖表使用) */ - public function expiry(Request $request): View + public function slotsAjax(Machine $machine) { - return view('admin.machines.index', ['machines' => Machine::paginate(1)]); // Placeholder + $slots = $machine->slots()->with('product:id,name,image')->orderByRaw('CAST(slot_no AS UNSIGNED) ASC')->get(); + + return response()->json([ + 'success' => true, + 'machine' => $machine->only(['id', 'name', 'serial_no']), + 'slots' => $slots + ]); + } + + /** + * AJAX: 更新貨道效期 + */ + public function updateSlotExpiry(Request $request, Machine $machine) + { + $request->validate([ + 'slot_no' => 'required|integer', + 'expiry_date' => 'nullable|date', + 'apply_all_same_product' => 'boolean' + ]); + + $slotNo = $request->slot_no; + $expiryDate = $request->expiry_date; + $applyAll = $request->apply_all_same_product ?? false; + + $slot = $machine->slots()->where('slot_no', $slotNo)->firstOrFail(); + $slot->update(['expiry_date' => $expiryDate]); + + if ($applyAll && $slot->product_id) { + $machine->slots() + ->where('product_id', $slot->product_id) + ->update(['expiry_date' => $expiryDate]); + } + + return response()->json([ + 'success' => true, + 'message' => __('Expiry updated successfully.') + ]); + } + + /** + * 取得機台統計數據 (AJAX) + */ + public function utilizationData(int $id, Request $request) + { + $machine = Machine::findOrFail($id); + $date = $request->get('date', now()->toDateString()); + + $service = app(\App\Services\Machine\MachineService::class); + $stats = $service->getUtilizationStats($machine, $date); + + return response()->json([ + 'success' => true, + 'data' => $stats + ]); } /** diff --git a/app/Http/Controllers/Api/V1/App/MachineController.php b/app/Http/Controllers/Api/V1/App/MachineController.php index cdb1810..b231310 100644 --- a/app/Http/Controllers/Api/V1/App/MachineController.php +++ b/app/Http/Controllers/Api/V1/App/MachineController.php @@ -31,6 +31,25 @@ class MachineController extends Controller ], 202); // 202 Accepted } + /** + * B018: Record Machine Restock/Setup Report (Asynchronous) + */ + public function recordRestock(Request $request) + { + $machine = $request->get('machine'); + $data = $request->all(); + $data['serial_no'] = $machine->serial_no; + + \App\Jobs\Machine\ProcessRestockReport::dispatch($data); + + return response()->json([ + 'success' => true, + 'code' => 200, + 'message' => 'Restock report accepted', + 'status' => '49' + ], 202); + } + /** * B017: Get Slot Info & Stock (Synchronous) */ diff --git a/app/Jobs/Machine/ProcessRestockReport.php b/app/Jobs/Machine/ProcessRestockReport.php new file mode 100644 index 0000000..4dee93c --- /dev/null +++ b/app/Jobs/Machine/ProcessRestockReport.php @@ -0,0 +1,37 @@ +data = $data; + } + + /** + * Execute the job. + */ + public function handle(\App\Services\Machine\MachineService $machineService): void + { + $serialNo = $this->data['serial_no'] ?? null; + $slotsData = $this->data['slots'] ?? []; + + if (!$serialNo) return; + + $machine = \App\Models\Machine\Machine::where('serial_no', $serialNo)->first(); + if ($machine) { + $machineService->syncSlots($machine, $slotsData); + } + } +} diff --git a/app/Models/Machine/Machine.php b/app/Models/Machine/Machine.php index d121f69..da15586 100644 --- a/app/Models/Machine/Machine.php +++ b/app/Models/Machine/Machine.php @@ -17,8 +17,8 @@ class Machine extends Model // 權限隔離:一般帳號登入時只能看到自己被分配的機台 static::addGlobalScope('machine_access', function (\Illuminate\Database\Eloquent\Builder $builder) { $user = auth()->user(); - // 如果是在 Console、或是系統管理員、或是租戶的「管理員」角色,則不限制 (可看該公司所有機台) - if (app()->runningInConsole() || !$user || $user->isSystemAdmin() || $user->hasRole('管理員') || $user->hasRole('super-admin')) { + // 如果是在 Console、或是系統管理員,則不限制 (可看所有機台) + if (app()->runningInConsole() || !$user || $user->isSystemAdmin()) { return; } @@ -101,6 +101,11 @@ class Machine extends Model return $this->hasMany(MachineLog::class); } + public function slots() + { + return $this->hasMany(MachineSlot::class); + } + public function machineModel() { return $this->belongsTo(MachineModel::class); @@ -121,6 +126,38 @@ class Machine extends Model return $this->belongsTo(\App\Models\System\User::class, 'updater_id'); } + public const PAGE_STATUSES = [ + '0' => 'Offline', + '1' => 'Home Page', + '2' => 'Vending Page', + '3' => 'Admin Page', + '4' => 'Replenishment Page', + '5' => 'Tutorial Page', + '60' => 'Purchasing', + '61' => 'Locked Page', + '62' => 'Dispense Failed', + '301' => 'Slot Test', + '302' => 'Slot Test', + '401' => 'Payment Selection', + '402' => 'Waiting for Payment', + '403' => 'Dispensing', + '404' => 'Receipt Printing', + '601' => 'Pass Code', + '602' => 'Pickup Code', + '603' => 'Message Display', + '604' => 'Cancel Purchase', + '605' => 'Purchase Finished', + '611' => 'Welcome Gift Status', + '612' => 'Dispense Failed', + ]; + + public function getCurrentPageLabelAttribute(): string + { + $code = (string) $this->current_page; + $label = self::PAGE_STATUSES[$code] ?? $code; + return __($label); + } + public function users() { return $this->belongsToMany(\App\Models\System\User::class); diff --git a/app/Models/Machine/MachineLog.php b/app/Models/Machine/MachineLog.php index 9ad5109..6c11beb 100644 --- a/app/Models/Machine/MachineLog.php +++ b/app/Models/Machine/MachineLog.php @@ -12,8 +12,10 @@ class MachineLog extends Model const UPDATED_AT = null; protected $fillable = [ + 'company_id', 'machine_id', 'level', + 'type', 'message', 'context', ]; diff --git a/app/Models/Machine/MachineSlot.php b/app/Models/Machine/MachineSlot.php index aaf419a..ecf326b 100644 --- a/app/Models/Machine/MachineSlot.php +++ b/app/Models/Machine/MachineSlot.php @@ -14,17 +14,17 @@ class MachineSlot extends Model 'machine_id', 'product_id', 'slot_no', - 'slot_name', - 'capacity', + 'max_stock', 'stock', - 'price', - 'status', - 'last_restocked_at', + 'expiry_date', + 'batch_no', + 'is_active', ]; protected $casts = [ 'price' => 'decimal:2', 'last_restocked_at' => 'datetime', + 'expiry_date' => 'date:Y-m-d', ]; public function machine() diff --git a/app/Services/Machine/MachineService.php b/app/Services/Machine/MachineService.php index ad0b93e..dd41ecd 100644 --- a/app/Services/Machine/MachineService.php +++ b/app/Services/Machine/MachineService.php @@ -21,12 +21,20 @@ class MachineService return DB::transaction(function () use ($serialNo, $data) { $machine = Machine::where('serial_no', $serialNo)->firstOrFail(); + // 參數相容性處理 (Mapping legacy fields to new fields) + $temperature = $data['temperature'] ?? $machine->temperature; + $currentPage = $data['current_page'] ?? $data['M_Stus2'] ?? $machine->current_page; + $doorStatus = $data['door_status'] ?? $data['door'] ?? $machine->door_status; + $firmwareVersion = $data['firmware_version'] ?? $data['M_Ver'] ?? $machine->firmware_version; + $model = $data['model'] ?? $data['M_Stus'] ?? $machine->model; + $updateData = [ 'status' => 'online', - 'temperature' => $data['temperature'] ?? $machine->temperature, - 'current_page' => $data['current_page'] ?? $machine->current_page, - 'door_status' => $data['door_status'] ?? $machine->door_status, - 'firmware_version' => $data['firmware_version'] ?? $machine->firmware_version, + 'temperature' => $temperature, + 'current_page' => $currentPage, + 'door_status' => $doorStatus, + 'firmware_version' => $firmwareVersion, + 'model' => $model, 'last_heartbeat_at' => now(), ]; @@ -35,9 +43,11 @@ class MachineService // Record log if provided if (!empty($data['log'])) { $machine->logs()->create([ + 'company_id' => $machine->company_id, + 'type' => 'status', 'level' => $data['log_level'] ?? 'info', 'message' => $data['log'], - 'payload' => $data['log_payload'] ?? null, + 'context' => $data['log_payload'] ?? null, ]); } @@ -46,17 +56,43 @@ class MachineService } /** - * Update machine slot stock. + * Sync machine slots based on replenishment report. + * + * @param Machine $machine + * @param array $slotsData */ - public function updateSlotStock(Machine $machine, int $slotNo, int $stock): void + public function syncSlots(Machine $machine, array $slotsData): void { - $machine->slots()->where('slot_no', $slotNo)->update([ - 'stock' => $stock, - 'last_restocked_at' => now(), - ]); + DB::transaction(function () use ($machine, $slotsData) { + foreach ($slotsData as $slotData) { + $slotNo = $slotData['slot_no'] ?? null; + if (!$slotNo) continue; + + $existingSlot = $machine->slots()->where('slot_no', $slotNo)->first(); + + $updateData = [ + 'product_id' => $slotData['product_id'] ?? null, + 'stock' => $slotData['stock'] ?? 0, + 'capacity' => $slotData['capacity'] ?? ($existingSlot->capacity ?? 10), + 'price' => $slotData['price'] ?? ($existingSlot->price ?? 0), + 'last_restocked_at' => now(), + ]; + + // 如果商品變了,或者這是一次明確的補貨回報,清空效期等待管理員更新 + // 這裡我們暫定只要有 report 進來,就需要重新確認效期 + $updateData['expiry_date'] = null; + + if ($existingSlot) { + $existingSlot->update($updateData); + } else { + $machine->slots()->create(array_merge($updateData, ['slot_no' => $slotNo])); + } + } + }); } /** + * Update machine slot stock (single slot). * Legacy support for recordLog (Existing code). */ public function recordLog(int $machineId, array $data): MachineLog @@ -66,7 +102,129 @@ class MachineService return $machine->logs()->create([ 'level' => $data['level'] ?? 'info', 'message' => $data['message'], - 'payload' => $data['context'] ?? null, + 'context' => $data['context'] ?? null, ]); } + + /** + * Get machine utilization and OEE statistics. + */ + public function getUtilizationStats(Machine $machine, string $date): array + { + $start = Carbon::parse($date)->startOfDay(); + $end = Carbon::parse($date)->endOfDay(); + + // 1. Availability: Based on heartbeat logs (status type) + // Assume online if heartbeat within 6 minutes + $logs = $machine->logs() + ->where('type', 'status') + ->whereBetween('created_at', [$start, $end]) + ->orderBy('created_at') + ->get(); + + $onlineMinutes = 0; + $lastLogTime = null; + + foreach ($logs as $log) { + $currentTime = Carbon::parse($log->created_at); + if ($lastLogTime) { + $diff = $currentTime->diffInMinutes($lastLogTime); + if ($diff <= 6) { + $onlineMinutes += $diff; + } + } + $lastLogTime = $currentTime; + } + + $totalMinutes = 24 * 60; + $availability = ($totalMinutes > 0) ? min(100, ($onlineMinutes / $totalMinutes) * 100) : 0; + + // 2. Performance: Sales Count (B600) + // Target: 2 sales per hour (48/day) + $salesCount = $machine->logs() + ->where('message', 'like', '%B600%') + ->whereBetween('created_at', [$start, $end]) + ->count(); + + $targetSales = 48; + $performance = ($targetSales > 0) ? min(100, ($salesCount / $targetSales) * 100) : 0; + + // 3. Quality: Success Rate + // Exclude failed dispense (B130) + $errorCount = $machine->logs() + ->where('message', 'like', '%B130%') + ->whereBetween('created_at', [$start, $end]) + ->count(); + + $totalAttempts = $salesCount + $errorCount; + $quality = ($totalAttempts > 0) ? (($salesCount / $totalAttempts) * 100) : 100; + + // Combined OEE + $oee = ($availability / 100) * ($performance / 100) * ($quality / 100) * 100; + + return [ + 'overview' => [ + 'availability' => round($availability, 2), + 'performance' => round($performance, 2), + 'quality' => round($quality, 2), + 'oee' => round($oee, 2), + 'onlineHours' => round($onlineMinutes / 60, 2), + 'salesCount' => $salesCount, + 'errorCount' => $errorCount, + ], + 'chart' => [ + 'uptime' => $this->formatUptimeTimeline($logs, $start, $end), + 'sales' => $this->formatSalesTimeline($machine, $start, $end) + ] + ]; + } + + private function formatUptimeTimeline($logs, $start, $end) + { + $data = []; + if ($logs->isEmpty()) return $data; + + $lastLog = null; + $currentRangeStart = null; + + foreach ($logs as $log) { + $logTime = Carbon::parse($log->created_at); + if (!$currentRangeStart) { + $currentRangeStart = $logTime; + } else { + $diff = $logTime->diffInMinutes(Carbon::parse($lastLog->created_at)); + if ($diff > 10) { // Interruption > 10 mins + $data[] = [ + 'x' => 'Uptime', + 'y' => [$currentRangeStart->getTimestamp() * 1000, Carbon::parse($lastLog->created_at)->getTimestamp() * 1000], + 'fillColor' => '#06b6d4' + ]; + $currentRangeStart = $logTime; + } + } + $lastLog = $log; + } + + if ($currentRangeStart && $lastLog) { + $data[] = [ + 'x' => 'Uptime', + 'y' => [$currentRangeStart->getTimestamp() * 1000, Carbon::parse($lastLog->created_at)->getTimestamp() * 1000], + 'fillColor' => '#06b6d4' + ]; + } + + return $data; + } + + private function formatSalesTimeline($machine, $start, $end) + { + return $machine->logs() + ->where('message', 'like', '%B600%') + ->whereBetween('created_at', [$start, $end]) + ->get() + ->map(function($log) { + return [Carbon::parse($log->created_at)->getTimestamp() * 1000, 1]; + }) + ->toArray(); + } } diff --git a/database/migrations/2026_03_24_095824_add_type_and_company_id_to_machine_logs.php b/database/migrations/2026_03_24_095824_add_type_and_company_id_to_machine_logs.php new file mode 100644 index 0000000..9595ac0 --- /dev/null +++ b/database/migrations/2026_03_24_095824_add_type_and_company_id_to_machine_logs.php @@ -0,0 +1,30 @@ +foreignId('company_id')->after('id')->nullable()->constrained()->onDelete('cascade'); + $table->string('type')->after('level')->default('status')->index(); // status, login, submachine, device + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('machine_logs', function (Blueprint $table) { + $table->dropForeign(['company_id']); + $table->dropColumn(['company_id', 'type']); + }); + } +}; diff --git a/database/migrations/2026_03_24_131956_add_expiry_fields_to_machine_slots_table.php b/database/migrations/2026_03_24_131956_add_expiry_fields_to_machine_slots_table.php new file mode 100644 index 0000000..5a5a8fa --- /dev/null +++ b/database/migrations/2026_03_24_131956_add_expiry_fields_to_machine_slots_table.php @@ -0,0 +1,29 @@ +date('expiry_date')->nullable()->after('max_stock')->comment('商品效期'); + $table->string('batch_no')->nullable()->after('expiry_date')->comment('補貨批號'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('machine_slots', function (Blueprint $table) { + $table->dropColumn(['expiry_date', 'batch_no']); + }); + } +}; diff --git a/database/seeders/RoleSeeder.php b/database/seeders/RoleSeeder.php index 0d34b77..72e95f8 100644 --- a/database/seeders/RoleSeeder.php +++ b/database/seeders/RoleSeeder.php @@ -21,6 +21,7 @@ class RoleSeeder extends Seeder $permissions = [ 'menu.members', 'menu.machines', + 'menu.machines.list', 'menu.app', 'menu.warehouses', 'menu.sales', @@ -60,6 +61,7 @@ class RoleSeeder extends Seeder $tenantAdmin->syncPermissions([ 'menu.members', 'menu.machines', + 'menu.machines.list', 'menu.app', 'menu.warehouses', 'menu.sales', diff --git a/lang/en.json b/lang/en.json index 05e5c2a..0db242d 100644 --- a/lang/en.json +++ b/lang/en.json @@ -1,12 +1,22 @@ { "A new verification link has been sent to your email address.": "A new verification link has been sent to your email address.", - "Account created successfully.": "Account created successfully.", - "Account deleted successfully.": "Account deleted successfully.", + "AI Prediction": "AI Prediction", + "API Token": "API Token", + "APK Versions": "APK Versions", + "APP Features": "APP Features", + "APP Management": "APP Management", + "APP Version": "APP Version", + "APP_ID": "APP_ID", + "APP_KEY": "APP_KEY", + "Account": "帳號", "Account Management": "Account Management", + "Account Name": "帳號姓名", "Account Settings": "Account Settings", "Account Status": "Account Status", + "Account created successfully.": "Account created successfully.", + "Account deleted successfully.": "Account deleted successfully.", "Account updated successfully.": "Account updated successfully.", - "accounts": "Account Management", + "Account:": "帳號:", "Accounts / Machines": "Accounts / Machines", "Action": "Action", "Actions": "Actions", @@ -17,14 +27,16 @@ "Add Machine Model": "Add Machine Model", "Add Role": "Add Role", "Admin": "Admin", - "Admin display name": "Admin display name", "Admin Name": "Admin Name", + "Admin Page": "Admin Page", "Admin Sellable Products": "Admin Sellable Products", + "Admin display name": "Admin display name", "Administrator": "Administrator", "Advertisement Management": "Advertisement Management", + "Affiliated Unit": "Affiliated Unit", "Affiliation": "Affiliation", - "AI Prediction": "AI Prediction", "Alert Summary": "Alert Summary", + "Alerts": "中心告警", "Alerts Pending": "Alerts Pending", "All": "All", "All Affiliations": "All Affiliations", @@ -32,38 +44,40 @@ "All Levels": "All Levels", "All Machines": "All Machines", "All Times System Timezone": "All times are in system timezone", - "analysis": "Analysis Management", + "An error occurred while saving.": "An error occurred while saving.", "Analysis Management": "Analysis Management", "Analysis Permissions": "Analysis Permissions", - "API Token": "API Token", - "APK Versions": "APK Versions", - "app": "APP Management", - "APP Features": "APP Features", - "APP Management": "APP Management", - "APP_ID": "APP_ID", - "APP_KEY": "APP_KEY", + "Apply to all identical products in this machine": "Apply to all identical products in this machine", "Are you sure to delete this customer?": "Are you sure to delete this customer?", "Are you sure you want to delete this account?": "Are you sure you want to delete this account?", "Are you sure you want to delete this account? This action cannot be undone.": "Are you sure you want to delete this account? This action cannot be undone.", + "Are you sure you want to delete this configuration?": "您確定要刪除此金流配置嗎?", "Are you sure you want to delete this configuration? This action cannot be undone.": "Are you sure you want to delete this configuration? This action cannot be undone.", "Are you sure you want to delete this item? This action cannot be undone.": "Are you sure you want to delete this item? This action cannot be undone.", "Are you sure you want to delete this role? This action cannot be undone.": "Are you sure you want to delete this role? This action cannot be undone.", "Are you sure you want to delete your account?": "Are you sure you want to delete your account?", + "Are you sure you want to proceed? This action cannot be undone.": "您確定要繼續嗎?此操作將無法復原。", "Are you sure?": "Are you sure?", - "audit": "Audit Management", + "Assign": "Assign", + "Assign Machines": "分配機台", + "Assigned Machines": "授權機台", "Audit Management": "Audit Management", "Audit Permissions": "Audit Permissions", + "Authorized Machines": "Authorized Machines", + "Availability": "可用性 (Availability)", + "Available Machines": "可供分配的機台", "Avatar updated successfully.": "Avatar updated successfully.", "Badge Settings": "Badge Settings", "Basic Information": "Basic Information", "Basic Settings": "Basic Settings", - "basic-settings": "Basic Settings", + "Batch No": "Batch No", "Belongs To": "Belongs To", "Belongs To Company": "Belongs To Company", "Cancel": "Cancel", + "Cancel Purchase": "Cancel Purchase", + "Cannot Delete Role": "Cannot Delete Role", "Cannot delete company with active accounts.": "Cannot delete company with active accounts.", "Cannot delete model that is currently in use by machines.": "Cannot delete model that is currently in use by machines.", - "Cannot Delete Role": "Cannot Delete Role", "Cannot delete role with active users.": "Cannot delete role with active users.", "Card Reader": "Card Reader", "Card Reader No": "Card Reader No", @@ -75,22 +89,24 @@ "ChannelSecret": "ChannelSecret", "Checkout Time 1": "Checkout Time 1", "Checkout Time 2": "Checkout Time 2", + "Clear Filter": "Clear Filter", "Clear Stock": "Clear Stock", "Click here to re-send the verification email.": "Click here to re-send the verification email.", "Click to upload": "Click to upload", "Close Panel": "Close Panel", - "companies": "Customer Management", "Company": "Company", "Company Code": "Company Code", "Company Information": "Company Information", "Company Level": "Company Level", "Company Name": "Company Name", + "Config Name": "配置名稱", "Configuration Name": "Configuration Name", "Confirm": "Confirm", "Confirm Deletion": "Confirm Deletion", "Confirm Password": "Confirm Password", "Connecting...": "Connecting...", "Connectivity Status": "Connectivity Status", + "Connectivity vs Sales Correlation": "連線狀態與銷售關聯分析", "Contact & Details": "Contact & Details", "Contact Email": "Contact Email", "Contact Name": "Contact Name", @@ -98,24 +114,24 @@ "Contract Until (Optional)": "Contract Until (Optional)", "Coupons": "Coupons", "Create": "Create", - "Create a new role and assign permissions.": "Create a new role and assign permissions.", "Create Config": "Create Config", "Create Machine": "Create Machine", "Create Payment Config": "Create Payment Config", "Create Role": "Create Role", + "Create a new role and assign permissions.": "Create a new role and assign permissions.", + "Critical": "Critical", "Current Password": "Current Password", "Current Stock": "Current Stock", - "Customer created successfully.": "Customer created successfully.", - "Customer deleted successfully.": "Customer deleted successfully.", "Customer Info": "Customer Info", "Customer Management": "Customer Management", "Customer Payment Config": "Customer Payment Config", + "Customer created successfully.": "Customer created successfully.", + "Customer deleted successfully.": "Customer deleted successfully.", "Customer updated successfully.": "Customer updated successfully.", "Danger Zone: Delete Account": "Danger Zone: Delete Account", "Dashboard": "Dashboard", "Data Configuration": "Data Configuration", "Data Configuration Permissions": "Data Configuration Permissions", - "data-config": "Data Configuration", "Day Before": "Day Before", "Default Donate": "Default Donate", "Default Not Donate": "Default Not Donate", @@ -125,15 +141,14 @@ "Delete Account": "Delete Account", "Delete Permanently": "Delete Permanently", "Deposit Bonus": "Deposit Bonus", + "Deselect All": "取消全選", "Detail": "Detail", + "Device Status Logs": "Device Status Logs", "Disabled": "Disabled", "Discord Notifications": "Discord Notifications", - "e.g. John Doe": "e.g. John Doe", - "e.g. johndoe": "e.g. johndoe", - "e.g. Taiwan Star": "e.g. Taiwan Star", - "e.g. TWSTAR": "e.g. TWSTAR", - "e.g., Company Standard Pay": "e.g., Company Standard Pay", - "e.g., Taipei Station": "e.g., Taipei Station", + "Dispense Failed": "Dispense Failed", + "Dispense Success": "Dispense Success", + "Dispensing": "Dispensing", "E.SUN QR Scan": "E.SUN QR Scan", "E.SUN QR Scan Settings Description": "E.SUN Bank QR Scan Payment Settings", "EASY_MERCHANT_ID": "EASY_MERCHANT_ID", @@ -142,11 +157,15 @@ "Edit": "Edit", "Edit Account": "Edit Account", "Edit Customer": "Edit Customer", + "Edit Expiry": "Edit Expiry", "Edit Machine": "Edit Machine", "Edit Machine Model": "Edit Machine Model", + "Edit Machine Settings": "編輯機台設定", "Edit Payment Config": "Edit Payment Config", "Edit Role": "Edit Role", + "Edit Role Permissions": "Edit Role Permissions", "Edit Settings": "Edit Settings", + "Edit Sub Account Role": "編輯子帳號角色", "Email": "Email", "Enabled/Disabled": "Enabled/Disabled", "Ensure your account is using a long, random password to stay secure.": "Ensure your account is using a long, random password to stay secure.", @@ -157,14 +176,23 @@ "Enter role name": "Enter role name", "Enter serial number": "Enter serial number", "Enter your password to confirm": "Enter your password to confirm", + "Equipment efficiency and OEE metrics": "設備效能與 OEE 綜合指標", "Error": "Error", + "Expired": "Expired", "Expired / Disabled": "Expired / Disabled", + "Expiry Date": "Expiry Date", "Expiry Management": "Expiry Management", + "Failed to fetch machine data.": "Failed to fetch machine data.", + "Failed to save permissions.": "Failed to save permissions.", "Failed to update machine images: ": "Failed to update machine images: ", - "files selected": "files selected", "Firmware Version": "Firmware Version", + "Fleet Avg OEE": "全機隊平均 OEE", + "Fleet Performance": "全機隊效能", + "From": "From", + "Full Access": "Full Access", "Full Name": "Full Name", "Games": "Games", + "General permissions not linked to a specific menu.": "未連結到特定選單的一般權限。", "Gift Definitions": "Gift Definitions", "Global roles accessible by all administrators.": "Global roles accessible by all administrators.", "Got it": "Got it", @@ -177,93 +205,106 @@ "Heating Range": "Heating Range", "Heating Start Time": "Heating Start Time", "Helper": "Helper", + "Home Page": "Home Page", "Info": "Info", "Initial Admin Account": "Initial Admin Account", "Initial Role": "Initial Role", "Invoice Status": "Invoice Status", - "items": "items", "Items": "Items", "JKO_MERCHANT_ID": "JKO_MERCHANT_ID", - "john@example.com": "john@example.com", "Joined": "Joined", "Key": "Key", "Key No": "Key No", + "LEVEL TYPE": "LEVEL TYPE", + "LINE Pay Direct": "LINE Pay Direct", + "LINE Pay Direct Settings Description": "LINE Pay Official Direct Connection Settings", + "LINE_MERCHANT_ID": "LINE_MERCHANT_ID", + "LIVE": "LIVE", "Last Heartbeat": "Last Heartbeat", + "Last Page": "Last Page", "Last Signal": "Last Signal", + "Last Time": "Last Time", "Last Updated": "Last Updated", "Level": "Level", - "line": "Line Management", "Line Coupons": "Line Coupons", "Line Machines": "Line Machines", "Line Management": "Line Management", "Line Members": "Line Members", "Line Official Account": "Line Official Account", "Line Orders": "Line Orders", - "LINE Pay Direct": "LINE Pay Direct", - "LINE Pay Direct Settings Description": "LINE Pay Official Direct Connection Settings", "Line Permissions": "Line Permissions", "Line Products": "Line Products", - "LINE_MERCHANT_ID": "LINE_MERCHANT_ID", - "LIVE": "LIVE", + "Loading machines...": "Loading machines...", + "Loading...": "Loading...", "Location": "Location", + "Locked Page": "Locked Page", "Login History": "Login History", "Logout": "Logout", "Logs": "Logs", "Machine Count": "Machine Count", - "Machine created successfully.": "Machine created successfully.", "Machine Details": "Machine Details", "Machine Images": "Machine Images", - "Machine images updated successfully.": "Machine images updated successfully.", "Machine Info": "Machine Info", + "Machine Information": "Machine Information", "Machine List": "Machine List", + "Machine Login Logs": "Machine Login Logs", "Machine Logs": "Machine Logs", "Machine Management": "Machine Management", "Machine Management Permissions": "Machine Management Permissions", "Machine Model": "Machine Model", - "Machine model created successfully.": "Machine model created successfully.", - "Machine model deleted successfully.": "Machine model deleted successfully.", "Machine Model Settings": "Machine Model Settings", - "Machine model updated successfully.": "Machine model updated successfully.", "Machine Name": "Machine Name", "Machine Permissions": "Machine Permissions", "Machine Reports": "Machine Reports", "Machine Restart": "Machine Restart", "Machine Settings": "Machine Settings", - "Machine settings updated successfully.": "Machine settings updated successfully.", + "Machine Status": "Machine Status", "Machine Status List": "Machine Status List", "Machine Stock": "Machine Stock", - "machines": "Machine Management", + "Machine created successfully.": "Machine created successfully.", + "Machine images updated successfully.": "Machine images updated successfully.", + "Machine model created successfully.": "Machine model created successfully.", + "Machine model deleted successfully.": "Machine model deleted successfully.", + "Machine model updated successfully.": "Machine model updated successfully.", + "Machine settings updated successfully.": "Machine settings updated successfully.", "Machines": "Machines", + "Machines Online": "在線機台數", "Maintenance Records": "Maintenance Records", + "Manage Account Access": "管理帳號存取", + "Manage Expiry": "Manage Expiry", "Manage administrative and tenant accounts": "Manage administrative and tenant accounts", "Manage all tenant accounts and validity": "Manage all tenant accounts and validity", + "Manage your machine fleet and operational data": "Manage your machine fleet and operational data", "Manage your profile information, security settings, and login history": "Manage your profile information, security settings, and login history", + "Management of operational parameters": "機台運作參數管理", "Management of operational parameters and models": "Management of operational parameters and models", "Max 3": "Max 3", "Member & External": "Member & External", "Member List": "Member List", "Member Management": "Member Management", "Member System": "Member System", - "members": "Member Management", "Membership Tiers": "Membership Tiers", "Menu Permissions": "Menu Permissions", "Merchant IDs": "Merchant IDs", "Merchant payment gateway settings management": "Merchant payment gateway settings management", "Message": "Message", "Message Content": "Message Content", + "Message Display": "Message Display", "Min 8 characters": "Min 8 characters", "Model": "Model", "Model Name": "Model Name", "Models": "Models", "Modifying your own administrative permissions may result in losing access to certain system functions.": "Modifying your own administrative permissions may result in losing access to certain system functions.", "Monitor events and system activity across your vending fleet.": "Monitor events and system activity across your vending fleet.", - "Monthly cumulative revenue overview": "Monthly cumulative revenue overview", "Monthly Transactions": "Monthly Transactions", + "Monthly cumulative revenue overview": "Monthly cumulative revenue overview", "Name": "Name", "Never Connected": "Never Connected", "New Password": "New Password", "New Password (leave blank to keep current)": "New Password (leave blank to keep current)", + "New Sub Account Role": "新增子帳號角色", "Next": "Next", + "No Invoice": "No Invoice", "No accounts found": "No accounts found", "No alert summary": "No alert summary", "No configurations found": "No configurations found", @@ -271,37 +312,54 @@ "No data available": "No data available", "No file uploaded.": "No file uploaded.", "No images uploaded": "No images uploaded", - "No Invoice": "No Invoice", "No location set": "No location set", "No login history yet": "No login history yet", "No logs found": "No logs found", + "No machines assigned": "未分配機台", + "No machines available": "No machines available", + "No machines available in this company.": "此客戶目前沒有可供分配的機台。", "No matching logs found": "No matching logs found", "No permissions": "No permissions", "No roles found.": "No roles found.", + "No slots found": "No slots found", "No users found": "No users found", "None": "None", + "Normal": "Normal", "Not Used": "Not Used", + "Not Used Description": "不使用第三方支付介接", "Notes": "Notes", - "of": "of", + "OEE Score": "OEE 綜合得分", + "OEE.Activity": "營運活動", + "OEE.Errors": "異常", + "OEE.Hours": "小時", + "OEE.Orders": "訂單", + "OEE.Sales": "銷售", "Offline": "Offline", "Offline Machines": "Offline Machines", "Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.": "Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.", "Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.": "Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.", "Online": "Online", + "Online Duration": "累積連線時數", "Online Machines": "Online Machines", "Only system roles can be assigned to platform administrative accounts.": "Only system roles can be assigned to platform administrative accounts.", "Operational Parameters": "Operational Parameters", "Operations": "Operations", + "Optimal": "Optimal", "Optimized for display. Supported formats: JPG, PNG, WebP.": "Optimized for display. Supported formats: JPG, PNG, WebP.", "Optional": "Optional", "Order Management": "Order Management", "Orders": "Orders", + "Other Permissions": "其他權限", "Others": "Others", "Owner": "Owner", - "Parameters": "Parameters", "PARTNER_KEY": "PARTNER_KEY", + "PI_MERCHANT_ID": "PI_MERCHANT_ID", + "PS_MERCHANT_ID": "PS_MERCHANT_ID", + "Parameters": "Parameters", + "Pass Code": "Pass Code", "Pass Codes": "Pass Codes", "Password": "Password", + "Password updated successfully.": "密碼已成功變更。", "Payment & Invoice": "Payment & Invoice", "Payment Buffer Seconds": "Payment Buffer Seconds", "Payment Config": "Payment Config", @@ -309,38 +367,47 @@ "Payment Configuration created successfully.": "Payment Configuration created successfully.", "Payment Configuration deleted successfully.": "Payment Configuration deleted successfully.", "Payment Configuration updated successfully.": "Payment Configuration updated successfully.", + "Payment Selection": "Payment Selection", + "Pending": "Pending", + "Performance": "效能 (Performance)", "Permanent": "Permanent", "Permanently Delete Account": "Permanently Delete Account", "Permission Settings": "Permission Settings", "Permissions": "Permissions", - "permissions": "Permission Settings", "Phone": "Phone", "Photo Slot": "Photo Slot", - "PI_MERCHANT_ID": "PI_MERCHANT_ID", + "Pickup Code": "Pickup Code", "Pickup Codes": "Pickup Codes", "Please check the following errors:": "Please check the following errors:", "Please check the form for errors.": "Please check the form for errors.", + "Please select a machine to view metrics": "請選擇機台以查看數據", "Point Rules": "Point Rules", "Point Settings": "Point Settings", "Previous": "Previous", "Product Management": "Product Management", "Product Reports": "Product Reports", + "Product Status": "商品狀態", "Profile": "Profile", "Profile Information": "Profile Information", "Profile Settings": "Profile Settings", "Profile updated successfully.": "Profile updated successfully.", "Promotions": "Promotions", "Protected": "Protected", - "PS_MERCHANT_ID": "PS_MERCHANT_ID", "Purchase Audit": "Purchase Audit", + "Purchase Finished": "Purchase Finished", "Purchases": "Purchases", + "Purchasing": "Purchasing", + "Quality": "品質 (Quality)", "Questionnaire": "Questionnaire", + "Quick Expiry Check": "Quick Expiry Check", + "Quick Select": "快速選取", "Quick search...": "Quick search...", - "Real-time monitoring across all machines": "Real-time monitoring across all machines", + "Real-time OEE analysis awaits": "即時 OEE 分析預備中", "Real-time Operation Logs (Last 50)": "Real-time Operation Logs (Last 50)", + "Real-time monitoring across all machines": "Real-time monitoring across all machines", "Real-time status monitoring": "Real-time status monitoring", + "Receipt Printing": "Receipt Printing", "Recent Login": "Recent Login", - "remote": "Remote Management", "Remote Change": "Remote Change", "Remote Checkout": "Remote Checkout", "Remote Dispense": "Remote Dispense", @@ -348,46 +415,58 @@ "Remote Management": "Remote Management", "Remote Permissions": "Remote Permissions", "Replenishment Audit": "Replenishment Audit", + "Replenishment Page": "Replenishment Page", "Replenishment Records": "Replenishment Records", "Replenishments": "Replenishments", - "reservation": "Reservation System", "Reservation Members": "Reservation Members", "Reservation System": "Reservation System", "Reservations": "Reservations", "Returns": "Returns", + "Risk": "Risk", "Role": "Role", - "Role created successfully.": "Role created successfully.", - "Role deleted successfully.": "Role deleted successfully.", + "Role Identification": "Role Identification", "Role Management": "Role Permission Management", "Role Name": "Role Name", - "Role name already exists in this company.": "Role name already exists in this company.", - "Role not found.": "Role not found.", "Role Permissions": "Role Permissions", "Role Settings": "Role Permissions", "Role Type": "Role Type", + "Role created successfully.": "Role created successfully.", + "Role deleted successfully.": "Role deleted successfully.", + "Role name already exists in this company.": "Role name already exists in this company.", + "Role not found.": "Role not found.", "Role updated successfully.": "Role updated successfully.", "Roles": "Role Permissions", - "roles": "Role Permissions", "Roles scoped to specific customer companies.": "Roles scoped to specific customer companies.", "Running Status": "Running Status", + "SYSTEM": "SYSTEM", "Sales": "Sales", - "sales": "Sales Management", + "Sales Activity": "銷售活動", "Sales Management": "Sales Management", "Sales Permissions": "Sales Permissions", "Sales Records": "Sales Records", "Save": "Save", "Save Changes": "Save Changes", "Save Config": "Save Config", + "Save Permissions": "儲存權限", "Saved.": "Saved.", + "Saving...": "儲存中...", + "Scale level and access control": "層級與存取控制", "Search configurations...": "Search configurations...", "Search customers...": "Search customers...", + "Search machines by name or serial...": "Search machines by name or serial...", "Search machines...": "Search machines...", "Search models...": "Search models...", "Search roles...": "Search roles...", "Search users...": "Search users...", + "Select All": "全選", "Select Company": "Select Company", + "Select Machine": "選擇機台", + "Select Machine to view metrics": "請選擇機台以查看指標", "Select Model": "Select Model", "Select Owner": "Select Owner", + "Select a machine to deep dive": "請選擇機台以開始深度分析", + "Selected": "Selected", + "Selected Date": "查詢日期", "Serial & Version": "Serial & Version", "Serial No": "Serial No", "Serial Number": "Serial Number", @@ -396,12 +475,15 @@ "Showing :from to :to of :total items": "Showing :from to :to of :total items", "Sign in to your account": "Sign in to your account", "Signed in as": "Signed in as", + "Slot": "Slot", "Slot Mechanism (default: Conveyor, check for Spring)": "Slot Mechanism (default: Conveyor, check for Spring)", + "Slot Status": "Slot Status", + "Slot Test": "Slot Test", "Some fields need attention": "Some fields need attention", "Special Permission": "Special Permission", - "special-permission": "Special Permission", "Staff Stock": "Staff Stock", "Status": "Status", + "Status / Temp / Sub / Card / Scan": "Status / Temp / Sub / Card / Scan", "Stock Management": "Stock Management", "Store Gifts": "Store Gifts", "Store ID": "Store ID", @@ -410,12 +492,15 @@ "Sub Account Management": "Sub Account Management", "Sub Account Roles": "Sub Account Roles", "Sub Accounts": "Sub Accounts", + "Sub-actions": "子項目", + "Sub-machine Status Request": "Sub-machine Status", "Success": "Success", "Super Admin": "Super Admin", "Super-admin role cannot be assigned to tenant accounts.": "Super-admin role cannot be assigned to tenant accounts.", "Survey Analysis": "Survey Analysis", - "SYSTEM": "SYSTEM", + "System Default": "System Default", "System Level": "System Level", + "System Official": "System Official", "System Role": "System Role", "System role name cannot be modified.": "System role name cannot be modified.", "System roles cannot be deleted by tenant administrators.": "System roles cannot be deleted by tenant administrators.", @@ -425,34 +510,40 @@ "Systems Initializing": "Systems Initializing", "TapPay Integration": "TapPay Integration", "TapPay Integration Settings Description": "TapPay Payment Integration Settings", + "Target": "目標", "Tax ID (Optional)": "Tax ID (Optional)", "Temperature": "Temperature", "TermID": "TermID", - "The image is too large. Please upload an image smaller than 1MB.": "The image is too large. Please upload an image smaller than 1MB.", "The Super Admin role cannot be deleted.": "The Super Admin role cannot be deleted.", "The Super Admin role is immutable.": "The Super Admin role is immutable.", "The Super Admin role name cannot be modified.": "The Super Admin role name cannot be modified.", + "The image is too large. Please upload an image smaller than 1MB.": "The image is too large. Please upload an image smaller than 1MB.", "This role belongs to another company and cannot be assigned.": "This role belongs to another company and cannot be assigned.", "Time": "Time", "Time Slots": "Time Slots", "Timer": "Timer", "Timestamp": "Timestamp", - "to": "to", + "To": "To", "Today Cumulative Sales": "Today Cumulative Sales", "Today's Transactions": "Today's Transactions", "Total Connected": "Total Connected", "Total Customers": "Total Customers", - "Total items": "Total items: :count", + "Total Daily Sales": "本日累計銷量", "Total Logins": "Total Logins", + "Total Selected": "已選擇總數", + "Total Slots": "Total Slots", + "Total items": "Total items: :count", "Transfer Audit": "Transfer Audit", "Transfers": "Transfers", + "Tutorial Page": "Tutorial Page", "Type": "Type", "UI Elements": "UI Elements", + "Unified Operational Timeline": "整合式營運時序圖", "Unknown": "Unknown", "Update": "Update", "Update Customer": "Update Customer", - "Update existing role and permissions.": "Update existing role and permissions.", "Update Password": "Update Password", + "Update existing role and permissions.": "Update existing role and permissions.", "Update your account's profile information and email address.": "Update your account's profile information and email address.", "Upload New Images": "Upload New Images", "Uploading new images will replace all existing images.": "Uploading new images will replace all existing images.", @@ -461,59 +552,90 @@ "Username": "Username", "Users": "Users", "Utilization Rate": "Utilization Rate", + "Utilization Timeline": "稼動時序", + "Utilization, OEE and Operational Intelligence": "稼動率、OEE 與營運情報", "Valid Until": "Valid Until", + "Vending Page": "Vending Page", "Venue Management": "Venue Management", "View Details": "View Details", "View Logs": "View Logs", - "vs Yesterday": "vs Yesterday", + "Waiting for Payment": "Waiting for Payment", "Warehouse List": "Warehouse List", "Warehouse List (All)": "Warehouse List (All)", "Warehouse List (Individual)": "Warehouse List (Individual)", "Warehouse Management": "Warehouse Management", "Warehouse Permissions": "Warehouse Permissions", - "warehouses": "Warehouse Management", "Warning": "Warning", "Warning: You are editing your own role!": "Warning: You are editing your own role!", "Welcome Gift": "Welcome Gift", + "Welcome Gift Status": "Welcome Gift Status", "Yesterday": "Yesterday", "You cannot assign permissions you do not possess.": "You cannot assign permissions you do not possess.", "You cannot delete your own account.": "You cannot delete your own account.", "Your email address is unverified.": "Your email address is unverified.", "Your recent account activity": "Your recent account activity", - "menu.data-config": "Data Configuration", - "menu.data-config.sub-accounts": "Sub Account Management", - "menu.data-config.sub-account-roles": "Sub Account Roles", + "accounts": "Account Management", + "admin": "管理員", + "analysis": "Analysis Management", + "app": "APP Management", + "audit": "Audit Management", + "basic-settings": "Basic Settings", + "basic.machines": "機台設定", + "basic.payment-configs": "客戶金流設定", + "companies": "Customer Management", + "data-config": "Data Configuration", + "data-config.sub-account-roles": "子帳號角色", + "data-config.sub-accounts": "子帳號管理", + "e.g. John Doe": "e.g. John Doe", + "e.g. TWSTAR": "e.g. TWSTAR", + "e.g. Taiwan Star": "e.g. Taiwan Star", + "e.g. johndoe": "e.g. johndoe", + "e.g., Company Standard Pay": "e.g., Company Standard Pay", + "e.g., Taipei Station": "e.g., Taipei Station", + "files selected": "files selected", + "items": "items", + "john@example.com": "john@example.com", + "line": "Line Management", + "machines": "Machine Management", + "members": "Member Management", + "menu.analysis": "Analysis Management", + "menu.app": "APP Management", + "menu.audit": "Audit Management", + "menu.basic": "基本管理", "menu.basic-settings": "Basic Settings", "menu.basic.machines": "Machine Settings", "menu.basic.payment-configs": "Customer Payment Config", - "menu.permission": "Permission Settings", - "menu.permissions.companies": "Customer Management", - "menu.permissions.accounts": "Account Management", - "menu.permissions.roles": "Role Permissions", - "menu.members": "Member Management", - "menu.machines": "Machine Management", - "menu.app": "APP Management", - "menu.warehouses": "Warehouse Management", - "menu.sales": "Sales Management", - "menu.analysis": "Analysis Management", - "menu.audit": "Audit Management", - "menu.remote": "Remote Management", + "menu.data-config": "Data Configuration", + "menu.data-config.sub-account-roles": "Sub Account Roles", + "menu.data-config.sub-accounts": "Sub Account Management", "menu.line": "Line Management", + "menu.machines": "Machine Management", + "menu.machines.list": "Machine List", + "menu.members": "Member Management", + "menu.permission": "Permission Settings", + "menu.permissions": "權限管理", + "menu.permissions.accounts": "Account Management", + "menu.permissions.companies": "Customer Management", + "menu.permissions.roles": "Role Permissions", + "menu.remote": "Remote Management", "menu.reservation": "Reservation System", + "menu.sales": "Sales Management", "menu.special-permission": "Special Permission", - "Edit Role Permissions": "Edit Role Permissions", - "Role Identification": "Role Identification", - "LEVEL TYPE": "LEVEL TYPE", - "Affiliated Unit": "Affiliated Unit", - "System Official": "System Official", - "Full Access": "Full Access", - "System Default": "System Default", - "Authorized Machines": "Authorized Machines", - "Assign": "Assign", - "No machines available": "No machines available", - "Selected": "Selected", - "Failed to fetch machine data.": "Failed to fetch machine data.", - "Failed to save permissions.": "Failed to save permissions.", - "An error occurred while saving.": "An error occurred while saving.", - "Loading machines...": "Loading machines..." -} \ No newline at end of file + "menu.warehouses": "Warehouse Management", + "of": "of", + "permissions": "Permission Settings", + "permissions.accounts": "帳號管理", + "permissions.companies": "客戶管理", + "permissions.roles": "角色權限管理", + "remote": "Remote Management", + "reservation": "Reservation System", + "roles": "Role Permissions", + "sales": "Sales Management", + "special-permission": "Special Permission", + "super-admin": "超級管理員", + "to": "to", + "user": "一般用戶", + "vs Yesterday": "vs Yesterday", + "warehouses": "Warehouse Management", + "待填寫": "Pending" +} diff --git a/lang/ja.json b/lang/ja.json index 11e9b7e..c308317 100644 --- a/lang/ja.json +++ b/lang/ja.json @@ -1,12 +1,22 @@ { "A new verification link has been sent to your email address.": "新しい確認リンクがメールアドレスに送信されました。", - "Account created successfully.": "アカウントが正常に作成されました。", - "Account deleted successfully.": "アカウントが正常に削除されました。", + "AI Prediction": "AI予測", + "API Token": "API キー", + "APK Versions": "APKバージョン", + "APP Features": "APP機能", + "APP Management": "APP管理", + "APP Version": "APPバージョン", + "APP_ID": "APP_ID", + "APP_KEY": "APP_KEY", + "Account": "帳號", "Account Management": "アカウント管理", + "Account Name": "帳號姓名", "Account Settings": "アカウント設定", "Account Status": "アカウント狀態", + "Account created successfully.": "アカウントが正常に作成されました。", + "Account deleted successfully.": "アカウントが正常に削除されました。", "Account updated successfully.": "アカウントが正常に更新されました。", - "accounts": "アカウント管理", + "Account:": "帳號:", "Accounts / Machines": "アカウント / 機台", "Action": "操作", "Actions": "操作", @@ -17,14 +27,16 @@ "Add Machine Model": "機台型號を追加", "Add Role": "ロールを追加", "Admin": "管理者", - "Admin display name": "管理者表示名", "Admin Name": "管理者名", + "Admin Page": "管理画面", "Admin Sellable Products": "管理者販売可能商品", + "Admin display name": "管理者表示名", "Administrator": "管理者", "Advertisement Management": "廣告管理", + "Affiliated Unit": "所属ユニット", "Affiliation": "所属", - "AI Prediction": "AI予測", "Alert Summary": "アラート概要", + "Alerts": "中心告警", "Alerts Pending": "アラート待機中", "All": "すべて", "All Affiliations": "全ての所属", @@ -32,38 +44,40 @@ "All Levels": "すべてのレベル", "All Machines": "すべての機体", "All Times System Timezone": "時間はすべてシステムタイムゾーンです", - "analysis": "分析管理", + "An error occurred while saving.": "儲存時發生錯誤。", "Analysis Management": "分析管理", "Analysis Permissions": "分析管理權限", - "API Token": "API キー", - "APK Versions": "APKバージョン", - "app": "APP管理", - "APP Features": "APP機能", - "APP Management": "APP管理", - "APP_ID": "APP_ID", - "APP_KEY": "APP_KEY", + "Apply to all identical products in this machine": "同步套用至此機台內的所有相同商品", "Are you sure to delete this customer?": "この顧客を削除してもよろしいですか?", "Are you sure you want to delete this account?": "このアカウントを削除してもよろしいですか?", "Are you sure you want to delete this account? This action cannot be undone.": "このアカウントを削除してもよろしいですか?この操作は元に戻せません。", + "Are you sure you want to delete this configuration?": "您確定要刪除此金流配置嗎?", "Are you sure you want to delete this configuration? This action cannot be undone.": "この設定を削除してもよろしいですか?この操作は元に戻せません。", "Are you sure you want to delete this item? This action cannot be undone.": "この項目を削除してもよろしいですか?この操作は元に戻せません。", "Are you sure you want to delete this role? This action cannot be undone.": "このロールを削除してもよろしいですか?この操作は元に戻せません。", "Are you sure you want to delete your account?": "真的にアカウントを削除してもよろしいですか?", + "Are you sure you want to proceed? This action cannot be undone.": "您確定要繼續嗎?此操作將無法復原。", "Are you sure?": "よろしいですか?", - "audit": "監査管理", + "Assign": "分配所屬機台", + "Assign Machines": "分配機台", + "Assigned Machines": "授權機台", "Audit Management": "監査管理", "Audit Permissions": "監査管理權限", + "Authorized Machines": "授權機台", + "Availability": "可用性 (Availability)", + "Available Machines": "可供分配的機台", "Avatar updated successfully.": "アバターが正常に更新されました。", "Badge Settings": "バッジ設定", "Basic Information": "基本情報", "Basic Settings": "基本設定", - "basic-settings": "基本設定", + "Batch No": "批號", "Belongs To": "所属", "Belongs To Company": "所属会社", "Cancel": "キャンセル", + "Cancel Purchase": "購入キャンセル", + "Cannot Delete Role": "ロールを削除できません", "Cannot delete company with active accounts.": "アクティブなアカウントを持つ会社は削除できません。", "Cannot delete model that is currently in use by machines.": "機台で使用中の型號は削除できません。", - "Cannot Delete Role": "ロールを削除できません", "Cannot delete role with active users.": "アクティブなユーザーがいるロールは削除できません。", "Card Reader": "カードリーダー", "Card Reader No": "カードリーダー番号", @@ -75,22 +89,24 @@ "ChannelSecret": "チャンネルシークレット", "Checkout Time 1": "決済時間 1", "Checkout Time 2": "決済時間 2", + "Clear Filter": "フィルターをクリア", "Clear Stock": "在庫クリア", "Click here to re-send the verification email.": "確認メールを再送信するにはここをクリックしてください。", "Click to upload": "クリックしてアップロード", "Close Panel": "パネルを閉じる", - "companies": "顧客管理", "Company": "所属顧客", "Company Code": "会社コード", "Company Information": "会社情報", "Company Level": "顧客レベル", "Company Name": "会社名", + "Config Name": "配置名稱", "Configuration Name": "設定名称", "Confirm": "確認", "Confirm Deletion": "削除の確認", "Confirm Password": "新しいパスワード(確認)", "Connecting...": "接続中...", "Connectivity Status": "接続ステータス概況", + "Connectivity vs Sales Correlation": "連線狀態與銷售關聯分析", "Contact & Details": "連絡先と詳細", "Contact Email": "連絡先メールアドレス", "Contact Name": "連絡担当者名", @@ -98,24 +114,24 @@ "Contract Until (Optional)": "契約期限 (任意)", "Coupons": "クーポン", "Create": "作成", - "Create a new role and assign permissions.": "新しいロールを作成し、権限を割り当てます。", "Create Config": "設定を新規作成", "Create Machine": "機台新規作成", "Create Payment Config": "決済設定を新規作成", "Create Role": "ロール作成", + "Create a new role and assign permissions.": "新しいロールを作成し、権限を割り当てます。", + "Critical": "致命的", "Current Password": "現在のパスワード", "Current Stock": "現在の在庫", - "Customer created successfully.": "顧客が正常に作成されました。", - "Customer deleted successfully.": "顧客が正常に削除されました。", "Customer Info": "顧客情報", "Customer Management": "顧客管理", "Customer Payment Config": "決済設定管理", + "Customer created successfully.": "顧客が正常に作成されました。", + "Customer deleted successfully.": "顧客が正常に削除されました。", "Customer updated successfully.": "顧客が正常に更新されました。", "Danger Zone: Delete Account": "危険区域:アカウントの削除", "Dashboard": "ダッシュボード", "Data Configuration": "データ設定", "Data Configuration Permissions": "データ設定権限", - "data-config": "データ設定", "Day Before": "一昨日", "Default Donate": "デフォルト寄付", "Default Not Donate": "デフォルト寄付しない", @@ -125,15 +141,14 @@ "Delete Account": "アカウントの削除", "Delete Permanently": "完全に削除", "Deposit Bonus": "入金ボーナス", + "Deselect All": "取消全選", "Detail": "詳細", + "Device Status Logs": "デバイス状態ログ", "Disabled": "停止中", "Discord Notifications": "Discord通知", - "e.g. John Doe": "例:山田太郎", - "e.g. johndoe": "例:yamadataro", - "e.g. Taiwan Star": "例:台湾スター", - "e.g. TWSTAR": "例:TWSTAR", - "e.g., Company Standard Pay": "例:標準決済組合せ", - "e.g., Taipei Station": "例:台北駅", + "Dispense Failed": "出庫失敗", + "Dispense Success": "出庫成功", + "Dispensing": "出庫中", "E.SUN QR Scan": "玉山銀行 QR スキャン", "E.SUN QR Scan Settings Description": "玉山銀行 QR スキャン決済設定", "EASY_MERCHANT_ID": "悠遊付 加盟店ID", @@ -142,11 +157,15 @@ "Edit": "編集", "Edit Account": "アカウントを編集", "Edit Customer": "顧客を編集", + "Edit Expiry": "編輯效期", "Edit Machine": "機台編集", "Edit Machine Model": "機台型號を編輯", + "Edit Machine Settings": "編輯機台設定", "Edit Payment Config": "決済設定を編集", "Edit Role": "ロール編集", + "Edit Role Permissions": "ロール権限の編集", "Edit Settings": "設定編集", + "Edit Sub Account Role": "編輯子帳號角色", "Email": "メールアドレス", "Enabled/Disabled": "有効/無効", "Ensure your account is using a long, random password to stay secure.": "セキュリティを維持するため、アカウントには長くランダムなパスワードを使用してください。", @@ -157,15 +176,25 @@ "Enter role name": "ロール名を入力してください", "Enter serial number": "シリアル番号を入力してください", "Enter your password to confirm": "確認のためパスワードを入力してください", + "Equipment efficiency and OEE metrics": "設備效能與 OEE 綜合指標", "Error": "エラー", + "Expired": "期限切れ", "Expired / Disabled": "期限切れ / 停止中", + "Expiry Date": "有效日期", "Expiry Management": "有効期限管理", + "Failed to fetch machine data.": "無法取得機台資料。", + "Failed to save permissions.": "無法儲存權限設定。", "Failed to update machine images: ": "機台画像の更新に失敗しました:", - "files selected": "ファイルを選択済み", "Firmware Version": "ファームウェアバージョン", + "Fleet Avg OEE": "全機隊平均 OEE", + "Fleet Performance": "全機隊效能", + "From": "から", + "Full Access": "全機台授權", "Full Name": "氏名", "Games": "ゲーム", + "General permissions not linked to a specific menu.": "未連結到特定選單的一般權限。", "Gift Definitions": "ギフト設定", + "Global roles accessible by all administrators.": "適用於所有管理者的全域角色。", "Got it": "了解", "Hardware & Network": "ハードウェアとネットワーク", "Hardware & Slots": "ハードウェアと貨道", @@ -176,93 +205,106 @@ "Heating Range": "加熱時間帯", "Heating Start Time": "加熱開始時間", "Helper": "ヘルパー", + "Home Page": "主画面", "Info": "情報", "Initial Admin Account": "初期管理者アカウント", "Initial Role": "初期ロール", "Invoice Status": "発票発行状態", - "items": "個の項目", "Items": "個の項目", "JKO_MERCHANT_ID": "街口支付 加盟店ID", - "john@example.com": "john@example.com", "Joined": "入会日", "Key": "キー (Key)", "Key No": "キー番号", + "LEVEL TYPE": "層級タイプ", + "LINE Pay Direct": "LINE Pay 直結決済", + "LINE Pay Direct Settings Description": "LINE Pay 公式直結設定", + "LINE_MERCHANT_ID": "LINE Pay 加盟店ID", + "LIVE": "ライブ", "Last Heartbeat": "最終ハートビート時間", + "Last Page": "最終ページ", "Last Signal": "最終信号時間", + "Last Time": "最終時間", "Last Updated": "最終更新", "Level": "レベル", - "line": "Line管理", "Line Coupons": "Lineクーポン", "Line Machines": "Line機台", "Line Management": "Line管理", "Line Members": "Line会員", "Line Official Account": "Line公式アカウント", "Line Orders": "Line注文", - "LINE Pay Direct": "LINE Pay 直結決済", - "LINE Pay Direct Settings Description": "LINE Pay 公式直結設定", "Line Permissions": "Line管理權限", "Line Products": "Line商品", - "LINE_MERCHANT_ID": "LINE Pay 加盟店ID", - "LIVE": "ライブ", + "Loading machines...": "正在載入機台...", + "Loading...": "読み込み中...", "Location": "場所", + "Locked Page": "ロック画面", "Login History": "ログイン履歴", "Logout": "ログアウト", "Logs": "ログ", "Machine Count": "機台数量", - "Machine created successfully.": "機台が正常に作成されました。", "Machine Details": "機台詳情", "Machine Images": "機台写真", - "Machine images updated successfully.": "機台画像が正常に更新されました。", "Machine Info": "機台情報", + "Machine Information": "機台情報", "Machine List": "機台リスト", + "Machine Login Logs": "機台ログイン履歴", "Machine Logs": "機台ログ", "Machine Management": "機台管理", "Machine Management Permissions": "機台管理權限", "Machine Model": "機台型號", - "Machine model created successfully.": "機台型號が正常に作成されました。", - "Machine model deleted successfully.": "機台型號が正常に削除されました。", "Machine Model Settings": "機台型號設定", - "Machine model updated successfully.": "機台型號が正常に更新されました。", "Machine Name": "機台名", "Machine Permissions": "機台権限", "Machine Reports": "機台レポート", "Machine Restart": "機台再起動", "Machine Settings": "機台設定", - "Machine settings updated successfully.": "機台設定が正常に更新されました。", + "Machine Status": "機台状態", "Machine Status List": "機台稼働状況リスト", "Machine Stock": "機台在庫", - "machines": "機台管理", + "Machine created successfully.": "機台が正常に作成されました。", + "Machine images updated successfully.": "機台画像が正常に更新されました。", + "Machine model created successfully.": "機台型號が正常に作成されました。", + "Machine model deleted successfully.": "機台型號が正常に削除されました。", + "Machine model updated successfully.": "機台型號が正常に更新されました。", + "Machine settings updated successfully.": "機台設定が正常に更新されました。", "Machines": "機台リスト", + "Machines Online": "在線機台數", "Maintenance Records": "メンテナンス記録", + "Manage Account Access": "管理帳號存取", + "Manage Expiry": "進入效期管理", "Manage administrative and tenant accounts": "管理者およびテナントアカウントを管理します", "Manage all tenant accounts and validity": "すべてのテナントアカウントと有効期限を管理します", + "Manage your machine fleet and operational data": "機台フリートと運用データの管理", "Manage your profile information, security settings, and login history": "プロフィール情報、セキュリティ設定、ログイン履歴の管理", + "Management of operational parameters": "機台運作參數管理", "Management of operational parameters and models": "運用パラメータと型番の管理", "Max 3": "最大3枚", "Member & External": "会員と外部システム", "Member List": "会員リスト", "Member Management": "会員管理", "Member System": "会員システム", - "members": "会員管理", "Membership Tiers": "会員ランク", "Menu Permissions": "メニュー権限", "Merchant IDs": "マーチャント ID", "Merchant payment gateway settings management": "マーチャント決済ゲートウェイ設定管理", "Message": "メッセージ", "Message Content": "ログ内容", + "Message Display": "メッセージ表示", "Min 8 characters": "最低8文字", "Model": "型番", "Model Name": "型號名称", "Models": "型番リスト", "Modifying your own administrative permissions may result in losing access to certain system functions.": "自身の管理權限を変更すると、一部のシステム機能へのアクセス權を失う可能性があります。", "Monitor events and system activity across your vending fleet.": "自販機フリート全体のイベントとシステムアクティビティを監視します。", - "Monthly cumulative revenue overview": "今月の累計収益概要", "Monthly Transactions": "今月の取引統計", + "Monthly cumulative revenue overview": "今月の累計収益概要", "Name": "氏名", "Never Connected": "未接続", "New Password": "新しいパスワード", "New Password (leave blank to keep current)": "新しいパスワード (変更しない場合は空欄)", + "New Sub Account Role": "新增子帳號角色", "Next": "次へ", + "No Invoice": "発票を発行しない", "No accounts found": "アカウントが見つかりません", "No alert summary": "アラートなし", "No configurations found": "設定が見つかりません", @@ -270,37 +312,54 @@ "No data available": "データなし", "No file uploaded.": "ファイルがアップロードされていません。", "No images uploaded": "写真がアップロードされていません", - "No Invoice": "発票を発行しない", "No location set": "場所が未設定です", "No login history yet": "ログイン履歴はまだありません", "No logs found": "ログがありません", + "No machines assigned": "未分配機台", + "No machines available": "目前沒有可供分配的機台", + "No machines available in this company.": "此客戶目前沒有可供分配的機台。", "No matching logs found": "一致するログが見つかりません", "No permissions": "権限項目なし", "No roles found.": "ロールが見つかりませんでした。", + "No slots found": "未找到貨道資訊", "No users found": "ユーザーが見つかりません", "None": "なし", + "Normal": "正常", "Not Used": "未使用", + "Not Used Description": "不使用第三方支付介接", "Notes": "備考", - "of": "件中", + "OEE Score": "OEE 綜合得分", + "OEE.Activity": "營運活動", + "OEE.Errors": "異常", + "OEE.Hours": "小時", + "OEE.Orders": "訂單", + "OEE.Sales": "銷售", "Offline": "オフライン", "Offline Machines": "オフライン機台", "Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.": "アカウントが削除されると、そのすべてのリソース和データが永久に削除されます。アカウントを削除する前に、保持したいデータや情報をダウンロードしてください。", "Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.": "アカウントが削除されると、すべての関連データが永久に削除されます。アカウントの永久削除を確定するため、パスワードを入力してください。", "Online": "オンライン", + "Online Duration": "累積連線時數", "Online Machines": "オンライン機台", "Only system roles can be assigned to platform administrative accounts.": "プラットフォーム管理アカウントにはシステムロールのみ割り当て可能です。", "Operational Parameters": "運用パラメータ", "Operations": "運用設定", + "Optimal": "最適", "Optimized for display. Supported formats: JPG, PNG, WebP.": "表示用に最適化されています。対応形式:JPG, PNG, WebP。", "Optional": "任意", "Order Management": "注文管理", "Orders": "注文", + "Other Permissions": "其他權限", "Others": "その他", "Owner": "所属会社", - "Parameters": "パラメータ設定", "PARTNER_KEY": "パートナーキー", + "PI_MERCHANT_ID": "Pi 拍錢包 加盟店ID", + "PS_MERCHANT_ID": "全盈+Pay 加盟店ID", + "Parameters": "パラメータ設定", + "Pass Code": "パスコード", "Pass Codes": "パスクード", "Password": "パスワード", + "Password updated successfully.": "密碼已成功變更。", "Payment & Invoice": "決済と発票", "Payment Buffer Seconds": "決済バッファ秒数", "Payment Config": "決済設定", @@ -308,38 +367,47 @@ "Payment Configuration created successfully.": "決済設定が正常に作成されました。", "Payment Configuration deleted successfully.": "決済設定が正常に削除されました。", "Payment Configuration updated successfully.": "決済設定が正常に更新されました。", + "Payment Selection": "決済選択", + "Pending": "保留中", + "Performance": "效能 (Performance)", "Permanent": "永久認可", "Permanently Delete Account": "アカウントを永久に削除", "Permission Settings": "権限設定", "Permissions": "権限", - "permissions": "權限設定", "Phone": "電話番号", "Photo Slot": "写真スロット", - "PI_MERCHANT_ID": "Pi 拍錢包 加盟店ID", + "Pickup Code": "受取コード", "Pickup Codes": "受取コード", "Please check the following errors:": "以下のエラーを確認してください:", "Please check the form for errors.": "フォームにエラーがないか確認してください。", + "Please select a machine to view metrics": "請選擇機台以查看數據", "Point Rules": "ポイントルール", "Point Settings": "ポイント設定", "Previous": "前へ", "Product Management": "商品管理", "Product Reports": "商品レポート", + "Product Status": "商品狀態", "Profile": "プロフィール", "Profile Information": "プロフィール情報", "Profile Settings": "個人設定", "Profile updated successfully.": "プロフィールが正常に更新されました。", "Promotions": "プロモーション", "Protected": "保護されています", - "PS_MERCHANT_ID": "全盈+Pay 加盟店ID", "Purchase Audit": "購入監査", + "Purchase Finished": "購入終了", "Purchases": "購入", + "Purchasing": "購入中", + "Quality": "品質 (Quality)", "Questionnaire": "アンケート", + "Quick Expiry Check": "效期快速檢查", + "Quick Select": "快速選取", "Quick search...": "クイック検索...", - "Real-time monitoring across all machines": "全機台のリアルタイム監視", + "Real-time OEE analysis awaits": "即時 OEE 分析預備中", "Real-time Operation Logs (Last 50)": "リアルタイム操作ログ (直近 50 件)", + "Real-time monitoring across all machines": "全機台のリアルタイム監視", "Real-time status monitoring": "リアルタイムステータス監視", + "Receipt Printing": "レシート印刷", "Recent Login": "最近のログイン", - "remote": "リモート管理", "Remote Change": "リモートお釣り", "Remote Checkout": "リモート決済", "Remote Dispense": "リモート出庫", @@ -347,44 +415,58 @@ "Remote Management": "リモート管理", "Remote Permissions": "リモート管理權限", "Replenishment Audit": "補充監査", + "Replenishment Page": "補充画面", "Replenishment Records": "補充記録", "Replenishments": "補充", - "reservation": "予約システム", "Reservation Members": "予約会員", "Reservation System": "予約システム", "Reservations": "予約", "Returns": "返品", + "Risk": "リスク", "Role": "ロール", - "Role created successfully.": "ロールが正常に作成されました。", - "Role deleted successfully.": "ロールが正常に削除されました。", + "Role Identification": "ロール識別情報", "Role Management": "ロール權限管理", "Role Name": "ロール名", - "Role name already exists in this company.": "この会社には同じ名前のロールが既に存在します。", - "Role not found.": "ロールが見つかりませんでした。", "Role Permissions": "ロール權限", "Role Settings": "ロール權限", "Role Type": "ロールタイプ", + "Role created successfully.": "ロールが正常に作成されました。", + "Role deleted successfully.": "ロールが正常に削除されました。", + "Role name already exists in this company.": "この会社には同じ名前のロールが既に存在します。", + "Role not found.": "ロールが見つかりませんでした。", "Role updated successfully.": "ロールが正常に更新されました。", "Roles": "ロール權限", - "roles": "ロール權限", + "Roles scoped to specific customer companies.": "適用於各個客戶單位的特定角色。", "Running Status": "稼働状況", - "sales": "販売管理", + "SYSTEM": "システムレベル", + "Sales": "銷售管理", + "Sales Activity": "銷售活動", "Sales Management": "販売管理", "Sales Permissions": "販売管理権限", "Sales Records": "販売記録", "Save": "変更を保存", "Save Changes": "変更を保存", "Save Config": "設定を保存", + "Save Permissions": "儲存權限", "Saved.": "保存されました", + "Saving...": "儲存中...", + "Scale level and access control": "層級與存取控制", "Search configurations...": "設定を検索...", "Search customers...": "顧客を検索...", + "Search machines by name or serial...": "名称またはシリアル番号で検索...", "Search machines...": "機台を検索...", "Search models...": "型番を検索...", "Search roles...": "ロールを検索...", "Search users...": "ユーザーを検索...", + "Select All": "全選", "Select Company": "会社を選択", + "Select Machine": "選擇機台", + "Select Machine to view metrics": "請選擇機台以查看指標", "Select Model": "型番を選択", "Select Owner": "所属会社を選択", + "Select a machine to deep dive": "請選擇機台以開始深度分析", + "Selected": "已選擇", + "Selected Date": "查詢日期", "Serial & Version": "シリアルとバージョン", "Serial No": "機台シリアル番号", "Serial Number": "シリアル番号", @@ -393,12 +475,15 @@ "Showing :from to :to of :total items": ":total 件中 :from から :to 件を表示", "Sign in to your account": "アカウントにサインイン", "Signed in as": "ログイン中", + "Slot": "貨道", "Slot Mechanism (default: Conveyor, check for Spring)": "貨道メカニズム (デフォルト:コンベア、チェックでスプリング)", + "Slot Status": "貨道效期", + "Slot Test": "テスト中", "Some fields need attention": "一部のフィールドに注意が必要です", "Special Permission": "特別権限", - "special-permission": "特別権限", "Staff Stock": "スタッフ在庫", "Status": "ステータス", + "Status / Temp / Sub / Card / Scan": "状態 / 温度 / 下位機 / カード / スキャン", "Stock Management": "在庫管理", "Store Gifts": "来店特典", "Store ID": "加盟店ID (MerchantID)", @@ -407,12 +492,15 @@ "Sub Account Management": "サブアカウント管理", "Sub Account Roles": "サブアカウントロール", "Sub Accounts": "サブアカウント", + "Sub-actions": "子項目", + "Sub-machine Status Request": "下位機状態リクエスト", "Success": "成功", "Super Admin": "スーパー管理者", "Super-admin role cannot be assigned to tenant accounts.": "スーパー管理者ロールはテナントアカウントに割り当てることはできません。", "Survey Analysis": "アンケート分析", - "SYSTEM": "システムレベル", + "System Default": "系統預設", "System Level": "システムレベル", + "System Official": "公式", "System Role": "システムロール", "System role name cannot be modified.": "システムロール名は変更できません。", "System roles cannot be deleted by tenant administrators.": "テナント管理者はシステムロールを削除できません。", @@ -422,34 +510,40 @@ "Systems Initializing": "システム初期化中", "TapPay Integration": "TapPay 統合決済", "TapPay Integration Settings Description": "TapPay 決済連携設定", + "Target": "目標", "Tax ID (Optional)": "納税者番号 (任意)", "Temperature": "温度", "TermID": "端末ID (TermID)", - "The image is too large. Please upload an image smaller than 1MB.": "画像が大きすぎます。1MB未満の画像をアップロードしてください。", "The Super Admin role cannot be deleted.": "スーパー管理者ロールは削除できません。", "The Super Admin role is immutable.": "スーパー管理者ロールは変更できません。", "The Super Admin role name cannot be modified.": "スーパー管理者のロール名は変更できません。", + "The image is too large. Please upload an image smaller than 1MB.": "画像が大きすぎます。1MB未満の画像をアップロードしてください。", "This role belongs to another company and cannot be assigned.": "このロールは他の会社に属しており、割り当てることはできません。", "Time": "時間", "Time Slots": "タイムスロット", "Timer": "タイマー", "Timestamp": "タイムスタンプ", - "to": "から", + "To": "まで", "Today Cumulative Sales": "本日累計販売", "Today's Transactions": "今日の取引額", "Total Connected": "接続数合計", "Total Customers": "顧客總數", - "Total items": "合計 :count 件", + "Total Daily Sales": "本日累計銷量", "Total Logins": "總ログイン數", + "Total Selected": "已選擇總數", + "Total Slots": "合計スロット数", + "Total items": "合計 :count 件", "Transfer Audit": "転送監査", "Transfers": "転送", + "Tutorial Page": "チュートリアル画面", "Type": "タイプ", "UI Elements": "UI要素", + "Unified Operational Timeline": "整合式營運時序圖", "Unknown": "不明", "Update": "更新", "Update Customer": "顧客を更新", - "Update existing role and permissions.": "既存のロールと権限を更新します。", "Update Password": "パスワードの更新", + "Update existing role and permissions.": "既存のロールと権限を更新します。", "Update your account's profile information and email address.": "アカウントの氏名、電話番号、メールアドレスを更新します。", "Upload New Images": "新しい写真をアップロード", "Uploading new images will replace all existing images.": "新しい写真をアップロードすると、既存のすべての写真が置き換えられます。", @@ -458,49 +552,90 @@ "Username": "ユーザー名", "Users": "ユーザー数", "Utilization Rate": "稼働率", + "Utilization Timeline": "稼動時序", + "Utilization, OEE and Operational Intelligence": "稼動率、OEE 與營運情報", "Valid Until": "有効期限", + "Vending Page": "販売画面", "Venue Management": "会場管理", "View Details": "詳細表示", "View Logs": "ログを表示", - "vs Yesterday": "前日比", + "Waiting for Payment": "決済待ち", "Warehouse List": "倉庫リスト", "Warehouse List (All)": "倉庫リスト(全)", "Warehouse List (Individual)": "倉庫リスト(個)", "Warehouse Management": "倉庫管理", "Warehouse Permissions": "倉庫管理權限", - "warehouses": "倉庫管理", "Warning": "警告", "Warning: You are editing your own role!": "警告:現在使用中のロールを編集しています!", "Welcome Gift": "会員登録特典", + "Welcome Gift Status": "来店特典", "Yesterday": "昨日", "You cannot assign permissions you do not possess.": "ご自身が所有していない権限を割り當てることはできません。", "You cannot delete your own account.": "ご自身のアカウントは削除できません。", "Your email address is unverified.": "メールアドレスが未確認です。", "Your recent account activity": "最近のアカウントアクティビティ", - "menu.data-config": "データ設定", - "menu.data-config.sub-accounts": "サブアカウント管理", - "menu.data-config.sub-account-roles": "サブアカウントロール", + "accounts": "アカウント管理", + "admin": "管理員", + "analysis": "分析管理", + "app": "APP管理", + "audit": "監査管理", + "basic-settings": "基本設定", + "basic.machines": "機台設定", + "basic.payment-configs": "客戶金流設定", + "companies": "顧客管理", + "data-config": "データ設定", + "data-config.sub-account-roles": "子帳號角色", + "data-config.sub-accounts": "子帳號管理", + "e.g. John Doe": "例:山田太郎", + "e.g. TWSTAR": "例:TWSTAR", + "e.g. Taiwan Star": "例:台湾スター", + "e.g. johndoe": "例:yamadataro", + "e.g., Company Standard Pay": "例:標準決済組合せ", + "e.g., Taipei Station": "例:台北駅", + "files selected": "ファイルを選択済み", + "items": "個の項目", + "john@example.com": "john@example.com", + "line": "Line管理", + "machines": "機台管理", + "members": "会員管理", + "menu.analysis": "データ分析", + "menu.app": "APP 運用", + "menu.audit": "監査管理", + "menu.basic": "基本管理", "menu.basic-settings": "基本設定", "menu.basic.machines": "機台設定", "menu.basic.payment-configs": "決済設定管理", - "menu.permission": "權限設定", - "menu.permissions.companies": "顧客管理", - "menu.permissions.accounts": "アカウント管理", - "menu.permissions.roles": "ロール權限管理", - "menu.members": "会員管理", - "menu.machines": "機台管理", - "menu.app": "APP 運用", - "menu.warehouses": "倉庫管理", - "menu.sales": "売上レポート", - "menu.analysis": "データ分析", - "menu.audit": "監査管理", - "menu.remote": "リモート指令", + "menu.data-config": "データ設定", + "menu.data-config.sub-account-roles": "サブアカウントロール", + "menu.data-config.sub-accounts": "サブアカウント管理", "menu.line": "LINE 設定", + "menu.machines": "機台管理", + "menu.machines.list": "機台リスト", + "menu.members": "会員管理", + "menu.permission": "權限設定", + "menu.permissions": "權限管理", + "menu.permissions.accounts": "アカウント管理", + "menu.permissions.companies": "顧客管理", + "menu.permissions.roles": "ロール權限管理", + "menu.remote": "リモート指令", "menu.reservation": "予約管理", + "menu.sales": "売上レポート", "menu.special-permission": "特殊権限", - "Edit Role Permissions": "ロール権限の編集", - "Role Identification": "ロール識別情報", - "LEVEL TYPE": "層級タイプ", - "Affiliated Unit": "所属ユニット", - "System Official": "公式" -} \ No newline at end of file + "menu.warehouses": "倉庫管理", + "of": "件中", + "permissions": "權限設定", + "permissions.accounts": "帳號管理", + "permissions.companies": "客戶管理", + "permissions.roles": "角色權限管理", + "remote": "リモート管理", + "reservation": "予約システム", + "roles": "ロール權限", + "sales": "販売管理", + "special-permission": "特別権限", + "super-admin": "超級管理員", + "to": "から", + "user": "一般用戶", + "vs Yesterday": "前日比", + "warehouses": "倉庫管理", + "待填寫": "待填寫" +} diff --git a/lang/zh_TW.json b/lang/zh_TW.json index e03c1c1..3c97c36 100644 --- a/lang/zh_TW.json +++ b/lang/zh_TW.json @@ -1,12 +1,22 @@ { "A new verification link has been sent to your email address.": "已將新的驗證連結發送至您的電子郵件地址。", - "Account created successfully.": "帳號已成功建立。", - "Account deleted successfully.": "帳號已成功刪除。", + "AI Prediction": "AI智能預測", + "API Token": "API 金鑰", + "APK Versions": "APK版本", + "APP Features": "APP功能", + "APP Management": "APP管理", + "APP Version": "APP版本號", + "APP_ID": "APP_ID", + "APP_KEY": "APP_KEY", + "Account": "帳號", "Account Management": "帳號管理", + "Account Name": "帳號姓名", "Account Settings": "帳戶設定", "Account Status": "帳號狀態", + "Account created successfully.": "帳號已成功建立。", + "Account deleted successfully.": "帳號已成功刪除。", "Account updated successfully.": "帳號已成功更新。", - "accounts": "帳號管理", + "Account:": "帳號:", "Accounts / Machines": "帳號 / 機台", "Action": "操作", "Actions": "操作", @@ -17,26 +27,16 @@ "Add Machine Model": "新增機台型號", "Add Role": "新增角色", "Admin": "管理員", - "admin": "管理員", - "Admin display name": "管理員顯示名稱", "Admin Name": "管理員姓名", - "Account Name": "帳號姓名", - "Account": "帳號", - "Account:": "帳號:", - "Manage Account Access": "管理帳號存取", - "Assigned Machines": "授權機台", - "No machines assigned": "未分配機台", - "Available Machines": "可供分配的機台", - "Loading machines...": "正在載入機台...", - "No machines available in this company.": "此客戶目前沒有可供分配的機台。", - "Saving...": "儲存中...", - "Save Permissions": "儲存權限", + "Admin Page": "管理頁", "Admin Sellable Products": "管理者可賣", + "Admin display name": "管理員顯示名稱", "Administrator": "管理員", "Advertisement Management": "廣告管理", + "Affiliated Unit": "所屬單位", "Affiliation": "所屬單位", - "AI Prediction": "AI智能預測", "Alert Summary": "告警摘要", + "Alerts": "中心告警", "Alerts Pending": "待處理告警", "All": "全部", "All Affiliations": "全部單位", @@ -44,16 +44,10 @@ "All Levels": "所有層級", "All Machines": "所有機台", "All Times System Timezone": "所有時間為系統時區", - "analysis": "分析管理", + "An error occurred while saving.": "儲存時發生錯誤。", "Analysis Management": "分析管理", "Analysis Permissions": "分析管理權限", - "API Token": "API 金鑰", - "APK Versions": "APK版本", - "app": "APP 管理", - "APP Features": "APP功能", - "APP Management": "APP管理", - "APP_ID": "APP_ID", - "APP_KEY": "APP_KEY", + "Apply to all identical products in this machine": "同步套用至此機台內的所有相同商品", "Are you sure to delete this customer?": "您確定要刪除此客戶嗎?", "Are you sure you want to delete this account?": "您確定要刪除此帳號嗎?", "Are you sure you want to delete this account? This action cannot be undone.": "確定要刪除此帳號嗎?此操作無法復原。", @@ -64,20 +58,26 @@ "Are you sure you want to delete your account?": "您確定要刪除您的帳號嗎?", "Are you sure you want to proceed? This action cannot be undone.": "您確定要繼續嗎?此操作將無法復原。", "Are you sure?": "確定要執行此操作嗎?", - "audit": "稽核管理", + "Assign": "分配所屬機台", + "Assign Machines": "分配機台", + "Assigned Machines": "授權機台", "Audit Management": "稽核管理", "Audit Permissions": "稽核管理權限", + "Authorized Machines": "授權機台", + "Availability": "可用性 (Availability)", + "Available Machines": "可供分配的機台", "Avatar updated successfully.": "頭像已成功更新。", "Badge Settings": "識別證", "Basic Information": "基本資訊", "Basic Settings": "基本設定", - "basic-settings": "基本設定", + "Batch No": "批號", "Belongs To": "所屬公司", "Belongs To Company": "所屬公司", "Cancel": "取消", + "Cancel Purchase": "取消購買", + "Cannot Delete Role": "無法刪除該角色", "Cannot delete company with active accounts.": "無法刪除仍有帳號的客戶", "Cannot delete model that is currently in use by machines.": "無法刪除目前正在被機台使用的型號。", - "Cannot Delete Role": "無法刪除該角色", "Cannot delete role with active users.": "無法刪除已有綁定帳號的角色。", "Card Reader": "刷卡機", "Card Reader No": "刷卡機編號", @@ -89,11 +89,11 @@ "ChannelSecret": "ChannelSecret", "Checkout Time 1": "卡機結帳時間1", "Checkout Time 2": "卡機結帳時間2", + "Clear Filter": "清除篩選", "Clear Stock": "庫存清空", "Click here to re-send the verification email.": "點擊此處重新發送驗證郵件。", "Click to upload": "點擊上傳", "Close Panel": "關閉面板", - "companies": "客戶管理", "Company": "所屬客戶", "Company Code": "公司代碼", "Company Information": "公司資訊", @@ -106,6 +106,7 @@ "Confirm Password": "確認新密碼", "Connecting...": "連線中", "Connectivity Status": "連線狀態概況", + "Connectivity vs Sales Correlation": "連線狀態與銷售關聯分析", "Contact & Details": "聯絡資訊與詳情", "Contact Email": "聯絡人信箱", "Contact Name": "聯絡人姓名", @@ -113,24 +114,24 @@ "Contract Until (Optional)": "合約到期日 (選填)", "Coupons": "優惠券", "Create": "建立", - "Create a new role and assign permissions.": "建立新角色並分配對應權限。", "Create Config": "建立配置", "Create Machine": "新增機台", "Create Payment Config": "新增金流配置", "Create Role": "建立角色", + "Create a new role and assign permissions.": "建立新角色並分配對應權限。", + "Critical": "嚴重", "Current Password": "當前密碼", "Current Stock": "當前庫存", - "Customer created successfully.": "客戶新增成功", - "Customer deleted successfully.": "客戶刪除成功", "Customer Info": "客戶資訊", "Customer Management": "客戶管理", "Customer Payment Config": "客戶金流設定", + "Customer created successfully.": "客戶新增成功", + "Customer deleted successfully.": "客戶刪除成功", "Customer updated successfully.": "客戶更新成功", "Danger Zone: Delete Account": "危險區域:刪除帳號", "Dashboard": "儀表板", "Data Configuration": "資料設定", "Data Configuration Permissions": "資料設定權限", - "data-config": "資料設定", "Day Before": "前日", "Default Donate": "預設捐贈", "Default Not Donate": "預設不捐贈", @@ -140,15 +141,14 @@ "Delete Account": "刪除帳號", "Delete Permanently": "確認永久刪除資料", "Deposit Bonus": "儲值回饋", + "Deselect All": "取消全選", "Detail": "詳細", + "Device Status Logs": "設備狀態紀錄", "Disabled": "已停用", "Discord Notifications": "Discord通知", - "e.g. John Doe": "例如:張曉明", - "e.g. johndoe": "例如:xiaoming", - "e.g. Taiwan Star": "例如:台灣之星", - "e.g. TWSTAR": "例如:TWSTAR", - "e.g., Company Standard Pay": "例如:公司標準支付", - "e.g., Taipei Station": "例如:台北車站", + "Dispense Failed": "出貨失敗", + "Dispense Success": "出貨成功", + "Dispensing": "出貨", "E.SUN QR Scan": "玉山銀行標籤支付", "E.SUN QR Scan Settings Description": "玉山銀行掃碼支付設定", "EASY_MERCHANT_ID": "悠遊付 商店代號", @@ -157,12 +157,15 @@ "Edit": "編輯", "Edit Account": "編輯帳號", "Edit Customer": "編輯客戶", + "Edit Expiry": "編輯效期", "Edit Machine": "編輯機台", "Edit Machine Model": "編輯機台型號", "Edit Machine Settings": "編輯機台設定", "Edit Payment Config": "編輯金流配置", "Edit Role": "編輯角色", + "Edit Role Permissions": "編輯角色權限", "Edit Settings": "編輯設定", + "Edit Sub Account Role": "編輯子帳號角色", "Email": "電子郵件", "Enabled/Disabled": "啟用/停用", "Ensure your account is using a long, random password to stay secure.": "確保您的帳號使用了足夠強度的隨機密碼以維持安全。", @@ -173,14 +176,23 @@ "Enter role name": "請輸入角色名稱", "Enter serial number": "請輸入機台序號", "Enter your password to confirm": "請輸入您的密碼以確認", + "Equipment efficiency and OEE metrics": "設備效能與 OEE 綜合指標", "Error": "異常", + "Expired": "已過期", "Expired / Disabled": "已過期 / 停用", + "Expiry Date": "有效日期", "Expiry Management": "效期管理", + "Failed to fetch machine data.": "無法取得機台資料。", + "Failed to save permissions.": "無法儲存權限設定。", "Failed to update machine images: ": "更新機台圖片失敗:", - "files selected": "個檔案已選擇", "Firmware Version": "韌體版本", + "Fleet Avg OEE": "全機隊平均 OEE", + "Fleet Performance": "全機隊效能", + "From": "從", + "Full Access": "全機台授權", "Full Name": "全名", "Games": "互動遊戲", + "General permissions not linked to a specific menu.": "未連結到特定選單的一般權限。", "Gift Definitions": "禮品設定", "Global roles accessible by all administrators.": "適用於所有管理者的全域角色。", "Got it": "知道了", @@ -193,66 +205,76 @@ "Heating Range": "加熱時段", "Heating Start Time": "開啟-加熱時間", "Helper": "小幫手", + "Home Page": "主頁面", "Info": "一般", "Initial Admin Account": "初始管理帳號", "Initial Role": "初始角色", "Invoice Status": "發票開立狀態", - "items": "筆項目", "Items": "個項目", "JKO_MERCHANT_ID": "街口支付 商店代號", - "john@example.com": "john@example.com", "Joined": "加入日期", "Key": "金鑰 (Key)", "Key No": "鑰匙編號", + "LEVEL TYPE": "層級類型", + "LINE Pay Direct": "LINE Pay 官方直連", + "LINE Pay Direct Settings Description": "LINE Pay 官方直連設定", + "LINE_MERCHANT_ID": "LINE Pay 商店代號", + "LIVE": "實時", "Last Heartbeat": "最後心跳時間", + "Last Page": "最後頁面", "Last Signal": "最後訊號時間", + "Last Time": "最後時間", "Last Updated": "最後更新日期", "Level": "層級", - "line": "Line 管理", "Line Coupons": "Line優惠券", "Line Machines": "Line機台", "Line Management": "Line管理", "Line Members": "Line會員", "Line Official Account": "Line生活圈", "Line Orders": "Line訂單", - "LINE Pay Direct": "LINE Pay 官方直連", - "LINE Pay Direct Settings Description": "LINE Pay 官方直連設定", "Line Permissions": "Line 管理權限", "Line Products": "Line商品", - "LINE_MERCHANT_ID": "LINE Pay 商店代號", - "LIVE": "實時", + "Loading machines...": "正在載入機台...", + "Loading...": "載入中...", "Location": "位置", + "Locked Page": "鎖定頁", "Login History": "登入歷史", "Logout": "登出", "Logs": "日誌", "Machine Count": "機台數量", - "Machine created successfully.": "機台已成功建立。", "Machine Details": "機台詳情", "Machine Images": "機台照片", - "Machine images updated successfully.": "機台圖片已成功更新。", "Machine Info": "機台資訊", + "Machine Information": "機台資訊", "Machine List": "機台列表", + "Machine Login Logs": "機台登入紀錄", "Machine Logs": "機台日誌", "Machine Management": "機台管理", "Machine Management Permissions": "機台管理權限", "Machine Model": "機台型號", - "Machine model created successfully.": "機台型號已成功建立。", - "Machine model deleted successfully.": "機台型號已成功刪除。", "Machine Model Settings": "機台型號設定", - "Machine model updated successfully.": "機台型號已成功更新。", "Machine Name": "機台名稱", "Machine Permissions": "授權機台", "Machine Reports": "機台報表", "Machine Restart": "機台重啟", "Machine Settings": "機台設定", - "Machine settings updated successfully.": "機台設定已成功更新。", + "Machine Status": "機台狀態", "Machine Status List": "機台運行狀態列表", "Machine Stock": "機台庫存", - "machines": "機台管理", + "Machine created successfully.": "機台已成功建立。", + "Machine images updated successfully.": "機台圖片已成功更新。", + "Machine model created successfully.": "機台型號已成功建立。", + "Machine model deleted successfully.": "機台型號已成功刪除。", + "Machine model updated successfully.": "機台型號已成功更新。", + "Machine settings updated successfully.": "機台設定已成功更新。", "Machines": "機台列表", + "Machines Online": "在線機台數", "Maintenance Records": "維修管理單", + "Manage Account Access": "管理帳號存取", + "Manage Expiry": "進入效期管理", "Manage administrative and tenant accounts": "管理系統管理者與租戶帳號", "Manage all tenant accounts and validity": "管理所有租戶帳號與合約效期", + "Manage your machine fleet and operational data": "管理您的機台群組與營運數據", "Manage your profile information, security settings, and login history": "管理您的個人資訊、安全設定與登入紀錄", "Management of operational parameters": "機台運作參數管理", "Management of operational parameters and models": "管理運作參數與型號", @@ -261,26 +283,28 @@ "Member List": "會員列表", "Member Management": "會員管理", "Member System": "會員系統", - "members": "會員管理", "Membership Tiers": "會員等級", "Menu Permissions": "選單權限", "Merchant IDs": "特店代號清單", "Merchant payment gateway settings management": "特約商店支付網關參數管理", "Message": "訊息", "Message Content": "日誌內容", + "Message Display": "訊息顯示", "Min 8 characters": "至少 8 個字元", "Model": "機台型號", "Model Name": "型號名稱", "Models": "型號列表", "Modifying your own administrative permissions may result in losing access to certain system functions.": "修改自身管理權限可能導致失去對部分系統功能的控制權。", "Monitor events and system activity across your vending fleet.": "跨機台連線動態與系統日誌監控。", - "Monthly cumulative revenue overview": "本月累計營收概況", "Monthly Transactions": "本月交易統計", + "Monthly cumulative revenue overview": "本月累計營收概況", "Name": "姓名", "Never Connected": "從未連線", "New Password": "新密碼", "New Password (leave blank to keep current)": "新密碼 (若不修改請留空)", + "New Sub Account Role": "新增子帳號角色", "Next": "下一頁", + "No Invoice": "不開立發票", "No accounts found": "找不到帳號資料", "No alert summary": "暫無告警記錄", "No configurations found": "暫無相關配置", @@ -288,36 +312,51 @@ "No data available": "暫無資料", "No file uploaded.": "未上傳任何檔案。", "No images uploaded": "尚未上傳照片", - "No Invoice": "不開立發票", "No location set": "尚未設定位置", "No login history yet": "尚無登入紀錄", "No logs found": "暫無相關日誌", + "No machines assigned": "未分配機台", + "No machines available": "目前沒有可供分配的機台", + "No machines available in this company.": "此客戶目前沒有可供分配的機台。", "No matching logs found": "找不到符合條件的日誌", "No permissions": "無權限項目", "No roles found.": "找不到角色資料。", + "No slots found": "未找到貨道資訊", "No users found": "找不到用戶資料", "None": "無", + "Normal": "正常", "Not Used": "不使用", "Not Used Description": "不使用第三方支付介接", "Notes": "備註", - "of": "總計", + "OEE Score": "OEE 綜合得分", + "OEE.Activity": "營運活動", + "OEE.Errors": "異常", + "OEE.Hours": "小時", + "OEE.Orders": "訂單", + "OEE.Sales": "銷售", "Offline": "離線", "Offline Machines": "離線機台", "Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.": "一旦您的帳號被刪除,其所有資源和數據將被永久刪除。在刪除帳號之前,請下載您希望保留的任何數據或資訊。", "Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.": "帳號一旦刪除,所有關連數據將被永久移除。請輸入您的密碼以確認您希望永久刪除此帳號。", "Online": "線上", + "Online Duration": "累積連線時數", "Online Machines": "在線機台", "Only system roles can be assigned to platform administrative accounts.": "僅系統角色可指派給平台管理帳號。", "Operational Parameters": "運作參數", "Operations": "運作設定", + "Optimal": "良好", "Optimized for display. Supported formats: JPG, PNG, WebP.": "已針對顯示進行優化。支援格式:JPG, PNG, WebP。", "Optional": "選填", "Order Management": "訂單管理", "Orders": "購買單", + "Other Permissions": "其他權限", "Others": "其他功能", "Owner": "所屬公司", - "Parameters": "參數設定", "PARTNER_KEY": "PARTNER_KEY", + "PI_MERCHANT_ID": "Pi 拍錢包 商店代號", + "PS_MERCHANT_ID": "全盈+Pay 商店代號", + "Parameters": "參數設定", + "Pass Code": "通行碼", "Pass Codes": "通行碼", "Password": "密碼", "Password updated successfully.": "密碼已成功變更。", @@ -328,17 +367,20 @@ "Payment Configuration created successfully.": "金流設定已成功建立。", "Payment Configuration deleted successfully.": "金流設定已成功刪除。", "Payment Configuration updated successfully.": "金流設定已成功更新。", + "Payment Selection": "付款選擇", + "Pending": "待核效期", + "Performance": "效能 (Performance)", "Permanent": "永久授權", "Permanently Delete Account": "永久刪除帳號", "Permission Settings": "權限設定", "Permissions": "權限", - "permissions": "權限設定", "Phone": "手機號碼", "Photo Slot": "照片欄位", - "PI_MERCHANT_ID": "Pi 拍錢包 商店代號", + "Pickup Code": "取貨碼", "Pickup Codes": "取貨碼", "Please check the following errors:": "請檢查以下錯誤:", "Please check the form for errors.": "請檢查欄位內容是否正確。", + "Please select a machine to view metrics": "請選擇機台以查看數據", "Point Rules": "點數規則", "Point Settings": "點數設定", "Previous": "上一頁", @@ -351,16 +393,21 @@ "Profile updated successfully.": "個人資料已成功更新。", "Promotions": "促銷時段", "Protected": "受保護", - "PS_MERCHANT_ID": "全盈+Pay 商店代號", "Purchase Audit": "採購單", + "Purchase Finished": "購買結束", "Purchases": "採購單", + "Purchasing": "購買中", + "Quality": "品質 (Quality)", "Questionnaire": "問卷", + "Quick Expiry Check": "效期快速檢查", + "Quick Select": "快速選取", "Quick search...": "快速搜尋...", - "Real-time monitoring across all machines": "跨機台即時狀態監控", + "Real-time OEE analysis awaits": "即時 OEE 分析預備中", "Real-time Operation Logs (Last 50)": "即時操作日誌 (最後 50 筆)", + "Real-time monitoring across all machines": "跨機台即時狀態監控", "Real-time status monitoring": "即時監控機台連線動態", + "Receipt Printing": "收據簽單", "Recent Login": "最近登入", - "remote": "遠端管理", "Remote Change": "遠端找零", "Remote Checkout": "遠端結帳", "Remote Dispense": "遠端出貨", @@ -368,46 +415,58 @@ "Remote Management": "遠端管理", "Remote Permissions": "遠端管理權限", "Replenishment Audit": "補貨單", + "Replenishment Page": "補貨頁", "Replenishment Records": "機台補貨紀錄", "Replenishments": "機台補貨單", - "reservation": "預約系統", "Reservation Members": "預約會員", "Reservation System": "預約系統", "Reservations": "預約管理", "Returns": "回庫單", + "Risk": "風險狀態", "Role": "角色", - "Role created successfully.": "角色已成功建立。", - "Role deleted successfully.": "角色已成功刪除。", + "Role Identification": "角色識別資訊", "Role Management": "角色權限管理", "Role Name": "角色名稱", - "Role name already exists in this company.": "該公司已存在相同名稱的角色。", - "Role not found.": "角色不存在。", "Role Permissions": "角色權限", "Role Settings": "角色權限", "Role Type": "角色類型", + "Role created successfully.": "角色已成功建立。", + "Role deleted successfully.": "角色已成功刪除。", + "Role name already exists in this company.": "該公司已存在相同名稱的角色。", + "Role not found.": "角色不存在。", "Role updated successfully.": "角色已成功更新。", "Roles": "角色權限", - "roles": "角色權限", "Roles scoped to specific customer companies.": "適用於各個客戶單位的特定角色。", "Running Status": "運行狀態", + "SYSTEM": "系統層級", "Sales": "銷售管理", - "sales": "銷售管理", + "Sales Activity": "銷售活動", "Sales Management": "銷售管理", "Sales Permissions": "銷售管理權限", "Sales Records": "銷售紀錄", "Save": "儲存變更", "Save Changes": "儲存變更", "Save Config": "儲存配置", + "Save Permissions": "儲存權限", "Saved.": "已儲存", + "Saving...": "儲存中...", + "Scale level and access control": "層級與存取控制", "Search configurations...": "搜尋設定...", "Search customers...": "搜尋客戶...", + "Search machines by name or serial...": "搜尋機台名稱或序號...", "Search machines...": "搜尋機台...", "Search models...": "搜尋型號...", "Search roles...": "搜尋角色...", "Search users...": "搜尋用戶...", + "Select All": "全選", "Select Company": "選擇所屬公司", + "Select Machine": "選擇機台", + "Select Machine to view metrics": "請選擇機台以查看指標", "Select Model": "選擇型號", "Select Owner": "選擇所屬公司", + "Select a machine to deep dive": "請選擇機台以開始深度分析", + "Selected": "已選擇", + "Selected Date": "查詢日期", "Serial & Version": "序號與版本", "Serial No": "機台序號", "Serial Number": "機台序號", @@ -416,12 +475,15 @@ "Showing :from to :to of :total items": "顯示第 :from 到 :to 項,共 :total 項", "Sign in to your account": "隨時隨地掌控您的業務。", "Signed in as": "登入身份", + "Slot": "貨道", "Slot Mechanism (default: Conveyor, check for Spring)": "貨道機制 (預設履帶,勾選為彈簧)", + "Slot Status": "貨道效期", + "Slot Test": "貨道測試", "Some fields need attention": "部分欄位需要注意", "Special Permission": "特殊權限", - "special-permission": "特殊權限", "Staff Stock": "人員庫存", "Status": "狀態", + "Status / Temp / Sub / Card / Scan": "狀態 / 溫度 / 下位機 / 刷卡機 / 掃碼機", "Stock Management": "庫存管理單", "Store Gifts": "來店禮", "Store ID": "商店代號", @@ -430,13 +492,15 @@ "Sub Account Management": "子帳號管理", "Sub Account Roles": "子帳號角色", "Sub Accounts": "子帳號", + "Sub-actions": "子項目", + "Sub-machine Status Request": "下位機狀態回傳", "Success": "成功", "Super Admin": "超級管理員", - "super-admin": "超級管理員", "Super-admin role cannot be assigned to tenant accounts.": "超級管理員角色無法指派給租戶帳號。", "Survey Analysis": "問卷分析", - "SYSTEM": "系統層級", + "System Default": "系統預設", "System Level": "系統層級", + "System Official": "系統層", "System Role": "系統角色", "System role name cannot be modified.": "內建系統角色的名稱無法修改。", "System roles cannot be deleted by tenant administrators.": "租戶管理員無法刪除系統角色。", @@ -446,115 +510,132 @@ "Systems Initializing": "系統初始化中", "TapPay Integration": "TapPay 支付串接", "TapPay Integration Settings Description": "喬睿科技支付串接設定", + "Target": "目標", "Tax ID (Optional)": "統一編號 (選填)", "Temperature": "溫度", "TermID": "終端代號 (TermID)", - "The image is too large. Please upload an image smaller than 1MB.": "圖片檔案太大,請上傳小於 1MB 的圖片。", "The Super Admin role cannot be deleted.": "超級管理員角色不可刪除。", "The Super Admin role is immutable.": "超級管理員角色不可修改。", "The Super Admin role name cannot be modified.": "超級管理員角色的名稱無法修改。", + "The image is too large. Please upload an image smaller than 1MB.": "圖片檔案太大,請上傳小於 1MB 的圖片。", "This role belongs to another company and cannot be assigned.": "此角色屬於其他公司,無法指派。", "Time": "時間", "Time Slots": "時段組合", "Timer": "計時器", "Timestamp": "時間戳記", - "to": "至", + "To": "至", "Today Cumulative Sales": "今日累積銷售", "Today's Transactions": "今日交易額", "Total Connected": "總計連線數", "Total Customers": "客戶總數", - "Total items": "總計 :count 項", + "Total Daily Sales": "本日累計銷量", "Total Logins": "總登入次數", + "Total Selected": "已選擇總數", + "Total Slots": "總貨道數", + "Total items": "總計 :count 項", "Transfer Audit": "調撥單", "Transfers": "調撥單", + "Tutorial Page": "教學頁", "Type": "類型", "UI Elements": "UI元素", + "Unified Operational Timeline": "整合式營運時序圖", "Unknown": "未知", "Update": "更新", "Update Customer": "更新客戶", - "Update existing role and permissions.": "更新現有角色與權限設定。", "Update Password": "更改密碼", + "Update existing role and permissions.": "更新現有角色與權限設定。", "Update your account's profile information and email address.": "更新您的帳號姓名、手機號碼與電子郵件地址。", "Upload New Images": "上傳新照片", "Uploading new images will replace all existing images.": "上傳新照片將會取代所有現有照片。", "User": "一般用戶", - "user": "一般用戶", "User Info": "用戶資訊", "Username": "使用者帳號", "Users": "帳號數", "Utilization Rate": "機台稼動率", + "Utilization Timeline": "稼動時序", + "Utilization, OEE and Operational Intelligence": "稼動率、OEE 與營運情報", "Valid Until": "合約到期日", + "Vending Page": "販賣頁", "Venue Management": "場地管理", "View Details": "查看詳情", "View Logs": "查看日誌", - "vs Yesterday": "較昨日", + "Waiting for Payment": "等待付款", "Warehouse List": "倉庫清單", "Warehouse List (All)": "倉庫列表(全)", "Warehouse List (Individual)": "倉庫列表(個)", "Warehouse Management": "倉庫管理", "Warehouse Permissions": "倉庫管理權限", - "warehouses": "倉庫管理", - "Warning": "警告", + "Warning": "即將過期", "Warning: You are editing your own role!": "警告:您正在編輯目前使用的角色!", "Welcome Gift": "註冊成效禮", + "Welcome Gift Status": "來店禮", "Yesterday": "昨日", "You cannot assign permissions you do not possess.": "您無法指派您自身不具備的權限。", "You cannot delete your own account.": "您無法刪除自己的帳號。", "Your email address is unverified.": "您的電子郵件地址尚未驗證。", "Your recent account activity": "最近的帳號活動", - "menu.members": "會員管理", - "menu.machines": "機台管理", - "menu.app": "APP 運維", - "menu.warehouses": "倉儲管理", - "menu.sales": "銷售報表", + "accounts": "帳號管理", + "admin": "管理員", + "analysis": "分析管理", + "app": "APP 管理", + "audit": "稽核管理", + "basic-settings": "基本設定", + "basic.machines": "機台設定", + "basic.payment-configs": "客戶金流設定", + "companies": "客戶管理", + "data-config": "資料設定", + "data-config.sub-account-roles": "子帳號角色", + "data-config.sub-accounts": "子帳號管理", + "e.g. John Doe": "例如:張曉明", + "e.g. TWSTAR": "例如:TWSTAR", + "e.g. Taiwan Star": "例如:台灣之星", + "e.g. johndoe": "例如:xiaoming", + "e.g., Company Standard Pay": "例如:公司標準支付", + "e.g., Taipei Station": "例如:台北車站", + "files selected": "個檔案已選擇", + "items": "筆項目", + "john@example.com": "john@example.com", + "line": "Line 管理", + "machines": "機台管理", + "members": "會員管理", "menu.analysis": "數據分析", + "menu.app": "APP 運維", "menu.audit": "審核管理", - "menu.remote": "遠端指令", - "menu.line": "LINE 配置", - "menu.reservation": "預約管理", - "menu.special-permission": "特殊權限", - "menu.data-config": "資料設定", - "menu.data-config.sub-accounts": "子帳號管理", - "menu.data-config.sub-account-roles": "子帳號角色", "menu.basic": "基本管理", "menu.basic-settings": "基本設定", "menu.basic.machines": "機台設定", "menu.basic.payment-configs": "客戶金流設定", + "menu.data-config": "資料設定", + "menu.data-config.sub-account-roles": "子帳號角色", + "menu.data-config.sub-accounts": "子帳號管理", + "menu.line": "LINE 配置", + "menu.machines": "機台管理", + "menu.machines.list": "機台列表", + "menu.members": "會員管理", "menu.permission": "權限設定", "menu.permissions": "權限管理", - "menu.permissions.companies": "客戶管理", "menu.permissions.accounts": "帳號管理", + "menu.permissions.companies": "客戶管理", "menu.permissions.roles": "角色權限管理", - "Select All": "全選", - "Deselect All": "取消全選", - "Sub-actions": "子項目", - "Quick Select": "快速選取", - "Total Selected": "已選擇總數", - "Scale level and access control": "層級與存取控制", - "Edit Role Permissions": "編輯角色權限", - "Role Identification": "角色識別資訊", - "LEVEL TYPE": "層級類型", - "Affiliated Unit": "所屬單位", - "System Official": "系統層", - "Other Permissions": "其他權限", - "General permissions not linked to a specific menu.": "未連結到特定選單的一般權限。", - "Assign Machines": "分配機台", - "data-config.sub-accounts": "子帳號管理", - "data-config.sub-account-roles": "子帳號角色", - "basic.machines": "機台設定", - "basic.payment-configs": "客戶金流設定", - "permissions.companies": "客戶管理", + "menu.remote": "遠端指令", + "menu.reservation": "預約管理", + "menu.sales": "銷售報表", + "menu.special-permission": "特殊權限", + "menu.warehouses": "倉儲管理", + "of": "總計", + "permissions": "權限設定", "permissions.accounts": "帳號管理", + "permissions.companies": "客戶管理", "permissions.roles": "角色權限管理", - "Edit Sub Account Role": "編輯子帳號角色", - "New Sub Account Role": "新增子帳號角色", - "Full Access": "全機台授權", - "System Default": "系統預設", - "Authorized Machines": "授權機台", - "Assign": "分配所屬機台", - "No machines available": "目前沒有可供分配的機台", - "Selected": "已選擇", - "Failed to fetch machine data.": "無法取得機台資料。", - "Failed to save permissions.": "無法儲存權限設定。", - "An error occurred while saving.": "儲存時發生錯誤。" -} \ No newline at end of file + "remote": "遠端管理", + "reservation": "預約系統", + "roles": "角色權限", + "sales": "銷售管理", + "special-permission": "特殊權限", + "super-admin": "超級管理員", + "to": "至", + "user": "一般用戶", + "vs Yesterday": "較昨日", + "warehouses": "倉庫管理", + "待填寫": "待填寫" +} diff --git a/resources/views/admin/machines/index.blade.php b/resources/views/admin/machines/index.blade.php index 45997ce..c2570ea 100644 --- a/resources/views/admin/machines/index.blade.php +++ b/resources/views/admin/machines/index.blade.php @@ -1,91 +1,992 @@ @extends('layouts.admin') -@section('header') -
+ {{ __('Manage your machine fleet and operational data') }} +
+| + {{ __('Machine Information') }} | ++ {{ __('Status / Temp / Sub / Card / Scan') }} | ++ {{ __('Last Page') }} | ++ {{ __('APP Version') }} | ++ {{ __('Last Time') }} | ++ {{ __('Actions') }} | +
|---|---|---|---|---|---|
| id }}', '{{ $machine->serial_no }}', '{{ addslashes($machine->name) }}')">
+
+
+
+ @if(isset($machine->image_urls[0]))
+
+
+
+
+ {{ $machine->name }}
+
+
+
+ {{ $machine->serial_no ?: '--' }}
+
+
+ |
+
+
+ @if($machine->status === 'online')
+
+
+
+ @elseif($machine->status === 'error')
+
+
+
+
+ {{
+ __('Online') }}
+
+
+ {{
+ __('Error') }}
+
+ @else
+
+
+ {{
+ __('Offline') }}
+
+ @endif
+
+ |
+ {{
+ $machine->temperature ?? '--' }}°C
+ |
+
+
+
+ {{
+ __('Normal') }}
+
+
+
+ {{
+ __('Normal') }}
+
+
+
+ {{
+ __('Normal') }}
+
+ |
+ + {{ $machine->current_page_label ?: '-' }} + | ++ {{ $machine->firmware_version ?: '-' }} + | ++ {{ $machine->last_heartbeat_at ? $machine->last_heartbeat_at->format('Y-m-d H:i:s') : '-' }} + | +
+
+
+
+
+
+
+ |
+
| + {{ __('Machine Information') }} | ++ {{ __('Total Slots') }} | ++ {{ __('Expired') }} | ++ {{ __('Warning') }} | ++ {{ __('Pending') }} | ++ {{ __('Risk') }} | ++ {{ __('Actions') }} | +
|---|---|---|---|---|---|---|
|
+ id }}')">
+
+
+ @if(isset($machine->image_urls[0]))
+
+
+
+
+
+
+ {{ $machine->name }}
+
+ {{ $machine->serial_no }}
+
+ |
+ + {{ + $machine->total_slots }} + | +
+
+ {{ $machine->expired_count }}
+
+ |
+
+
+ {{ $machine->warning_count }}
+
+ |
+
+
+ {{ $machine->pending_count }}
+
+ |
+ + @if($machine->expired_count > 0) + + + {{ __('Critical') }} + + @elseif($machine->warning_count > 0) + + + {{ __('Warning') }} + + @else + + + {{ __('Optimal') }} + + @endif + | +
+
+
+
+ |
+
{{ __('Monitor events and system activity across your vending fleet.') }}
-| {{ __('Timestamp') }} | -{{ __('Machine') }} | -{{ __('Level') }} | -{{ __('Message Content') }} | -
|---|---|---|---|
|
-
- {{ $log->created_at->format('Y-m-d') }}
-
-
- {{ $log->created_at->format('H:i:s') }}
-
- |
- - - - {{ $log->machine->name ?? __('Unknown') }} - - - - | -- @php - $badgeStyles = [ - 'info' => 'bg-cyan-500/10 text-cyan-600 dark:text-cyan-400 border-cyan-500/20', - 'warning' => 'bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/20', - 'error' => 'bg-rose-500/10 text-rose-600 dark:text-rose-400 border-rose-500/20', - ]; - $currentStyle = $badgeStyles[$log->level] ?? 'bg-slate-500/10 text-slate-600 border-slate-500/20'; - @endphp - - - {{ __(ucfirst($log->level)) }} - - | -
- - {{ $log->message }} - - @if($log->context) -
-
- @endif
- {{ json_encode($log->context, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) }}
- |
-
|
-
-
-
-
-
- {{ __('No matching logs found') }}
- |
- |||
{{ __('Last Heartbeat') }}
{{ $machine->last_heartbeat_at ?? __('N/A') }}
{{ __('Current Page') }}
++ {{ $machine->current_page_label ?: '-' }} +
+{{ __('Utilization, OEE and Operational Intelligence') }}
++ + {{ __('Fleet Avg OEE') }} +
++ + {{ __('Machines Online') }} +
++ + {{ __('Total Daily Sales') }} +
+{{ __('Connectivity vs Sales Correlation') }}
+{{ __('Real-time OEE analysis awaits') }}
+