Files
leaudit-platform-frontend/app/components/reviews/FileDetails.tsx
T

182 lines
5.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 文件详情组件
* 显示文件基本信息、合同信息和评查信息
*/
import { ReactNode } from 'react';
// 文件基本信息
interface FileInfo {
fileName: string;
contractNumber: string;
fileSize: string;
fileFormat: string;
pageCount: number;
uploadTime: string;
uploadUser: string;
fileType: string;
}
// 合同信息
interface ContractInfo {
contractType: string;
signDate: string;
parties: {
partyA: string;
partyB: string;
};
amount: string;
period: string;
}
// 评查信息
interface ReviewInfo {
reviewTime: string;
reviewModel: string;
ruleGroup: string;
result: string;
issueCount: number;
}
interface FileDetailsProps {
fileInfo: FileInfo;
contractInfo: ContractInfo;
reviewInfo: ReviewInfo;
}
export function FileDetails({ fileInfo, contractInfo, reviewInfo }: FileDetailsProps) {
// 情况状态对应的标签
const controlContractShow = false
const renderResultBadge = (result: string) => {
switch (result) {
case 'success':
return (
<span className="status-badge status-success">
<i className="ri-checkbox-circle-line mr-1"></i>
</span>
);
case 'warning':
return (
<span className="status-badge status-warning">
<i className="ri-alert-line mr-1"></i>
</span>
);
case 'error':
return (
<span className="status-badge status-error">
<i className="ri-close-circle-line mr-1"></i>
</span>
);
default:
return (
<span className="status-badge status-warning">
<i className="ri-alert-line mr-1"></i>
</span>
);
}
};
// 渲染信息区块
const renderInfoSection = (title: string, icon: string, color: string, children: ReactNode) => {
// 根据color参数返回对应的具体类名
const getBgClass = (colorName: string) => {
switch(colorName) {
case 'blue': return 'bg-blue-50';
case 'green': return 'bg-green-50';
case 'purple': return 'bg-purple-50';
default: return 'bg-gray-50';
}
};
const getTextClass = (colorName: string) => {
switch(colorName) {
case 'blue': return 'text-blue-500';
case 'green': return 'text-green-500';
case 'purple': return 'text-purple-500';
default: return 'text-gray-500';
}
};
const getTextTitleClass = (colorName: string) => {
switch(colorName) {
case 'blue': return 'text-blue-700';
case 'green': return 'text-green-700';
case 'purple': return 'text-purple-700';
default: return 'text-gray-700';
}
};
return (
<div className="info-section">
<div className={`info-header ${getBgClass(color)}`}>
<i className={`${icon} ${getTextClass(color)} text-lg mr-2`}></i>
<h3 className={`font-medium ${getTextTitleClass(color)}`}>{title}</h3>
</div>
<div className="info-content">
{children}
</div>
</div>
);
};
// 渲染信息行
const renderInfoRow = (label: string, value: string | ReactNode) => {
return (
<div className="info-row">
<div className="info-label">{label}</div>
<div className="info-value">{value}</div>
</div>
);
};
return (
<div className="bg-white rounded-lg shadow-sm overflow-hidden">
{/* 文件基本信息 */}
{renderInfoSection('文件基本信息', 'ri-file-info-line', 'blue', (
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
{renderInfoRow('文件名称', fileInfo.fileName)}
{renderInfoRow(fileInfo.fileType != "1" ? '卷宗编号' : '合同编号', fileInfo.contractNumber)}
{renderInfoRow('文件大小', fileInfo.fileSize)}
{renderInfoRow('文件格式', fileInfo.fileFormat)}
{renderInfoRow('页数', `${fileInfo.pageCount}`)}
{renderInfoRow('上传时间', fileInfo.uploadTime)}
{/* {renderInfoRow('上传用户', fileInfo.uploadUser)} */}
</div>
))}
{/* 合同信息 */}
{ controlContractShow && (
renderInfoSection('合同信息', 'ri-file-paper-2-line', 'green', (
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
{renderInfoRow('合同类型', contractInfo.contractType)}
{renderInfoRow('签约日期', contractInfo.signDate)}
{renderInfoRow('合同当事人', (
<div>
<div>{contractInfo.parties.partyA}</div>
<div>{contractInfo.parties.partyB}</div>
</div>
))}
{renderInfoRow('合同金额', contractInfo.amount)}
{renderInfoRow('履行期限', contractInfo.period)}
</div>
))
)}
{/* 评查信息 */}
{renderInfoSection('评查信息', 'ri-search-eye-line', 'purple', (
<>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
{renderInfoRow('评查时间', reviewInfo.reviewTime)}
{renderInfoRow('评查模型', reviewInfo.reviewModel)}
{renderInfoRow('评查规则组', reviewInfo.ruleGroup)}
{renderInfoRow('评查结果', (
<div className="flex items-center">
{renderResultBadge(reviewInfo.result)}
{reviewInfo.issueCount > 0 && <span className="text-sm ml-2">{reviewInfo.issueCount}</span>}
</div>
))}
</div>
</>
))}
</div>
);
}