[FIX] 整合機台效期管理功能並優化 UI 比例
All checks were successful
star-cloud-deploy-demo / deploy-demo (push) Successful in 1m2s
All checks were successful
star-cloud-deploy-demo / deploy-demo (push) Successful in 1m2s
- 修正 Alpine.js 作用域問題,恢復效期編輯彈窗功能 - 整合機台日誌與效期管理至主列表頁 (Index) - 優化大螢幕貨道格線佈局,解決日期折行問題 - 縮小彈窗字體與內距,調整為極簡奢華風 UI - 新增貨道效期與批號欄位之 Migration 與模型關聯 - 補齊中、英、日三語系翻譯檔
This commit is contained in:
@@ -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)」。
|
||||
|
||||
@@ -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
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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)
|
||||
*/
|
||||
|
||||
37
app/Jobs/Machine/ProcessRestockReport.php
Normal file
37
app/Jobs/Machine/ProcessRestockReport.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace App\Jobs\Machine;
|
||||
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Queue\Queueable;
|
||||
|
||||
class ProcessRestockReport implements ShouldQueue
|
||||
{
|
||||
use Queueable;
|
||||
|
||||
protected $data;
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
public function __construct(array $data)
|
||||
{
|
||||
$this->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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -12,8 +12,10 @@ class MachineLog extends Model
|
||||
const UPDATED_AT = null;
|
||||
|
||||
protected $fillable = [
|
||||
'company_id',
|
||||
'machine_id',
|
||||
'level',
|
||||
'type',
|
||||
'message',
|
||||
'context',
|
||||
];
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('machine_logs', function (Blueprint $table) {
|
||||
$table->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']);
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('machine_slots', function (Blueprint $table) {
|
||||
$table->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']);
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -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',
|
||||
|
||||
316
lang/en.json
316
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..."
|
||||
"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"
|
||||
}
|
||||
309
lang/ja.json
309
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": "公式"
|
||||
"menu.warehouses": "倉庫管理",
|
||||
"of": "件中",
|
||||
"permissions": "權限設定",
|
||||
"permissions.accounts": "帳號管理",
|
||||
"permissions.companies": "客戶管理",
|
||||
"permissions.roles": "角色權限管理",
|
||||
"remote": "リモート管理",
|
||||
"reservation": "予約システム",
|
||||
"roles": "ロール權限",
|
||||
"sales": "販売管理",
|
||||
"special-permission": "特別権限",
|
||||
"super-admin": "超級管理員",
|
||||
"to": "から",
|
||||
"user": "一般用戶",
|
||||
"vs Yesterday": "前日比",
|
||||
"warehouses": "倉庫管理",
|
||||
"待填寫": "待填寫"
|
||||
}
|
||||
331
lang/zh_TW.json
331
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.": "儲存時發生錯誤。"
|
||||
"remote": "遠端管理",
|
||||
"reservation": "預約系統",
|
||||
"roles": "角色權限",
|
||||
"sales": "銷售管理",
|
||||
"special-permission": "特殊權限",
|
||||
"super-admin": "超級管理員",
|
||||
"to": "至",
|
||||
"user": "一般用戶",
|
||||
"vs Yesterday": "較昨日",
|
||||
"warehouses": "倉庫管理",
|
||||
"待填寫": "待填寫"
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,129 +0,0 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', __('Machine Logs'))
|
||||
|
||||
@section('content')
|
||||
<div class="space-y-10 pb-20">
|
||||
<!-- Header -->
|
||||
<div class="flex flex-col md:flex-row md:items-center md:justify-between gap-6">
|
||||
<div>
|
||||
<h1 class="text-3xl font-black text-slate-800 dark:text-white tracking-tight font-display">{{ __('Machine Logs') }}</h1>
|
||||
<p class="text-sm font-bold text-slate-500 dark:text-slate-400 mt-1 uppercase tracking-widest">{{ __('Monitor events and system activity across your vending fleet.') }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Machine Logs Content (Integrated Card - Same as Roles) -->
|
||||
<div class="luxury-card rounded-3xl p-8 animate-luxury-in">
|
||||
<!-- Toolbar (Integrated Filters) -->
|
||||
<div class="flex flex-col md:flex-row md:items-center justify-between gap-6 mb-10">
|
||||
<form method="GET" action="{{ route('admin.machines.logs') }}" class="flex flex-wrap items-center gap-4 group">
|
||||
<div class="space-y-1">
|
||||
<label class="text-[10px] font-black text-slate-400 uppercase tracking-widest px-1">{{ __('Machine') }}</label>
|
||||
<select name="machine_id" class="luxury-select text-xs h-9 py-0" onchange="this.form.submit()">
|
||||
<option value="">{{ __('All Machines') }}</option>
|
||||
@foreach($machines as $machine)
|
||||
<option value="{{ $machine->id }}" {{ request('machine_id') == $machine->id ? 'selected' : '' }}>
|
||||
{{ $machine->name }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="space-y-1">
|
||||
<label class="text-[10px] font-black text-slate-400 uppercase tracking-widest px-1">{{ __('Level') }}</label>
|
||||
<select name="level" class="luxury-select text-xs h-9 py-0" onchange="this.form.submit()">
|
||||
<option value="">{{ __('All Levels') }}</option>
|
||||
<option value="info" {{ request('level') == 'info' ? 'selected' : '' }}>{{ __('Info') }}</option>
|
||||
<option value="warning" {{ request('level') == 'warning' ? 'selected' : '' }}>{{ __('Warning') }}</option>
|
||||
<option value="error" {{ request('level') == 'error' ? 'selected' : '' }}>{{ __('Error') }}</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="flex items-end gap-2 mt-5">
|
||||
<button type="submit" class="p-2 rounded-xl bg-slate-50 dark:bg-slate-800 text-slate-400 hover:text-cyan-500 transition-colors border border-slate-200 dark:border-slate-700">
|
||||
<svg class="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg>
|
||||
</button>
|
||||
<a href="{{ route('admin.machines.logs') }}" class="p-2 rounded-xl bg-slate-50 dark:bg-slate-800 text-slate-400 hover:text-rose-500 transition-colors border border-slate-200 dark:border-slate-700">
|
||||
<svg class="w-4 h-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"/><path d="M3 3v5h5"/></svg>
|
||||
</a>
|
||||
</div>
|
||||
<input type="hidden" name="per_page" value="{{ request('per_page', 10) }}">
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="overflow-x-auto">
|
||||
<table class="w-full text-left border-separate border-spacing-y-0">
|
||||
<thead>
|
||||
<tr class="bg-slate-50/50 dark:bg-slate-900/10">
|
||||
<th class="px-6 py-4 text-[11px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-[0.2em] border-b border-slate-100 dark:border-slate-800">{{ __('Timestamp') }}</th>
|
||||
<th class="px-6 py-4 text-[11px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-[0.2em] border-b border-slate-100 dark:border-slate-800">{{ __('Machine') }}</th>
|
||||
<th class="px-6 py-4 text-[11px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-[0.2em] border-b border-slate-100 dark:border-slate-800">{{ __('Level') }}</th>
|
||||
<th class="px-6 py-4 text-[11px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-[0.2em] border-b border-slate-100 dark:border-slate-800">{{ __('Message Content') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-slate-50 dark:divide-slate-800/80">
|
||||
@forelse ($logs as $log)
|
||||
<tr class="group hover:bg-slate-50/80 dark:hover:bg-slate-800/40 transition-all duration-300">
|
||||
<td class="px-6 py-6 transition-colors">
|
||||
<div class="text-[13px] font-bold font-display tracking-widest text-slate-600 dark:text-slate-300">
|
||||
{{ $log->created_at->format('Y-m-d') }}
|
||||
</div>
|
||||
<div class="text-[11px] font-bold text-slate-400 dark:text-slate-500 tracking-wider mt-0.5 uppercase">
|
||||
{{ $log->created_at->format('H:i:s') }}
|
||||
</div>
|
||||
</td>
|
||||
<td class="px-6 py-6 transition-colors">
|
||||
<a href="{{ route('admin.machines.show', $log->machine_id) }}" class="inline-flex items-center gap-2 group/link">
|
||||
<span class="text-base font-extrabold text-slate-800 dark:text-slate-100 group-hover/link:text-cyan-500 transition-colors">
|
||||
{{ $log->machine->name ?? __('Unknown') }}
|
||||
</span>
|
||||
<svg class="w-3.5 h-3.5 text-slate-300 dark:text-slate-600 opacity-0 group-hover/link:opacity-100 transition-all -translate-x-2 group-hover/link:translate-x-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="3"><path stroke-linecap="round" stroke-linejoin="round" d="M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3"/></svg>
|
||||
</a>
|
||||
</td>
|
||||
<td class="px-6 py-6 transition-colors">
|
||||
@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
|
||||
<span class="inline-flex items-center px-3 py-1 rounded-lg border text-[11px] font-black uppercase tracking-wider {{ $currentStyle }}">
|
||||
<span class="w-1.5 h-1.5 rounded-full bg-current mr-2 animate-pulse"></span>
|
||||
{{ __(ucfirst($log->level)) }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="px-6 py-6 transition-colors">
|
||||
<p class="text-[14px] font-medium text-slate-700 dark:text-slate-200 leading-relaxed max-w-xl">
|
||||
{{ $log->message }}
|
||||
</p>
|
||||
@if($log->context)
|
||||
<div class="mt-3 p-4 rounded-xl bg-slate-50/50 dark:bg-[#0f172a]/50 border border-slate-100 dark:border-slate-800/50 group-hover:bg-white dark:group-hover:bg-[#0f172a] transition-colors">
|
||||
<pre class="text-[10px] font-bold text-slate-400 dark:text-slate-500 whitespace-pre-wrap break-all">{{ json_encode($log->context, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) }}</pre>
|
||||
</div>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="4" class="px-6 py-24 text-center">
|
||||
<div class="flex flex-col items-center">
|
||||
<div class="p-4 rounded-full bg-slate-50 dark:bg-slate-800/50 mb-4 border border-slate-100 dark:border-slate-800/50">
|
||||
<svg class="w-8 h-8 text-slate-300 dark:text-slate-600" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M21 7v10c0 1.1-.9 2-2 2H5c-1.1 0-2-.9-2-2V7c0-1.1.9-2 2-2h14c1.1 0 2 .9 2 2z"/><path d="M12 11l4-4"/><path d="M8 15l4-4"/></svg>
|
||||
</div>
|
||||
<span class="text-sm font-bold text-slate-400 dark:text-slate-500 uppercase tracking-widest">{{ __('No matching logs found') }}</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="mt-8 border-t border-slate-100 dark:border-slate-800 pt-6">
|
||||
{{ $logs->links('vendor.pagination.luxury') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
@@ -30,6 +30,12 @@
|
||||
<p class="text-xs text-gray-500 uppercase">{{ __('Last Heartbeat') }}</p>
|
||||
<p class="text-sm">{{ $machine->last_heartbeat_at ?? __('N/A') }}</p>
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-xs text-gray-500 uppercase">{{ __('Current Page') }}</p>
|
||||
<p class="text-sm font-bold shadow-sm inline-block px-2 py-1 rounded bg-slate-100 dark:bg-slate-800 text-slate-700 dark:text-slate-300">
|
||||
{{ $machine->current_page_label ?: '-' }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
351
resources/views/admin/machines/utilization.blade.php
Normal file
351
resources/views/admin/machines/utilization.blade.php
Normal file
@@ -0,0 +1,351 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('header')
|
||||
<h2 class="font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight font-display tracking-tight">
|
||||
{{ __('Machine Management') }} > {{ __('Utilization Rate') }}
|
||||
</h2>
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<div class="space-y-8" x-data="utilizationDashboard()">
|
||||
<!-- Page Header & Global Discovery -->
|
||||
<div class="flex flex-col md:flex-row md:items-end md:justify-between gap-6">
|
||||
<div>
|
||||
<h1 class="text-4xl font-black text-slate-800 dark:text-white tracking-tighter font-display">{{ __('Fleet Performance') }}</h1>
|
||||
<p class="text-sm font-bold text-slate-500 dark:text-slate-400 mt-1 uppercase tracking-[0.2em]">{{ __('Utilization, OEE and Operational Intelligence') }}</p>
|
||||
</div>
|
||||
|
||||
<!-- Global Date Filter -->
|
||||
<div class="flex items-center bg-white dark:bg-slate-900 rounded-2xl p-1.5 shadow-sm border border-slate-200 dark:border-slate-800 animate-luxury-in">
|
||||
<button @click="prevDay()" class="p-2 hover:bg-slate-50 dark:hover:bg-slate-800 rounded-xl transition-colors text-slate-400"><svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M15 19l-7-7 7-7" /></svg></button>
|
||||
<div class="px-4 text-sm font-black text-slate-700 dark:text-slate-200 font-mono tracking-tight" x-text="startDate"></div>
|
||||
<button @click="nextDay()" class="p-2 hover:bg-slate-50 dark:hover:bg-slate-800 rounded-xl transition-colors text-slate-400"><svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M9 5l7 7-7 7" /></svg></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Fleet Summary Cards (Always visible) -->
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 animate-luxury-in">
|
||||
<!-- Avg OEE Card -->
|
||||
<div class="luxury-card p-8 rounded-3xl bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 relative group overflow-hidden shadow-lg">
|
||||
<p class="text-xs font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest flex items-center gap-2 mb-4">
|
||||
<span class="w-2 h-2 rounded-full bg-cyan-500"></span>
|
||||
{{ __('Fleet Avg OEE') }}
|
||||
</p>
|
||||
<div class="flex items-baseline gap-2">
|
||||
<span class="text-6xl font-black text-slate-900 dark:text-white font-display tracking-tighter" x-text="fleetStats.avgOee">0</span>
|
||||
<span class="text-2xl font-black text-cyan-500/80">%</span>
|
||||
</div>
|
||||
<div class="mt-8 flex items-center justify-between text-[10px] font-bold uppercase tracking-widest text-slate-400">
|
||||
<span>{{ __('Target Performance') }}</span>
|
||||
<span class="text-emerald-500 text-xs">85%</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Online Count Card -->
|
||||
<div class="luxury-card p-8 rounded-3xl bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 relative group overflow-hidden shadow-lg">
|
||||
<p class="text-xs font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest flex items-center gap-2 mb-4">
|
||||
<span class="w-2 h-2 rounded-full bg-emerald-500 animate-pulse"></span>
|
||||
{{ __('Machines Online') }}
|
||||
</p>
|
||||
<div class="flex items-baseline gap-2">
|
||||
<span class="text-6xl font-black text-slate-900 dark:text-white font-display tracking-tighter" x-text="fleetStats.onlineCount">0</span>
|
||||
<span class="text-2xl font-black text-emerald-500/80">/ {{ count($machines) }}</span>
|
||||
</div>
|
||||
<div class="mt-8 flex items-center justify-between text-[10px] font-bold uppercase tracking-widest text-slate-400">
|
||||
<span>{{ __('Current Operational State') }}</span>
|
||||
<span class="text-emerald-500 text-xs">LIVE</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Total Sales Card -->
|
||||
<div class="luxury-card p-8 rounded-3xl bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 relative group overflow-hidden shadow-lg">
|
||||
<p class="text-xs font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest flex items-center gap-2 mb-4">
|
||||
<span class="w-2 h-2 rounded-full bg-amber-500"></span>
|
||||
{{ __('Total Daily Sales') }}
|
||||
</p>
|
||||
<div class="flex items-baseline gap-2">
|
||||
<span class="text-6xl font-black text-slate-900 dark:text-white font-display tracking-tighter" x-text="fleetStats.totalSales">0</span>
|
||||
<span class="text-2xl font-black text-amber-500/80">{{ __('Orders') }}</span>
|
||||
</div>
|
||||
<div class="mt-8 flex items-center justify-between text-[10px] font-bold uppercase tracking-widest text-slate-400">
|
||||
<span>{{ __('System Health') }}</span>
|
||||
<div class="flex items-center gap-1.5 text-rose-500">
|
||||
<span class="w-1.5 h-1.5 rounded-full bg-rose-500"></span>
|
||||
<span x-text="fleetStats.alertCount">0</span> Alerts
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Main Workspace -->
|
||||
<div class="grid grid-cols-1 lg:grid-cols-4 gap-8">
|
||||
|
||||
<!-- Navigation: Machine Sidebar -->
|
||||
<div class="lg:col-span-1">
|
||||
<div class="luxury-card p-0 rounded-3xl overflow-hidden shadow-xl sticky top-24 border border-slate-100 dark:border-slate-800">
|
||||
<div class="p-6 border-b border-slate-50 dark:border-slate-800 bg-slate-50/50 dark:bg-slate-900/50">
|
||||
<h3 class="text-xs font-black text-slate-400 uppercase tracking-widest">{{ __('Select Machine') }}</h3>
|
||||
</div>
|
||||
<div class="max-h-[500px] overflow-y-auto custom-scrollbar divide-y divide-slate-50 dark:divide-slate-800">
|
||||
@foreach($machines as $machine)
|
||||
<button @click="selectMachine('{{ $machine->id }}', '{{ $machine->serial_no }}', '{{ addslashes($machine->name) }}')"
|
||||
:class="selectedMachineId == '{{ $machine->id }}' ? 'bg-cyan-500/5 dark:bg-cyan-500/10' : 'hover:bg-slate-50/80 dark:hover:bg-slate-800/40'"
|
||||
class="w-full text-left p-6 transition-all duration-300 relative group">
|
||||
<div x-show="selectedMachineId == '{{ $machine->id }}'" class="absolute inset-y-0 left-0 w-1 bg-cyan-500 rounded-r-full"></div>
|
||||
<div class="flex items-center gap-4">
|
||||
<div class="flex-shrink-0 relative">
|
||||
<div :class="selectedMachineId == '{{ $machine->id }}' ? 'bg-cyan-500 shadow-cyan-500/20' : 'bg-slate-100 dark:bg-slate-800'"
|
||||
class="w-12 h-12 rounded-2xl flex items-center justify-center transition-all duration-500 shadow-lg group-hover:scale-110">
|
||||
<svg class="w-6 h-6" :class="selectedMachineId == '{{ $machine->id }}' ? 'text-white' : 'text-slate-400'" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2.5"><path d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" /></svg>
|
||||
</div>
|
||||
<span class="absolute -top-1 -right-1 w-3 h-3 rounded-full border-2 border-white dark:border-slate-900"
|
||||
:class="'{{ $machine->status }}' === 'online' ? 'bg-emerald-500' : 'bg-slate-400'"></span>
|
||||
</div>
|
||||
<div class="min-w-0">
|
||||
<div class="text-sm font-black text-slate-800 dark:text-slate-100 truncate tracking-tight" :class="selectedMachineId == '{{ $machine->id }}' ? 'text-cyan-600 dark:text-cyan-400' : ''">{{ $machine->name }}</div>
|
||||
<div class="text-[10px] font-mono font-bold text-slate-400 uppercase tracking-[0.2em] mt-0.5">{{ $machine->serial_no }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</button>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Detail: Metrics & Insights -->
|
||||
<div class="lg:col-span-3 space-y-8">
|
||||
|
||||
<template x-if="selectedMachineId">
|
||||
<div class="animate-luxury-in space-y-8">
|
||||
<!-- OEE Triple Gauges -->
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
|
||||
<div class="luxury-card p-6 rounded-3xl text-center">
|
||||
<div id="gauge-availability" class="mx-auto h-40"></div>
|
||||
<h4 class="text-[10px] font-black text-slate-400 uppercase tracking-widest -mt-4">{{ __('Availability') }}</h4>
|
||||
</div>
|
||||
<div class="luxury-card p-6 rounded-3xl text-center">
|
||||
<div id="gauge-performance" class="mx-auto h-40"></div>
|
||||
<h4 class="text-[10px] font-black text-slate-400 uppercase tracking-widest -mt-4">{{ __('Performance') }}</h4>
|
||||
</div>
|
||||
<div class="luxury-card p-6 rounded-3xl text-center">
|
||||
<div id="gauge-quality" class="mx-auto h-40"></div>
|
||||
<h4 class="text-[10px] font-black text-slate-400 uppercase tracking-widest -mt-4">{{ __('Quality') }}</h4>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Unified Timeline Chart -->
|
||||
<div class="luxury-card p-8 rounded-3xl relative overflow-hidden">
|
||||
<div class="flex items-center justify-between mb-8">
|
||||
<div>
|
||||
<h3 class="text-xl font-black text-slate-800 dark:text-white tracking-tight">{{ __('Unified Operational Timeline') }}</h3>
|
||||
<p class="text-[10px] font-bold text-slate-500 uppercase tracking-widest mt-1">{{ __('Connectivity vs Sales Correlation') }}</p>
|
||||
</div>
|
||||
<div class="flex items-center gap-4">
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="w-3 h-1 rounded-full bg-cyan-500"></span>
|
||||
<span class="text-[10px] font-black text-slate-400 uppercase tracking-widest">連線狀態</span>
|
||||
</div>
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="w-3 h-3 rounded-full bg-amber-500"></span>
|
||||
<span class="text-[10px] font-black text-slate-400 uppercase tracking-widest">銷售事件</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="unified-timeline" class="w-full min-h-[350px]"></div>
|
||||
|
||||
<div x-show="loading" class="absolute inset-0 bg-white/60 dark:bg-slate-900/60 backdrop-blur-[2px] z-20 flex items-center justify-center">
|
||||
<div class="flex flex-col items-center gap-3">
|
||||
<div class="w-8 h-8 border-4 border-cyan-500/20 border-t-cyan-500 rounded-full animate-spin"></div>
|
||||
<span class="text-[10px] font-black text-slate-400 uppercase tracking-widest">Aggregating intelligence...</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<!-- Initial State -->
|
||||
<template x-if="!selectedMachineId">
|
||||
<div class="luxury-card p-24 rounded-3xl flex flex-col items-center justify-center text-center opacity-80 border-dashed border-2 border-slate-200 dark:border-slate-800">
|
||||
<div class="w-24 h-24 rounded-full bg-slate-50 dark:bg-slate-800/50 flex items-center justify-center mb-8">
|
||||
<svg class="w-12 h-12 text-slate-300 dark:text-slate-600" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M15 19.128a9.38 9.38 0 002.625.372 9.337 9.337 0 004.121-.952 4.125 4.125 0 00-2.123-7.947c-2.333 0-4.66.307-6.877.914m-1.5-3.619l1.125-1.125m0 0l1.125 1.125m-1.125-1.125V3h-.75m-6.75 4.5V3h-.75m2.25 13.5v3.25a2.25 2.25 0 01-2.25 2.25h-5.25a2.25 2.25 0 01-2.25-2.25V5.25A2.25 2.25 0 015.25 3H12m1.5 12l1.125-1.125m0 0l1.125 1.125m-1.125-1.125V18" /></svg>
|
||||
</div>
|
||||
<h3 class="text-2xl font-black text-slate-400 dark:text-slate-600 tracking-tighter">{{ __('Select a machine to deep dive') }}</h3>
|
||||
<p class="text-sm font-bold text-slate-400 mt-2 uppercase tracking-widest">{{ __('Real-time OEE analysis awaits') }}</p>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@push('scripts')
|
||||
<script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
|
||||
<script>
|
||||
function utilizationDashboard() {
|
||||
return {
|
||||
selectedMachineId: '',
|
||||
selectedMachineSn: '',
|
||||
selectedMachineName: '',
|
||||
startDate: new Date().toISOString().split('T')[0],
|
||||
loading: false,
|
||||
fleetStats: { avgOee: 0, onlineCount: 0, totalSales: 0, alertCount: 0 },
|
||||
charts: {},
|
||||
|
||||
prevDay() {
|
||||
let d = new Date(this.startDate);
|
||||
d.setDate(d.getDate() - 1);
|
||||
this.startDate = d.toISOString().split('T')[0];
|
||||
this.fetchData();
|
||||
},
|
||||
nextDay() {
|
||||
let d = new Date(this.startDate);
|
||||
d.setDate(d.getDate() + 1);
|
||||
this.startDate = d.toISOString().split('T')[0];
|
||||
this.fetchData();
|
||||
},
|
||||
|
||||
init() {
|
||||
// Fleet stats from server/mock
|
||||
this.fleetStats = {
|
||||
avgOee: 72.4,
|
||||
onlineCount: Number("{{ count($machines->where('status', 'online')) }}") || 0,
|
||||
totalSales: 128,
|
||||
alertCount: 3
|
||||
};
|
||||
},
|
||||
|
||||
selectMachine(id, sn, name) {
|
||||
this.selectedMachineId = id;
|
||||
this.selectedMachineSn = sn;
|
||||
this.selectedMachineName = name;
|
||||
this.fetchData();
|
||||
},
|
||||
|
||||
async fetchData() {
|
||||
if (!this.selectedMachineId) return;
|
||||
this.loading = true;
|
||||
|
||||
try {
|
||||
const response = await fetch(`/admin/machines/${this.selectedMachineId}/utilization-ajax?date=${this.startDate}`);
|
||||
const result = await response.json();
|
||||
|
||||
if (result.success) {
|
||||
const stats = result.data.overview;
|
||||
const chartData = result.data.chart;
|
||||
|
||||
this.$nextTick(() => {
|
||||
this.renderGauges(stats);
|
||||
this.renderTimeline(chartData);
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to fetch utilization data:', error);
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
|
||||
renderGauges({availability, performance, quality}) {
|
||||
const isDark = document.documentElement.classList.contains('dark');
|
||||
const trackColor = isDark ? '#1e293b' : '#f1f5f9';
|
||||
|
||||
const createGauge = (id, value, color) => {
|
||||
const el = document.querySelector(`#${id}`);
|
||||
if (!el) return;
|
||||
if (this.charts[id]) this.charts[id].destroy();
|
||||
|
||||
const options = {
|
||||
series: [value],
|
||||
chart: { height: 200, type: 'radialBar', sparkline: { enabled: true } },
|
||||
plotOptions: {
|
||||
radialBar: {
|
||||
hollow: { size: '65%' },
|
||||
dataLabels: {
|
||||
name: { show: false },
|
||||
value: {
|
||||
offsetY: 10,
|
||||
fontSize: '22px',
|
||||
fontWeight: 900,
|
||||
fontFamily: 'Outfit',
|
||||
color: isDark ? '#fff' : '#1e293b',
|
||||
formatter: (v) => v + '%'
|
||||
}
|
||||
},
|
||||
track: { background: trackColor }
|
||||
}
|
||||
},
|
||||
colors: [color],
|
||||
stroke: { lineCap: 'round' }
|
||||
};
|
||||
this.charts[id] = new ApexCharts(el, options);
|
||||
this.charts[id].render();
|
||||
};
|
||||
|
||||
createGauge('gauge-availability', availability, '#06b6d4');
|
||||
createGauge('gauge-performance', performance, '#f59e0b');
|
||||
createGauge('gauge-quality', quality, '#10b981');
|
||||
},
|
||||
|
||||
renderTimeline(chartData) {
|
||||
const el = document.querySelector("#unified-timeline");
|
||||
if (!el) return;
|
||||
if (this.charts['timeline']) this.charts['timeline'].destroy();
|
||||
|
||||
const isDark = document.documentElement.classList.contains('dark');
|
||||
|
||||
const options = {
|
||||
series: [
|
||||
{
|
||||
name: '{{ __("OEE.Activity") }}',
|
||||
type: 'rangeBar',
|
||||
data: chartData.uptime || []
|
||||
},
|
||||
{
|
||||
name: '{{ __("OEE.Sales") }}',
|
||||
type: 'scatter',
|
||||
data: chartData.sales || []
|
||||
}
|
||||
],
|
||||
chart: {
|
||||
height: 350,
|
||||
toolbar: { show: false },
|
||||
background: 'transparent',
|
||||
fontFamily: 'Outfit'
|
||||
},
|
||||
plotOptions: {
|
||||
bar: {
|
||||
horizontal: true,
|
||||
barHeight: '40%',
|
||||
rangeBarGroupRows: true
|
||||
}
|
||||
},
|
||||
xaxis: {
|
||||
type: 'datetime',
|
||||
labels: { style: { colors: isDark ? '#94a3b8' : '#64748b', fontWeight: 700 } }
|
||||
},
|
||||
yaxis: {
|
||||
labels: { style: { colors: isDark ? '#94a3b8' : '#64748b', fontWeight: 700 } }
|
||||
},
|
||||
markers: { size: 6, colors: ['#f59e0b'], strokeColors: '#fff', strokeWidth: 2 },
|
||||
grid: { borderColor: isDark ? '#1e293b' : '#f1f5f9', strokeDashArray: 4 },
|
||||
legend: { show: false },
|
||||
tooltip: {
|
||||
theme: isDark ? 'dark' : 'light',
|
||||
x: { format: 'HH:mm' }
|
||||
},
|
||||
noData: {
|
||||
text: '{{ __("No machines available") }}',
|
||||
align: 'center',
|
||||
verticalAlign: 'middle',
|
||||
style: { color: isDark ? '#475569' : '#94a3b8', fontSize: '14px', fontFamily: 'Outfit' }
|
||||
}
|
||||
};
|
||||
this.charts['timeline'] = new ApexCharts(el, options);
|
||||
this.charts['timeline'].render();
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@endpush
|
||||
@endsection
|
||||
@@ -80,83 +80,91 @@
|
||||
}
|
||||
|
||||
// 3. 處理最後一個動作/頁面
|
||||
if ($lastSegment !== 'index') {
|
||||
$pageLabel = match($lastSegment) {
|
||||
'edit' => str_starts_with($routeName, 'profile') ? null : __('Edit'),
|
||||
'create' => __('Create'),
|
||||
'show' => __('Detail'),
|
||||
'logs' => __('Machine Logs'),
|
||||
'permissions' => __('Machine Permissions'),
|
||||
'utilization' => __('Utilization Rate'),
|
||||
'expiry' => __('Expiry Management'),
|
||||
'maintenance' => __('Maintenance Records'),
|
||||
'ui-elements' => __('UI Elements'),
|
||||
'helper' => __('Helper'),
|
||||
'questionnaire' => __('Questionnaire'),
|
||||
'games' => __('Games'),
|
||||
'timer' => __('Timer'),
|
||||
'personal' => __('Warehouse List (Individual)'),
|
||||
'stock-management' => __('Stock Management'),
|
||||
'transfers' => __('Transfers'),
|
||||
'purchases' => __('Purchases'),
|
||||
'replenishments' => __('Replenishments'),
|
||||
'replenishment-records' => __('Replenishment Records'),
|
||||
'machine-stock' => __('Machine Stock'),
|
||||
'staff-stock' => __('Staff Stock'),
|
||||
'returns' => __('Returns'),
|
||||
'pickup-codes' => __('Pickup Codes'),
|
||||
'orders' => __('Orders'),
|
||||
'promotions' => __('Promotions'),
|
||||
'pass-codes' => __('Pass Codes'),
|
||||
'store-gifts' => __('Store Gifts'),
|
||||
'change-stock' => __('Change Stock'),
|
||||
'machine-reports' => __('Machine Reports'),
|
||||
'product-reports' => __('Product Reports'),
|
||||
'survey-analysis' => __('Survey Analysis'),
|
||||
'products' => __('Product Management'),
|
||||
'advertisements' => __('Advertisement Management'),
|
||||
'admin-products' => __('Admin Sellable Products'),
|
||||
'accounts' => __('Account Management'),
|
||||
'sub-accounts' => __('Sub Accounts'),
|
||||
'sub-account-roles' => __('Sub Account Roles'),
|
||||
'points' => __('Point Settings'),
|
||||
'badges' => __('Badge Settings'),
|
||||
'restart' => __('Machine Restart'),
|
||||
'restart-card-reader' => __('Card Reader Restart'),
|
||||
'checkout' => __('Remote Checkout'),
|
||||
'lock' => __('Remote Lock'),
|
||||
'change' => __('Remote Change'),
|
||||
'dispense' => __('Remote Dispense'),
|
||||
'official-account' => __('Line Official Account'),
|
||||
'coupons' => __('Line Coupons'),
|
||||
'stores' => __('Store Management'),
|
||||
'time-slots' => __('Time Slots'),
|
||||
'venues' => __('Venue Management'),
|
||||
'reservations' => __('Reservations'),
|
||||
'clear-stock' => __('Clear Stock'),
|
||||
'apk-versions' => __('APK Versions'),
|
||||
'discord-notifications' => __('Discord Notifications'),
|
||||
'app-features' => __('APP Features'),
|
||||
'roles' => __('Roles'),
|
||||
'others' => __('Others'),
|
||||
'ai-prediction' => __('AI Prediction'),
|
||||
'data-config' => __('Data Configuration Permissions'),
|
||||
'sales' => __('Sales Permissions'),
|
||||
'machines' => __('Machine Management Permissions'),
|
||||
'warehouses' => __('Warehouse Permissions'),
|
||||
'analysis' => __('Analysis Permissions'),
|
||||
'audit' => __('Audit Permissions'),
|
||||
'remote' => __('Remote Permissions'),
|
||||
'line' => __('Line Permissions'),
|
||||
$pageLabel = match($lastSegment) {
|
||||
'index' => match($segments[1] ?? '') {
|
||||
'members' => __('Member List'),
|
||||
'machines' => request()->input('tab') === 'expiry' ? __('Expiry Management') : __('Machine List'),
|
||||
'warehouses' => __('Warehouse List (All)'),
|
||||
'sales' => __('Sales Records'),
|
||||
'analysis' => __('Analysis Management'),
|
||||
'audit' => __('Audit Management'),
|
||||
'permission' => __('Permission Settings'),
|
||||
default => null,
|
||||
};
|
||||
},
|
||||
'edit' => str_starts_with($routeName, 'profile') ? null : __('Edit'),
|
||||
'create' => __('Create'),
|
||||
'show' => __('Detail'),
|
||||
'logs' => __('Machine Logs'),
|
||||
'permissions' => __('Machine Permissions'),
|
||||
'utilization' => __('Utilization Rate'),
|
||||
'expiry' => __('Expiry Management'),
|
||||
'maintenance' => __('Maintenance Records'),
|
||||
'ui-elements' => __('UI Elements'),
|
||||
'helper' => __('Helper'),
|
||||
'questionnaire' => __('Questionnaire'),
|
||||
'games' => __('Games'),
|
||||
'timer' => __('Timer'),
|
||||
'personal' => __('Warehouse List (Individual)'),
|
||||
'stock-management' => __('Stock Management'),
|
||||
'transfers' => __('Transfers'),
|
||||
'purchases' => __('Purchases'),
|
||||
'replenishments' => __('Replenishments'),
|
||||
'replenishment-records' => __('Replenishment Records'),
|
||||
'machine-stock' => __('Machine Stock'),
|
||||
'staff-stock' => __('Staff Stock'),
|
||||
'returns' => __('Returns'),
|
||||
'pickup-codes' => __('Pickup Codes'),
|
||||
'orders' => __('Orders'),
|
||||
'promotions' => __('Promotions'),
|
||||
'pass-codes' => __('Pass Codes'),
|
||||
'store-gifts' => __('Store Gifts'),
|
||||
'change-stock' => __('Change Stock'),
|
||||
'machine-reports' => __('Machine Reports'),
|
||||
'product-reports' => __('Product Reports'),
|
||||
'survey-analysis' => __('Survey Analysis'),
|
||||
'products' => __('Product Management'),
|
||||
'advertisements' => __('Advertisement Management'),
|
||||
'admin-products' => __('Admin Sellable Products'),
|
||||
'accounts' => __('Account Management'),
|
||||
'sub-accounts' => __('Sub Accounts'),
|
||||
'sub-account-roles' => __('Sub Account Roles'),
|
||||
'points' => __('Point Settings'),
|
||||
'badges' => __('Badge Settings'),
|
||||
'restart' => __('Machine Restart'),
|
||||
'restart-card-reader' => __('Card Reader Restart'),
|
||||
'checkout' => __('Remote Checkout'),
|
||||
'lock' => __('Remote Lock'),
|
||||
'change' => __('Remote Change'),
|
||||
'dispense' => __('Remote Dispense'),
|
||||
'official-account' => __('Line Official Account'),
|
||||
'coupons' => __('Line Coupons'),
|
||||
'stores' => __('Store Management'),
|
||||
'time-slots' => __('Time Slots'),
|
||||
'venues' => __('Venue Management'),
|
||||
'reservations' => __('Reservations'),
|
||||
'clear-stock' => __('Clear Stock'),
|
||||
'apk-versions' => __('APK Versions'),
|
||||
'discord-notifications' => __('Discord Notifications'),
|
||||
'app-features' => __('APP Features'),
|
||||
'roles' => __('Roles'),
|
||||
'others' => __('Others'),
|
||||
'ai-prediction' => __('AI Prediction'),
|
||||
'data-config' => __('Data Configuration Permissions'),
|
||||
'sales' => __('Sales Permissions'),
|
||||
'machines' => __('Machine Management Permissions'),
|
||||
'warehouses' => __('Warehouse Permissions'),
|
||||
'analysis' => __('Analysis Permissions'),
|
||||
'audit' => __('Audit Permissions'),
|
||||
'remote' => __('Remote Permissions'),
|
||||
'line' => __('Line Permissions'),
|
||||
default => null,
|
||||
};
|
||||
|
||||
if ($pageLabel) {
|
||||
$links[] = [
|
||||
'label' => $pageLabel,
|
||||
'active' => true
|
||||
];
|
||||
}
|
||||
if ($pageLabel) {
|
||||
$links[] = [
|
||||
'label' => $pageLabel,
|
||||
'active' => true
|
||||
];
|
||||
}
|
||||
|
||||
// 確保最後一個 link 是 active 的
|
||||
|
||||
@@ -56,11 +56,11 @@
|
||||
</button>
|
||||
<div x-show="open" x-collapse>
|
||||
<ul class="luxury-submenu" data-sidebar-sub>
|
||||
<li><a class="flex items-center gap-x-3.5 py-2 px-2.5 text-sm transition-colors rounded-lg {{ request()->routeIs('admin.machines.logs') ? 'text-slate-900 dark:text-white bg-slate-100 dark:bg-white/5' : 'text-slate-500 dark:text-slate-400 hover:text-slate-900 dark:hover:text-white' }}" href="{{ route('admin.machines.logs') }}">{{ __('Machine Logs') }}</a></li>
|
||||
@can('menu.machines.list')
|
||||
<li><a class="flex items-center gap-x-3.5 py-2 px-2.5 text-sm transition-colors rounded-lg {{ request()->routeIs('admin.machines.index') ? 'text-slate-900 dark:text-white bg-slate-100 dark:bg-white/5' : 'text-slate-500 dark:text-slate-400 hover:text-slate-900 dark:hover:text-white' }}" href="{{ route('admin.machines.index') }}">{{ __('Machine List') }}</a></li>
|
||||
@endcan
|
||||
|
||||
<li><a class="flex items-center gap-x-3.5 py-2 px-2.5 text-sm transition-colors rounded-lg {{ request()->routeIs('admin.machines.utilization') ? 'text-slate-900 dark:text-white bg-slate-100 dark:bg-white/5' : 'text-slate-500 dark:text-slate-400 hover:text-slate-900 dark:hover:text-white' }}" href="{{ route('admin.machines.utilization') }}">{{ __('Utilization Rate') }}</a></li>
|
||||
<li><a class="flex items-center gap-x-3.5 py-2 px-2.5 text-sm transition-colors rounded-lg {{ request()->routeIs('admin.machines.expiry') ? 'text-slate-900 dark:text-white bg-slate-100 dark:bg-white/5' : 'text-slate-500 dark:text-slate-400 hover:text-slate-900 dark:hover:text-white' }}" href="{{ route('admin.machines.expiry') }}">{{ __('Expiry Management') }}</a></li>
|
||||
<li><a class="flex items-center gap-x-3.5 py-2 px-2.5 text-sm transition-colors rounded-lg {{ request()->routeIs('admin.machines.maintenance') ? 'text-slate-900 dark:text-white bg-slate-100 dark:bg-white/5' : 'text-slate-500 dark:text-slate-400 hover:text-slate-900 dark:hover:text-white' }}" href="{{ route('admin.machines.maintenance') }}">{{ __('Maintenance Records') }}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -56,6 +56,7 @@ Route::prefix('v1')->middleware(['throttle:api'])->group(function () {
|
||||
Route::post('machine/member/verify/B650', [App\Http\Controllers\Api\V1\App\MachineController::class, 'verifyMember']);
|
||||
|
||||
// 交易、發票與出貨 (B600, B601, B602)
|
||||
Route::post('machine/restock/B018', [App\Http\Controllers\Api\V1\App\MachineController::class, 'recordRestock']);
|
||||
Route::post('B600', [App\Http\Controllers\Api\V1\App\TransactionController::class, 'store']);
|
||||
Route::post('B601', [App\Http\Controllers\Api\V1\App\TransactionController::class, 'recordInvoice']);
|
||||
Route::post('B602', [App\Http\Controllers\Api\V1\App\TransactionController::class, 'recordDispense']);
|
||||
|
||||
@@ -36,17 +36,17 @@ Route::middleware(['auth', 'verified', 'tenant.access'])->prefix('admin')->name(
|
||||
Route::resource('point-rules', App\Http\Controllers\Admin\PointRuleController::class)->except(['show', 'create', 'edit']);
|
||||
Route::resource('gift-definitions', App\Http\Controllers\Admin\GiftDefinitionController::class)->except(['show', 'create', 'edit']);
|
||||
|
||||
// 3. 機台管理
|
||||
Route::prefix('machines')->name('machines.')->group(function () {
|
||||
Route::get('/logs', [App\Http\Controllers\Admin\MachineController::class , 'logs'])->name('logs');
|
||||
Route::prefix('machines')->name('machines.')->group(function () {
|
||||
// Route::get('/permissions', [App\Http\Controllers\Admin\MachineController::class , 'permissions'])->name('permissions'); // Merged into Sub-account Management
|
||||
Route::get('/permissions/accounts/{user}', [App\Http\Controllers\Admin\MachineController::class, 'getAccountMachines'])->name('permissions.accounts.get');
|
||||
Route::post('/permissions/accounts/{user}', [App\Http\Controllers\Admin\MachineController::class, 'syncAccountMachines'])->name('permissions.accounts.sync');
|
||||
Route::get('/utilization', [App\Http\Controllers\Admin\MachineController::class , 'utilization'])->name('utilization');
|
||||
Route::get('/expiry', [App\Http\Controllers\Admin\MachineController::class , 'expiry'])->name('expiry');
|
||||
Route::get('/{id}/utilization-ajax', [App\Http\Controllers\Admin\MachineController::class, 'utilizationData'])->name('utilization-ajax');
|
||||
Route::get('/{machine}/slots-ajax', [App\Http\Controllers\Admin\MachineController::class, 'slotsAjax'])->name('slots-ajax');
|
||||
Route::post('/{machine}/slots/expiry', [App\Http\Controllers\Admin\MachineController::class, 'updateSlotExpiry'])->name('slots.expiry.update');
|
||||
Route::get('/{machine}/logs-ajax', [App\Http\Controllers\Admin\MachineController::class, 'logsAjax'])->name('logs-ajax');
|
||||
Route::get('/maintenance', [App\Http\Controllers\Admin\MachineController::class , 'maintenance'])->name('maintenance');
|
||||
}
|
||||
);
|
||||
});
|
||||
Route::resource('machines', App\Http\Controllers\Admin\MachineController::class);
|
||||
|
||||
// 4. APP管理
|
||||
|
||||
Reference in New Issue
Block a user