import { postgrestPut, postgrestPost } from '../postgrest-client'; // import dayjs from 'dayjs'; // import { getDocumentTypes } from '../document-types/document-types'; // import type { DocumentTypeUI } from '../document-types/document-types'; // import weekday from 'dayjs/plugin/weekday'; // import updateLocale from 'dayjs/plugin/updateLocale'; import { formatDate } from '../../utils'; // 文档数据库表接口 export interface Document { id: number; user_id: number | null; type_id: number; name: string; document_number: string; path: string; storage_type: string; file_size: number; upload_time: string; is_test_document: boolean; evaluation_level: string; status: string; ocr_result: Record; extracted_results: Record | null; sumary: string | null; remark: string; created_at: string; updated_at: string; evaluations_status: number | null; audit_status: number | null; } // 文档类型接口 export interface DocumentType { id: number; name: string; description: string | null; status: number; created_at: string; updated_at: string; } // 评查文件UI接口 export interface ReviewFileUI { id: string; status: string; path: string; fileName: string; fileCode: string; fileType: string; fileTypeId: number; fileSize: number; uploadTime: string; reviewStatus: string; reviewStatusCode: number; issueCount: number; score?: number; auditStatus: number | null; issues: Array<{ severity: 'info' | 'warning' | 'error' | 'critical'; message: string; }>; createdBy: string; passCount: number; warningCount: number; failCount: number; manualCount: number; } // 数据库函数返回的评查文件结构 interface ReviewFileFromSQL { id: number; status: string; path: string; file_name: string; file_code: string; file_type_name: string; file_type_id: number; file_size: number; upload_time: string; created_at: string; evaluations_status: number; audit_status: number | null; created_by_user_id: number | null; issue_count: number; total_score: number; pass_count: number; warning_count: number; fail_count: number; manual_count: number; issues: Array<{ severity: 'info' | 'warning' | 'error' | 'critical'; message: string; }> | null; } // 文件列表搜索参数 export interface DocumentSearchParams { fileType?: string; // 文件类型ID reviewStatus?: string; // 评查状态 // dateRange?: string; // 日期范围 dateFrom?: string; // 开始日期 dateTo?: string; // 结束日期 keyword?: string; // 搜索关键字 sortOrder?: string; // 排序方式 page?: number; // 当前页码 pageSize?: number; // 每页条数 } // 添加评查结果和评查点类型定义 // 评查结果类型 // interface EvaluationResult { // id: string | number; // document_id: string | number; // evaluation_point_id: string | number; // evaluated_results?: { // result?: boolean; // message?: string; // data?: string; // [key: string]: unknown; // }; // [key: string]: unknown; // } // 评查点类型 // interface EvaluationPoint { // id: string | number; // post_action?: string; // score?: number; // [key: string]: unknown; // } // 文档评查状态结果 // interface DocumentReviewResult { // status: number; // issueCount: number; // passCount: number; // warningCount: number; // failCount: number; // manualCount: number; // } // /** // * 从不同格式的 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; // } /** * 将评查状态代码映射到UI状态 * @param status 评查状态代码 * @returns UI状态 */ export function mapReviewStatusToUI(status: number | null): string { switch(status) { case 1: return 'pass'; case -2: return 'warning'; case -1: return 'fail'; case 0: return 'pending'; default: return 'pending'; } } /** * 将UI状态映射到评查状态代码 * @param status UI状态 * @returns 评查状态代码 */ export function mapUIToReviewStatus(status: string): number { switch(status) { case 'pass': return 1; case 'warning': return -2; case 'fail': return -1; case 'pending': return 0; default: return 0; } } /** * 获取文件扩展名 * @param fileName 文件名 * @returns 文件扩展名 */ export function getFileExtension(fileName: string): string { return fileName.split('.').pop()?.toLowerCase() || ''; } /** * 获取评查文件列表 * @param searchParams 搜索参数 * @returns 评查文件列表和总数 */ export async function getReviewFiles(searchParams: DocumentSearchParams = {}): Promise<{ data?: { files: ReviewFileUI[], total: number }; error?: string; status?: number; }> { try { const { page = 1, pageSize = 10, keyword, fileType, // sessionStorage.getItem('reviewType') reviewStatus, dateFrom, dateTo, sortOrder = 'upload_time_desc' } = searchParams; let p_typeid: number[] | null = null; if (fileType) { if (fileType === 'record') { p_typeid = [2, 3]; } else if (fileType === 'contract') { p_typeid = [1]; } else { const typeId = parseInt(fileType, 10); if (!isNaN(typeId)) { p_typeid = [typeId]; } } } const rpcParams = { p_keyword: keyword || null, p_typeid: p_typeid, p_evaluations_status: reviewStatus ? mapUIToReviewStatus(reviewStatus) : null, p_date_from: dateFrom || null, p_date_to: dateTo || null, }; const listParams = { ...rpcParams, p_page: page, p_page_size: pageSize, p_sort_order: sortOrder }; // 并行执行获取数据和获取总数的请求 const [filesResponse, countResponse] = await Promise.all([ postgrestPost('rpc/get_review_files_with_details', listParams), postgrestPost('rpc/count_review_files', rpcParams) ]); // 处理获取文档列表的错误 if (filesResponse.error || !filesResponse.data) { return { error: filesResponse.error || '获取文档数据失败', status: filesResponse.status || 500 }; } // 处理获取总数的错误 if (countResponse.error || typeof countResponse.data !== 'number') { console.error('获取文档总数失败:', countResponse.error); } const totalCount = typeof countResponse.data === 'number' ? countResponse.data : 0; // 将SQL返回的数据转换为UI格式 const reviewFiles: ReviewFileUI[] = filesResponse.data.map((file: ReviewFileFromSQL) => ({ id: file.id.toString(), status: file.status, path: file.path, fileName: file.file_name, fileCode: file.file_code, fileType: file.file_type_name, fileTypeId: file.file_type_id, fileSize: file.file_size, uploadTime: formatDate(file.created_at), reviewStatus: mapReviewStatusToUI(file.evaluations_status), reviewStatusCode: file.evaluations_status, issueCount: file.issue_count, score: file.total_score, auditStatus: file.audit_status, issues: file.issues || [], createdBy: file.created_by_user_id?.toString() || '系统', passCount: file.pass_count, warningCount: file.warning_count, failCount: file.fail_count, manualCount: file.manual_count, })); return { data: { files: reviewFiles, total: totalCount } }; } catch (error) { console.error('获取评查文件列表失败:', error); return { error: error instanceof Error ? error.message : '获取评查文件列表失败', status: 500 }; } } /** * 更新文件的评查状态 * @param id 文件ID * @param status 评查状态 * @returns 更新后的文件信息 */ // export async function updateReviewStatus(id: string, status: string): Promise<{ // data?: ReviewFileUI; // error?: string; // status?: number; // }> { // try { // if (!id) { // return { error: '文件ID不能为空', status: 400 }; // } // const statusValue = mapUIToReviewStatus(status); // const response = await postgrestPut>( // 'documents', // { evaluations_status: statusValue }, // { id: parseInt(id) } // ); // if (response.error) { // return { error: response.error, status: response.status }; // } // const extractedData = extractApiData(response.data); // if (!extractedData) { // return { error: '更新评查状态失败', status: 500 }; // } // // 获取文档类型,用于查找文档类型名称 // const documentTypesResponse = await getDocumentTypes({pageSize: 500}); // const documentTypes = documentTypesResponse.data?.types || []; // // 查找文档类型名称 // const docType = documentTypes.find((type: DocumentTypeUI) => type.id === extractedData.type_id); // const typeName = docType ? docType.name : '未知类型'; // return { data: convertToReviewFileUI(extractedData, typeName) }; // } catch (error) { // console.error('更新评查状态失败:', error); // return { // error: error instanceof Error ? error.message : '更新评查状态失败', // status: 500 // } // } // } /** * 更新文件的审核状态 * @param id 文件ID * @param auditStatus 审核状态 * @returns 更新结果 */ export async function updateDocumentAuditStatus(id: string, auditStatus: number): Promise<{ success?: boolean; error?: string; status?: number; }> { try { if (!id) { return { error: '文件ID不能为空', status: 400 }; } const response = await postgrestPut>( 'documents', { audit_status: auditStatus }, { id: parseInt(id) } ); if (response.error) { return { error: response.error, status: response.status }; } return { success: true }; } catch (error) { console.error('更新文件审核状态失败:', error); return { error: error instanceof Error ? error.message : '更新文件审核状态失败', status: 500 }; } }