From 05074a641da1d47602203fae906f647473ace1fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=ED=98=81=EC=84=B1?= Date: Thu, 19 Mar 2026 11:39:22 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20[QA]=20=EA=B2=AC=EC=A0=81=20=EC=97=91?= =?UTF-8?q?=EC=85=80=20=EC=97=85=EB=A1=9C=EB=93=9C=20=EC=A4=80=EB=B9=84?= =?UTF-8?q?=EC=A4=91=20=EC=B2=98=EB=A6=AC=20+=20=EB=8B=A8=EA=B0=80=20?= =?UTF-8?q?=ED=92=88=EB=AA=A9=EC=BD=94=EB=93=9C=20=ED=91=9C=EC=8B=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - LocationListPanel: 양식다운로드/업로드 버튼 → "준비중입니다." toast - pricing/actions: item 데이터 우선 사용으로 품목코드·품목명 정상 표시 fix: [production] 작업자 화면 빈 화면 버그 수정 - 공정 목록 API 실패 시 activeTab이 ''로 남아 탭 콘텐츠 미렌더링되는 문제 수정 - processTabs가 비어있을 때 'screen'으로 폴백 설정 --- src/components/pricing/actions.ts | 7 ++++--- src/components/production/WorkerScreen/index.tsx | 9 ++++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/components/pricing/actions.ts b/src/components/pricing/actions.ts index 9c22bb7b..c747d8a7 100644 --- a/src/components/pricing/actions.ts +++ b/src/components/pricing/actions.ts @@ -88,14 +88,15 @@ interface PriceApiData { * API 데이터 → 프론트엔드 타입 변환 */ function transformApiToFrontend(apiData: PriceApiData): PricingData { + const item = (apiData as unknown as Record).item as Record | undefined; const product = apiData.product; const material = apiData.material; - const itemCode = product?.product_code || material?.item_code || `ITEM-${apiData.item_id}`; - const itemName = product?.product_name || material?.item_name || '품목명 없음'; + const itemCode = (item?.code as string) || product?.product_code || material?.item_code || `ITEM-${apiData.item_id}`; + const itemName = (item?.name as string) || product?.product_name || material?.item_name || '품목명 없음'; const specification = product?.specification || material?.specification || undefined; const unit = product?.unit || material?.unit || 'EA'; - const itemType = product?.product_type || material?.product_type || 'PT'; + const itemType = (item?.item_category as string) || product?.product_type || material?.product_type || 'PT'; // 리비전 변환 const revisions = apiData.revisions?.map((rev) => ({ diff --git a/src/components/production/WorkerScreen/index.tsx b/src/components/production/WorkerScreen/index.tsx index f09ae389..c10a32db 100644 --- a/src/components/production/WorkerScreen/index.tsx +++ b/src/components/production/WorkerScreen/index.tsx @@ -280,12 +280,15 @@ export default function WorkerScreen() { return processListCache.filter((p) => p.status === '사용중'); }, [processListCache]); - // 공정 목록 로드 후 첫 번째 공정을 기본 선택 + // 공정 목록 로드 후 첫 번째 공정을 기본 선택 (폴백: 'screen') useEffect(() => { - if (processTabs.length > 0 && !activeTab) { + if (activeTab) return; + if (processTabs.length > 0) { setActiveTab(processTabs[0].id); + } else if (!isLoading) { + setActiveTab('screen'); } - }, [processTabs, activeTab]); + }, [processTabs, activeTab, isLoading]); // 선택된 공정의 ProcessTab 키 (mock 데이터 및 기존 로직 호환용) const activeProcessTabKey: ProcessTab = useMemo(() => {