# ADP PTO 同步 - 错误码

| Code | HTTP | 含义 | i18n key |
|---|---|---|---|
| `INSUFFICIENT_PERMISSIONS` | 403 | 非管理员尝试访问 | `adp_sync.error.insufficient_permissions` |
| `TASK_ALREADY_RUNNING` | 409 | 同一 task code 正在执行（并发锁） | `adp_sync.error.task_already_running` |
| `INVALID_DATE_RANGE` | 400 | 时间窗口超出允许范围（PTO sync 6 周；admin 查询 -30d~+60d） | `adp_sync.error.invalid_date_range` |
| `MEETING_NOT_FOUND` | 404 | applyPtoMarking 找不到会议 | `meeting_attendance.error.meeting_not_found` |
| `ADP_API_ERROR` | 502 | 调用 ADP 上游失败（mTLS / token / 5xx） | `adp_sync.error.upstream_failure` |
| `ADP_TOKEN_EXPIRED` | 502 | OAuth2 token 过期且刷新失败 | `adp_sync.error.token_expired` |

## 错误响应格式

走项目统一 `AllExceptionsFilter`：

```json
{
  "success": false,
  "code": "INSUFFICIENT_PERMISSIONS",
  "message": "Only meeting administrators can perform this action.",
  "messageKey": "adp_sync.error.insufficient_permissions",
  "messageParams": {}
}
```

## 上游 ADP 错误处理

| 上游响应 | 本系统处理 |
|---|---|
| 401 (token expired) | 自动重新获取 token 并重试一次 |
| 403 (Invalid Scope) | 立即失败，写入 logs；不重试 |
| 404 Canonical URI Not Found | 记 ERROR 级日志（说明路径错），失败任务 |
| 5xx | 重试 3 次（指数退避）；3 次失败后任务标 FAILED |
| 网络/超时 | 同上 |

异常详情进 `AutomationExecution.error` 字段。
