import { useState } from "react"; import { useLoaderData, useActionData, useNavigate, Form } from "@remix-run/react"; import { redirect, type ActionFunctionArgs, type LoaderFunctionArgs, type MetaFunction } from "@remix-run/node"; import { Card } from "~/components/ui/Card"; import { Button } from "~/components/ui/Button"; import documentEditStyles from "~/styles/pages/documents_edit.css?url"; import { getDocument, updateDocument } from "~/api/files/documents"; import { getDocumentTypes } from "~/api/document-types/document-types"; import { FileTag } from "~/components/ui/FileTag"; export function links() { return [{ rel: "stylesheet", href: documentEditStyles }]; } export const meta: MetaFunction = () => { return [ { title: "修改文档 - 中国烟草AI合同及卷宗审核系统" }, { name: "description", content: "修改文档信息,包括文档类型、编号、状态和备注信息等" } ]; }; // 文档审核状态定义 enum DocumentAuditStatus { FAIL = -1, WAITING = 0, PASS = 1, WARNING = 2, PROCESSING = 3 } // 文档状态对应的中文标签 const STATUS_LABELS: Record = { [DocumentAuditStatus.FAIL]: "不通过", [DocumentAuditStatus.WAITING]: "待审核", [DocumentAuditStatus.PASS]: "通过", [DocumentAuditStatus.WARNING]: "警告", [DocumentAuditStatus.PROCESSING]: "审核中" }; // 文档状态样式配置 const STATUS_STYLES: Record = { [-1]: { color: "red", icon: "ri-close-line" }, [0]: { color: "blue", icon: "ri-time-line" }, [1]: { color: "green", icon: "ri-check-line" }, [2]: { color: "yellow", icon: "ri-alert-line" }, [3]: { color: "purple", icon: "ri-search-line" } }; // 格式化文件大小 function formatFileSize(bytes: number): string { if (bytes === 0) return "0 Bytes"; const k = 1024; const sizes = ["Bytes", "KB", "MB", "GB", "TB"]; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i]; } // Loader函数 export async function loader({ request }: LoaderFunctionArgs) { try { // 从URL查询参数获取文档ID const url = new URL(request.url); const id = url.searchParams.get("id"); if (!id) { throw new Response("缺少文档ID", { status: 400 }); } // 并行获取文档详情和文档类型列表 const [documentResponse, documentTypesResponse] = await Promise.all([ getDocument(id), getDocumentTypes({ pageSize: 500 }) ]); if (documentResponse.error) { throw new Response(documentResponse.error, { status: documentResponse.status || 404 }); } if (documentTypesResponse.error) { console.error("获取文档类型列表失败:", documentTypesResponse.error); } return Response.json({ document: documentResponse.data, documentTypes: documentTypesResponse.data?.types || [] }); } catch (error) { console.error("加载文档数据失败:", error); throw new Response("加载文档数据失败", { status: 500 }); } } // Action函数处理表单提交 export async function action({ request }: ActionFunctionArgs) { // 从URL查询参数获取文档ID const url = new URL(request.url); const id = url.searchParams.get("id"); if (!id) { return Response.json({ error: "缺少文档ID" }, { status: 400 }); } try { const formData = await request.formData(); // 从表单数据中提取字段 const type = formData.get("type_id") as string; const documentNumber = formData.get("document_number") as string; const auditStatus = parseInt(formData.get("audit_status") as string); const isTest = formData.get("is_test_document") === "on"; const remark = formData.get("remark") as string; // 验证必填字段 if (!type || auditStatus === undefined || isNaN(auditStatus)) { return Response.json( { error: "缺少必填字段", fieldErrors: { type_id: !type ? "文档类型不能为空" : null, audit_status: (auditStatus === undefined || isNaN(auditStatus)) ? "审核状态不能为空" : null } }, { status: 400 } ); } console.log('提交更新:', { type, documentNumber, auditStatus, isTest, remark }); // 更新文档 const updateResponse = await updateDocument(id, { type, documentNumber, auditStatus, isTest, remark }); if (updateResponse.error) { console.error('更新文档失败:', updateResponse.error); return Response.json({ error: updateResponse.error, message: "更新文档失败,请检查提交的数据是否正确" }, { status: updateResponse.status || 500 }); } // 重定向回文档列表 return redirect("/documents"); } catch (error) { console.error("更新文档失败:", error); return Response.json({ error: "更新文档失败", message: error instanceof Error ? error.message : "发生未知错误" }, { status: 500 }); } } // 文档编辑页面组件 export default function DocumentEdit() { const { document, documentTypes } = useLoaderData(); const actionData = useActionData(); const navigate = useNavigate(); // 定义类型 interface DocType { id: string | number; name: string; } // 状态 const [localStatus, setLocalStatus] = useState(document.auditStatus); // 处理状态变更 const handleStatusChange = (e: React.ChangeEvent) => { setLocalStatus(parseInt(e.target.value)); }; // 获取文档类型名称 const getDocumentTypeName = (typeId: string): string => { const docType = documentTypes.find((type: DocType) => type.id.toString() === typeId); return docType ? docType.name : "未知类型"; }; // 渲染状态徽章 const renderStatusBadge = (status: number) => { const style = STATUS_STYLES[status] || STATUS_STYLES[0]; const label = STATUS_LABELS[status as DocumentAuditStatus] || STATUS_LABELS[DocumentAuditStatus.WAITING]; return ( {label} ); }; // 在新窗口打开文档预览 const openPreview = () => { // 假设有一个预览URL的格式,比如 /preview?path=xxx console.log('documentstest', document); const previewUrl = `/preview?path=${encodeURIComponent(document.path)}&name=${encodeURIComponent(document.name)}`; window.open(previewUrl, '_blank'); }; return (
{/* 页面头部 */}

修改文档信息

{/* 文档信息 */}
{document.name}
{getDocumentTypeName(document.type)}
{document.uploadTime}
{formatFileSize(document.size)}
{renderStatusBadge(document.auditStatus)}
您可以修改此文档的基本信息,但不能更改文档内容。如需修改内容,请删除后重新上传新文档。
更改文档类型将重新应用对应的评查规则
{actionData?.fieldErrors?.type_id && (
{actionData.fieldErrors.type_id}
)}
如无编号可留空
更改状态可能会影响此文档在列表中的显示和排序
{actionData?.fieldErrors?.audit_status && (
{actionData.fieldErrors.audit_status}
)}
文档属性
标记为测试文档(不计入正式统计)
{/* 文档预览 */}
{document.name}

预览功能暂不可用

点击"在新窗口打开"查看完整文档

{/* 修改历史 */}
{[ { time: "2023-10-15 15:30", user: "系统", action: "创建了此文档", details: `首次上传文档,文档类型:${getDocumentTypeName(document.type)},状态:待审核` }, { time: "2023-10-15 16:45", user: "张三", action: "启动了文档审核", details: "状态由'待审核'变更为'审核中'" }, { time: "2023-10-15 17:20", user: "系统", action: "完成了文档审核", details: "状态由'审核中'变更为'通过',未发现问题" }, { time: "2023-10-16 09:10", user: "李四", action: "修改了文档属性", details: "添加了备注信息,完善了文档编号" } ].map((item, index) => (
{item.time}
{item.user} {item.action}
{item.details}
))}
); } // 错误边界 export function ErrorBoundary() { return (

出错了

文档编辑页面加载失败。请检查文档ID是否正确,或稍后重试。

); }