From 0969a07a3ecaf04f0757d1407cbcd8c6494c73bb Mon Sep 17 00:00:00 2001 From: "allen.yan" Date: Tue, 6 May 2025 18:11:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=20Branch,Room,RoomStausLog?= =?UTF-8?q?=20table=2020250506?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Enums/RoomStatus.php | 25 ++++++++ app/Models/.DS_Store | Bin 0 -> 6148 bytes app/Models/Branch.php | 26 ++++++++ app/Models/Room.php | 25 ++++++++ app/Models/RoomStatusLog.php | 31 ++++++++++ app/Models/Song.php | 6 +- app/Observers/RoomObserver.php | 57 ++++++++++++++++++ database/.DS_Store | Bin 0 -> 6148 bytes database/migrations/.DS_Store | Bin 0 -> 6148 bytes ...025_05_06_055303_create_branches_table.php | 29 +++++++++ .../2025_05_06_055307_create_rooms_table.php | 34 +++++++++++ ...6_055312_create_room_status_logs_table.php | 31 ++++++++++ ..._05_06_055313_create_branch_song_table.php | 33 ++++++++++ 13 files changed, 296 insertions(+), 1 deletion(-) create mode 100644 app/Enums/RoomStatus.php create mode 100644 app/Models/.DS_Store create mode 100644 app/Models/Branch.php create mode 100644 app/Models/Room.php create mode 100644 app/Models/RoomStatusLog.php create mode 100644 app/Observers/RoomObserver.php create mode 100644 database/.DS_Store create mode 100644 database/migrations/.DS_Store create mode 100644 database/migrations/2025_05_06_055303_create_branches_table.php create mode 100644 database/migrations/2025_05_06_055307_create_rooms_table.php create mode 100644 database/migrations/2025_05_06_055312_create_room_status_logs_table.php create mode 100644 database/migrations/2025_05_06_055313_create_branch_song_table.php diff --git a/app/Enums/RoomStatus.php b/app/Enums/RoomStatus.php new file mode 100644 index 0000000..b9cd372 --- /dev/null +++ b/app/Enums/RoomStatus.php @@ -0,0 +1,25 @@ + __('enums.room.status.Active'), + self::Closed => __('enums.room.status.Closed'), + self::Error => __('enums.room.status.Error'), + self::Maintenance => __('enums.room.status.Maintenance'), + }; + } +} diff --git a/app/Models/.DS_Store b/app/Models/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 */ + use HasFactory; + + protected $fillable = [ + 'name', + 'external_ip', + ]; + + public function rooms() { + return $this->hasMany(Room::class); + } + public function songs(){ + return $this->belongsToMany(Song::class) + ->withPivot('counts') + ->withTimestamps(); + } +} diff --git a/app/Models/Room.php b/app/Models/Room.php new file mode 100644 index 0000000..ad8c5df --- /dev/null +++ b/app/Models/Room.php @@ -0,0 +1,25 @@ + */ + use HasFactory; + + protected $casts = [ + 'started_at' => 'datetime', + 'ended_at' => 'datetime', + ]; + + public function branch() { + return $this->belongsTo(Branch::class); + } + + public function statusLogs() { + return $this->hasMany(RoomStatusLog::class); + } +} diff --git a/app/Models/RoomStatusLog.php b/app/Models/RoomStatusLog.php new file mode 100644 index 0000000..d36c84a --- /dev/null +++ b/app/Models/RoomStatusLog.php @@ -0,0 +1,31 @@ + */ + use HasFactory; + + public $timestamps = false; + + protected $fillable = + [ + 'room_id', + 'user_id', + 'status', + 'message', + 'logged_at' + ]; + + protected $casts = [ + 'logged_at' => 'datetime', + ]; + + public function room() { + return $this->belongsTo(Room::class); + } +} diff --git a/app/Models/Song.php b/app/Models/Song.php index 043aa7d..f40efd5 100644 --- a/app/Models/Song.php +++ b/app/Models/Song.php @@ -60,7 +60,11 @@ class Song extends Model public function categories(){ return $this->belongsToMany(SongCategory::class); } - + public function branches(){ + return $this->belongsToMany(Branch::class) + ->withPivot('counts') + ->withTimestamps(); + } protected static function booted() { // 無論是 creating 或 updating,都執行這段共用的邏輯 diff --git a/app/Observers/RoomObserver.php b/app/Observers/RoomObserver.php new file mode 100644 index 0000000..01a9775 --- /dev/null +++ b/app/Observers/RoomObserver.php @@ -0,0 +1,57 @@ +wasChanged('status')) { + RoomStatusLog::create([ + 'room_id' => $room->id, + 'user_id' => Auth::id(), // 若是 console 或系統自動操作可能為 null + 'status' => $room->status, + 'message' => '狀態自動變更紀錄', + 'logged_at' => now(), + ]); + } + } + + /** + * Handle the Room "deleted" event. + */ + public function deleted(Room $room): void + { + // + } + + /** + * Handle the Room "restored" event. + */ + public function restored(Room $room): void + { + // + } + + /** + * Handle the Room "force deleted" event. + */ + public function forceDeleted(Room $room): void + { + // + } +} diff --git a/database/.DS_Store b/database/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b1ea27f26ce3918826e777f505cab72016243956 GIT binary patch literal 6148 zcmeHKJ5EC}5S)b+5i}_&eFbh{Md1WofKMcZ6nGMW{#7|wj>hb#AbLp`nrK#9kG*i$`Hl84p0#ZNH1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0id(); + $table->string('name'); + $table->ipAddress('external_ip'); // 對外 IP + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('branches'); + } +}; diff --git a/database/migrations/2025_05_06_055307_create_rooms_table.php b/database/migrations/2025_05_06_055307_create_rooms_table.php new file mode 100644 index 0000000..a71a614 --- /dev/null +++ b/database/migrations/2025_05_06_055307_create_rooms_table.php @@ -0,0 +1,34 @@ +id(); + $table->foreignId('branch_id')->constrained()->onDelete('cascade'); // 關聯分店 + $table->string('name'); // 包廂名稱 + $table->string('internal_ip'); // 內部 IP + $table->unsignedSmallInteger('port'); // 通訊 Port + $table->enum('status', ['active', 'closed', 'error', 'maintenance']); // 狀態:啟用中 / 已結束 + $table->dateTime('started_at'); // 開始時間 + $table->dateTime('ended_at')->nullable(); // 結束時間 + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('rooms'); + } +}; diff --git a/database/migrations/2025_05_06_055312_create_room_status_logs_table.php b/database/migrations/2025_05_06_055312_create_room_status_logs_table.php new file mode 100644 index 0000000..8c27e98 --- /dev/null +++ b/database/migrations/2025_05_06_055312_create_room_status_logs_table.php @@ -0,0 +1,31 @@ +id(); + $table->foreignId('room_id')->constrained()->onDelete('cascade'); + $table->foreignId('user_id')->nullable()->constrained()->onDelete('set null'); // 操作者,可為 null(系統) + $table->enum('status', ['active', 'closed', 'error', 'maintenance']); + $table->text('message')->nullable(); // 可填異常原因或操作說明 + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('room_status_logs'); + } +}; diff --git a/database/migrations/2025_05_06_055313_create_branch_song_table.php b/database/migrations/2025_05_06_055313_create_branch_song_table.php new file mode 100644 index 0000000..8a57888 --- /dev/null +++ b/database/migrations/2025_05_06_055313_create_branch_song_table.php @@ -0,0 +1,33 @@ +unsignedBigInteger('song_id'); + $table->unsignedBigInteger('branch_id'); + $table->integer('counts')->default(0)->comment('點播次數'); + $table->foreign('song_id')->references('id')->on('songs')->restrictOnDelete()->restrictOnUpdate(); + $table->foreign('branch_id')->references('id')->on('branches')->restrictOnDelete()->restrictOnUpdate(); + $table->primary(['song_id', 'branch_id']); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('branch_song'); + } +};