From 60aef7992b1d88cad1d9d78db6e3fd9bb695cf92 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 14:17:18 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20[equipment]=20=EC=A0=90=EA=B2=80?= =?UTF-8?q?=ED=95=AD=EB=AA=A9=20=EB=8B=A4=EB=A5=B8=20=EC=A3=BC=EA=B8=B0?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=B5=EC=82=AC=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 서비스: copyTemplatesToCycles 메서드 추가 (중복 항목 스킵) - 컨트롤러: copyTemplates API 엔드포인트 추가 - UI: 다른 주기에 복사 버튼 + 체크박스 모달 --- .../Admin/EquipmentInspectionController.php | 28 ++++ app/Services/EquipmentInspectionService.php | 58 ++++++++ .../partials/tabs/inspection-items.blade.php | 126 +++++++++++++++++- routes/api.php | 1 + 4 files changed, 208 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/Api/Admin/EquipmentInspectionController.php b/app/Http/Controllers/Api/Admin/EquipmentInspectionController.php index 9892db81..c2026c80 100644 --- a/app/Http/Controllers/Api/Admin/EquipmentInspectionController.php +++ b/app/Http/Controllers/Api/Admin/EquipmentInspectionController.php @@ -164,6 +164,34 @@ public function updateTemplate(Request $request, int $templateId): JsonResponse } } + public function copyTemplates(Request $request, int $equipmentId): JsonResponse + { + $request->validate([ + 'source_cycle' => 'required|string', + 'target_cycles' => 'required|array|min:1', + 'target_cycles.*' => 'required|string', + ]); + + try { + $result = $this->inspectionService->copyTemplatesToCycles( + $equipmentId, + $request->input('source_cycle'), + $request->input('target_cycles') + ); + + return response()->json([ + 'success' => true, + 'message' => "{$result['copied']}개 항목이 복사되었습니다.".($result['skipped'] > 0 ? " (중복 {$result['skipped']}개 건너뜀)" : ''), + 'data' => $result, + ]); + } catch (\Exception $e) { + return response()->json([ + 'success' => false, + 'message' => $e->getMessage(), + ], 400); + } + } + public function deleteTemplate(int $templateId): JsonResponse { try { diff --git a/app/Services/EquipmentInspectionService.php b/app/Services/EquipmentInspectionService.php index 6d9869b8..72cd30ed 100644 --- a/app/Services/EquipmentInspectionService.php +++ b/app/Services/EquipmentInspectionService.php @@ -200,6 +200,64 @@ public function deleteTemplate(int $id): bool return EquipmentInspectionTemplate::findOrFail($id)->delete(); } + /** + * 점검항목을 다른 주기로 복사 + */ + public function copyTemplatesToCycles(int $equipmentId, string $sourceCycle, array $targetCycles): array + { + $tenantId = session('selected_tenant_id', 1); + + $sourceTemplates = EquipmentInspectionTemplate::where('equipment_id', $equipmentId) + ->where('inspection_cycle', $sourceCycle) + ->where('is_active', true) + ->orderBy('sort_order') + ->get(); + + if ($sourceTemplates->isEmpty()) { + throw new \Exception('복사할 점검항목이 없습니다.'); + } + + $copiedCount = 0; + $skippedCount = 0; + + foreach ($targetCycles as $targetCycle) { + foreach ($sourceTemplates as $template) { + $exists = EquipmentInspectionTemplate::where('equipment_id', $equipmentId) + ->where('inspection_cycle', $targetCycle) + ->where('item_no', $template->item_no) + ->exists(); + + if ($exists) { + $skippedCount++; + + continue; + } + + EquipmentInspectionTemplate::create([ + 'tenant_id' => $tenantId, + 'equipment_id' => $equipmentId, + 'inspection_cycle' => $targetCycle, + 'item_no' => $template->item_no, + 'check_point' => $template->check_point, + 'check_item' => $template->check_item, + 'check_timing' => $template->check_timing, + 'check_frequency' => $template->check_frequency, + 'check_method' => $template->check_method, + 'sort_order' => $template->sort_order, + 'is_active' => true, + ]); + $copiedCount++; + } + } + + return [ + 'copied' => $copiedCount, + 'skipped' => $skippedCount, + 'source_count' => $sourceTemplates->count(), + 'target_cycles' => $targetCycles, + ]; + } + /** * 설비에 등록된 점검주기 목록 반환 (항목이 있는 주기만) */ diff --git a/resources/views/equipment/partials/tabs/inspection-items.blade.php b/resources/views/equipment/partials/tabs/inspection-items.blade.php index 3ec95ae2..b3362b16 100644 --- a/resources/views/equipment/partials/tabs/inspection-items.blade.php +++ b/resources/views/equipment/partials/tabs/inspection-items.blade.php @@ -2,10 +2,17 @@

점검항목 템플릿

- +
+ + +
@php @@ -144,8 +151,45 @@ class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg">추가
+ + + diff --git a/routes/api.php b/routes/api.php index e9509ac9..ac51f3d0 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1023,6 +1023,7 @@ Route::post('/{id}/templates', [\App\Http\Controllers\Api\Admin\EquipmentInspectionController::class, 'storeTemplate'])->whereNumber('id')->name('templates.store'); Route::put('/templates/{templateId}', [\App\Http\Controllers\Api\Admin\EquipmentInspectionController::class, 'updateTemplate'])->whereNumber('templateId')->name('templates.update'); Route::delete('/templates/{templateId}', [\App\Http\Controllers\Api\Admin\EquipmentInspectionController::class, 'deleteTemplate'])->whereNumber('templateId')->name('templates.destroy'); + Route::post('/{id}/templates/copy', [\App\Http\Controllers\Api\Admin\EquipmentInspectionController::class, 'copyTemplates'])->whereNumber('id')->name('templates.copy'); // 점검 기록 Route::get('/inspections', [\App\Http\Controllers\Api\Admin\EquipmentInspectionController::class, 'index'])->name('inspections.index');