195 lines
4.8 KiB
TypeScript
195 lines
4.8 KiB
TypeScript
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<FileGalleryDetail>(`${prefix}detail`, {
|
||
params: { id },
|
||
});
|
||
}
|
||
|
||
export async function deleteFileGalleryItem(id: number | number[]) {
|
||
const data = Array.isArray(id) ? { ids: id } : { id };
|
||
return requestClient.post<any>(`${prefix}delete`, data);
|
||
}
|
||
|
||
export async function renameFileGalleryItem(id: number, file_name: string) {
|
||
return requestClient.post<any>(`${prefix}rename`, { id, file_name });
|
||
}
|
||
|
||
export async function moveFileGalleryType(id: number, type: number) {
|
||
return requestClient.post<any>(`${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<FileTypeItem[]>(`${prefix}file-types`);
|
||
}
|
||
|
||
/** 规划 OSS 同步日期分组(full 全部 / incremental 从库内最新日期起) */
|
||
export async function planFileGalleryOssSync(data?: { mode?: 'full' | 'incremental' }) {
|
||
return requestClient.post<{
|
||
mode: 'full' | 'incremental';
|
||
prefixes: string[];
|
||
total: number;
|
||
since_date: string;
|
||
}>(`${prefix}sync-oss-plan`, data ?? {});
|
||
}
|
||
|
||
/** 从 OSS 同步一批(按日期 prefix + marker;全部组结束后 finalize=1) */
|
||
export async function syncFileGalleryFromOss(data?: {
|
||
limit?: number;
|
||
marker?: string;
|
||
prefix?: string;
|
||
finalize?: number;
|
||
}) {
|
||
return requestClient.post<{
|
||
scanned: number;
|
||
skipped: number;
|
||
synced: number;
|
||
next_marker: string;
|
||
done: boolean;
|
||
folder_created: number;
|
||
prefix: string;
|
||
}>(`${prefix}sync-oss`, data ?? {});
|
||
}
|
||
|
||
/** 文件加入自定义分组 */
|
||
export async function addFileToGroup(file_id: number, group_id: number) {
|
||
return requestClient.post<any>(`${prefix}add-to-group`, {
|
||
file_id,
|
||
group_id,
|
||
});
|
||
}
|
||
|
||
/** 文件移出自定义分组 */
|
||
export async function removeFileFromGroup(file_id: number, group_id: number) {
|
||
return requestClient.post<any>(`${prefix}remove-from-group`, {
|
||
file_id,
|
||
group_id,
|
||
});
|
||
}
|
||
|
||
/** 素材库统计:总数 / 容量 / 未引用 / 可回收 */
|
||
export async function getFileGalleryStats() {
|
||
return requestClient.get<FileGalleryStats>(`${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,
|
||
},
|
||
);
|
||
}
|