feat: 1. 完善交叉评查上传创建任务,改成动态加载文档类型。

2. 重新对齐交叉评查的接口。
This commit is contained in:
2025-12-02 10:10:03 +08:00
parent c9e0d5abba
commit 88466b7a8b
21 changed files with 561 additions and 174 deletions
+41 -15
View File
@@ -26,7 +26,7 @@ import { type MetaFunction, type LoaderFunctionArgs, type ActionFunctionArgs } f
import React, { useState, useEffect, useCallback, useRef, useMemo } from "react";
import { useNavigate, useLoaderData } from "@remix-run/react";
import crossCheckingStyles from "~/styles/cross-checking-result.css?url";
import { getReviewPoints, updateReviewResult} from "~/api/evaluation_points/reviews";
import { getReviewPoints, updateReviewResult, getReviewPoints_fromApi} from "~/api/evaluation_points/reviews";
import { toastService } from "~/components/ui/Toast";
import { confirmReviewResults, checkProposalVotes, findIsProposer } from "~/api/cross-checking/cross-file-result";
@@ -199,8 +199,37 @@ export async function loader({ request }: LoaderFunctionArgs) {
const { getUserSession } = await import("~/api/login/auth.server");
const { userInfo, frontendJWT } = await getUserSession(request);
// 获取评查点数据,传递request对象
const reviewData = await getReviewPoints(id, request);
// 🔒 安全验证:检查用户是否有权限访问该文档
if (!userInfo?.user_id) {
return Response.json({
result: false,
message: '用户身份验证失败,请重新登录'
}, { status: 401 });
}
// const { verifyDocumentAccess } = await import("~/api/cross-checking/verify-document-access");
// const accessCheck = await verifyDocumentAccess({
// documentId: id,
// taskId: taskId,
// userId: userInfo.user_id,
// jwtToken: frontendJWT
// });
// if (!accessCheck.hasAccess) {
// console.warn(`⚠️ [Loader] 用户 ${userInfo.user_id} 尝试访问未授权文档 ${id},原因: ${accessCheck.reason}`);
// return Response.json({
// result: false,
// message: accessCheck.reason || '您没有权限访问该文档'
// }, { status: 403 });
// }
// console.log(`✅ [Loader] 用户 ${userInfo.user_id} (${accessCheck.userRole}) 访问文档 ${id} - 权限验证通过`);
// 对接接口,新的获取评查点结果的方法
const reviewData = await getReviewPoints_fromApi(id, request)
// 获取评查点数据,传递request对象 旧获取评查点结果的方法
// const reviewData = await getReviewPoints(id, request);
// 获取当前登录用户是否是发起人
const isProposer = await findIsProposer(taskId, userInfo?.user_id, frontendJWT);
@@ -313,12 +342,9 @@ export default function CrossCheckingResult() {
const isProcessingRef = useRef(false);
// 添加组件挂载/卸载日志
// useEffect(() => {
// console.log('[组件] CrossCheckingResult 挂载');
// return () => {
// console.log('[组件] CrossCheckingResult 卸载');
// };
// }, []);
useEffect(() => {
console.log('[组件] CrossCheckingResult', isProposer);
}, [isProposer]);
// 同步外部scoring_proposals到本地状态
useEffect(() => {
@@ -536,18 +562,18 @@ export default function CrossCheckingResult() {
// 使用ref防止重复点击,避免触发状态更新
if (isProcessingRef.current) {
console.log('[完成评查] 正在处理中,跳过');
// console.log('[完成评查] 正在处理中,跳过');
return;
}
try {
console.log('[完成评查] 标记为处理中');
// console.log('[完成评查] 标记为处理中');
isProcessingRef.current = true;
// 1. 先检查未投票(不触发loading状态更新,避免重新渲染)
console.log('[完成评查] 开始检查未投票提案');
// console.log('[完成评查] 开始检查未投票提案');
const checkRes = await checkProposalVotes(document.id, jwtToken);
console.log("[完成评查] 检查结果:", checkRes);
// console.log("[完成评查] 检查结果:", checkRes);
if (checkRes.error) {
toastService.error(checkRes.error);
@@ -582,11 +608,11 @@ export default function CrossCheckingResult() {
}
// 4. 重置处理状态标记,准备显示模态框(不触发状态更新)
console.log('[完成评查] 重置处理标记,准备显示模态框');
// console.log('[完成评查] 重置处理标记,准备显示模态框');
isProcessingRef.current = false;
// 5. 弹出模态框
console.log('[完成评查] 显示确认模态框');
// console.log('[完成评查] 显示确认模态框');
messageService.show({
title: '提示',
message: modalMessage,