完善评查详情
This commit is contained in:
+140
-47
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user