import { useEffect, useMemo, useState } from 'react'; import { Download, Eye, FileUp, Search } from 'lucide-react'; import { adminApi, type FileObject, type FileRef, type ReportTask } from '@/api/adminApi'; import { Breadcrumb, Button, DateRangeInput, FileActions, Input, Modal, Select, Table, Tag, Textarea, type DateRangeValue, type TableColumn } from '@/components/ui'; const statusMeta: Record = { pending: { label: '待处理', tone: 'neutral' }, ready: { label: '待导出', tone: 'info' }, exported: { label: '已导出', tone: 'warning' }, reporting: { label: '报备中', tone: 'warning' }, partial: { label: '部分完成', tone: 'info' }, completed: { label: '已完成', tone: 'success' }, failed: { label: '有失败', tone: 'danger' }, }; type ReceiptImportPayload = { delimiter: ',' | '\t'; fileContent: string; fileName: string; fileObjectId: string; remark: string; }; function ReceiptImportModal({ onClose, onSubmit, task }: { onClose: () => void; onSubmit: (payload: ReceiptImportPayload) => void; task: ReportTask }) { const [file, setFile] = useState(null); const [fileObject, setFileObject] = useState(null); const [uploading, setUploading] = useState(false); const [remark, setRemark] = useState(''); const [error, setError] = useState(''); const fileRef: FileRef | null = fileObject ? { contentType: fileObject.contentType, fileName: fileObject.fileName, fileObjectId: fileObject.id } : null; async function uploadReceiptFile(nextFile: File | undefined) { setFile(nextFile ?? null); setFileObject(null); setError(''); if (!nextFile) { return; } setUploading(true); try { const uploaded = await adminApi.uploadFileObject(nextFile, { purpose: 'report_receipt', prefix: `report-receipts/${task.id}` }); setFileObject(uploaded); } catch (failure) { setError(failure instanceof Error ? failure.message : '报备回执上传失败'); } finally { setUploading(false); } } async function submitImport() { if (!file || !fileObject) { return; } const delimiter: ',' | '\t' = file.name.toLowerCase().endsWith('.tsv') ? '\t' : ','; onSubmit({ delimiter, fileContent: await file.text(), fileName: file.name, fileObjectId: fileObject.id, remark, }); } return ( } onClose={onClose} open size="xl" title={

导入报备回执

上传运营商回执并记录状态。

} >
{error ?

{error}

: null}