From eb8ed221394aa0dfb54c067beb107393c6a5648b Mon Sep 17 00:00:00 2001 From: hyojin kim Date: Fri, 27 Feb 2026 10:57:33 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=9E=AC=EC=88=98=EC=A7=91=20=EC=8B=A4?= =?UTF-8?q?=ED=8C=A8=20=EA=B1=B4=20=EC=88=98=20=ED=91=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ frontend/src/api/batchApi.ts | 1 + frontend/src/pages/Recollects.tsx | 22 +++++++++++++++++++ .../global/controller/BatchController.java | 10 +++++++++ .../BatchFailedRecordRepository.java | 8 +++++++ .../service/RecollectionHistoryService.java | 15 +++++++++++++ 6 files changed, 59 insertions(+) diff --git a/.gitignore b/.gitignore index 3b66953..6993c75 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,9 @@ dependency-reduced-pom.xml buildNumber.properties .mvn/timing.properties .mvn/wrapper/maven-wrapper.jar +.mvn/wrapper/maven-wrapper.properties +mvnw +mvnw.cmd # Gradle .gradle/ diff --git a/frontend/src/api/batchApi.ts b/frontend/src/api/batchApi.ts index 18a186b..846b51f 100644 --- a/frontend/src/api/batchApi.ts +++ b/frontend/src/api/batchApi.ts @@ -287,6 +287,7 @@ export interface RecollectionSearchResponse { number: number; size: number; totalPages: number; + failedRecordCounts: Record; } export interface RecollectionStatsResponse { diff --git a/frontend/src/pages/Recollects.tsx b/frontend/src/pages/Recollects.tsx index 6b2b898..e6bbc09 100644 --- a/frontend/src/pages/Recollects.tsx +++ b/frontend/src/pages/Recollects.tsx @@ -94,6 +94,9 @@ export default function Recollects() { const [totalCount, setTotalCount] = useState(0); const [useSearch, setUseSearch] = useState(false); + // 실패건 수 (jobExecutionId → count) + const [failedRecordCounts, setFailedRecordCounts] = useState>({}); + // 실패 로그 모달 const [failLogTarget, setFailLogTarget] = useState(null); @@ -256,6 +259,7 @@ export default function Recollects() { setHistories(data.content); setTotalPages(data.totalPages); setTotalCount(data.totalElements); + setFailedRecordCounts(data.failedRecordCounts ?? {}); if (!useSearch) setPage(data.number); } catch { setHistories([]); @@ -684,6 +688,7 @@ export default function Recollects() { 재수집 시작일시 재수집 종료일시 소요시간 + 실패건 액션 @@ -727,6 +732,23 @@ export default function Recollects() { {formatDuration(hist.durationMs)} + + {(() => { + const count = hist.jobExecutionId + ? (failedRecordCounts[hist.jobExecutionId] ?? 0) + : 0; + if (hist.executionStatus === 'STARTED') { + return -; + } + return count > 0 ? ( + + {count}건 + + ) : ( + 0 + ); + })()} +