machine; if (!$machine || !$machine->company) { return; } $company = $machine->company; $companySettings = $company->settings ?? []; // 必須啟用 Discord 通知功能 if (!($companySettings['discord_notify_enabled'] ?? false)) { return; } // 優先讀取機台專屬 Webhook,無則繼承公司全域 Webhook $machineSettings = $machine->settings ?? []; $webhookUrl = $machineSettings['discord_webhook_url'] ?? $companySettings['discord_webhook_url'] ?? null; if (empty($webhookUrl)) { return; } // 2. 判定是否符合發送條件 $shouldNotify = false; if ($log->type === 'temperature') { $shouldNotify = true; } elseif ($log->type === 'status') { if ($log->message === 'Connection lost (LWT)') { $shouldNotify = true; } elseif ($log->message === 'Connection restored') { // 尋找此機台前一筆狀態日誌 (ID 比當前小,type 為 status,倒序第一筆) $previousStatus = self::withoutGlobalScopes() ->where('machine_id', $log->machine_id) ->where('type', 'status') ->where('id', '<', $log->id) ->orderBy('id', 'desc') ->first(); if ($previousStatus && $previousStatus->message === 'Connection lost (LWT)' && $previousStatus->is_resolved) { // 只有當前一筆是真實 LWT 斷線,且已被消警 (is_resolved = true) 時,才發送恢復通知 $shouldNotify = true; } } } elseif ($log->type === 'submachine') { $shouldNotify = true; } elseif ($log->level === 'error') { $shouldNotify = true; } // 3. 若符合發送條件,調度非同步任務 if ($shouldNotify) { \App\Jobs\Notification\SendDiscordNotificationJob::dispatch($log->id); } }); } protected $fillable = [ 'company_id', 'machine_id', 'level', 'type', 'message', 'context', 'is_resolved', ]; protected $casts = [ 'context' => 'array', 'is_resolved' => 'boolean', ]; protected $appends = [ 'translated_message', ]; /** * 動態重組翻譯後的訊息 */ public function getTranslatedMessageAttribute(): string { $context = $this->context; // 若 context 中已有翻譯標籤 (B013 封裝),則進行動態重組 if (isset($context['translated_label'])) { $label = __($context['translated_label']); $tid = $context['tid'] ?? null; $code = $context['raw_code'] ?? '0000'; if ($tid) { return __('Slot') . " {$tid}: {$label} (Code: {$code})"; } return "{$label} (Code: {$code})"; } // 預設退回原始 message (支援歷史資料的翻譯判定與佔位符替換) return __($this->message, $context ?? []); } public function machine() { return $this->belongsTo(Machine::class); } }