From 79da7a6da7b58867fe9c98fb508c2ef63ff9582d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Sat, 28 Feb 2026 12:37:26 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20[equipment]=20=EB=8B=A4=EC=A4=91=20?= =?UTF-8?q?=EC=A0=90=EA=B2=80=EC=A3=BC=EA=B8=B0=20+=20=EB=B6=80=20?= =?UTF-8?q?=EB=8B=B4=EB=8B=B9=EC=9E=90=20DB=20=EC=8A=A4=ED=82=A4=EB=A7=88?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - equipments: sub_manager_id 컬럼 추가 - equipment_inspection_templates: inspection_cycle 컬럼 + 유니크 변경 - equipment_inspections: inspection_cycle 컬럼 + 유니크 변경 --- ...00_add_sub_manager_to_equipments_table.php | 23 +++++++ ...dd_inspection_cycle_to_templates_table.php | 67 +++++++++++++++++++ ..._inspection_cycle_to_inspections_table.php | 43 ++++++++++++ 3 files changed, 133 insertions(+) create mode 100644 database/migrations/2026_02_28_100000_add_sub_manager_to_equipments_table.php create mode 100644 database/migrations/2026_02_28_100100_add_inspection_cycle_to_templates_table.php create mode 100644 database/migrations/2026_02_28_100200_add_inspection_cycle_to_inspections_table.php diff --git a/database/migrations/2026_02_28_100000_add_sub_manager_to_equipments_table.php b/database/migrations/2026_02_28_100000_add_sub_manager_to_equipments_table.php new file mode 100644 index 0000000..c1c195f --- /dev/null +++ b/database/migrations/2026_02_28_100000_add_sub_manager_to_equipments_table.php @@ -0,0 +1,23 @@ +foreignId('sub_manager_id')->nullable()->after('manager_id') + ->comment('부 담당자 ID (users.id)'); + }); + } + + public function down(): void + { + Schema::table('equipments', function (Blueprint $table) { + $table->dropColumn('sub_manager_id'); + }); + } +}; diff --git a/database/migrations/2026_02_28_100100_add_inspection_cycle_to_templates_table.php b/database/migrations/2026_02_28_100100_add_inspection_cycle_to_templates_table.php new file mode 100644 index 0000000..5750d5f --- /dev/null +++ b/database/migrations/2026_02_28_100100_add_inspection_cycle_to_templates_table.php @@ -0,0 +1,67 @@ +string('inspection_cycle', 20)->default('daily')->after('equipment_id') + ->comment('점검주기: daily/weekly/monthly/bimonthly/quarterly/semiannual'); + }); + } + + // FK 삭제 → 유니크 변경 → FK 재생성 (개별 statement) + $this->dropFkIfExists('equipment_inspection_templates', 'equipment_inspection_templates_equipment_id_foreign'); + $this->dropUniqueIfExists('equipment_inspection_templates', 'uq_equipment_item_no'); + + Schema::table('equipment_inspection_templates', function (Blueprint $table) { + $table->unique(['equipment_id', 'inspection_cycle', 'item_no'], 'uq_equipment_cycle_item_no'); + $table->index('inspection_cycle', 'idx_insp_tmpl_cycle'); + + $table->foreign('equipment_id') + ->references('id') + ->on('equipments') + ->onDelete('cascade'); + }); + } + + public function down(): void + { + $this->dropFkIfExists('equipment_inspection_templates', 'equipment_inspection_templates_equipment_id_foreign'); + + Schema::table('equipment_inspection_templates', function (Blueprint $table) { + $table->dropIndex('idx_insp_tmpl_cycle'); + $table->dropUnique('uq_equipment_cycle_item_no'); + $table->unique(['equipment_id', 'item_no'], 'uq_equipment_item_no'); + $table->dropColumn('inspection_cycle'); + + $table->foreign('equipment_id') + ->references('id') + ->on('equipments') + ->onDelete('cascade'); + }); + } + + private function dropFkIfExists(string $table, string $fkName): void + { + $fks = DB::select("SELECT CONSTRAINT_NAME FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME = ?", [$table, $fkName]); + if (count($fks) > 0) { + DB::statement("ALTER TABLE `{$table}` DROP FOREIGN KEY `{$fkName}`"); + } + } + + private function dropUniqueIfExists(string $table, string $indexName): void + { + $indexes = DB::select("SHOW INDEX FROM `{$table}` WHERE Key_name = ?", [$indexName]); + if (count($indexes) > 0) { + DB::statement("ALTER TABLE `{$table}` DROP INDEX `{$indexName}`"); + } + } +}; diff --git a/database/migrations/2026_02_28_100200_add_inspection_cycle_to_inspections_table.php b/database/migrations/2026_02_28_100200_add_inspection_cycle_to_inspections_table.php new file mode 100644 index 0000000..0de3fe6 --- /dev/null +++ b/database/migrations/2026_02_28_100200_add_inspection_cycle_to_inspections_table.php @@ -0,0 +1,43 @@ +string('inspection_cycle', 20)->default('daily')->after('equipment_id') + ->comment('점검주기: daily/weekly/monthly/bimonthly/quarterly/semiannual'); + }); + + // 기존 레코드를 daily로 설정 + DB::statement("UPDATE equipment_inspections SET inspection_cycle = 'daily' WHERE inspection_cycle = '' OR inspection_cycle IS NULL"); + + Schema::table('equipment_inspections', function (Blueprint $table) { + // 기존 유니크/인덱스 삭제 + $table->dropUnique('uq_inspection_month'); + $table->dropIndex('idx_inspection_ym'); + + // cycle 포함 유니크/인덱스 추가 + $table->unique(['tenant_id', 'equipment_id', 'inspection_cycle', 'year_month'], 'uq_inspection_cycle_period'); + $table->index(['tenant_id', 'inspection_cycle', 'year_month'], 'idx_inspection_cycle_period'); + }); + } + + public function down(): void + { + Schema::table('equipment_inspections', function (Blueprint $table) { + $table->dropIndex('idx_inspection_cycle_period'); + $table->dropUnique('uq_inspection_cycle_period'); + + $table->unique(['tenant_id', 'equipment_id', 'year_month'], 'uq_inspection_month'); + $table->index(['tenant_id', 'year_month'], 'idx_inspection_ym'); + + $table->dropColumn('inspection_cycle'); + }); + } +};