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 @@