# 实现任务清单

## 1. 准备工作
- [x] 1.1 阅读现有账号管理代码（Handler/Service/Store）
- [x] 1.2 确认现有 DTO 定义和验证规则
- [x] 1.3 确认现有路由注册模式

## 2. Model 层（DTO 定义）
- [x] 2.1 在 `internal/model/account_dto.go` 中新增 `UpdatePasswordRequest`
  - 字段：`new_password` (必填，8-32位)
- [x] 2.2 在 `internal/model/account_dto.go` 中新增 `UpdateStatusRequest`
  - 字段：`status` (必填，0 或 1)
- [x] 2.3 在 `internal/model/account_dto.go` 中新增 `PlatformAccountListRequest`
  - 复用 `AccountListRequest`，移除 `user_type` 字段
- [x] 2.4 修改 `AssignRolesRequest`
  - 将 `role_ids` 验证规则从 `required,min=1` 改为 `omitempty`
  - 允许空数组

## 3. Service 层（业务逻辑）
- [x] 3.1 在 `internal/service/account/service.go` 中新增 `UpdatePassword` 方法
  - 验证账号存在
  - 验证密码格式
  - bcrypt 哈希新密码
  - 更新数据库
  - 设置 Updater 字段
- [x] 3.2 在 `internal/service/account/service.go` 中新增 `UpdateStatus` 方法
  - 验证账号存在
  - 验证状态值（0 或 1）
  - 更新数据库
  - 设置 Updater 字段
- [x] 3.3 在 `internal/service/account/service.go` 中新增 `ListPlatformAccounts` 方法
  - 自动筛选 `user_type IN (1, 2)`
  - 支持 username, phone, status 筛选
  - 支持分页
  - 返回账号列表 + 总数
- [x] 3.4 修改 `AssignRoles` 方法
  - 支持 `roleIDs` 为空数组（清空所有角色）
  - 超级管理员（`user_type=1`）禁止分配角色，返回错误
  - 空数组时删除所有现有角色
  - 非空数组时保持现有逻辑

## 4. Handler 层（HTTP 处理）
- [x] 4.1 在 `internal/handler/admin/account.go` 中新增 `UpdatePassword` 方法
  - 解析路径参数 `id`
  - 解析请求 body (`UpdatePasswordRequest`)
  - 调用 `service.UpdatePassword`
  - 返回 `response.Success(c, nil)`
- [x] 4.2 在 `internal/handler/admin/account.go` 中新增 `UpdateStatus` 方法
  - 解析路径参数 `id`
  - 解析请求 body (`UpdateStatusRequest`)
  - 调用 `service.UpdateStatus`
  - 返回 `response.Success(c, nil)`
- [x] 4.3 在 `internal/handler/admin/account.go` 中新增 `ListPlatformAccounts` 方法
  - 解析查询参数 (`PlatformAccountListRequest`)
  - 调用 `service.ListPlatformAccounts`
  - 返回 `response.SuccessWithPagination(c, accounts, total, req.Page, req.PageSize)`

## 5. 路由注册
- [x] 5.1 在 `internal/routes/account.go` 中新增 `registerPlatformAccountRoutes` 函数
  - 注册 `GET /api/admin/platform-accounts` → `h.ListPlatformAccounts`
  - 注册 `POST /api/admin/platform-accounts` → `h.Create`（复用现有）
  - 注册 `GET /api/admin/platform-accounts/:id` → `h.Get`（复用现有）
  - 注册 `PUT /api/admin/platform-accounts/:id` → `h.Update`（复用现有）
  - 注册 `DELETE /api/admin/platform-accounts/:id` → `h.Delete`（复用现有）
  - 注册 `PUT /api/admin/platform-accounts/:id/password` → `h.UpdatePassword`
  - 注册 `PUT /api/admin/platform-accounts/:id/status` → `h.UpdateStatus`
  - 注册 `POST /api/admin/platform-accounts/:id/roles` → `h.AssignRoles`（复用现有）
  - 注册 `GET /api/admin/platform-accounts/:id/roles` → `h.GetRoles`（复用现有）
  - 注册 `DELETE /api/admin/platform-accounts/:id/roles/:role_id` → `h.RemoveRole`（复用现有）
- [x] 5.2 在 `internal/routes/router.go` 中调用 `registerPlatformAccountRoutes`

## 6. 错误码定义
- [x] 6.1 检查 `pkg/errors/codes.go` 中是否有所需错误码
  - `CodeAccountNotFound` (已有)
  - `CodeInvalidPassword` (已有)
  - `CodeInvalidParam` (已有)
  - `CodeUnauthorized` (已有)
- [x] 6.2 如需新增，添加错误码和消息

## 7. 常量定义
- [x] 7.1 检查 `pkg/constants/constants.go` 中状态常量
  - `StatusDisabled = 0` (已有)
  - `StatusEnabled = 1` (已有)
  - `UserTypeSuperAdmin = 1` (已有)
  - `UserTypePlatform = 2` (已有)

## 8. 单元测试
- [x] 8.1 为 `UpdatePassword` 方法编写单元测试
  - 测试成功场景
  - 测试账号不存在场景
  - 测试密码格式错误场景
- [x] 8.2 为 `UpdateStatus` 方法编写单元测试
  - 测试启用/禁用场景
  - 测试账号不存在场景
  - 测试无效状态值场景
- [x] 8.3 为 `ListPlatformAccounts` 方法编写单元测试
  - 测试自动筛选 user_type IN (1,2)
  - 测试分页功能
  - 测试筛选条件（username, phone, status）
- [x] 8.4 为修改后的 `AssignRoles` 方法编写测试
  - 测试空数组清空角色场景
  - 测试超级管理员禁止分配角色场景
  - 测试平台用户分配角色场景

## 9. 集成测试
- [x] 9.1 编写 API 集成测试（`tests/integration/platform_account_test.go`）
  - 测试平台账号列表查询
  - 测试新增平台账号
  - 测试修改密码接口
  - 测试启用/禁用接口
  - 测试角色分配（含空数组场景）
- [x] 9.2 测试超级管理员保护逻辑
  - 超级管理员出现在列表中
  - 超级管理员禁止分配角色

## 10. 文档更新
- [x] 10.1 更新 OpenAPI 文档（如果使用 `openapi-generation`）
- [x] 10.2 在 `docs/` 目录创建功能总结文档
  - 接口列表
  - 请求/响应示例
  - 错误码说明
  - 注意事项（超级管理员保护、角色清空等）

## 11. 验证与清理
- [x] 11.1 运行所有单元测试：`go test ./internal/service/account/...`
- [x] 11.2 运行集成测试：`go test ./tests/integration/...`
- [x] 11.3 使用 `openspec validate add-platform-account-management --strict` 验证提案
- [x] 11.4 代码格式化：`gofmt -w .`
- [x] 11.5 静态检查：`go vet ./...`

## 12. 部署准备
- [x] 12.1 确认无数据库迁移需求
- [x] 12.2 确认向后兼容（现有接口不受影响）
- [x] 12.3 准备发布说明（新增接口列表、使用示例）
