diff --git a/app/Services/BendingItemService.php b/app/Services/BendingItemService.php index c1572e17..1440040d 100644 --- a/app/Services/BendingItemService.php +++ b/app/Services/BendingItemService.php @@ -136,7 +136,7 @@ public function update(int $id, array $data): BendingItem } /** - * 기초자료 복사 — 같은 분류코드의 다음 번호 자동 채번 + * 기초자료 복사 — 같은 분류코드의 다음 번호 자동 채번 + 이미지 복사 */ public function duplicate(int $id): BendingItem { @@ -147,7 +147,7 @@ public function duplicate(int $id): BendingItem $prefix = $m[1] ?? 'XX'; $newCode = $this->generateCode($prefix); - return BendingItem::create([ + $newItem = BendingItem::create([ 'tenant_id' => $source->tenant_id, 'code' => $newCode, 'item_name' => $source->item_name, @@ -170,6 +170,58 @@ public function duplicate(int $id): BendingItem 'is_active' => true, 'created_by' => $this->apiUserId(), ]); + + // 이미지 파일 복사 (R2) + $this->duplicateFiles($source, $newItem); + + return $newItem; + } + + /** + * 원본 아이템의 파일을 R2에서 복사하여 새 아이템에 연결 + */ + private function duplicateFiles(BendingItem $source, BendingItem $target): void + { + $files = \App\Models\Commons\File::where('document_id', $source->id) + ->where('document_type', 'bending_item') + ->whereNull('deleted_at') + ->get(); + + foreach ($files as $file) { + try { + $disk = \Illuminate\Support\Facades\Storage::disk('r2'); + $newStoredName = bin2hex(random_bytes(8)).'.'.pathinfo($file->stored_name, PATHINFO_EXTENSION); + $dir = dirname($file->file_path); + $newPath = $dir.'/'.$newStoredName; + + // R2 내 파일 복사 + if ($file->file_path && $disk->exists($file->file_path)) { + $disk->copy($file->file_path, $newPath); + } + + // 새 File 레코드 생성 + \App\Models\Commons\File::create([ + 'tenant_id' => $target->tenant_id, + 'document_id' => $target->id, + 'document_type' => 'bending_item', + 'field_key' => $file->field_key, + 'file_path' => $newPath, + 'stored_name' => $newStoredName, + 'original_name' => $file->original_name, + 'display_name' => $file->display_name, + 'file_size' => $file->file_size, + 'mime_type' => $file->mime_type, + 'file_type' => $file->file_type, + 'created_by' => $this->apiUserId(), + ]); + } catch (\Throwable $e) { + \Illuminate\Support\Facades\Log::warning('BendingItem file duplicate failed', [ + 'source_id' => $source->id, + 'file_id' => $file->id, + 'error' => $e->getMessage(), + ]); + } + } } public function delete(int $id): bool