- 자료실 하위 3개 메뉴: 자료보관함, 매뉴얼, 공지사항 - 자료보관함: 폴더 트리 + 파일 업로드/다운로드/삭제 - 매뉴얼/공지사항: 게시판형 CRUD + 첨부파일 - 안전관리: 안전보건교육, TBM현황, 위험성평가, 재해예방조치 - 품질관리: 시정조치 UI 페이지 - 대시보드: 슈퍼관리자 전용 레거시 사이트 참고 카드 - 작업일보/출면일보 오류 수정 및 기능 개선 - 설비 사진 업로드, 근로계약서 종료일 수정
202 lines
6.6 KiB
PHP
202 lines
6.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Juil;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Juil\PmisArchiveFile;
|
|
use App\Models\Juil\PmisArchiveFolder;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Storage;
|
|
|
|
class PmisArchiveController extends Controller
|
|
{
|
|
private function tenantId(): int
|
|
{
|
|
return (int) session('current_tenant_id', 1);
|
|
}
|
|
|
|
/* ─── 폴더 트리 ─── */
|
|
|
|
public function folderTree(): JsonResponse
|
|
{
|
|
$folders = PmisArchiveFolder::tenant($this->tenantId())
|
|
->whereNull('parent_id')
|
|
->with('children.children.children')
|
|
->orderBy('sort_order')
|
|
->get();
|
|
|
|
return response()->json(['folders' => $folders]);
|
|
}
|
|
|
|
public function folderStore(Request $request): JsonResponse
|
|
{
|
|
$request->validate([
|
|
'name' => 'required|string|max:200',
|
|
'parent_id' => 'nullable|integer',
|
|
]);
|
|
|
|
$folder = PmisArchiveFolder::create([
|
|
'tenant_id' => $this->tenantId(),
|
|
'parent_id' => $request->parent_id,
|
|
'name' => $request->name,
|
|
'sort_order' => PmisArchiveFolder::tenant($this->tenantId())
|
|
->where('parent_id', $request->parent_id)
|
|
->count(),
|
|
]);
|
|
|
|
return response()->json(['folder' => $folder], 201);
|
|
}
|
|
|
|
public function folderUpdate(Request $request, int $id): JsonResponse
|
|
{
|
|
$folder = PmisArchiveFolder::tenant($this->tenantId())->findOrFail($id);
|
|
|
|
$request->validate(['name' => 'required|string|max:200']);
|
|
$folder->update(['name' => $request->name]);
|
|
|
|
return response()->json(['folder' => $folder]);
|
|
}
|
|
|
|
public function folderDestroy(int $id): JsonResponse
|
|
{
|
|
$folder = PmisArchiveFolder::tenant($this->tenantId())->findOrFail($id);
|
|
$descendantIds = $folder->allDescendantIds();
|
|
|
|
PmisArchiveFile::tenant($this->tenantId())
|
|
->whereIn('folder_id', $descendantIds)
|
|
->each(function ($file) {
|
|
Storage::disk('public')->delete($file->file_path);
|
|
$file->delete();
|
|
});
|
|
|
|
PmisArchiveFolder::tenant($this->tenantId())
|
|
->whereIn('id', $descendantIds)
|
|
->delete();
|
|
|
|
return response()->json(['message' => '삭제되었습니다.']);
|
|
}
|
|
|
|
/* ─── 파일 목록 ─── */
|
|
|
|
public function fileList(Request $request): JsonResponse
|
|
{
|
|
$folderId = $request->query('folder_id');
|
|
$tab = $request->query('tab', '전체');
|
|
$search = $request->query('search', '');
|
|
$dateFrom = $request->query('date_from');
|
|
$dateTo = $request->query('date_to');
|
|
$includeSubfolder = $request->boolean('include_subfolder', true);
|
|
|
|
$query = PmisArchiveFile::tenant($this->tenantId());
|
|
|
|
if ($folderId) {
|
|
if ($includeSubfolder) {
|
|
$folder = PmisArchiveFolder::tenant($this->tenantId())->find($folderId);
|
|
if ($folder) {
|
|
$folderIds = $folder->allDescendantIds();
|
|
$query->whereIn('folder_id', $folderIds);
|
|
}
|
|
} else {
|
|
$query->where('folder_id', $folderId);
|
|
}
|
|
}
|
|
|
|
if ($tab !== '전체') {
|
|
$query->where('file_type', $tab);
|
|
}
|
|
|
|
if ($search) {
|
|
$query->where(function ($q) use ($search) {
|
|
$q->where('title', 'like', "%{$search}%")
|
|
->orWhere('original_name', 'like', "%{$search}%")
|
|
->orWhereHas('folder', fn ($fq) => $fq->where('name', 'like', "%{$search}%"));
|
|
});
|
|
}
|
|
|
|
if ($dateFrom) {
|
|
$query->whereDate('created_at', '>=', $dateFrom);
|
|
}
|
|
if ($dateTo) {
|
|
$query->whereDate('created_at', '<=', $dateTo);
|
|
}
|
|
|
|
$files = $query->orderByDesc('created_at')->get();
|
|
|
|
$result = $files->map(fn ($f) => [
|
|
'id' => $f->id,
|
|
'title' => $f->title ?: $f->original_name,
|
|
'fileName' => $f->original_name,
|
|
'filePath' => Storage::disk('public')->url($f->file_path),
|
|
'fileType' => $f->file_type,
|
|
'siteName' => $f->site_name,
|
|
'size' => PmisArchiveFile::formatSize($f->file_size),
|
|
'sizeRaw' => $f->file_size,
|
|
'registrant' => $f->registeredByUser?->name ?? '-',
|
|
'registeredAt' => $f->created_at->format('Y-m-d'),
|
|
'folderId' => $f->folder_id,
|
|
]);
|
|
|
|
return response()->json(['files' => $result]);
|
|
}
|
|
|
|
/* ─── 파일 업로드 ─── */
|
|
|
|
public function fileStore(Request $request): JsonResponse
|
|
{
|
|
$request->validate([
|
|
'folder_id' => 'required|integer|exists:pmis_archive_folders,id',
|
|
'files' => 'required|array|min:1',
|
|
'files.*' => 'file|max:51200',
|
|
'title' => 'nullable|string|max:300',
|
|
'site_name' => 'nullable|string|max:200',
|
|
]);
|
|
|
|
$user = auth()->user();
|
|
$uploaded = [];
|
|
|
|
foreach ($request->file('files') as $file) {
|
|
$ext = $file->getClientOriginalExtension();
|
|
$path = $file->store('pmis/archive', 'public');
|
|
|
|
$record = PmisArchiveFile::create([
|
|
'tenant_id' => $this->tenantId(),
|
|
'folder_id' => $request->folder_id,
|
|
'title' => $request->title ?: '',
|
|
'original_name' => $file->getClientOriginalName(),
|
|
'file_path' => $path,
|
|
'file_type' => PmisArchiveFile::detectFileType($ext),
|
|
'file_size' => $file->getSize(),
|
|
'site_name' => $request->site_name ?: '',
|
|
'registered_by' => $user?->id,
|
|
]);
|
|
|
|
$uploaded[] = $record;
|
|
}
|
|
|
|
return response()->json(['files' => $uploaded, 'message' => count($uploaded).'개 파일이 업로드되었습니다.'], 201);
|
|
}
|
|
|
|
/* ─── 파일 삭제 ─── */
|
|
|
|
public function fileDestroy(int $id): JsonResponse
|
|
{
|
|
$file = PmisArchiveFile::tenant($this->tenantId())->findOrFail($id);
|
|
|
|
Storage::disk('public')->delete($file->file_path);
|
|
$file->delete();
|
|
|
|
return response()->json(['message' => '삭제되었습니다.']);
|
|
}
|
|
|
|
/* ─── 파일 다운로드 ─── */
|
|
|
|
public function fileDownload(int $id)
|
|
{
|
|
$file = PmisArchiveFile::tenant($this->tenantId())->findOrFail($id);
|
|
$fullPath = Storage::disk('public')->path($file->file_path);
|
|
|
|
return response()->download($fullPath, $file->original_name);
|
|
}
|
|
}
|