feat(frontend): integrate GraphRAG scored evaluation results
- Add getUnifiedEvaluationResults API function - Extend ReviewPointsListProps with flowType, scoredResults, scoredSummary - Add ScoredResultCard rendering for graphrag flow_type - Modify reviews.tsx loader to call unified API - Add scored evaluation component imports Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
+65
-15
@@ -30,7 +30,7 @@ import { useState, useEffect, useRef, useCallback } from "react";
|
||||
import { useNavigate, useLoaderData, useFetcher } from "@remix-run/react";
|
||||
import type { FilePreviewHandle } from "~/components/reviews/FilePreview";
|
||||
import reviewsStyles from "~/styles/reviews.css?url";
|
||||
import { getReviewPoints, getReviewPoints_fromApi, updateReviewResult, confirmReviewResults } from "~/api/evaluation_points/reviews";
|
||||
import { getReviewPoints, getReviewPoints_fromApi, getUnifiedEvaluationResults, updateReviewResult, confirmReviewResults } from "~/api/evaluation_points/reviews";
|
||||
import { toastService } from "~/components/ui/Toast";
|
||||
|
||||
// 导入评查详情页面组件
|
||||
@@ -193,19 +193,67 @@ export async function loader({ request }: LoaderFunctionArgs) {
|
||||
const { getUserSession } = await import("~/api/login/auth.server");
|
||||
const { userInfo, frontendJWT } = await getUserSession(request);
|
||||
|
||||
// 🆕 使用新的后端API获取评查点数据(单次请求替代原7次请求)
|
||||
const reviewData = await getReviewPoints_fromApi(id, request);
|
||||
// 🆕 使用新的统一API获取评查点数据
|
||||
// 先尝试新的统一评查接口
|
||||
const unifiedData = await getUnifiedEvaluationResults(id, request);
|
||||
|
||||
// ⚠️ 原方法已注释(保留以备回退)
|
||||
// const reviewData = await getReviewPoints(id, request);
|
||||
// 如果统一接口返回错误或flow_type为legacy,使用原有API
|
||||
if ('error' in unifiedData || !unifiedData.flow_type) {
|
||||
console.log("[Reviews Loader] 统一接口不可用,使用旧接口...");
|
||||
const reviewData = await getReviewPoints_fromApi(id, request);
|
||||
|
||||
if ('error' in reviewData && reviewData.error) {
|
||||
console.error("[Reviews Loader] 获取评查点数据错误:", reviewData.error);
|
||||
return Response.json({ result: false, message: reviewData.error });
|
||||
if ('error' in reviewData && reviewData.error) {
|
||||
console.error("[Reviews Loader] 获取评查点数据错误:", reviewData.error);
|
||||
return Response.json({ result: false, message: reviewData.error });
|
||||
}
|
||||
|
||||
if ('document' in reviewData && 'data' in reviewData && 'reviewInfo' in reviewData && 'stats' in reviewData) {
|
||||
return Response.json({
|
||||
previousRoute: previousRoute,
|
||||
document: reviewData.document,
|
||||
reviewPoints: reviewData.data,
|
||||
reviewInfo: reviewData.reviewInfo,
|
||||
statistics: reviewData.stats,
|
||||
comparison_document: reviewData.comparison_document,
|
||||
userInfo,
|
||||
frontendJWT,
|
||||
flowType: 'legacy',
|
||||
scoredResults: null,
|
||||
scoredSummary: null
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 确保reviewData有效且具有预期的属性
|
||||
if ('document' in reviewData && 'data' in reviewData && 'reviewInfo' in reviewData && 'stats' in reviewData) {
|
||||
// 统一接口成功返回,判断流程类型
|
||||
if (unifiedData.flow_type === 'graphrag') {
|
||||
// 先获取文档基本信息(统一接口不返回文档内容)
|
||||
const reviewData = await getReviewPoints_fromApi(id, request);
|
||||
|
||||
return Response.json({
|
||||
previousRoute: previousRoute,
|
||||
document: ('document' in reviewData && !('error' in reviewData)) ? reviewData.document : null,
|
||||
reviewPoints: unifiedData.results,
|
||||
reviewInfo: { reviewTime: unifiedData.evaluated_at, reviewModel: 'GraphRAG', ruleGroup: '', result: '', issueCount: unifiedData.summary?.total_points || 0 },
|
||||
statistics: {
|
||||
total: unifiedData.summary?.total_points || 0,
|
||||
success: unifiedData.summary?.passed_count || 0,
|
||||
error: unifiedData.summary?.failed_count || 0,
|
||||
warning: 0,
|
||||
score: unifiedData.summary?.total_score || 0
|
||||
},
|
||||
comparison_document: ('comparison_document' in reviewData && !('error' in reviewData)) ? reviewData.comparison_document : null,
|
||||
userInfo,
|
||||
frontendJWT,
|
||||
flowType: 'graphrag',
|
||||
scoredResults: unifiedData.results,
|
||||
scoredSummary: unifiedData.summary
|
||||
});
|
||||
} else {
|
||||
// legacy 流程但统一接口可用,也走原有逻辑
|
||||
const reviewData = await getReviewPoints_fromApi(id, request);
|
||||
if ('error' in reviewData && reviewData.error) {
|
||||
return Response.json({ result: false, message: reviewData.error });
|
||||
}
|
||||
return Response.json({
|
||||
previousRoute: previousRoute,
|
||||
document: reviewData.document,
|
||||
@@ -214,13 +262,12 @@ export async function loader({ request }: LoaderFunctionArgs) {
|
||||
statistics: reviewData.stats,
|
||||
comparison_document: reviewData.comparison_document,
|
||||
userInfo,
|
||||
frontendJWT
|
||||
frontendJWT,
|
||||
flowType: 'legacy',
|
||||
scoredResults: null,
|
||||
scoredSummary: null
|
||||
});
|
||||
} else {
|
||||
console.error("[Reviews Loader] 返回的评查数据格式不正确,完整数据:", JSON.stringify(reviewData, null, 2));
|
||||
return Response.json({ result: false, message: '返回的评查数据格式不正确' });
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[Reviews Loader] 获取评查数据失败:', error);
|
||||
console.error('[Reviews Loader] 错误堆栈:', error instanceof Error ? error.stack : '无堆栈信息');
|
||||
return Response.json({ result: false, message: `获取评查数据失败: ${error instanceof Error ? error.message : '未知错误'}` });
|
||||
@@ -909,6 +956,9 @@ export default function ReviewDetails() {
|
||||
onStatusChange={handleReviewPointStatusChange}
|
||||
fileFormat={reviewData.fileInfo.fileFormat}
|
||||
onAiSuggestionReplace={handleAiSuggestionReplace}
|
||||
flowType={reviewData.flowType}
|
||||
scoredResults={reviewData.scoredResults}
|
||||
scoredSummary={reviewData.scoredSummary}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user