[FEAT] 重構機台狀態判定邏輯並優化全站多語系支援
All checks were successful
star-cloud-deploy-demo / deploy-demo (push) Successful in 1m18s

1. 重構機台在線狀態判定機制:移除資料庫 status 欄位,改由 Model 根據心跳時間動態計算。
2. 修正儀表板 (Dashboard) 與機台管理頁面的多語系顯示問題,解決換行導致翻譯失效的 Bug。
3. 修正個人檔案頁面的麵包屑 (Breadcrumbs) 導航,補齊「個人設定」層級。
4. 更新 IoT API (B010, B600) 的認證機制與日誌處理邏輯。
5. 同步更新繁中、英文、日文語言檔,確保 UI 標籤一致性。
This commit is contained in:
2026-04-07 10:21:07 +08:00
parent 08b6c60d2e
commit bbdc5bad9f
18 changed files with 2476 additions and 1813 deletions

View File

@@ -0,0 +1,86 @@
<?php
namespace Tests\Feature;
use App\Models\Machine\Machine;
use App\Models\Machine\MachineLog;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class MachineStatusTest extends TestCase
{
use RefreshDatabase;
/**
* Test machine is online with recent heartbeat and no errors.
*/
public function test_machine_is_online_with_recent_heartbeat(): void
{
$machine = Machine::factory()->create([
'last_heartbeat_at' => now()->subSeconds(10),
]);
$this->assertEquals('online', $machine->calculated_status);
}
/**
* Test machine is error with recent heartbeat but recent errors.
*/
public function test_machine_is_error_with_recent_logs(): void
{
$machine = Machine::factory()->create([
'last_heartbeat_at' => now()->subSeconds(10),
]);
// Add an error log 10 mins ago
MachineLog::create([
'machine_id' => $machine->id,
'level' => 'error',
'created_at' => now()->subMinutes(10),
'message' => 'Test error',
]);
$this->assertEquals('error', $machine->calculated_status);
}
/**
* Test machine is offline with old heartbeat (30s+).
*/
public function test_machine_is_offline_with_old_heartbeat(): void
{
$machine = Machine::factory()->create([
'last_heartbeat_at' => now()->subSeconds(35),
]);
$this->assertEquals('offline', $machine->calculated_status);
}
/**
* Test machine scopes (online, offline, hasError).
*/
public function test_machine_scopes(): void
{
// 1. Online machine
$onlineMachine = Machine::factory()->create(['last_heartbeat_at' => now()->subSeconds(10)]);
// 2. Offline machine
$offlineMachine = Machine::factory()->create(['last_heartbeat_at' => now()->subSeconds(40)]);
// 3. Online machine with error
$errorMachine = Machine::factory()->create(['last_heartbeat_at' => now()->subSeconds(5)]);
MachineLog::create([
'machine_id' => $errorMachine->id,
'level' => 'error',
'created_at' => now()->subMinutes(5),
'message' => 'Error log',
]);
$this->assertEquals(2, Machine::online()->count());
$this->assertEquals(1, Machine::offline()->count());
$this->assertEquals(1, Machine::online()->hasError()->count());
$this->assertTrue(Machine::online()->get()->contains($onlineMachine));
$this->assertTrue(Machine::offline()->get()->contains($offlineMachine));
$this->assertTrue(Machine::online()->hasError()->get()->contains($errorMachine));
}
}