Merge branch 'shiy' into awen

This commit is contained in:
2025-04-16 18:50:30 +08:00
18 changed files with 382 additions and 306 deletions
+22 -3
View File
@@ -3,15 +3,23 @@ import { type MetaFunction } from "@remix-run/node";
import { useLoaderData } from "@remix-run/react";
import { Card } from "~/components/ui/Card";
import { Button } from "~/components/ui/Button";
import { StatusBadge, links as statusBadgeLinks } from "~/components/ui/StatusBadge";
import { FileTag, links as fileTagLinks } from "~/components/ui/FileTag";
// import { FileTypeTag, links as fileTypeTagLinks } from "~/components/ui/FileTypeTag";
import { Tag } from "~/components/ui/Tag";
import homeStyles from "~/styles/pages/home.css?url";
import { getDocuments, type DocumentUI } from "~/api/files/documents";
// 文件处理状态选项
const fileProcessingStatusOptions = [
{ value: "Waiting", label: "上传中", icon: "ri-loader-line", color: "blue" },
{ value: "Cutting", label: "切分中", icon: "ri-loader-line", color: "purple" },
{ value: "Extractioning", label: "抽取中", icon: "ri-loader-line", color: "cyan" },
{ value: "Evaluationing", label: "评查中", icon: "ri-loader-line", color: "teal" },
{ value: "Processed", label: "已完成", icon: "ri-check-line", color: "green" },
];
export const links = () => [
{ rel: "stylesheet", href: homeStyles },
...statusBadgeLinks(),
...fileTagLinks()
];
@@ -158,7 +166,18 @@ export default function Index() {
</div>
</div>
<div className="doc-status">
<StatusBadge status={file.fileStatus} />
{(() => {
const fileStatus = file.fileStatus || "-";
const status = fileProcessingStatusOptions.find(s => s.value === fileStatus) ||
fileProcessingStatusOptions[0];
const isSpinning = fileStatus !== "Processed";
return (
<div className={`inline-flex items-center px-2 py-1 rounded-full text-xs bg-${status.color}-100 text-${status.color}-800`}>
<i className={`${status.icon} ${isSpinning ? "animate-spin" : ""} mr-1`}></i>
<span>{status.label}</span>
</div>
);
})()}
</div>
</div>
))}
+5 -4
View File
@@ -56,6 +56,7 @@ export const loader = async ({ request }: LoaderFunctionArgs) => {
// 获取文档列表
const documentsResponse = await getDocuments(searchParams);
// console.log('documentsResponse---1--',JSON.stringify(documentsResponse,null,2));
if (documentsResponse.error) {
throw new Error(documentsResponse.error);
}
@@ -436,17 +437,17 @@ export default function DocumentsIndex() {
key: "name",
width:'25%',
render: (_: unknown, record: DocumentUI) => (
<div className="flex items-center m-1">
<div className="flex m-1">
<FileTag
extension={record.fileType}
showIcon={true}
showText={false}
showBackground={false}
size="lg"
className="mr-2 flex-shrink-0"
className="mr-2 flex-shrink-0 self-center"
/>
<div className="overflow-hidden">
<span className="file-name break-words block" title={record.name}>{record.name}</span>
<span className="file-name break-words block whitespace-normal leading-normal" title={record.name}>{record.name}</span>
<div className="mt-2 flex inline-block">
<FileTypeTag
type={record.type}
@@ -484,7 +485,7 @@ export default function DocumentsIndex() {
render: (_: unknown, record: DocumentUI) => {
// 处理fileStatus为null或undefined的情况
// console.log('fileStatus',record.fileStatus)
const fileStatus = record.fileStatus || "Processed";
const fileStatus = record.fileStatus || "-";
const status = fileProcessingStatusOptions.find(s => s.value === fileStatus) ||
fileProcessingStatusOptions[0];
const isSpinning = fileStatus !== "Processed";
+12 -4
View File
@@ -1,6 +1,6 @@
import { useState, useEffect, useRef } from "react";
import { MetaFunction, ActionFunctionArgs, LoaderFunctionArgs } from "@remix-run/node";
import { Form, useActionData, useLoaderData } from "@remix-run/react";
import { Form, useActionData, useLoaderData, useNavigate } from "@remix-run/react";
import { Card } from "~/components/ui/Card";
import { Button } from "~/components/ui/Button";
import { Table } from "~/components/ui/Table";
@@ -288,6 +288,7 @@ export default function FilesUpload() {
{ title: "评查点审核", description: "DeepSeek 评查中", status: "waiting" },
{ title: "审核准备", description: "文档已准备就绪,等待审核", status: "waiting" }
]);
const navigate = useNavigate();
// 队列文件状态
const [queueFiles, setQueueFiles] = useState<Document[]>(documents);
@@ -823,6 +824,11 @@ export default function FilesUpload() {
let statusText = "";
switch(record.status) {
case 'waiting':
statusClass = "status-processing";
statusIcon = "ri-loader-4-line";
statusText = "等待中";
break;
case DocumentStatus.WAITING:
statusClass = "status-processing";
statusIcon = "ri-loader-4-line";
@@ -854,6 +860,7 @@ export default function FilesUpload() {
statusText = "已完成";
break;
}
return (
<span className={`status-badge ${statusClass}`}>
@@ -873,7 +880,7 @@ export default function FilesUpload() {
size="small"
disabled={record.status !== DocumentStatus.PROCESSED}
icon="ri-eye-line"
onClick={() => alert(`查看文件详情: ${record.name}`)}
onClick={() => navigate(`/reviews?id=${record.id}`)}
>
</Button>
@@ -1144,14 +1151,15 @@ export default function FilesUpload() {
<p className="text-sm text-green-700"></p>
</div>
<div className="flex justify-end">
{/* <div className="flex justify-end">
<Button
type="primary"
icon="ri-file-search-line"
>
查看详情并审核
</Button>
</div>
</div> */}
</div>
)}
+7 -4
View File
@@ -183,7 +183,7 @@ export async function loader({ request }: LoaderFunctionArgs) {
}
const reviewData = await getReviewPoints(id);
console.log("reviewData-------",reviewData);
console.log("reviewData-------",JSON.stringify(reviewData.data,null,2));
if (reviewData.error) {
console.error("获取评查点数据错误:", reviewData.error);
return Response.json({ error: reviewData.error }, { status: reviewData.status || 500 });
@@ -192,6 +192,7 @@ export async function loader({ request }: LoaderFunctionArgs) {
return Response.json({
document: documentData.data,
reviewPoints: reviewData.data,
reviewInfo: reviewData.reviewInfo,
statistics: reviewData.stats
});
} catch (error) {
@@ -202,7 +203,7 @@ export async function loader({ request }: LoaderFunctionArgs) {
export default function ReviewDetails() {
const navigate = useNavigate();
const { document, reviewPoints, statistics } = useLoaderData<typeof loader>();
const { document, reviewPoints, statistics, reviewInfo } = useLoaderData<typeof loader>();
const [isLoading, setIsLoading] = useState(false); // 已经通过loader加载了数据,不需要再显示加载状态
const [activeTab, setActiveTab] = useState<string>('preview'); // 'preview', 'analysis', 'fileinfo'
const [reviewData, setReviewData] = useState<ReviewData | null>(null);
@@ -222,6 +223,7 @@ export default function ReviewDetails() {
uploadTime: document.uploadTime || "未知时间",
uploadUser: document.uploadUser || "未知用户",
auditStatus: document.auditStatus || 0,
legalBasis: document.legalBasis || {}
};
// 创建包含真实文档数据的评查数据对象
@@ -230,16 +232,17 @@ export default function ReviewDetails() {
fileInfo: fileInfo,
// 其他字段暂时使用默认值
contractInfo: getMockReviewData().contractInfo,
reviewInfo: getMockReviewData().reviewInfo,
reviewInfo: reviewInfo,
statistics: statistics,
fileContent: getMockReviewData().fileContent,
reviewPoints: reviewPoints,
aiAnalysis: getMockReviewData().aiAnalysis,
};
console.log("reviewDataObj-------",reviewDataObj);
setReviewData(reviewDataObj);
setIsLoading(false);
}, [document, reviewPoints, statistics]);
}, [document, reviewPoints, statistics, reviewInfo]);
const handleTabChange = (tabKey: string) => {
setActiveTab(tabKey);
+26 -50
View File
@@ -163,19 +163,6 @@ export default function RulesFiles() {
setSearchParams(newParams);
};
// 处理确认评查状态
const handleConfirmStatus = async (id: string, status: string) => {
try {
await updateReviewStatus(id, status);
// 刷新页面获取最新数据
const newParams = new URLSearchParams(searchParams);
setSearchParams(newParams);
} catch (error) {
console.error('更新评查状态失败:', error);
// 可以在这里添加错误提示
}
};
// 渲染问题摘要
const renderIssues = (file: ReviewFileUI) => {
// 如果评查状态为通过,显示"所有评查点均通过"
@@ -220,11 +207,13 @@ export default function RulesFiles() {
key: "fileName",
width: "30%",
render: (_: unknown, file: ReviewFileUI) => (
<div className="flex items-center">
<FileIcon fileName={file.fileName} className="mr-2 text-lg flex-shrink-0 w-10 h-10" />
<div>
<div className="font-normal text-base break-words" title={file.fileName}>{file.fileName}</div>
<div className="text-xs text-secondary mt-1">
<div className="flex">
<div className="flex-shrink-0 flex items-center self-center">
<FileIcon fileName={file.fileName} className="text-lg w-10 h-10" />
</div>
<div className="min-w-0 flex-1 flex flex-col py-2 ml-2">
<div className="font-normal text-base break-words whitespace-normal leading-normal" title={file.fileName}>{file.fileName}</div>
<div className="text-xs text-secondary mt-2">
{file.fileCode}
</div>
</div>
@@ -283,27 +272,16 @@ export default function RulesFiles() {
width: "14%",
render: (_: unknown, file: ReviewFileUI) => (
<>
{file.reviewStatus === 'pending' ? (
<Button
type="primary"
size="small"
icon="ri-check-double-line"
className="mr-2"
onClick={() => handleConfirmStatus(file.id, 'pass')}
>
</Button>
) : (
<Button
type="default"
size="small"
icon="ri-eye-line"
to={`/files/${file.id}`}
className="mr-2"
>
</Button>
)}
<Button
type="default"
size="small"
icon="ri-eye-line"
to={`/reviews?id=${file.id}`}
className="mr-2"
>
</Button>
<Button type="default" size="small" icon="ri-download-2-line">
</Button>
@@ -357,16 +335,6 @@ export default function RulesFiles() {
onChange={handleFilterChange}
className="mr-2 w-40"
/>
<SearchFilter
label="搜索"
placeholder="搜索文件名、合同编号或关键词"
value={searchParams.get('keyword') || ''}
onSearch={handleSearch}
buttonText=""
className="mr-2 w-64"
/>
<FilterSelect
label="排序方式"
name="sortOrder"
@@ -380,6 +348,14 @@ export default function RulesFiles() {
{ value: "issue_count_asc", label: "问题数量 ↑" }
]}
/>
<SearchFilter
label="搜索"
placeholder="搜索文件名、合同编号或关键词"
value={searchParams.get('keyword') || ''}
onSearch={handleSearch}
buttonText=""
className="mr-2 flex-1"
/>
</FilterPanel>
{/* 文件列表 */}
@@ -389,7 +365,7 @@ export default function RulesFiles() {
dataSource={files}
rowKey="id"
emptyText="暂无文件数据"
className="files-table"
className="files-table table-auto-height"
/>
{/* 分页组件 */}