diff --git a/apps/jingrow/frontend/src/shared/api/common.ts b/apps/jingrow/frontend/src/shared/api/common.ts index e8ecbaa..08dd8a7 100644 --- a/apps/jingrow/frontend/src/shared/api/common.ts +++ b/apps/jingrow/frontend/src/shared/api/common.ts @@ -6,38 +6,33 @@ import { get_session_api_headers } from './auth' // 删除记录的通用函数 export const deleteRecords = async (pagetype: string, names: string[]): Promise<{ success: boolean; message?: string }> => { try { - const results = [] - const failed = [] - - // 循环调用单个删除接口 - for (const name of names) { - try { - await axios.post( - `/api/action/jingrow.client.delete`, - { - pagetype: pagetype, - name: name - }, - { - headers: get_session_api_headers(), - withCredentials: true - } - ) - results.push(name) - } catch (error: any) { - failed.push(name) - } + if (!names || names.length === 0) { + return { success: false, message: '未提供要删除的记录' } } - if (failed.length === 0) { - return { success: true, message: `成功删除 ${results.length} 条记录` } - } else if (results.length > 0) { - return { success: false, message: `部分删除成功:${results.length} 条成功,${failed.length} 条失败` } - } else { - return { success: false, message: '删除失败' } + const response = await axios.post( + `/jingrow/bulk-delete`, + { + pagetype: pagetype, + names: names + }, + { + headers: get_session_api_headers(), + withCredentials: true, + validateStatus: (status) => status === 200 || status === 207 // 允许207状态码 + } + ) + + const result = response.data + // 207 状态码表示部分成功 + const isPartialSuccess = response.status === 207 + + return { + success: !isPartialSuccess, + message: result?.message || (isPartialSuccess ? '部分删除成功' : '删除完成') } } catch (error: any) { - return { success: false, message: error.message || '删除失败' } + return { success: false, message: error.response?.data?.detail || error.message || '删除失败' } } } @@ -386,3 +381,4 @@ export const uploadFileToJingrow = async ( } } } + diff --git a/apps/jingrow/jingrow/api/page.py b/apps/jingrow/jingrow/api/page.py index 6fc21f7..ae4f414 100644 --- a/apps/jingrow/jingrow/api/page.py +++ b/apps/jingrow/jingrow/api/page.py @@ -132,20 +132,54 @@ async def delete_record_api(request: Request, pagetype: str, name: str): except Exception as e: raise HTTPException(status_code=500, detail=str(e)) -@router.post("/api/action/jingrow.client.delete") +@router.post("/jingrow/bulk-delete") async def batch_delete_records(request: Request, data: Dict[str, Any]): """批量删除记录""" - try: - pagetype = data.get('pagetype') - name = data.get('name') - - if not pagetype or not name: - raise HTTPException(status_code=400, detail="缺少必要参数") - - return await delete_record_api(request, pagetype, name) - - except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + pagetype = data.get('pagetype') + name = data.get('name') + names = data.get('names', []) + + if not pagetype: + raise HTTPException(status_code=400, detail="缺少必要参数 pagetype") + + # 统一处理:如果提供了单个 name,转换为列表 + if name and not names: + names = [name] + + if not names: + raise HTTPException(status_code=400, detail="缺少必要参数 name 或 names") + + # 批量删除 + success_count = 0 + failed_names = [] + + for name_item in names: + try: + if jingrow.delete_pg(pagetype, name_item): + success_count += 1 + else: + failed_names.append(name_item) + except Exception: + failed_names.append(name_item) + + failed_count = len(failed_names) + + # 根据结果返回响应 + if failed_count == 0: + return JSONResponse(content={ + "message": f"成功删除 {success_count} 条记录", + "success_count": success_count, + "failed_count": 0 + }) + elif success_count > 0: + return JSONResponse(content={ + "message": f"部分删除成功:{success_count} 条成功,{failed_count} 条失败", + "success_count": success_count, + "failed_count": failed_count, + "failed_names": failed_names + }, status_code=207) # 207 Multi-Status + else: + raise HTTPException(status_code=400, detail="所有记录删除失败") @router.post("/api/action/jingrow.client.get_count") async def get_record_count(request: Request, pagetype: str):