diff --git a/app/Http/Controllers/EquipmentController.php b/app/Http/Controllers/EquipmentController.php new file mode 100644 index 00000000..c2221c63 --- /dev/null +++ b/app/Http/Controllers/EquipmentController.php @@ -0,0 +1,115 @@ +header('HX-Request')) { + return response('', 200)->header('HX-Redirect', route('equipment.dashboard')); + } + + $stats = $this->equipmentService->getDashboardStats(); + $typeStats = $this->equipmentService->getTypeStats(); + $inspectionStats = $this->inspectionService->getMonthlyStats(now()->format('Y-m')); + $recentRepairs = $this->repairService->getRecentRepairs(5); + + return view('equipment.dashboard', compact('stats', 'typeStats', 'inspectionStats', 'recentRepairs')); + } + + public function index(Request $request): View|Response + { + if ($request->header('HX-Request')) { + return response('', 200)->header('HX-Redirect', route('equipment.index')); + } + + return view('equipment.index'); + } + + public function create(): View + { + $users = \App\Models\User::orderBy('name')->get(['id', 'name']); + + return view('equipment.create', compact('users')); + } + + public function show(int $id): View + { + $equipment = $this->equipmentService->getEquipmentById($id); + + if (! $equipment) { + abort(404, '설비를 찾을 수 없습니다.'); + } + + return view('equipment.show', compact('equipment')); + } + + public function edit(int $id): View + { + $users = \App\Models\User::orderBy('name')->get(['id', 'name']); + + return view('equipment.edit', compact('id', 'users')); + } + + public function inspections(Request $request): View|Response + { + if ($request->header('HX-Request')) { + return response('', 200)->header('HX-Redirect', route('equipment.inspections')); + } + + $equipmentList = $this->equipmentService->getEquipmentList(); + + return view('equipment.inspections.index', compact('equipmentList')); + } + + public function repairs(Request $request): View|Response + { + if ($request->header('HX-Request')) { + return response('', 200)->header('HX-Redirect', route('equipment.repairs')); + } + + $equipmentList = $this->equipmentService->getEquipmentList(); + + return view('equipment.repairs.index', compact('equipmentList')); + } + + public function repairCreate(): View + { + $equipmentList = $this->equipmentService->getEquipmentList(); + $users = \App\Models\User::orderBy('name')->get(['id', 'name']); + + return view('equipment.repairs.create', compact('equipmentList', 'users')); + } + + public function import(Request $request): View|Response + { + if ($request->header('HX-Request')) { + return response('', 200)->header('HX-Redirect', route('equipment.import')); + } + + return view('equipment.import'); + } + + public function guide(Request $request): View|Response + { + if ($request->header('HX-Request')) { + return response('', 200)->header('HX-Redirect', route('equipment.guide')); + } + + return view('equipment.guide'); + } +} diff --git a/resources/views/components/academy-glossary.blade.php b/resources/views/components/academy-glossary.blade.php index 25225177..cb0d31e2 100644 --- a/resources/views/components/academy-glossary.blade.php +++ b/resources/views/components/academy-glossary.blade.php @@ -440,6 +440,29 @@ "Conflict": "같은 파일의 같은 부분을 두 사람이 다르게 수정했을 때 발생하는 충돌. 수동으로 해결해야 한다.", "3-way Merge": "공통 조상, 현재 브랜치, 대상 브랜치 세 가지를 비교하여 충돌을 해결하는 Merge 방식." }; +@elseif($domain === 'equipment') +window.__GLOSSARY_DATA['equipment'] = { + "BM": "Breakdown Maintenance(사후보전). 설비가 고장난 후에 수리하는 보전 방식. 가장 기본적이지만 비용과 손실이 크다.", + "PM": "Preventive Maintenance(예방보전). 고장이 발생하기 전에 정기적으로 점검·교체하는 보전 방식.", + "PdM": "Predictive Maintenance(예지보전). 센서 데이터로 고장 징후를 사전에 감지하여 적시에 보전하는 방식.", + "OEE": "Overall Equipment Effectiveness(설비종합효율). 가동률 x 성능효율 x 양품률로 계산하며, 설비 생산성의 핵심 지표.", + "MTBF": "Mean Time Between Failures(평균 고장 간격). 고장 없이 가동한 평균 시간. 값이 클수록 신뢰성이 높다.", + "MTTR": "Mean Time To Repair(평균 수리 시간). 고장 발생부터 복구까지 걸리는 평균 시간. 값이 작을수록 보전 역량이 높다.", + "TPM": "Total Productive Maintenance(전원참여 생산보전). 생산부서와 보전부서가 함께 설비 효율을 극대화하는 활동.", + "가동률": "설비가 실제로 가동된 시간의 비율. 계획 가동시간 대비 실제 가동시간으로 계산한다.", + "성능효율": "설비가 정상 속도로 가동된 비율. 이론 사이클타임 대비 실제 생산 속도를 나타낸다.", + "양품률": "생산된 제품 중 양품의 비율. 불량품을 제외한 실제 합격품 비율이다.", + "ISO 9001": "품질경영시스템 국제 표준. 조직이 고객 요구사항을 충족하고 지속적으로 개선하는 체계를 인증한다.", + "IATF 16949": "자동차 산업 품질경영시스템 표준. ISO 9001을 기반으로 자동차 산업 고유 요구사항을 추가한다.", + "예방보전": "Preventive Maintenance. 설비 고장을 예방하기 위해 계획적으로 수행하는 점검·정비·교체 활동.", + "사후보전": "Breakdown Maintenance. 설비가 고장난 후에 수리하는 방식. 비계획 정지가 발생하여 손실이 크다.", + "예지보전": "Predictive Maintenance. 설비 상태를 모니터링하여 고장을 사전 예측하고 최적 시점에 보전하는 방식.", + "파레토 분석": "고장 원인을 빈도순으로 정렬하여 상위 20%의 원인이 80%의 문제를 유발한다는 법칙을 활용하는 분석 기법.", + "Why-Why 분석": "왜(Why)를 5번 반복하여 고장의 근본 원인을 파악하는 분석 기법. 5 Whys라고도 한다.", + "교정": "측정 장비의 정확도를 기준 장비와 비교하여 확인·조정하는 활동. 품질 관리의 기본 요소.", + "보전구분": "수리 작업의 수행 주체 분류. 사내보전(자체 인력)과 외주보전(협력업체)으로 구분한다.", + "설비이력": "설비의 등록부터 점검, 수리, 폐기까지 전체 생애주기 동안의 기록. 이력 관리는 품질 심사의 핵심 증빙." +}; @endif diff --git a/resources/views/equipment/guide.blade.php b/resources/views/equipment/guide.blade.php new file mode 100644 index 00000000..f205f8f2 --- /dev/null +++ b/resources/views/equipment/guide.blade.php @@ -0,0 +1,877 @@ +@extends('layouts.app') + +@section('title', '설비관리 도움말') + +@push('styles') + +@endpush + +@section('content') +
설비 등록부터 점검, 수리이력, 품질인정심사 대응까지 — 친절한 가이드
++ SAM 설비관리는 공장 내 모든 설비의 생애주기를 체계적으로 관리하는 모듈입니다. + 설비 등록부터 일상점검, 수리이력, 통계 분석까지 한 곳에서 관리하며, + 품질인정심사(ISO 9001, IATF 16949)에 필요한 증빙 자료를 자동으로 생성합니다. +
++ 기존 엑셀·종이 기반의 관리 방식을 전산화하여 데이터 유실 방지, + 즉시 조회, 사진 증빙 자동 연결을 실현합니다. +
+설비코드, 설비명, 제조사, 설치일, 담당자 등 기본 정보를 체계적으로 등록·관리합니다.
+설비별 일상점검 항목을 날짜별로 기록합니다. 월별 필터와 그리드 뷰로 한눈에 확인합니다.
+고장 내용, 수리 일자, 보전구분(사내/외주), 비용을 기록하여 설비별 수리 이력을 추적합니다.
+등록 설비 수, 설비 유형별 분포, 월간 점검 현황, 최근 수리 내역을 통계 차트로 제공합니다.
+기존 엑셀 파일의 설비 데이터를 일괄 등록합니다. 템플릿 다운로드 후 데이터를 채워 업로드합니다.
+설비 사진을 드래그&드롭 또는 클립보드 붙여넣기(Ctrl+V)로 첨부합니다. 심사 증빙용으로 활용됩니다.
+사진 첨부 3가지 방법:
+Tip: 설비코드 규칙
+설비코드는 한번 등록하면 변경할 수 없습니다. 회사의 설비코드 체계에 맞춰 등록하세요. 예: EQ-PR-001 (설비-생산-001)
일상점검표는 설비별 그리드(표) 형태로 구성됩니다. 행은 날짜, 열은 점검 항목입니다.
+Tip: 점검 빈도
+ISO 9001에서 요구하는 일상점검은 매일 작업 시작 전에 수행하는 것이 원칙입니다. SAM에서는 날짜별로 자동 기록되므로 누락 여부를 쉽게 확인할 수 있습니다.
+설비 고장 발생 시 수리 내역을 기록하고 추적합니다.
+수리이력 활용
+수리이력은 설비 상세 페이지에서 설비별 수리 이력 탭으로 자동 연결됩니다. 심사관이 특정 설비의 수리 내역을 요청하면 즉시 조회할 수 있습니다.
+설비관리 대시보드는 다음 통계 지표를 제공합니다:
+ISO 9001:2015 7.1.3항 (인프라)과 7.1.5항 (모니터링 및 측정 자원)에서 설비관리를 요구합니다:
+IATF 16949(자동차 산업)는 이에 더해 TPM 활동, OEE 관리, 예비 부품 관리를 추가로 요구합니다.
+SAM 설비관리를 사용하면 다음 증빙이 자동으로 관리됩니다:
+| 항목 | +수기 방식 | +SAM 전산화 | +
|---|---|---|
| 설비대장 관리 | +엑셀/종이 → 분실 위험, 버전 혼동 | +DB 영구보관 + 자동 백업 | +
| 점검 기록 | +체크시트 수기 작성 → 판독 어려움 | +클릭 한 번으로 기록, 즉시 조회 | +
| 수리이력 | +별도 파일 관리 → 연결성 없음 | +설비별 자동 연결, 이력 추적 | +
| 심사 준비 시간 | +서류 찾느라 수일~수주 소요 | +즉시 조회, 클릭 한 번으로 출력 | +
| 사진 증빙 | +별도 폴더 관리 → 설비와 연결 안됨 | +설비에 직접 첨부, 자동 연결 | +
| 데이터 분석 | +수동 집계 → 오류 가능성 높음 | +대시보드 자동 통계, 실시간 현황 | +
SAM 설비관리는 PM(예방보전) 레벨을 지원하며, 축적된 데이터를 기반으로 PdM 전환을 준비할 수 있습니다.
+OEE = 가동률 x 성능효율 x 양품률
+가동률 (Availability)
+실제 가동시간 / 계획 가동시간
+설비가 실제로 돌아간 비율
+성능효율 (Performance)
+이론 사이클타임 x 생산량 / 가동시간
+정상 속도로 돌아간 비율
+양품률 (Quality)
+양품 수 / 총 생산량
+불량 없이 생산한 비율
+세계적 수준: OEE 85% 이상 | 일반 제조업: 60~75% | 개선 필요: 60% 미만
+"왜?"를 5번 반복하여 고장의 근본 원인을 찾는 기법입니다.
+현상: 모터가 과열된다
+Why 1: 왜 과열되는가? → 냉각팬이 작동하지 않는다
+Why 2: 왜 작동하지 않는가? → 팬 벨트가 끊어졌다
+Why 3: 왜 끊어졌는가? → 벨트가 마모되었다
+Why 4: 왜 마모되었는가? → 교체 주기를 넘겼다
+Why 5: 왜 넘겼는가? → 예방보전 계획이 없었다 (근본 원인)
+→ SAM 일상점검표로 벨트 마모 상태를 정기적으로 확인하면 예방 가능합니다.
+고장 원인을 빈도순으로 정렬하면, 상위 20%의 원인이 80%의 고장을 유발한다는 법칙입니다.
+핵심 지표: MTBF & MTTR
+MTBF (평균 고장 간격) = 총 가동시간 / 고장 횟수
+값이 클수록 설비 신뢰성이 높음
+MTTR (평균 수리 시간) = 총 수리시간 / 고장 횟수
+값이 작을수록 보전 역량이 높음
+A. 회사 내부 규정에 따르되, 일반적인 체계는 다음과 같습니다:
+EQ-PR-001 — 설비(EQ) + 생산(PR) + 일련번호(001)EQ-IS-001 — 설비(EQ) + 검사(IS) + 일련번호(001)EQ-UT-001 — 설비(EQ) + 유틸리티(UT) + 일련번호(001)설비코드는 한번 등록하면 변경할 수 없으므로 신중하게 결정하세요.
+A. 설비 1건당 사진 수에는 제한이 없습니다. 다만 개별 파일 크기는 10MB 이하를 권장합니다. 설비 전면, 측면, 명판 등 심사에 필요한 사진을 모두 등록하세요.
+A. 이미 등록된 설비코드와 동일한 코드가 엑셀에 포함되어 있으면 해당 행은 건너뛰기(skip) 처리됩니다. Import 완료 후 결과 요약에서 건너뛴 항목을 확인할 수 있습니다.
+A. 네, 점검 그리드에서 해당 셀을 다시 클릭하면 값을 변경할 수 있습니다. 단, 수정 이력이 기록되므로 심사 시 투명성이 유지됩니다.
+A. SAM에서는 설비를 완전 삭제하지 않고 비활성화(소프트 삭제) 처리합니다. 비활성화된 설비는 목록에서 숨겨지지만 데이터는 보존되어, 관리자가 복구할 수 있습니다.
+A. 보전구분은 비용 분석과 보전 역량 평가에 필요합니다:
+품질 심사에서도 자체 보전 역량과 외주 관리 체계를 확인합니다.
+A. 설비 상세 페이지에서 "수정" 버튼을 클릭한 뒤, 담당자 항목을 변경하고 저장하면 됩니다. 변경 이력이 자동으로 기록됩니다.
+A. 네, 점검 항목은 설비별로 독립적으로 관리됩니다. 설비 특성에 맞는 점검 항목(온도 확인, 소음 점검, 오일 상태 등)을 각각 설정할 수 있습니다.
+A. 네, 대시보드에 접속할 때마다 최신 데이터를 기반으로 통계가 계산됩니다. 설비 등록, 점검 기록, 수리이력을 입력하면 즉시 대시보드에 반영됩니다.
+A. 설비 목록 페이지에서 엑셀 다운로드 기능을 제공합니다. 등록된 전체 설비 정보를 엑셀 파일로 내보내어 보고서 작성이나 심사 자료로 활용할 수 있습니다.
++ SAM 설비관리는 설비 등록 → 일상점검 → 수리이력 → 통계/증빙의 일관된 흐름으로 운영됩니다. + 모든 데이터는 설비별로 자동 연결되어 품질인정심사 시 즉시 조회 가능한 증빙 자료가 됩니다. + 기존 수기 관리 대비 데이터 유실 방지, 심사 준비 시간 단축, 이력 추적성 확보가 핵심 이점입니다. +
+