Files
sam-manage/resources/views/equipment/partials/tabs/basic-info.blade.php
김보곤 0c9d2fd441 feat: [equipment] 사진 멀티 업로드(GCS) + 엑셀 Import 기능 추가
- EquipmentPhotoService: GCS 기반 사진 업로드/삭제/조회 (최대 10장)
- EquipmentImportService: 엑셀 파싱 → 설비 일괄 등록 (한글 헤더 자동 매핑)
- API: 사진 업로드/목록/삭제, Import 미리보기/실행 엔드포인트
- 뷰: create/edit에 드래그앤드롭 사진 업로드, show에 갤러리 표시
- import.blade.php: 3단계 Import UI (파일선택 → 미리보기 → 결과)
- phpoffice/phpspreadsheet 패키지 추가
2026-02-26 13:28:40 +09:00

128 lines
5.6 KiB
PHP

<!-- 기본정보 -->
<div class="bg-white rounded-lg shadow-sm p-6 mb-6">
<h2 class="text-lg font-semibold text-gray-800 mb-4 pb-2 border-b">기본정보</h2>
<div class="grid grid-cols-2 md:grid-cols-4 gap-4">
<div>
<label class="block text-sm text-gray-500 mb-1">설비코드</label>
<p class="text-gray-900 font-mono font-medium">{{ $equipment->equipment_code }}</p>
</div>
<div>
<label class="block text-sm text-gray-500 mb-1">설비명</label>
<p class="text-gray-900 font-medium">{{ $equipment->name }}</p>
</div>
<div>
<label class="block text-sm text-gray-500 mb-1">설비유형</label>
<p class="text-gray-900">{{ $equipment->equipment_type ?? '-' }}</p>
</div>
<div>
<label class="block text-sm text-gray-500 mb-1">규격</label>
<p class="text-gray-900">{{ $equipment->specification ?? '-' }}</p>
</div>
</div>
</div>
<div class="bg-white rounded-lg shadow-sm p-6 mb-6">
<h2 class="text-lg font-semibold text-gray-800 mb-4 pb-2 border-b">제조사 정보</h2>
<div class="grid grid-cols-2 md:grid-cols-3 gap-4">
<div>
<label class="block text-sm text-gray-500 mb-1">제조사</label>
<p class="text-gray-900">{{ $equipment->manufacturer ?? '-' }}</p>
</div>
<div>
<label class="block text-sm text-gray-500 mb-1">모델명</label>
<p class="text-gray-900">{{ $equipment->model_name ?? '-' }}</p>
</div>
<div>
<label class="block text-sm text-gray-500 mb-1">제조번호</label>
<p class="text-gray-900 font-mono">{{ $equipment->serial_no ?? '-' }}</p>
</div>
</div>
</div>
<div class="bg-white rounded-lg shadow-sm p-6 mb-6">
<h2 class="text-lg font-semibold text-gray-800 mb-4 pb-2 border-b">설치 정보</h2>
<div class="grid grid-cols-2 md:grid-cols-4 gap-4">
<div>
<label class="block text-sm text-gray-500 mb-1">위치</label>
<p class="text-gray-900">{{ $equipment->location ?? '-' }}</p>
</div>
<div>
<label class="block text-sm text-gray-500 mb-1">생산라인</label>
<p class="text-gray-900">{{ $equipment->production_line ?? '-' }}</p>
</div>
<div>
<label class="block text-sm text-gray-500 mb-1">구입일</label>
<p class="text-gray-900">{{ $equipment->purchase_date?->format('Y-m-d') ?? '-' }}</p>
</div>
<div>
<label class="block text-sm text-gray-500 mb-1">설치일</label>
<p class="text-gray-900">{{ $equipment->install_date?->format('Y-m-d') ?? '-' }}</p>
</div>
<div>
<label class="block text-sm text-gray-500 mb-1">구입가격</label>
<p class="text-gray-900">{{ $equipment->purchase_price ? number_format($equipment->purchase_price) . '원' : '-' }}</p>
</div>
<div>
<label class="block text-sm text-gray-500 mb-1">내용연수</label>
<p class="text-gray-900">{{ $equipment->useful_life ? $equipment->useful_life . '년' : '-' }}</p>
</div>
<div>
<label class="block text-sm text-gray-500 mb-1">담당자</label>
<p class="text-gray-900">{{ $equipment->manager?->name ?? '-' }}</p>
</div>
<div>
<label class="block text-sm text-gray-500 mb-1">상태</label>
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium {{ $equipment->status_color }}">
{{ $equipment->status_label }}
</span>
</div>
</div>
@if($equipment->memo)
<div class="mt-4">
<label class="block text-sm text-gray-500 mb-1">비고</label>
<p class="text-gray-900 whitespace-pre-wrap">{{ $equipment->memo }}</p>
</div>
@endif
</div>
@if($equipment->photos->isNotEmpty())
<div class="bg-white rounded-lg shadow-sm p-6 mb-6">
<h2 class="text-lg font-semibold text-gray-800 mb-4 pb-2 border-b">설비 사진</h2>
<div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-3">
@foreach($equipment->photos as $photo)
@php
$bucket = config('services.google.storage_bucket');
$url = $photo->gcs_object_name && $bucket
? "https://storage.googleapis.com/{$bucket}/{$photo->gcs_object_name}"
: null;
@endphp
@if($url)
<div>
<a href="{{ $url }}" target="_blank">
<img src="{{ $url }}" alt="{{ $photo->original_name }}"
class="w-full h-32 object-cover rounded-lg border hover:opacity-80 transition">
</a>
<p class="text-xs text-gray-500 mt-1 truncate">{{ $photo->original_name }}</p>
</div>
@endif
@endforeach
</div>
</div>
@endif
@if($equipment->processes->isNotEmpty())
<div class="bg-white rounded-lg shadow-sm p-6">
<h2 class="text-lg font-semibold text-gray-800 mb-4 pb-2 border-b">연결된 공정</h2>
<div class="flex flex-wrap gap-2">
@foreach($equipment->processes as $process)
<span class="inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-blue-100 text-blue-800">
{{ $process->process_name }}
@if($process->pivot->is_primary)
<span class="ml-1 text-xs text-blue-600">()</span>
@endif
</span>
@endforeach
</div>
</div>
@endif