fix(review): 验收冲突显示与闸门对齐 — 验收报 CONFLICT_UNRESOLVED 时回拉最新审稿并回灌冲突;未审稿不再误显「可直接验收」
This commit is contained in:
@@ -9,6 +9,9 @@ import { ThinkingIndicator } from "@/components/ThinkingIndicator";
|
||||
interface AcceptPanelProps {
|
||||
projectId: string;
|
||||
chapterNo: number;
|
||||
// 本页是否已有审稿结果(进页带留痕 或 本次重审完成)。用于区分
|
||||
// 「审过且 0 冲突→可直接验收」与「未审稿→先审稿」,避免把"未知"当"无冲突"。
|
||||
reviewed: boolean;
|
||||
conflictCount: number;
|
||||
unresolvedCount: number;
|
||||
// R3:当前伏笔建议数(验收前清单提醒,只读不自动落库)。
|
||||
@@ -22,6 +25,7 @@ interface AcceptPanelProps {
|
||||
export function AcceptPanel({
|
||||
projectId,
|
||||
chapterNo,
|
||||
reviewed,
|
||||
conflictCount,
|
||||
unresolvedCount,
|
||||
foreshadowCount,
|
||||
@@ -89,7 +93,9 @@ export function AcceptPanel({
|
||||
<>
|
||||
<p className="mb-2 text-xs text-ink-soft">
|
||||
{conflictCount === 0
|
||||
? "无冲突,可直接验收。"
|
||||
? reviewed
|
||||
? "无冲突,可直接验收。"
|
||||
: "尚未审稿——建议先点「重新审稿」确认本章无冲突,再验收。"
|
||||
: "全部冲突已裁决,可验收本章。"}
|
||||
</p>
|
||||
{/* R3:验收前「本次将更新」清单(预期,落库口径以验收回执为准)。 */}
|
||||
|
||||
@@ -16,10 +16,12 @@ import {
|
||||
type Verdict,
|
||||
} from "@/lib/review/decisions";
|
||||
import {
|
||||
latestReview,
|
||||
normalizeConflicts,
|
||||
normalizeForeshadowSug,
|
||||
normalizePace,
|
||||
} from "@/lib/review/history";
|
||||
import { api } from "@/lib/api/client";
|
||||
import {
|
||||
displayOrder,
|
||||
groupConflicts,
|
||||
@@ -315,8 +317,26 @@ export function ReviewReport({
|
||||
finalText,
|
||||
drafts,
|
||||
);
|
||||
if (outcome.missingIndices.length > 0) {
|
||||
setMissing(new Set(outcome.missingIndices));
|
||||
if (!outcome.conflictUnresolved) {
|
||||
if (outcome.missingIndices.length > 0) {
|
||||
setMissing(new Set(outcome.missingIndices));
|
||||
}
|
||||
return;
|
||||
}
|
||||
// 验收闸读的是「持久化的最新审稿」;本页冲突可能为空/过期(显示 0 冲突却被拦)。
|
||||
// 回拉最新审稿留痕 → 回灌冲突 + 重置裁决草稿,把「看不见的冲突」显式呈现供裁决。
|
||||
const { data } = await api.GET(
|
||||
"/projects/{project_id}/chapters/{chapter_no}/reviews",
|
||||
{ params: { path: { project_id: project.id, chapter_no: chapterNo } } },
|
||||
);
|
||||
const fresh = normalizeConflicts(latestReview(data?.reviews));
|
||||
setMissing(new Set(outcome.missingIndices));
|
||||
if (fresh.length > 0) {
|
||||
review.seed({ conflicts: fresh, foreshadow, pace, style });
|
||||
setDrafts(emptyDecisions(fresh.length));
|
||||
toast("审稿报告已刷新:检测到未裁决冲突,请裁决后再验收", "error");
|
||||
} else {
|
||||
toast("尚有冲突未裁决,请先「重新审稿」查看", "error");
|
||||
}
|
||||
};
|
||||
|
||||
@@ -520,6 +540,7 @@ export function ReviewReport({
|
||||
<AcceptPanel
|
||||
projectId={project.id}
|
||||
chapterNo={chapterNo}
|
||||
reviewed={initialReview !== undefined || review.state.phase === "done"}
|
||||
conflictCount={conflictCount}
|
||||
unresolvedCount={resolved ? 0 : unresolved}
|
||||
foreshadowCount={foreshadow.length}
|
||||
|
||||
Reference in New Issue
Block a user