添加jwt验证,添加交叉评查首页加载对接接口,评查任务文档列表对接接口,意见列表对接接口
This commit is contained in:
+205
-85
@@ -25,9 +25,9 @@
|
||||
* @author 中国烟草AI合同及卷宗审核系统开发团队
|
||||
*/
|
||||
|
||||
import { type MetaFunction, type LoaderFunctionArgs } from "@remix-run/node";
|
||||
import { type MetaFunction, type LoaderFunctionArgs, type ActionFunctionArgs } from "@remix-run/node";
|
||||
import { useState, useEffect } from "react";
|
||||
import { useNavigate, useLoaderData } from "@remix-run/react";
|
||||
import { useNavigate, useLoaderData, useFetcher } from "@remix-run/react";
|
||||
import reviewsStyles from "~/styles/reviews.css?url";
|
||||
import { getReviewPoints, updateReviewResult, confirmReviewResults } from "~/api/evaluation_points/reviews";
|
||||
import { toastService } from "~/components/ui/Toast";
|
||||
@@ -183,8 +183,8 @@ export async function loader({ request }: LoaderFunctionArgs) {
|
||||
return Response.json({ result: false, message: '文件ID不能为空' });
|
||||
}
|
||||
|
||||
// 获取评查点数据
|
||||
const reviewData = await getReviewPoints(id);
|
||||
// 获取评查点数据,传递request对象
|
||||
const reviewData = await getReviewPoints(id, request);
|
||||
|
||||
// console.log("documentData-------",JSON.stringify(documentData.data,null,2));
|
||||
// console.log("reviewData-------",JSON.stringify('data' in reviewData ? reviewData.data : '',null,2));
|
||||
@@ -214,9 +214,78 @@ export async function loader({ request }: LoaderFunctionArgs) {
|
||||
}
|
||||
}
|
||||
|
||||
// 添加 action 函数处理需要用户认证的操作
|
||||
export async function action({ request }: ActionFunctionArgs) {
|
||||
try {
|
||||
const formData = await request.formData();
|
||||
const intent = formData.get("intent") as string;
|
||||
|
||||
console.log('Action接收到请求, intent:', intent);
|
||||
|
||||
if (intent === "updateReviewResult") {
|
||||
const reviewPointResultId = formData.get("reviewPointResultId") as string;
|
||||
const editAuditStatusId = formData.get("editAuditStatusId") as string;
|
||||
const result = formData.get("result") as string;
|
||||
const message = formData.get("message") as string;
|
||||
|
||||
console.log('更新评查结果参数:', { reviewPointResultId, editAuditStatusId, result, message });
|
||||
|
||||
try {
|
||||
const response = await updateReviewResult(reviewPointResultId, editAuditStatusId, result, message, request);
|
||||
|
||||
if (response.error) {
|
||||
console.error('updateReviewResult返回错误:', response.error);
|
||||
return Response.json({ success: false, error: response.error }, { status: response.status || 500 });
|
||||
}
|
||||
|
||||
return Response.json({ success: true, data: response.data });
|
||||
} catch (updateError) {
|
||||
console.error('调用updateReviewResult时发生异常:', updateError);
|
||||
return Response.json({
|
||||
success: false,
|
||||
error: updateError instanceof Error ? updateError.message : '更新评查结果时发生未知错误'
|
||||
}, { status: 500 });
|
||||
}
|
||||
}
|
||||
|
||||
if (intent === "confirmReviewResults") {
|
||||
const documentId = formData.get("documentId") as string;
|
||||
|
||||
console.log('确认评查结果参数:', { documentId });
|
||||
|
||||
try {
|
||||
const response = await confirmReviewResults(documentId, request);
|
||||
|
||||
if (response.error) {
|
||||
console.error('confirmReviewResults返回错误:', response.error);
|
||||
return Response.json({ success: false, error: response.error }, { status: response.status || 500 });
|
||||
}
|
||||
|
||||
return Response.json({ success: true, data: response.data });
|
||||
} catch (confirmError) {
|
||||
console.error('调用confirmReviewResults时发生异常:', confirmError);
|
||||
return Response.json({
|
||||
success: false,
|
||||
error: confirmError instanceof Error ? confirmError.message : '确认评查结果时发生未知错误'
|
||||
}, { status: 500 });
|
||||
}
|
||||
}
|
||||
|
||||
console.error('收到未知的操作类型:', intent);
|
||||
return Response.json({ success: false, error: "未知的操作类型" }, { status: 400 });
|
||||
} catch (error) {
|
||||
console.error('Action处理失败:', error);
|
||||
return Response.json({
|
||||
success: false,
|
||||
error: error instanceof Error ? error.message : '操作失败'
|
||||
}, { status: 500 });
|
||||
}
|
||||
}
|
||||
|
||||
export default function ReviewDetails() {
|
||||
const navigate = useNavigate();
|
||||
const loaderData = useLoaderData<typeof loader>();
|
||||
const fetcher = useFetcher();
|
||||
const { document, reviewPoints, statistics, reviewInfo, comparison_document } = loaderData;
|
||||
const [isLoading, setIsLoading] = useState(false); // 已经通过loader加载了数据,不需要再显示加载状态
|
||||
const [activeTab, setActiveTab] = useState<string>('preview'); // 'preview', 'analysis', 'fileinfo'
|
||||
@@ -224,6 +293,11 @@ export default function ReviewDetails() {
|
||||
const [activeReviewPointResultId, setActiveReviewPointResultId] = useState<string | null>(null);
|
||||
const [targetPage, setTargetPage] = useState<number | undefined>(undefined);
|
||||
const [templateTargetPage, setTemplateTargetPage] = useState<number | undefined>(undefined);
|
||||
const [pendingUpdate, setPendingUpdate] = useState<{
|
||||
reviewPointResultId: string;
|
||||
newStatus: string;
|
||||
message: string;
|
||||
} | null>(null);
|
||||
|
||||
// loader 数据加载出错
|
||||
useEffect(()=>{
|
||||
@@ -374,6 +448,80 @@ export default function ReviewDetails() {
|
||||
// }
|
||||
// }
|
||||
|
||||
// 监听fetcher状态变化
|
||||
useEffect(() => {
|
||||
if (fetcher.state === "idle" && fetcher.data && pendingUpdate) {
|
||||
const result = fetcher.data as { success: boolean; error?: string; data?: unknown };
|
||||
console.log('Fetcher返回数据:', result);
|
||||
|
||||
if (result.success) {
|
||||
console.log('评查点状态更新成功');
|
||||
|
||||
// 使用pendingUpdate中的参数更新本地状态
|
||||
if (reviewData && pendingUpdate.reviewPointResultId) {
|
||||
const reviewPointToUpdate = reviewData.reviewPoints.find(point => point.id === pendingUpdate.reviewPointResultId);
|
||||
const oldStatus = reviewPointToUpdate?.status || '';
|
||||
const wasSuccess = reviewPointToUpdate?.result === true;
|
||||
const newIsSuccess = pendingUpdate.newStatus === 'true';
|
||||
|
||||
// 更新评查点
|
||||
const updatedReviewPoints = reviewData.reviewPoints.map(point =>
|
||||
point.id === pendingUpdate.reviewPointResultId ? {
|
||||
...point,
|
||||
result: pendingUpdate.newStatus === 'true' ? true : (pendingUpdate.newStatus === 'false' ? false : point.result),
|
||||
editAuditStatus: pendingUpdate.newStatus === 'review' ? 0 : 1,
|
||||
title: pendingUpdate.newStatus === 'review' ? point.title : pendingUpdate.message,
|
||||
editAuditStatusMessage: pendingUpdate.newStatus === 'review' ? point.editAuditStatusMessage : pendingUpdate.message
|
||||
} : point
|
||||
);
|
||||
|
||||
// 更新统计数据
|
||||
const updatedStatistics = { ...reviewData.statistics };
|
||||
|
||||
// 只处理结果实际变化的情况
|
||||
if (pendingUpdate.newStatus !== 'review' && wasSuccess !== newIsSuccess) {
|
||||
if (newIsSuccess) {
|
||||
// 从不通过变为通过
|
||||
updatedStatistics.success += 1;
|
||||
if (oldStatus === 'warning') {
|
||||
updatedStatistics.warning = Math.max(0, updatedStatistics.warning - 1);
|
||||
} else if (oldStatus === 'error') {
|
||||
updatedStatistics.error = Math.max(0, updatedStatistics.error - 1);
|
||||
}
|
||||
} else {
|
||||
// 从通过变为不通过
|
||||
updatedStatistics.success = Math.max(0, updatedStatistics.success - 1);
|
||||
if (oldStatus === 'warning') {
|
||||
updatedStatistics.warning += 1;
|
||||
} else if (oldStatus === 'error') {
|
||||
updatedStatistics.error += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 更新 UI 状态
|
||||
setReviewData({
|
||||
...reviewData,
|
||||
reviewPoints: updatedReviewPoints,
|
||||
statistics: updatedStatistics
|
||||
});
|
||||
}
|
||||
|
||||
if(document && document.id && pendingUpdate.newStatus !== 'review'){
|
||||
toastService.success('评查点状态已更新');
|
||||
}
|
||||
|
||||
// 清除pendingUpdate
|
||||
setPendingUpdate(null);
|
||||
} else {
|
||||
console.error('更新评查结果失败:', result.error);
|
||||
toastService.error(`更新评查结果失败: ${result.error || '未知错误'}`);
|
||||
// 清除pendingUpdate
|
||||
setPendingUpdate(null);
|
||||
}
|
||||
}
|
||||
}, [fetcher.state, fetcher.data, pendingUpdate, document, reviewData]);
|
||||
|
||||
// 处理评审点状态变更
|
||||
const handleReviewPointStatusChange = async (reviewPointResultId: string, editAuditStatusId: string | number, newStatus: string, message: string) => {
|
||||
// 将字符串的布尔值转换为布尔类型
|
||||
@@ -383,85 +531,28 @@ export default function ReviewDetails() {
|
||||
}
|
||||
|
||||
try {
|
||||
// 调用 API 更新评查结果
|
||||
const response = await updateReviewResult(reviewPointResultId, editAuditStatusId, boolResult, message);
|
||||
console.log('开始提交评查结果更新:', { reviewPointResultId, editAuditStatusId, boolResult, message });
|
||||
|
||||
if (response.error) {
|
||||
console.error('更新评查结果失败:', response.error);
|
||||
toastService.error(`更新评查结果失败: ${response.error}`);
|
||||
return;
|
||||
}
|
||||
// 设置待处理的更新信息
|
||||
setPendingUpdate({
|
||||
reviewPointResultId,
|
||||
newStatus: boolResult,
|
||||
message
|
||||
});
|
||||
|
||||
// console.log('评查点状态更新成功:', {
|
||||
// id: reviewPointResultId,
|
||||
// result: boolResult,
|
||||
// message: message
|
||||
// });
|
||||
|
||||
// 更新本地状态
|
||||
if (reviewData) {
|
||||
// 找到要更新的评查点和它的原始状态
|
||||
const reviewPointToUpdate = reviewData.reviewPoints.find(point => point.id === reviewPointResultId);
|
||||
const oldStatus = reviewPointToUpdate?.status || '';
|
||||
const wasSuccess = reviewPointToUpdate?.result === true;
|
||||
const newIsSuccess = newStatus === 'true';
|
||||
|
||||
// 更新评查点
|
||||
const updatedReviewPoints = reviewData.reviewPoints.map(point =>
|
||||
point.id === reviewPointResultId ? {
|
||||
...point,
|
||||
result: newStatus === 'true' ? true : (newStatus === 'false' ? false : point.result),
|
||||
editAuditStatus: boolResult === 'review' ? 0 : 1,
|
||||
title: boolResult === 'review' ? point.title : message,
|
||||
editAuditStatusMessage: boolResult === 'review' ? point.editAuditStatusMessage : message
|
||||
} : point
|
||||
);
|
||||
|
||||
// 更新统计数据
|
||||
const updatedStatistics = { ...reviewData.statistics };
|
||||
|
||||
// 只处理结果实际变化的情况,即从通过变为不通过,或从不通过变为通过
|
||||
if (newStatus !== 'review' && wasSuccess !== newIsSuccess) {
|
||||
if (newIsSuccess) {
|
||||
// 从不通过变为通过
|
||||
updatedStatistics.success += 1;
|
||||
// 减少对应的错误或警告数量
|
||||
if (oldStatus === 'warning') {
|
||||
updatedStatistics.warning = Math.max(0, updatedStatistics.warning - 1);
|
||||
} else if (oldStatus === 'error') {
|
||||
updatedStatistics.error = Math.max(0, updatedStatistics.error - 1);
|
||||
}
|
||||
} else {
|
||||
// 从通过变为不通过
|
||||
updatedStatistics.success = Math.max(0, updatedStatistics.success - 1);
|
||||
// 增加对应的错误或警告数量
|
||||
if (oldStatus === 'warning') {
|
||||
updatedStatistics.warning += 1;
|
||||
} else if (oldStatus === 'error') {
|
||||
updatedStatistics.error += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 更新 UI 状态
|
||||
setReviewData({
|
||||
...reviewData,
|
||||
reviewPoints: updatedReviewPoints,
|
||||
statistics: updatedStatistics
|
||||
});
|
||||
|
||||
// 显示成功消息
|
||||
if(document && document.id && newStatus !== 'review'){
|
||||
toastService.success('评查点状态已更新');
|
||||
}
|
||||
// 使用 Remix 的 useFetcher 调用 action
|
||||
const formData = new FormData();
|
||||
formData.append("intent", "updateReviewResult");
|
||||
formData.append("reviewPointResultId", reviewPointResultId);
|
||||
formData.append("editAuditStatusId", editAuditStatusId.toString());
|
||||
formData.append("result", boolResult);
|
||||
formData.append("message", message);
|
||||
|
||||
// console.log("newReviewPoints",updatedReviewPoints);
|
||||
|
||||
// 如果是review操作才调用API刷新
|
||||
// if (document && document.id && newStatus === 'review') {
|
||||
// await refreshReviewData(document.id.toString());
|
||||
// }
|
||||
}
|
||||
fetcher.submit(formData, { method: "POST" });
|
||||
|
||||
console.log('请求已提交,等待响应...');
|
||||
|
||||
// 注意:本地状态更新现在在useEffect中处理,当fetcher返回成功响应时触发
|
||||
} catch (error) {
|
||||
console.error('更新评查结果出错:', error);
|
||||
toastService.error('更新评查结果失败,请稍后重试');
|
||||
@@ -478,12 +569,41 @@ export default function ReviewDetails() {
|
||||
// 显示加载状态
|
||||
setIsLoading(true);
|
||||
|
||||
// 调用API确认评查结果
|
||||
const response = await confirmReviewResults(document.id.toString());
|
||||
// 使用 fetch 调用 action
|
||||
const formData = new FormData();
|
||||
formData.append("intent", "confirmReviewResults");
|
||||
formData.append("documentId", document.id.toString());
|
||||
|
||||
const response = await fetch(window.location.pathname, {
|
||||
method: "POST",
|
||||
body: formData,
|
||||
});
|
||||
|
||||
// 检查响应是否为JSON格式
|
||||
const contentType = response.headers.get("content-type");
|
||||
if (!contentType || !contentType.includes("application/json")) {
|
||||
console.error('服务器返回了非JSON响应,状态码:', response.status);
|
||||
const text = await response.text();
|
||||
console.error('响应内容:', text.substring(0, 500));
|
||||
|
||||
if (response.status === 401) {
|
||||
toastService.error('登录已过期,请重新登录');
|
||||
window.location.href = '/login';
|
||||
return;
|
||||
} else if (response.status >= 500) {
|
||||
toastService.error('服务器内部错误,请稍后重试');
|
||||
return;
|
||||
} else {
|
||||
toastService.error('请求失败,请检查网络连接');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
const result = await response.json();
|
||||
|
||||
if (response.error) {
|
||||
console.error('确认评查结果失败:', response.error);
|
||||
toastService.error(`确认评查结果失败: ${response.error}`);
|
||||
if (!result.success) {
|
||||
console.error('确认评查结果失败:', result.error);
|
||||
toastService.error(`确认评查结果失败: ${result.error}`);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user