fix: 견적 V2 자동 견적 산출 UI 오류 수정
- actions.ts: BomBulkResponse 타입, FinishedGoods에 has_bom/bom 필드 추가 - QuoteRegistrationV2.tsx: handleCalculate 응답 처리, DevFill BOM 필터링 - LocationDetailPanel.tsx: bomItemsByTab process_group 기반 매핑 - QuoteSummaryPanel.tsx: detailTotals grouped_items 기반 계산 해결된 문제: 1. 오른쪽 패널 제품 리스트 미표시 2. 개소별 합계(상세소계) 미표시 3. 상세별 합계(그룹) 미표시 4. 예상 견적금액 0원 표시
This commit is contained in:
@@ -164,15 +164,31 @@ export function LocationDetailPanel({
|
||||
};
|
||||
|
||||
items.forEach((item) => {
|
||||
// process_group_key (API 그룹 키) 또는 process_group (한글명) 사용
|
||||
const processGroupKey = (item as { process_group_key?: string }).process_group_key?.toLowerCase() || "";
|
||||
const processGroup = item.process_group?.toLowerCase() || "";
|
||||
|
||||
if (processGroup.includes("본체") || processGroup.includes("스크린") || processGroup.includes("슬랫")) {
|
||||
// API 그룹 키 기반 분류 (우선)
|
||||
if (processGroupKey === "screen" || processGroupKey === "assembly") {
|
||||
result.body.push(item);
|
||||
} else if (processGroup.includes("가이드") || processGroup.includes("레일")) {
|
||||
} else if (processGroupKey === "bending") {
|
||||
result["guide-rail"].push(item);
|
||||
} else if (processGroup.includes("케이스")) {
|
||||
} else if (processGroupKey === "steel") {
|
||||
result.case.push(item);
|
||||
} else if (processGroup.includes("하단") || processGroup.includes("마감")) {
|
||||
} else if (processGroupKey === "electric") {
|
||||
result.bottom.push(item);
|
||||
} else if (processGroupKey) {
|
||||
// 기타 그룹키는 본체에 포함
|
||||
result.body.push(item);
|
||||
}
|
||||
// 한글명 기반 분류 (fallback)
|
||||
else if (processGroup.includes("본체") || processGroup.includes("스크린") || processGroup.includes("슬랫") || processGroup.includes("조립")) {
|
||||
result.body.push(item);
|
||||
} else if (processGroup.includes("가이드") || processGroup.includes("레일") || processGroup.includes("절곡")) {
|
||||
result["guide-rail"].push(item);
|
||||
} else if (processGroup.includes("케이스") || processGroup.includes("철재")) {
|
||||
result.case.push(item);
|
||||
} else if (processGroup.includes("하단") || processGroup.includes("마감") || processGroup.includes("전기")) {
|
||||
result.bottom.push(item);
|
||||
} else {
|
||||
// 기타 항목은 본체에 포함
|
||||
@@ -187,7 +203,7 @@ export function LocationDetailPanel({
|
||||
const tabSubtotals = useMemo(() => {
|
||||
const result: Record<string, number> = {};
|
||||
Object.entries(bomItemsByTab).forEach(([tab, items]) => {
|
||||
result[tab] = items.reduce((sum, item) => sum + (item.total_price || 0), 0);
|
||||
result[tab] = items.reduce((sum: number, item: { total_price?: number }) => sum + (item.total_price || 0), 0);
|
||||
});
|
||||
return result;
|
||||
}, [bomItemsByTab]);
|
||||
|
||||
Reference in New Issue
Block a user