feat(aihr): decouple batch upload from processing via async queue

批量上传治本:POST /doc/upload-async 只暂存+入队即秒回,后台 worker
(并发2)复用 saveDocument 链路逐条解析/归类/向量化;队列表
aihr_knowledge_upload_item 状态机 0/1/2/3,完成/失败 CAS 写入,同名
文件串行防撞 attach 唯一键,卡住30分钟清扫重置,失败暂存保留72h。
新增 GET /doc/upload-items 批次查询与 POST /doc/upload-items/{id}/retry
单文件重试。资料处理页批量导入改走异步:提交即返回,新增本批次
进度面板(排队/加工中/完成/失败+进度条+单条重试),轮询防过期回写。
同步接口保留给 SOP 页单文件即时预览。
This commit is contained in:
2026-07-03 23:36:56 +08:00
parent e47f6a2f48
commit 4fa23617a4
9 changed files with 761 additions and 35 deletions
+48
View File
@@ -67,3 +67,51 @@ export function uploadKnowledgeDoc(data: FormData): Promise<ApiResult<SopUploadR
headers: { repeatSubmit: false }
});
}
export type UploadEnqueueResponse = {
itemId: number;
batchId: string;
fileName: string;
status: string;
};
export type UploadItem = {
id: number;
batchId: string;
fileName: string;
category: string;
status: number;
statusLabel: string;
error: string | null;
docId: string | null;
fragmentCount: number | null;
updatedAt: string;
};
/** 批量上传走异步队列:接口只暂存+入队即返回,解析/归类/向量化由后台 worker 处理。 */
export function uploadKnowledgeDocAsync(data: FormData): Promise<ApiResult<UploadEnqueueResponse>> {
return request({
url: '/api/knowledge/doc/upload-async',
method: 'post',
data,
timeout: 60000,
headers: { repeatSubmit: false }
});
}
export function listUploadItems(batchId: string): Promise<ApiResult<UploadItem[]>> {
return request({
url: '/api/knowledge/doc/upload-items',
method: 'get',
params: { batchId },
headers: { repeatSubmit: false }
});
}
export function retryUploadItem(id: number): Promise<ApiResult<UploadItem>> {
return request({
url: `/api/knowledge/doc/upload-items/${id}/retry`,
method: 'post',
headers: { repeatSubmit: false }
});
}