完善评查详情

This commit is contained in:
2025-04-18 15:41:43 +08:00
parent 119f9197b2
commit 01d93522b8
25 changed files with 1731 additions and 511 deletions
+140 -47
View File
@@ -28,9 +28,8 @@
import { type MetaFunction, type LoaderFunctionArgs } from "@remix-run/node";
import { useState, useEffect } from "react";
import { useNavigate, useLoaderData } from "@remix-run/react";
import {getDocument} from "~/api/files/documents";
import reviewsStyles from "~/styles/reviews.css?url";
import { getReviewPoints } from "~/api/evaluation_points/reviews";
import { getReviewPoints, updateReviewResult } from "~/api/evaluation_points/reviews";
// 导入评查详情页面组件
import {
@@ -176,25 +175,28 @@ export async function loader({ request }: LoaderFunctionArgs) {
return Response.json({ error: '评查ID不能为空' }, { status: 400 });
}
const documentData = await getDocument(id);
if (documentData.error) {
console.error("获取文档数据错误:", documentData.error);
return Response.json({ error: documentData.error }, { status: documentData.status || 500 });
}
const reviewData = await getReviewPoints(id);
console.log("reviewData-------",JSON.stringify(reviewData.data,null,2));
if (reviewData.error) {
// console.log("documentData-------",JSON.stringify(documentData.data,null,2));
console.log("reviewData-------",JSON.stringify('data' in reviewData ? reviewData.data : '',null,2));
if ('error' in reviewData && reviewData.error) {
console.error("获取评查点数据错误:", reviewData.error);
return Response.json({ error: reviewData.error }, { status: reviewData.status || 500 });
}
return Response.json({
document: documentData.data,
reviewPoints: reviewData.data,
reviewInfo: reviewData.reviewInfo,
statistics: reviewData.stats
});
// 确保reviewData有效且具有预期的属性
if ('document' in reviewData && 'data' in reviewData && 'reviewInfo' in reviewData && 'stats' in reviewData) {
return Response.json({
document: reviewData.document,
reviewPoints: reviewData.data,
reviewInfo: reviewData.reviewInfo,
statistics: reviewData.stats
});
} else {
console.error("返回的评查数据格式不正确");
return Response.json({ error: '返回的评查数据格式不正确' }, { status: 500 });
}
} catch (error) {
console.error('获取评查数据失败:', error);
return Response.json({ error: '获取评查数据失败' }, { status: 500 });
@@ -208,6 +210,7 @@ export default function ReviewDetails() {
const [activeTab, setActiveTab] = useState<string>('preview'); // 'preview', 'analysis', 'fileinfo'
const [reviewData, setReviewData] = useState<ReviewData | null>(null);
const [activeReviewPointId, setActiveReviewPointId] = useState<string | null>(null);
const [targetPage, setTargetPage] = useState<number | undefined>(undefined);
// 模拟获取评查数据
useEffect(() => {
@@ -238,7 +241,7 @@ export default function ReviewDetails() {
reviewPoints: reviewPoints,
aiAnalysis: getMockReviewData().aiAnalysis,
};
console.log("reviewDataObj-------",reviewDataObj);
setReviewData(reviewDataObj);
setIsLoading(false);
@@ -248,22 +251,130 @@ export default function ReviewDetails() {
setActiveTab(tabKey);
};
const handleReviewPointSelect = (reviewPointId: string) => {
const handleReviewPointSelect = (reviewPointId: string, page?: number) => {
setActiveReviewPointId(reviewPointId);
setTargetPage(page);
};
const handleReviewPointStatusChange = (reviewPointId: string, newStatus: string) => {
// 更新评查点状态
if (reviewData) {
const updatedReviewPoints = reviewData.reviewPoints.map(point =>
point.id === reviewPointId ? { ...point, status: newStatus } : point
);
// 刷新评审数据
async function refreshReviewData(documentId: string) {
// 设置加载状态
setIsLoading(true);
try {
// 获取最新的评审数据
const response = await getReviewPoints(documentId);
setReviewData({
...reviewData,
reviewPoints: updatedReviewPoints,
statistics: calculateStatistics(updatedReviewPoints)
if ('error' in response && response.error) {
console.error('刷新评审数据失败:', response.error);
alert(`刷新评审数据失败: ${response.error}`);
return;
}
// 确保response有效且具有预期的属性
if ('data' in response && 'stats' in response && 'reviewInfo' in response) {
const reviewPointsData = response.data || [];
const statisticsData = response.stats || { total: 0, success: 0, warning: 0, error: 0, score: 0 };
const reviewInfoData = response.reviewInfo || {
reviewTime: '',
reviewModel: '',
ruleGroup: '',
result: '',
issueCount: 0
};
// 更新评审数据和统计信息
setReviewData(prevData => {
if (!prevData) {
// 如果prevData为null,创建一个新的ReviewData对象
return {
fileInfo: {
fileName: document?.name || "",
contractNumber: document?.documentNumber || "",
fileSize: document?.size ? formatFileSize(document.size) : "",
fileFormat: document?.fileType ? document.fileType.toUpperCase() : "",
pageCount: document?.pageCount || 0,
uploadTime: document?.uploadTime || "",
uploadUser: document?.uploadUser || "",
auditStatus: document?.auditStatus || 0
},
contractInfo: getMockReviewData().contractInfo,
reviewInfo: reviewInfoData as ReviewInfo,
statistics: statisticsData as Statistics,
fileContent: getMockReviewData().fileContent,
reviewPoints: reviewPointsData as unknown as ReviewPoint[],
aiAnalysis: getMockReviewData().aiAnalysis
};
}
// 处理prevData非null的情况
return {
...prevData,
reviewPoints: reviewPointsData as unknown as ReviewPoint[],
statistics: statisticsData as Statistics,
reviewInfo: reviewInfoData as ReviewInfo
};
});
alert('评审数据已更新');
} else {
console.error('返回的数据格式不正确');
alert('刷新评审数据失败: 返回的数据格式不正确');
}
} catch (error) {
console.error('刷新评审数据失败:', error);
alert(`刷新评审数据失败: ${error instanceof Error ? error.message : '未知错误'}`);
} finally {
setIsLoading(false);
}
}
// 处理评审点状态变更
const handleReviewPointStatusChange = async (reviewPointResultId: string, newStatus: string, message: string) => {
// 将字符串的布尔值转换为布尔类型
const boolResult = newStatus === 'true';
try {
// 调用 API 更新评查结果
const response = await updateReviewResult(reviewPointResultId, boolResult, message);
if (response.error) {
console.error('更新评查结果失败:', response.error);
alert(`更新评查结果失败: ${response.error}`);
return;
}
console.log('评查点状态更新成功:', {
id: reviewPointResultId,
result: boolResult,
message: message
});
// 更新本地状态
if (reviewData) {
const updatedReviewPoints = reviewData.reviewPoints.map(point =>
point.id === reviewPointResultId ? {
...point,
result: boolResult,
status: boolResult ? 'success' : 'error',
message: message
} : point
);
// 更新 UI 状态
setReviewData({
...reviewData,
reviewPoints: updatedReviewPoints,
// statistics: calculateStatistics(updatedReviewPoints)
});
// 从API获取最新数据刷新列表
if (document && document.id) {
await refreshReviewData(document.id.toString());
}
}
} catch (error) {
console.error('更新评查结果出错:', error);
alert('更新评查结果失败,请稍后重试');
}
};
@@ -298,9 +409,10 @@ export default function ReviewDetails() {
{/* 左侧:文件预览 */}
<div className="w-full lg:w-2/3">
<FilePreview
fileContent={reviewData.fileContent}
fileContent={document}
reviewPoints={reviewData.reviewPoints}
activeReviewPointId={activeReviewPointId}
targetPage={targetPage}
/>
</div>
@@ -341,25 +453,6 @@ export default function ReviewDetails() {
);
}
// 计算评查统计数据
function calculateStatistics(reviewPoints: ReviewPoint[]): Statistics {
const total = reviewPoints.length;
const success = reviewPoints.filter(point => point.status === 'success').length;
const warning = reviewPoints.filter(point => point.status === 'warning').length;
const error = reviewPoints.filter(point => point.status === 'error').length;
// 计算评分:通过占总数的百分比,错误项有额外惩罚
const score = Math.round((success / total) * 100 - (error * 5));
return {
total,
success,
warning,
error,
score: Math.max(0, Math.min(100, score)) // 确保分数在0-100之间
};
}
// 模拟评查数据
function getMockReviewData(): ReviewData {
return {