完善评查详情

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
+125 -24
View File
@@ -1,5 +1,5 @@
import { type MetaFunction, type LoaderFunctionArgs } from "@remix-run/node";
import { useLoaderData, useSearchParams } from "@remix-run/react";
import { useLoaderData, useSearchParams, useNavigate } from "@remix-run/react";
import { Button } from "~/components/ui/Button";
import { Card } from "~/components/ui/Card";
import { FileIcon } from "~/components/ui/FileIcon";
@@ -11,8 +11,8 @@ import { StatusBadge } from "~/components/ui/StatusBadge";
import rulesFilesStyles from "~/styles/pages/rules-files.css?url";
import {
getReviewFiles,
updateReviewStatus,
type ReviewFileUI
type ReviewFileUI,
updateDocumentAuditStatus
} from "~/api/evaluation_points/rules-files";
import { getDocumentTypes } from "~/api/document-types/document-types";
@@ -115,7 +115,8 @@ export function ErrorBoundary() {
export default function RulesFiles() {
const { files, documentTypes, totalCount, currentPage, pageSize } = useLoaderData<typeof loader>();
const [searchParams, setSearchParams] = useSearchParams();
const navigate = useNavigate();
// 处理筛选条件变更
const handleFilterChange = (e: React.ChangeEvent<HTMLSelectElement | HTMLInputElement>) => {
const { name, value } = e.target;
@@ -162,21 +163,114 @@ export default function RulesFiles() {
newParams.set('page', '1'); // 改变每页条数时重置为第一页
setSearchParams(newParams);
};
// 查看评查文件
const handleReviewFileClick = async (fileId: string, auditStatus: number | null) => {
// 检查audit_status是否为0,如果是则更新为2
if (auditStatus === 0) {
try {
const response = await updateDocumentAuditStatus(fileId, 2);
if (response.error) {
console.error('更新文件审核状态失败:', response.error);
// 尽管更新失败,仍然导航到文件详情页
}
} catch (error) {
console.error('更新文件审核状态时出错:', error);
// 尽管发生错误,仍然导航到文件详情页
}
}
// 导航到评查详情页
navigate(`/reviews?id=${fileId}`);
};
// 渲染问题摘要
const renderIssues = (file: ReviewFileUI) => {
// 如果评查状态为通过,显示"所有评查点均通过"
if (file.reviewStatus === 'pass') {
return (
<div className="text-sm text-success">
<i className="ri-check-double-line mr-1"></i>
</div>
);
// 如果评查状态为通过(说明所有评查结果为true),显示"所有评查点均通过"
if (file.status === 'Processed') {
if (file.reviewStatus === 'pass') {
return (
<div className="text-sm text-success">
<i className="ri-check-double-line mr-1"></i>
</div>
);
}
// 如果评查状态为通过,显示"所有评查点均通过"
if (file.reviewStatus === 'fail') {
return (
<div className="text-sm text-error">
<i className="ri-error-warning-line mr-1"></i>{file.score || 0}80
</div>
);
}
// 显示问题列表
if (file.reviewStatus !== 'pass' && file.reviewStatus !== 'fail' && file.issues && file.issues.length > 0) {
// 最多显示2个问题
const displayIssues = file.issues.slice(0, 2);
return (
<div className="text-sm">
{displayIssues.map((issue, index) => (
<div key={index} className="mb-1">
<i className="ri-circle-fill mr-1 text-warning"></i>
{issue.message}
</div>
))}
{file.issues.length > 2 && (
<div className="text-secondary mt-1">
{file.issues.length - 2} ...
</div>
)}
</div>
);
}
}
// 其他状态显示占位符
return <div className="text-sm text-secondary">-</div>;
};
// 下载文件
const handleDownload = async (path: string) => {
try {
const urlBefore = 'http://172.18.0.100:9000/docauditai/';
const downloadUrl = `${urlBefore}${path}`;
// 使用fetch获取文件内容
const response = await fetch(downloadUrl);
if (!response.ok) {
throw new Error(`下载失败: ${response.status} ${response.statusText}`);
}
// 将响应转换为Blob
const blob = await response.blob();
// 创建Blob URL
const blobUrl = URL.createObjectURL(blob);
// 创建一个隐藏的a标签并点击它
const a = document.createElement('a');
a.style.display = 'none';
a.href = blobUrl;
// 从路径中获取文件名
const fileName = path.split('/').pop() || 'document';
a.download = decodeURIComponent(fileName);
document.body.appendChild(a);
a.click();
// 清理
setTimeout(() => {
document.body.removeChild(a);
URL.revokeObjectURL(blobUrl);
}, 100);
} catch (error) {
console.error('下载文件失败:', error);
alert(`下载文件失败: ${error instanceof Error ? error.message : '未知错误'}`);
}
};
// 文件类型选项
const fileTypeOptions = documentTypes.map((type: {id: number, name: string}) => ({
@@ -197,7 +291,7 @@ export default function RulesFiles() {
{ value: DateRange.TODAY, label: '今天' },
{ value: DateRange.WEEK, label: '本周' },
{ value: DateRange.MONTH, label: '本月' },
{ value: DateRange.CUSTOM, label: '自定义时间段' }
// { value: DateRange.CUSTOM, label: '自定义时间段' }
];
// 定义表格列配置
@@ -252,13 +346,18 @@ export default function RulesFiles() {
title: "评查状态",
key: "reviewStatus",
width: "12%",
render: (_: unknown, file: ReviewFileUI) => (
<StatusBadge
status={file.reviewStatus}
text={REVIEW_STATUS_LABELS[file.reviewStatus]}
showIcon={true}
/>
)
render: (_: unknown, file: ReviewFileUI) =>
file.status === 'Processed' ? (
<StatusBadge
status={file.reviewStatus}
text={`${REVIEW_STATUS_LABELS[file.reviewStatus]}${file.issueCount>0?'('+file.issueCount+')':''}`}
showIcon={true}
/>
) : (
<div className="text-sm">
-
</div>
)
},
{
title: "问题摘要",
@@ -276,13 +375,15 @@ export default function RulesFiles() {
type="default"
size="small"
icon="ri-eye-line"
to={`/reviews?id=${file.id}`}
// to={`/reviews?id=${file.id}`}
onClick={() => handleReviewFileClick(file.id, file.auditStatus)}
disabled={file.status !== 'Processed'}
className="mr-2"
>
</Button>
<Button type="default" size="small" icon="ri-download-2-line">
<Button type="default" size="small" icon="ri-download-2-line" className="mt-1" onClick={() => handleDownload(file.path)}>
</Button>
</>
@@ -344,8 +445,8 @@ export default function RulesFiles() {
options={[
{ value: "upload_time_desc", label: "上传时间 ↓" },
{ value: "upload_time_asc", label: "上传时间 ↑" },
{ value: "issue_count_desc", label: "问题数量 ↓" },
{ value: "issue_count_asc", label: "问题数量 ↑" }
// { value: "issue_count_desc", label: "问题数量 ↓" },
// { value: "issue_count_asc", label: "问题数量 ↑" }
]}
/>
<SearchFilter