diff --git a/services/review.go b/services/review.go index b2c7cba..86c8815 100644 --- a/services/review.go +++ b/services/review.go @@ -134,7 +134,7 @@ func GenerateReview(db *sql.DB, repoPath, base, head string, topN, concurrency i sem <- struct{}{} // acquire slot defer func() { <-sem }() // release slot - // Send file_start (order doesn't matter, frontend tracks by filename) + // Send file_start after acquiring semaphore — this means the file is actually being reviewed now if safeCallback != nil { safeCallback("file_start", map[string]interface{}{ "file": f.Filename, diff --git a/templates/pages/review.html b/templates/pages/review.html index 977b76c..231447e 100644 --- a/templates/pages/review.html +++ b/templates/pages/review.html @@ -368,9 +368,6 @@ }, file_start(data) { currentFile = data.file || ''; - completedFiles++; - const pct = totalFiles > 0 ? Math.round((completedFiles / totalFiles) * 80 + 10) : 50; - document.getElementById('progress-bar').style.width = pct + '%'; document.getElementById('progress-text').textContent = `正在审查: ${currentFile} (${completedFiles}/${totalFiles})`; // Initialize file review entry @@ -389,7 +386,10 @@ appendSuggestionCard(data); }, file_end(data) { - // File done + completedFiles++; + const pct = totalFiles > 0 ? Math.round((completedFiles / totalFiles) * 80 + 10) : 50; + document.getElementById('progress-bar').style.width = pct + '%'; + document.getElementById('progress-text').textContent = `已完成 ${completedFiles}/${totalFiles} 个文件`; }, file_summary(data) { if (data.file && fileReviews[data.file]) {