diff --git a/src/components/orders/documents/OrderDocumentModal.tsx b/src/components/orders/documents/OrderDocumentModal.tsx index 0a04571c..e2767405 100644 --- a/src/components/orders/documents/OrderDocumentModal.tsx +++ b/src/components/orders/documents/OrderDocumentModal.tsx @@ -208,6 +208,7 @@ export function OrderDocumentModal({ motorsLeft={orderDetail?.motors?.left || []} motorsRight={orderDetail?.motors?.right || []} bendingParts={orderDetail?.bending_parts || []} + bendingImages={orderDetail?.bending_images} subsidiaryParts={orderDetail?.subsidiary_parts || []} categoryCode={orderDetail?.category_code} /> diff --git a/src/components/orders/documents/SalesOrderDocument.tsx b/src/components/orders/documents/SalesOrderDocument.tsx index 8baabcc2..7769e6e9 100644 --- a/src/components/orders/documents/SalesOrderDocument.tsx +++ b/src/components/orders/documents/SalesOrderDocument.tsx @@ -9,6 +9,7 @@ import { useState } from "react"; import { getTodayString } from "@/lib/utils/date"; +import { getBendingImageUrl } from "@/components/production/WorkOrders/documents/bending/utils"; import { OrderItem } from "../actions"; import { ProductInfo } from "./OrderDocumentModal"; import { ConstructionApprovalTable } from "@/components/document-system"; @@ -85,6 +86,7 @@ interface SalesOrderDocumentProps { motorsLeft?: MotorRow[]; motorsRight?: MotorRow[]; bendingParts?: BendingGroup[]; + bendingImages?: Record; subsidiaryParts?: SubsidiaryItem[]; categoryCode?: string; } @@ -95,9 +97,21 @@ const tdBase = 'border-r border-gray-300 px-1 py-1'; const tdCenter = `${tdBase} text-center`; const imgPlaceholder = 'flex items-center justify-center border border-dashed border-gray-300 text-gray-400'; -/** 절곡품 이미지 렌더링 — image_file_id 있으면 프록시 경유 실제 이미지, 없으면 placeholder */ -function BendingImage({ items, height = 'h-20' }: { items: BendingItem[]; height?: string }) { - const fileId = items.find(i => i.image_file_id)?.image_file_id; +/** 절곡품 이미지 렌더링 — R2 bending_images 맵 → 기초관리 files fallback → placeholder */ +function BendingImage({ category, productCode, type, bendingImages, fileId, height = 'h-20' }: { + category: 'guiderail' | 'bottombar' | 'smokebarrier' | 'box'; + productCode?: string; + type?: 'wall' | 'side' | 'both' | 'bottom' | 'rear'; + bendingImages?: Record; + fileId?: number | null; + height?: string; +}) { + // 1순위: R2 bending_images 맵 (작업일지와 동일) + const r2Url = getBendingImageUrl(category, productCode || '', type, bendingImages); + if (r2Url) { + return ; + } + // 2순위: 기초관리 files (file_id 기반 프록시) if (fileId) { return ; } @@ -127,12 +141,18 @@ export function SalesOrderDocument({ motorsLeft = [], motorsRight = [], bendingParts = [], + bendingImages, subsidiaryParts = [], }: SalesOrderDocumentProps) { const [bottomFinishView, setBottomFinishView] = useState<'screen' | 'steel'>('screen'); const motorRows = Math.max(motorsLeft.length, motorsRight.length); + // 첫 번째 제품의 productCode 추출 (이미지 매핑용) + const firstProductCode = productRows[0]?.product_code || 'KSE01'; + // 가이드레일 설치 타입 (벽면/측면) + const guideType: 'wall' | 'side' = productRows[0]?.guide_rail?.includes('측면') ? 'side' : 'wall'; + // 절곡물 그룹 데이터 추출 const guideRailItems = bendingParts.find(g => g.group === '가이드레일')?.items ?? []; const caseItems = bendingParts.find(g => g.group === '케이스')?.items ?? []; @@ -446,7 +466,7 @@ export function SalesOrderDocument({ {i === 0 && ( - + )} {item.name} @@ -475,7 +495,7 @@ export function SalesOrderDocument({ {i === 0 && ( - + )} {item.name} @@ -513,7 +533,7 @@ export function SalesOrderDocument({ {i === 0 && ( - + )} {item.name} @@ -542,7 +562,7 @@ export function SalesOrderDocument({ {i === 0 && ( - + )} {item.name} @@ -580,7 +600,7 @@ export function SalesOrderDocument({ {i === 0 && ( - + )} {item.name}