diff --git a/app/Http/Controllers/Api/Admin/EquipmentInspectionController.php b/app/Http/Controllers/Api/Admin/EquipmentInspectionController.php index c2026c80..06960b37 100644 --- a/app/Http/Controllers/Api/Admin/EquipmentInspectionController.php +++ b/app/Http/Controllers/Api/Admin/EquipmentInspectionController.php @@ -79,6 +79,39 @@ public function toggleDetail(Request $request): JsonResponse } } + public function setResult(Request $request): JsonResponse + { + $request->validate([ + 'equipment_id' => 'required|integer', + 'template_item_id' => 'required|integer', + 'check_date' => 'required|date', + 'cycle' => 'nullable|string', + 'result' => 'nullable|in:good,bad,repaired', + ]); + + try { + $result = $this->inspectionService->setResult( + $request->input('equipment_id'), + $request->input('template_item_id'), + $request->input('check_date'), + $request->input('cycle', InspectionCycle::DAILY), + $request->input('result') + ); + + return response()->json([ + 'success' => true, + 'data' => $result, + ]); + } catch (\Exception $e) { + $status = $e->getMessage() === '점검 권한이 없습니다.' ? 403 : 400; + + return response()->json([ + 'success' => false, + 'message' => $e->getMessage(), + ], $status); + } + } + public function updateNotes(Request $request): JsonResponse { $request->validate([ diff --git a/app/Http/Controllers/Mobile/MobileInspectionController.php b/app/Http/Controllers/Mobile/MobileInspectionController.php new file mode 100644 index 00000000..d398600d --- /dev/null +++ b/app/Http/Controllers/Mobile/MobileInspectionController.php @@ -0,0 +1,62 @@ +findOrFail($id); + + $cycle = $request->input('cycle', InspectionCycle::DAILY); + $today = now()->format('Y-m-d'); + $period = InspectionCycle::resolvePeriod($cycle, $today); + + $activeCycles = EquipmentInspectionTemplate::where('equipment_id', $equipment->id) + ->where('is_active', true) + ->distinct() + ->pluck('inspection_cycle') + ->toArray(); + + $templates = EquipmentInspectionTemplate::where('equipment_id', $equipment->id) + ->where('inspection_cycle', $cycle) + ->where('is_active', true) + ->orderBy('sort_order') + ->get(); + + $inspection = EquipmentInspection::where('equipment_id', $equipment->id) + ->where('inspection_cycle', $cycle) + ->where('year_month', $period) + ->first(); + + $details = collect(); + if ($inspection) { + $details = EquipmentInspectionDetail::where('inspection_id', $inspection->id) + ->where('check_date', $today) + ->get() + ->keyBy('template_item_id'); + } + + $canInspect = $equipment->canInspect(); + + return view('mobile.inspection.show', compact( + 'equipment', + 'cycle', + 'today', + 'period', + 'activeCycles', + 'templates', + 'details', + 'canInspect', + )); + } +} diff --git a/app/Services/EquipmentInspectionService.php b/app/Services/EquipmentInspectionService.php index 72cd30ed..9fc1c76b 100644 --- a/app/Services/EquipmentInspectionService.php +++ b/app/Services/EquipmentInspectionService.php @@ -137,6 +137,62 @@ public function toggleDetail(int $equipmentId, int $templateItemId, string $chec ]; } + /** + * 점검 결과 직접 설정 (모바일용) + */ + public function setResult(int $equipmentId, int $templateItemId, string $checkDate, string $cycle, ?string $result): array + { + $equipment = Equipment::findOrFail($equipmentId); + if (! $equipment->canInspect()) { + throw new \Exception('점검 권한이 없습니다.'); + } + + $tenantId = session('selected_tenant_id', 1); + $period = InspectionCycle::resolvePeriod($cycle, $checkDate); + + $inspection = EquipmentInspection::firstOrCreate( + [ + 'tenant_id' => $tenantId, + 'equipment_id' => $equipmentId, + 'inspection_cycle' => $cycle, + 'year_month' => $period, + ], + [ + 'created_by' => auth()->id(), + ] + ); + + $detail = EquipmentInspectionDetail::where('inspection_id', $inspection->id) + ->where('template_item_id', $templateItemId) + ->where('check_date', $checkDate) + ->first(); + + if ($result === null) { + if ($detail) { + $detail->delete(); + } + + return ['result' => null, 'symbol' => '', 'color' => 'text-gray-400']; + } + + if ($detail) { + $detail->update(['result' => $result]); + } else { + $detail = EquipmentInspectionDetail::create([ + 'inspection_id' => $inspection->id, + 'template_item_id' => $templateItemId, + 'check_date' => $checkDate, + 'result' => $result, + ]); + } + + return [ + 'result' => $result, + 'symbol' => $detail->fresh()->result_symbol, + 'color' => $detail->fresh()->result_color, + ]; + } + public function updateInspectionNotes(int $equipmentId, string $yearMonth, array $data, string $cycle = 'daily'): EquipmentInspection { $tenantId = session('selected_tenant_id', 1); diff --git a/app/Services/QrCodeService.php b/app/Services/QrCodeService.php new file mode 100644 index 00000000..a32ea9d0 --- /dev/null +++ b/app/Services/QrCodeService.php @@ -0,0 +1,16 @@ + +
{{ $equipment->equipment_code }}
+{{ $equipment->name }}
+ +{{ $equipment->equipment_code }}
++ {{ \Carbon\Carbon::parse($today)->format('Y-m-d') }} + {{ \App\Enums\InspectionCycle::label($cycle) }} 점검 +
+이 주기에 등록된 점검항목이 없습니다.
++ {{ $idx + 1 }}. {{ $template->check_point }} + - {{ $template->check_item }} +
+ @if($template->check_method) +{{ $template->check_method }}
+ @endif ++ 전체 {{ $templates->count() }}항목 | + 점검 {{ $details->count() }} | + 미점검 {{ $templates->count() - $details->count() }} +
+ @if($canInspect) + + @endif +