From 169ba3c4d26980927118bbc011219fab6bc83d60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Sun, 22 Mar 2026 14:01:57 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20[=EC=9E=90=EC=9E=AC=ED=88=AC=EC=9E=85]?= =?UTF-8?q?=20=EC=9E=AC=EA=B3=A0=20=EA=B2=80=EC=83=89=20=ED=95=84=EB=93=9C?= =?UTF-8?q?=20=EB=A7=A4=ED=95=91=20=EC=88=98=EC=A0=95=20+=20=EC=9E=AC?= =?UTF-8?q?=EA=B3=B5=ED=92=88=20=EC=9B=90=EC=9E=90=EC=9E=AC=20=ED=95=84?= =?UTF-8?q?=ED=84=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - searchStockByCode: API 응답 필드 매핑 수정 (Item 모델 code/name → itemCode/itemName) - 재공품(WIP) 자재 투입 시 원자재(RM)만 검색되도록 item_type 필터 추가 - handleStockSearch query null 안전 처리 - 재고생산 품목코드 동적 반영 (expectedItemCode 상태 추가) - 재고생산 목록 검색에 품목코드 포함 --- .../WorkerScreen/MaterialInputModal.tsx | 22 ++++-- .../production/WorkerScreen/actions.ts | 71 +++++++++++++------ src/components/stocks/BendingLotForm.tsx | 25 +++++-- src/components/stocks/StockProductionList.tsx | 1 + 4 files changed, 85 insertions(+), 34 deletions(-) diff --git a/src/components/production/WorkerScreen/MaterialInputModal.tsx b/src/components/production/WorkerScreen/MaterialInputModal.tsx index cbc1c85e..da05aa5e 100644 --- a/src/components/production/WorkerScreen/MaterialInputModal.tsx +++ b/src/components/production/WorkerScreen/MaterialInputModal.tsx @@ -89,6 +89,12 @@ export function MaterialInputModal({ const [isSubmitting, setIsSubmitting] = useState(false); const materialsLoadedRef = useRef(false); + // 재공품 여부 판별 — 재공품이면 검색 시 원자재(RM)만 조회 + const isWipOrder = useMemo(() => { + if (!order) return false; + return order.projectName === '재고생산' || order.salesOrderNo?.startsWith('STK'); + }, [order]); + // 재고 검색 상태 const [searchOpenGroup, setSearchOpenGroup] = useState(null); const [searchQuery, setSearchQuery] = useState(''); @@ -98,12 +104,14 @@ export function MaterialInputModal({ // 품목 검색 결과 (재고 없는 품목 포함) const [itemSearchResults, setItemSearchResults] = useState([]); - const handleStockSearch = useCallback(async (query: string) => { - if (!query.trim()) { setSearchResults([]); setItemSearchResults([]); return; } + const handleStockSearch = useCallback(async (query: string | undefined) => { + if (!query?.trim()) { setSearchResults([]); setItemSearchResults([]); return; } setIsSearching(true); + // 재공품: 원자재(RM)만 검색, 일반: 전체 검색 + const typeFilter = isWipOrder ? 'RM' : undefined; const [stockResult, itemResult] = await Promise.all([ - searchStockByCode(query.trim()), - searchItems(query.trim()), + searchStockByCode(query.trim(), typeFilter), + searchItems(query.trim(), typeFilter), ]); if (stockResult.success) setSearchResults(stockResult.data); if (itemResult.success) { @@ -112,7 +120,7 @@ export function MaterialInputModal({ setItemSearchResults(itemResult.data.filter(i => !stockItemIds.has(i.itemId))); } setIsSearching(false); - }, []); + }, [isWipOrder]); const [isForceCreating, setIsForceCreating] = useState(false); @@ -570,7 +578,7 @@ export function MaterialInputModal({ value={searchQuery} onChange={(e) => setSearchQuery(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleStockSearch(searchQuery)} - placeholder="품목코드 또는 자재명으로 재고 검색" + placeholder={isWipOrder ? "원자재 코드 또는 자재명으로 검색" : "품목코드 또는 자재명으로 재고 검색"} className="flex-1 text-xs px-2 py-1.5 border rounded bg-white" />