feat: 1. 接入CollaboraViewer选中的高亮效果,清除高亮功能,页面销毁自动清除高亮。

2. 合同模板对比接入monaco editor的效果。
3. 添加交叉评查的案卷类型的数据查询。

fix: 1. 修复文档列表的打开模态框蒙板层显示效果。
This commit is contained in:
2025-11-30 19:33:05 +08:00
parent fb67f138dc
commit 4fcc92a381
14 changed files with 1263 additions and 286 deletions
+47 -15
View File
@@ -43,6 +43,9 @@ import {
Comparison
} from "~/components/reviews";
// 导入文档对比组件
import { ComparePreview } from "~/components/reviews/previewComponents/ComparePreview";
// 从ReviewPointsList组件中导入ReviewPoint类型
import { type ReviewPoint } from '~/components/reviews';
import { messageService } from "~/components/ui/MessageModal";
@@ -306,6 +309,7 @@ export default function ReviewDetails() {
const [targetPage, setTargetPage] = useState<number | undefined>(undefined);
const [templateTargetPage, setTemplateTargetPage] = useState<number | undefined>(undefined);
const [charPositions, setCharPositions] = useState<Array<{ box: number[][], char: string, score: number }> | undefined>(undefined);
const [highlightValue, setHighlightValue] = useState<string | undefined>(undefined);
const [pendingUpdate, setPendingUpdate] = useState<{
reviewPointResultId: string;
newStatus: string;
@@ -352,10 +356,22 @@ export default function ReviewDetails() {
},[loaderData, navigate]);
// 当文档 ID 变化时,清空高亮相关的状态
useEffect(() => {
if (document?.id) {
console.log('[Reviews] 文档ID变化,清空高亮状态');
setActiveReviewPointResultId(null);
setTargetPage(undefined);
setTemplateTargetPage(undefined);
setCharPositions(undefined);
setHighlightValue(undefined);
}
}, [document?.id]);
// 模拟获取评查数据
useEffect(() => {
if (!document) return;
// 构建文件信息对象
const fileInfo = {
fileName: document.name || "未知文件名",
@@ -395,22 +411,25 @@ export default function ReviewDetails() {
setActiveTab(tabKey);
};
const handleReviewPointSelect = (reviewPointId: string, page?: number, charPos?: Array<{ box: number[][], char: string, score: number }>) => {
const handleReviewPointSelect = (reviewPointId: string, page?: number, charPos?: Array<{ box: number[][], char: string, score: number }>, value?: string) => {
// 如果点击的是相同的评查点,但有page参数,先重置targetPage以确保useEffect能够触发
if (reviewPointId === activeReviewPointResultId && page) {
setTargetPage(undefined);
setCharPositions(undefined);
// 使用setTimeout确保状态更新后再设置新的targetPage和charPositions
setHighlightValue(undefined);
// 使用setTimeout确保状态更新后再设置新的targetPage、charPositions和highlightValue
setTimeout(() => {
setActiveReviewPointResultId(reviewPointId);
setTargetPage(page);
setCharPositions(charPos);
setHighlightValue(value);
}, 0);
} else {
// 正常设置activeReviewPointId、targetPagecharPositions
// 正常设置activeReviewPointId、targetPagecharPositions和highlightValue
setActiveReviewPointResultId(reviewPointId);
setTargetPage(page);
setCharPositions(charPos);
setHighlightValue(value);
}
};
@@ -733,7 +752,7 @@ export default function ReviewDetails() {
previousRoute: loaderData.previousRoute,
path: document?.path,
auditStatus: document?.auditStatus,
type: document?.type,
type: document?.type || document?.type_id,
comparisonId: comparison_document?.id ? Number(comparison_document.id) : undefined
}}
onConfirmResults={handleConfirmResults}
@@ -742,6 +761,7 @@ export default function ReviewDetails() {
{/* 评查结果选项卡内容 */}
{activeTab === 'preview' && (
<div className="flex flex-col lg:flex-row space-y-4 lg:space-y-0 lg:space-x-4">
{/* {JSON.stringify(document)} */}
{/* 左侧:文件预览 */}
<div className="w-full lg:w-[65%]">
{(() => {
@@ -759,6 +779,8 @@ export default function ReviewDetails() {
activeReviewPointResultId={activeReviewPointResultId}
targetPage={targetPage}
charPositions={charPositions}
highlightValue={highlightValue}
userInfo={loaderData.userInfo}
/>
);
})()}
@@ -779,8 +801,23 @@ export default function ReviewDetails() {
{/* 结构比对选项卡内容 */}
{activeTab === 'filecompare' && (
<div className="w-full" style={{
height: 'calc(100vh - 120px)',
minHeight: '600px',
display: 'flex',
flexDirection: 'column'
}}>
{/* {JSON.stringify(comparison_document?.template_contract_path)} -----{JSON.stringify(document?.path)} */}
<ComparePreview
doc1Path={document?.path || ''}
doc2Path={comparison_document?.template_contract_path || ''}
/>
</div>
)}
{/* 原来的结构比对选项卡内容(已注释) */}
{/* {activeTab === 'filecompare' && (
<div className="flex flex-col lg:flex-row space-y-4 lg:space-y-0 lg:space-x-4">
{/* 左侧:原文件预览 */}
<div className={`w-full ${comparison_document.template_contract_path ? 'lg:w-[38%]' : 'lg:w-[56%]'}`}>
<FilePreview
fileContent={document}
@@ -790,10 +827,9 @@ export default function ReviewDetails() {
charPositions={charPositions}
/>
</div>
{/* 中间:附件文件预览 */}
<div className={`w-full ${comparison_document.template_contract_path ? 'lg:w-[38%]' : 'lg:w-[20%]'}`}>
<FilePreview
<FilePreview
fileContent={comparison_document}
reviewPoints={[]}
activeReviewPointResultId={activeReviewPointResultId}
@@ -801,15 +837,12 @@ export default function ReviewDetails() {
isStructuredView={true}
/>
</div>
{/* 右侧:结构比较结果 */}
<div className="w-full lg:w-[24%]">
<Comparison
comparison_document={comparison_document}
onPageJump={(sourcePage, templatePage) => {
// 同时处理主文件和模板文件的页码跳转
if (sourcePage > 0) {
// 如果目标页码与当前页码相同,先重置再设置以强制触发更新
if (sourcePage === targetPage) {
setTargetPage(undefined);
setTimeout(() => setTargetPage(sourcePage), 0);
@@ -819,7 +852,6 @@ export default function ReviewDetails() {
console.log(`跳转到主文件第${sourcePage}页`);
}
if (templatePage > 0) {
// 如果目标页码与当前页码相同,先重置再设置以强制触发更新
if (templatePage === templateTargetPage) {
setTemplateTargetPage(undefined);
setTimeout(() => setTemplateTargetPage(templatePage), 0);
@@ -832,7 +864,7 @@ export default function ReviewDetails() {
/>
</div>
</div>
)}
)} */}
{/* AI智能分析选项卡内容 */}
{activeTab === 'analysis' && (