import { requestClient } from '#/api/request'; const prefix = 'file-gallery/'; export interface FileGalleryItem { id: number; url: string; file_name?: string; file_size: number; file_size_text: string; type?: number; type_text?: string; type_icon?: string; group_ids?: number[]; created_at?: string; original_name?: string; object_key?: string; source?: number; is_qrcode?: number; ref_count?: number; folder_id?: number; } export interface FileTypeItem { id: number; name: string; icon?: string; value: number; suffix: string; sort: number; } export interface FileGalleryDetail extends FileGalleryItem { source_text?: string; updated_at?: string; } export interface FileGalleryStats { total_count: number; total_size: number; total_size_text: string; unref_count: number; recyclable_size: number; recyclable_size_text: string; has_scanned: boolean; } export interface FileGalleryListParams { page?: number; page_size?: number; pid?: number; type?: number; group_id?: number; keyword?: string; exclude_qrcode?: number; unref_only?: number; folder_id?: number; unfiled?: number; } export async function getFileGalleryList(params?: FileGalleryListParams) { return requestClient.get<{ items: FileGalleryItem[]; page: number; page_size: number; total: number; }>(`${prefix}list`, { params }); } export async function getFileGalleryDetail(id: number) { return requestClient.get(`${prefix}detail`, { params: { id }, }); } export async function deleteFileGalleryItem(id: number | number[]) { const data = Array.isArray(id) ? { ids: id } : { id }; return requestClient.post(`${prefix}delete`, data); } export async function renameFileGalleryItem(id: number, file_name: string) { return requestClient.post(`${prefix}rename`, { id, file_name }); } export async function moveFileGalleryType(id: number, type: number) { return requestClient.post(`${prefix}move-type`, { id, type }); } export async function batchArchiveFiles() { return requestClient.post<{ file_name_filled: number; reclassified: number; }>(`${prefix}batch-archive`); } export async function getFileTypes() { return requestClient.get(`${prefix}file-types`); } export async function syncFileGalleryFromOss() { return requestClient.post<{ scanned: number; skipped: number; synced: number; }>(`${prefix}sync-oss`); } /** 文件加入自定义分组 */ export async function addFileToGroup(file_id: number, group_id: number) { return requestClient.post(`${prefix}add-to-group`, { file_id, group_id, }); } /** 文件移出自定义分组 */ export async function removeFileFromGroup(file_id: number, group_id: number) { return requestClient.post(`${prefix}remove-from-group`, { file_id, group_id, }); } /** 素材库统计:总数 / 容量 / 未引用 / 可回收 */ export async function getFileGalleryStats() { return requestClient.get(`${prefix}stats`); } /** 右键标记或取消二维码 */ export async function markFileQrcode(id: number, is_qrcode: number) { return requestClient.post<{ id: number; is_qrcode: number }>( `${prefix}mark-qrcode`, { id, is_qrcode, }, ); } /** 扫描业务表 URL 引用(两库全表文本列) */ export async function scanFileGalleryRefs() { return requestClient.post<{ elapsed_ms: number; mysql_columns: number; mysql_failed: number; old_mysql_columns: number; old_mysql_failed: number; referenced: number; scanned_files: number; unreferenced: number; }>(`${prefix}scan-refs`); } /** 批量加入分组(移动到文件夹) */ export async function batchAddFilesToGroup(ids: number[], group_id: number) { return requestClient.post<{ count: number; group_id: number }>( `${prefix}batch-add-to-group`, { ids, group_id, }, ); } /** 批量移入真实文件夹 */ export async function batchMoveFilesToFolder(ids: number[], folder_id: number) { return requestClient.post<{ count: number; folder_id: number }>( `${prefix}batch-move-to-folder`, { ids, folder_id, }, ); }