fix: [자재투입] 재고 검색 필드 매핑 수정 + 재공품 원자재 필터
- searchStockByCode: API 응답 필드 매핑 수정 (Item 모델 code/name → itemCode/itemName) - 재공품(WIP) 자재 투입 시 원자재(RM)만 검색되도록 item_type 필터 추가 - handleStockSearch query null 안전 처리 - 재고생산 품목코드 동적 반영 (expectedItemCode 상태 추가) - 재고생산 목록 검색에 품목코드 포함
This commit is contained in:
@@ -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<string | null>(null);
|
||||
const [searchQuery, setSearchQuery] = useState('');
|
||||
@@ -98,12 +104,14 @@ export function MaterialInputModal({
|
||||
// 품목 검색 결과 (재고 없는 품목 포함)
|
||||
const [itemSearchResults, setItemSearchResults] = useState<ItemSearchResult[]>([]);
|
||||
|
||||
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"
|
||||
/>
|
||||
<Button size="sm" variant="outline" className="h-7 text-xs" onClick={() => handleStockSearch(searchQuery)}>
|
||||
@@ -904,7 +912,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"
|
||||
/>
|
||||
<Button size="sm" variant="outline" className="h-7 text-xs" onClick={() => handleStockSearch(searchQuery)}>
|
||||
|
||||
Reference in New Issue
Block a user