feat: 1. 将交叉评查转移在入口页。

2. 交叉评查渲染的pdf预览组件复用评查点详情的,同时在评查结果中的数据也添加坐标信息。
This commit is contained in:
2025-11-26 10:49:15 +08:00
parent d1f764028c
commit fe75b4fabd
8 changed files with 181 additions and 93 deletions
+18 -13
View File
@@ -37,8 +37,8 @@ import {
ReviewPointsList
} from "~/components/cross-checking";
// 从ReviewPointsList组件中导入ReviewPoint类型
import { type ReviewPoint } from '~/components/cross-checking';
// 从ReviewPointsList组件中导入ReviewPoint类型和CharPosition类型
import { type ReviewPoint, type CharPosition } from '~/components/cross-checking';
import { messageService } from "~/components/ui/MessageModal";
import { loadingBarService } from "~/components/ui/LoadingBar";
import { Breadcrumb } from "~/components/layout/Breadcrumb";
@@ -297,7 +297,7 @@ export async function action({ request }: ActionFunctionArgs) {
}
export default function CrossCheckingResult() {
console.log('[组件] CrossCheckingResult 渲染');
// console.log('[组件] CrossCheckingResult 渲染');
const navigate = useNavigate();
const loaderData = useLoaderData<typeof loader>();
@@ -306,18 +306,19 @@ export default function CrossCheckingResult() {
const [reviewData, setReviewData] = useState<ReviewData | null>(null);
const [activeReviewPointResultId, setActiveReviewPointResultId] = useState<string | null>(null);
const [targetPage, setTargetPage] = useState<number | undefined>(undefined);
const [charPositions, setCharPositions] = useState<CharPosition[] | undefined>(undefined);
const [localScoringProposals, setLocalScoringProposals] = useState<ScoringProposal[]>(scoring_proposals || []); // 本地状态管理scoringProposals
// 使用ref来跟踪loading状态,避免不必要的重新渲染
const isProcessingRef = useRef(false);
// 添加组件挂载/卸载日志
useEffect(() => {
console.log('[组件] CrossCheckingResult 挂载');
return () => {
console.log('[组件] CrossCheckingResult 卸载');
};
}, []);
// useEffect(() => {
// console.log('[组件] CrossCheckingResult 挂载');
// return () => {
// console.log('[组件] CrossCheckingResult 卸载');
// };
// }, []);
// 同步外部scoring_proposals到本地状态
useEffect(() => {
@@ -387,19 +388,22 @@ export default function CrossCheckingResult() {
}, [document, reviewPoints, statistics, reviewInfo]);
const handleReviewPointSelect = useCallback((reviewPointId: string, page?: number) => {
const handleReviewPointSelect = useCallback((reviewPointId: string, page?: number, charPositions?: CharPosition[]) => {
// 如果点击的是相同的评查点,但有page参数,先重置targetPage以确保useEffect能够触发
if (reviewPointId === activeReviewPointResultId && page) {
setTargetPage(undefined);
// 使用setTimeout确保状态更新后再设置新的targetPage
setCharPositions(undefined);
// 使用setTimeout确保状态更新后再设置新的targetPage和charPositions
setTimeout(() => {
setActiveReviewPointResultId(reviewPointId);
setTargetPage(page);
setCharPositions(charPositions);
}, 0);
} else {
// 正常设置activeReviewPointIdtargetPage
// 正常设置activeReviewPointIdtargetPage和charPositions
setActiveReviewPointResultId(reviewPointId);
setTargetPage(page);
setCharPositions(charPositions);
}
}, [activeReviewPointResultId]);
@@ -724,11 +728,12 @@ export default function CrossCheckingResult() {
<div className="flex flex-col lg:flex-row space-y-4 lg:space-y-0 lg:space-x-4 lg:justify-between">
{/* 左侧:文件预览 */}
<div className="w-full lg:w-[62%]">
<FilePreview
<FilePreview
fileContent={document}
reviewPoints={reviewData.reviewPoints}
activeReviewPointResultId={activeReviewPointResultId}
targetPage={targetPage}
charPositions={charPositions}
/>
</div>