diff --git a/negodata/front/src/features/products/components/PriceUpdateModal.tsx b/negodata/front/src/features/products/components/PriceUpdateModal.tsx index aeb0293..79ee979 100644 --- a/negodata/front/src/features/products/components/PriceUpdateModal.tsx +++ b/negodata/front/src/features/products/components/PriceUpdateModal.tsx @@ -270,7 +270,9 @@ export function PriceUpdateModal({ open, products, selectedIds, onDone, onClose if (fresh.success_yn && fresh.lp_price != null) { found += 1; const prev = prevPriceOf(id); - if (prev <= 0 || fresh.lp_price < prev) succeeded.add(id); // 값이 실제로 갱신된 행 + // 값이 실제로 갱신된 행. 단 **못 본 몰이 있으면 완료로 치지 않는다** — + // 그 몰에 더 싼 값이 있었을 수 있어, 다음 '다시 검색'의 기본 대상으로 남겨둔다. + if ((prev <= 0 || fresh.lp_price < prev) && unconfirmed.length === 0) succeeded.add(id); // by_mall 이 비어 오는 옛 이력 대비 — 최소한 대표 최저가는 보이도록 폴백을 채운다. if (Object.keys(malls).length === 0) malls.etc = fresh.lp_price; setItem(id, { kind: 'done', price: fresh.lp_price, malls, unconfirmed }); @@ -354,6 +356,16 @@ export function PriceUpdateModal({ open, products, selectedIds, onDone, onClose switch (s.kind) { case 'done': case 'notfound': + // 못 본 몰이 있으면 '변동 없음'이라 말하면 안 된다 — 그 몰에 더 싼 값이 있었을 수 있어 + // 이 결과는 최종이 아니다. 사용자에게 필요한 건 어느 몰이 왜 막혔는지가 아니라 + // '결과가 완전하지 않다'는 사실 하나다(재시도할 이유가 생긴다). + if (s.unconfirmed?.length) { + return ( + + 일부 확인 못함 + + ); + } // 검색은 정상 수행됐으나 기존보다 낮은 가격이 없었음(미발견 포함) — 값이 안 바뀐 상태. return 변동 없음; case 'failed':