# 2026-06-08 — 服务器批量任务结果持久化

## 摘要

批量任务（安装/升级/卸载 Agent、健康检查等）完成后写入 MySQL `server_batch_jobs`，审计日志带 `job_id` 与失败摘要；`GET /batch/jobs/{id}` Redis 过期后仍可从库读取。

## 动机

原先结果仅存 Redis（2h TTL），关闭通知后无法回看；审计只有「0/1 成功」摘要，无逐台失败原因，与脚本库 `script_executions` 不对齐。

## 涉及文件

- `server/domain/models/__init__.py` — `ServerBatchJob` 表
- `server/infrastructure/database/server_batch_job_repo.py`
- `server/application/services/server_batch_service.py` — 创建/落库/审计 JSON
- `server/api/servers.py` — `GET /batch/jobs` 列表
- `frontend/src/pages/AuditPage.vue` — 「查看结果」按钮
- `frontend/src/utils/auditBatchDetail.ts`

## 迁移 / 重启

- 新表由 `create_all` 自动创建（重启 API 后首次访问）
- 历史 Redis-only 任务无法补录

## 验证

```bash
pytest tests/test_server_batch_job_persist.py -q
# 批量安装 Agent → 审计日志 → 查看结果 → 逐台 stdout/error
# GET /api/servers/batch/jobs?limit=10
```

## 查看入口

| 时机 | 入口 |
|------|------|
| 任务刚完成 | 顶栏通知 → **查看详情** |
| 进行中 | 顶栏进度条（可点击） |
| 事后 | **审计日志** → 批量操作行 → **查看结果** |
| API | `GET /api/servers/batch/jobs/{job_id}` |
