添加jwt验证,添加交叉评查首页加载对接接口,评查任务文档列表对接接口,意见列表对接接口

This commit is contained in:
2025-07-22 14:37:37 +08:00
parent de953283e3
commit 47664fc0e8
19 changed files with 1988 additions and 557 deletions
@@ -26,13 +26,11 @@ import { Pagination } from '../ui/Pagination';
import { Button } from '../ui/Button';
import { LoadingIndicator } from '../ui/SkeletonScreen';
import {
submitCrossCheckingOpinion,
getCrossCheckingOpinions,
performOpinionAction,
type SubmitOpinionRequest,
type CrossCheckingOpinion,
type OpinionActionType
} from '../../api/cross-checking/cross-file-result';
import { useFetcher } from '@remix-run/react';
// import '../../styles/components/TooltipStyles.css';
/**
@@ -168,6 +166,7 @@ interface ReviewPointsListProps {
onReviewPointSelect: (id: string, page?: number) => void;
onStatusChange?: (id: string, editAuditStatusId: string | number, status: string, message: string) => void;
scoringProposals?: ScoringProposal[];
jwtToken?: string; // 添加JWT token参数
}
/**
@@ -424,12 +423,14 @@ export function ReviewPointsList({
statistics,
activeReviewPointResultId,
onReviewPointSelect,
scoringProposals = []
scoringProposals = [],
jwtToken
}: ReviewPointsListProps) {
// 状态管理
const [searchText, setSearchText] = useState(''); // 搜索文本
const [statusFilter, setStatusFilter] = useState<string | null>(null); // 状态过滤
const [evaluationResultIds, setEvaluationResultIds] = useState<number[]>([]); // 评分提案的evaluation_result_id
const fetcher = useFetcher();
// 在组件中使用scoringProposals(这里只是简单使用以避免linter警告)
// 将来可以用于显示相关的评分提案信息
@@ -467,6 +468,54 @@ export function ReviewPointsList({
const [opinionListPageSize, setOpinionListPageSize] = useState(10);
const [performingAction, setPerformingAction] = useState<string | null>(null);
// 监听fetcher状态变化 - 获取意见列表数据
useEffect(() => {
if (fetcher.data && fetcher.state === 'idle' && opinionListLoading) {
const data = fetcher.data as {
success?: boolean;
data?: {
opinions: CrossCheckingOpinion[];
total: number;
};
error?: string;
};
if (data.success && data.data) {
console.log('意见列表数据', data.data);
setOpinionListData(data.data.opinions || []);
setOpinionListTotal(data.data.total || 0);
// 使用当前状态值而不是依赖项中的值
setOpinionListCurrentPage(prev => prev);
setOpinionListPageSize(prev => prev);
} else {
console.error('加载意见列表失败:', data.error);
toastService.error(data.error || '加载意见列表失败');
}
setOpinionListLoading(false);
}
}, [fetcher.data, fetcher.state, opinionListLoading]);
// 监听fetcher状态变化 - 提交意见
useEffect(() => {
if (fetcher.data && fetcher.state === 'idle' && isSubmittingOpinion) {
const data = fetcher.data as {
success?: boolean;
error?: string;
};
if (data.success) {
toastService.success('意见提交成功');
handleCloseOpinionModal();
} else {
console.error('提交意见失败:', data.error);
toastService.error(data.error || '提交意见失败');
}
setIsSubmittingOpinion(false);
}
}, [fetcher.data, fetcher.state, isSubmittingOpinion]);
// 存放评查点ID与有效页码的映射
const [effectivePages, setEffectivePages] = useState<Record<string, number>>({});
@@ -525,22 +574,19 @@ export function ReviewPointsList({
setOpinionListLoading(true);
try {
console.log('加载意见列表数据', targetDocumentId, page, pageSize);
const response = await getCrossCheckingOpinions(targetDocumentId, page, pageSize);
console.log('意见列表数据', response);
if (response.error) {
toastService.error(response.error);
return;
}
// 使用 fetcher 调用路由的 action
const formData = new FormData();
formData.append("intent", "getCrossCheckingOpinions");
formData.append("documentId", targetDocumentId.toString());
formData.append("page", page.toString());
formData.append("pageSize", pageSize.toString());
fetcher.submit(formData, { method: "POST" });
setOpinionListData(response.data?.opinions || []);
setOpinionListTotal(response.data?.total || 0);
setOpinionListCurrentPage(page);
setOpinionListPageSize(pageSize);
} catch (error) {
console.error('加载意见列表失败:', error);
toastService.error('加载意见列表失败');
} finally {
setOpinionListLoading(false);
}
};
@@ -580,7 +626,7 @@ export function ReviewPointsList({
setPerformingAction(actionKey);
try {
const response = await performOpinionAction({ opinionId, action });
const response = await performOpinionAction({ opinionId, action }, jwtToken);
if (response.error) {
toastService.error(response.error);
@@ -648,28 +694,21 @@ export function ReviewPointsList({
setIsSubmittingOpinion(true);
try {
const opinionData: SubmitOpinionRequest = {
reviewPointResultId: selectedReviewPoint.id,
documentId: selectedReviewPoint.documentId || '',
auditPoint: opinionForm.auditPoint,
foundIssue: opinionForm.foundIssue,
auditOpinion: opinionForm.auditOpinion,
deductionScore: opinionForm.deductionScore
};
// 使用 fetcher 调用路由的 action
const formData = new FormData();
formData.append("intent", "submitCrossCheckingOpinion");
formData.append("reviewPointResultId", selectedReviewPoint.id);
formData.append("documentId", selectedReviewPoint.documentId || '');
formData.append("auditPoint", opinionForm.auditPoint);
formData.append("foundIssue", opinionForm.foundIssue);
formData.append("auditOpinion", opinionForm.auditOpinion);
formData.append("deductionScore", opinionForm.deductionScore.toString());
const response = await submitCrossCheckingOpinion(opinionData);
if (response.error) {
toastService.error(response.error);
return;
}
toastService.success('意见提交成功');
handleCloseOpinionModal();
fetcher.submit(formData, { method: "POST" });
} catch (error) {
console.error('提交意见失败:', error);
toastService.error('提交意见失败,请稍后重试');
} finally {
setIsSubmittingOpinion(false);
}
};