import { postgrestGet, type PostgrestParams } from '../postgrest-client'; import dayjs from 'dayjs'; // import { API_BASE_URL } from '../client'; /** * 从不同格式的 API 响应中提取数据 * @param responseData API 响应数据 * @returns 提取后的数据或 null */ function extractApiData(responseData: unknown): T | null { if (!responseData) return null; // 格式1: { code: number, msg: string, data: T } if (typeof responseData === 'object' && responseData !== null && 'code' in responseData && 'data' in responseData && (responseData as { data: unknown }).data) { return (responseData as { data: T }).data; } // 格式2: 直接是数据对象 return responseData as T; } // 文档状态枚举 export enum DocumentStatus { waiting = 'waiting', WAITING = "Waiting", CUTTING = "Cutting", EXTRACTIONING = "Extractioning", EVALUATIONING = "Evaluationing", FAILED = "Failed", PROCESSED = "Processed" } // 文档类型接口 export interface DocumentType { id: number; name: string; } // 提取结果接口 interface ExtractedResult { [key: string]: unknown; } // 摘要接口 interface Summary { [key: string]: unknown; } // 文档接口 export interface Document { id: number; name: string; type_id: number; file_size: number; status: DocumentStatus; created_at: string; document_number?: string; path?: string; storage_type?: string; is_test_document?: boolean; evaluation_level?: string; ocr_result?: Record; extracted_results?: ExtractedResult; sumary?: Summary; remark?: string; audit_status?: number; } // 文件上传响应接口 export interface FileUploadResponse { success: boolean; result?: { id: number; file_name: string; file_size: number; file_url: string; type_id: number; type_description: string; document_number: string | null; storage_type: string; is_test_document: boolean; remark: string | null; background_processing: boolean; evaluation_level: string; }; error: string | null; } /** * 将文件转换为二进制数据 */ export async function uploadFileToBinary(file: File): Promise { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => { if (reader.result instanceof ArrayBuffer) { resolve(reader.result); } else { reject(new Error('文件读取失败')); } }; reader.onerror = () => reject(new Error('文件读取失败')); reader.readAsArrayBuffer(file); }); } /** * 上传文件到文档审核系统 * @param binaryData 文件的二进制数据 * @param fileName 文件名 * @param fileType 文件类型 * @param typeId 文档类型ID * @param priority 优先级 * @param documentNumber 文档编号(可选) * @param remark 备注信息(可选) * @param isTestDocument 是否为测试文档 * @returns 上传结果 */ export async function uploadDocumentToServer( binaryData: ArrayBuffer, fileName: string, fileType: string, typeId: string | number, priority: string, documentNumber?: string | null, remark?: string | null, isTestDocument: boolean = false ): Promise<{data: FileUploadResponse; error?: never} | {data?: never; error: string; status?: number}> { try { // console.log('【调试】开始上传文档:', { fileName, fileSize: binaryData.byteLength }); // 创建FormData对象 const formData = new FormData(); // 将二进制数据转换为Blob并添加到FormData const blob = new Blob([binaryData], { type: fileType }); formData.append('file', blob, fileName); // console.log('【调试】Blob已创建,文件大小:', blob.size); // 将信息添加到一个JSON对象中 const uploadInfo = { type_id: Number(typeId), evaluation_level: priority, document_number: documentNumber || null, remark: remark || null, is_test_document: isTestDocument }; // 添加JSON字符串到FormData formData.append('upload_info', JSON.stringify(uploadInfo)); // console.log('【调试】FormData准备完成:', JSON.stringify(uploadInfo)); // console.log('【调试】准备发送请求到服务器:', 'http://172.16.0.58:8008/admin/documents/upload'); // 发送请求 // const response = await fetch(`${API_BASE_URL}/admin/documents/upload`, { try { // console.log('【调试】开始fetch请求...'); const response = await fetch('http://172.16.0.58:8008/admin/documents/upload', { // const response = await fetch('http://172.16.0.55:8000/admin/documents/upload', { // const response = await fetch('http://172.16.0.119:8000/admin/documents/upload', { method: 'POST', headers: { 'X-File-Name': encodeURIComponent(fileName) }, body: formData }); // console.log('【调试】收到服务器响应:', { status: response.status, statusText: response.statusText }); if (!response.ok) { const errorText = await response.text(); console.error(`【调试】上传失败 (${response.status}): ${errorText}`); return { error: `上传失败: ${response.status} ${response.statusText} - ${errorText}`, status: response.status }; } // console.log('【调试】开始解析JSON响应'); let responseData; try { responseData = await response.json(); // console.log('【调试】JSON响应解析成功:', responseData); } catch (jsonError) { console.error('【调试】JSON解析失败:', jsonError); return { error: `解析响应JSON失败: ${jsonError instanceof Error ? jsonError.message : '未知错误'}`, status: 500 }; } const extractedData = extractApiData(responseData); // console.log('【调试】提取的数据:', extractedData); if (!extractedData) { console.error('【调试】无法提取数据'); return { error: '处理上传响应失败', status: 500 }; } // console.log('【调试】上传成功,返回数据'); return { data: extractedData }; } catch (fetchError) { console.error('【调试】fetch请求失败:', fetchError); return { error: `fetch请求错误: ${fetchError instanceof Error ? fetchError.message : '未知错误'}`, status: 500 }; } } catch (error) { console.error('【调试】上传过程中发生错误:', error); return { error: error instanceof Error ? error.message : '上传失败', status: 500 }; } } /** * 获取当天的文档列表 * @param reviewType 审核类型(可选) * @returns 文档列表 */ export async function getTodayDocuments(reviewType?: string): Promise<{data: Document[]; error?: never} | {data?: never; error: string; status?: number}> { try { const today = dayjs().startOf('day').format('YYYY-MM-DD'); // console.log('查询当天文档,日期范围:', today); const params: PostgrestParams = { select: ` id, name, type_id, file_size, status, created_at, document_number, path, storage_type, is_test_document, evaluation_level, ocr_result, extracted_results, sumary, remark, audit_status `, order: 'created_at.desc', filter: { 'created_at': `gte.${today}` } }; // 根据reviewType添加过滤条件 if (reviewType === 'contract') { // 如果是合同类型,只显示type_id=1的文档 if (params.filter) { params.filter['type_id'] = 'eq.1'; } else { params.filter = { 'type_id': 'eq.1' }; } } else if (reviewType === 'record') { // 如果是卷宗类型,只显示type_id=2或type_id=3的文档 if (params.filter) { params.filter['type_id'] = 'in.(2,3)'; } else { params.filter = { 'type_id': 'in.(2,3)' }; } } // console.log('发送请求参数:', params); const response = await postgrestGet('documents', params); // console.log('API 响应:', response); if (response.error) { console.error('API 返回错误:', response.error); return { error: response.error, status: response.status }; } const extractedData = extractApiData(response.data); // console.log('提取后的数据:', extractedData); if (!extractedData) { console.error('数据提取失败'); return { error: '获取数据失败', status: 500 }; } return { data: extractedData }; } catch (error) { console.error('获取当天文档列表失败:', error); return { error: error instanceof Error ? error.message : '获取当天文档列表失败', status: 500 }; } } /** * 获取文档类型列表 * @param reviewType 审核类型(可选) * @returns 文档类型列表 */ export async function getDocumentTypes(reviewType?: string): Promise<{data: DocumentType[]; error?: never} | {data?: never; error: string; status?: number}> { try { const params: PostgrestParams = { select: 'id, name', filter: {} // 初始化为空对象 }; // 根据reviewType添加过滤条件 if (reviewType === 'contract') { // 如果是合同类型,只显示id=1的文档类型 if (params.filter) { params.filter['id'] = 'eq.1'; } else { params.filter = { 'id': 'eq.1' }; } } else if (reviewType === 'record') { // 如果是卷宗类型,只显示id=2或id=3的文档类型 if (params.filter) { params.filter['id'] = 'in.(2,3)'; } else { params.filter = { 'id': 'in.(2,3)' }; } } const response = await postgrestGet('document_types', params); if (response.error) { return { error: response.error, status: response.status }; } const extractedData = extractApiData(response.data); if (!extractedData) { return { error: '获取数据失败', status: 500 }; } return { data: extractedData }; } catch (error) { console.error('获取文档类型列表失败:', error); return { error: error instanceof Error ? error.message : '获取文档类型列表失败', status: 500 }; } } /** * 获取指定文档的状态 * @param documentIds 文档ID列表 * @returns 文档状态列表 */ export async function getDocumentsStatus(documentIds: number[]): Promise<{data: Document[]; error?: never} | {data?: never; error: string; status?: number}> { try { if (!documentIds || documentIds.length === 0) { return { data: [] }; } const params: PostgrestParams = { select: 'id, status', filter: { 'id': `in.(${documentIds.join(',')})` } }; const response = await postgrestGet('documents', params); if (response.error) { return { error: response.error, status: response.status }; } const extractedData = extractApiData(response.data); if (!extractedData) { return { error: '获取数据失败', status: 500 }; } return { data: extractedData }; } catch (error) { console.error('获取文档状态失败:', error); return { error: error instanceof Error ? error.message : '获取文档状态失败', status: 500 }; } }