# 平台账号管理功能实现

## 📋 变更概述

**Change ID**: `add-platform-account-management`

**目标**：实现专门的平台账号（平台用户 + 超级管理员）管理接口，提供语义清晰的专用操作，并增强角色分配灵活性。

**验证状态**: ✅ PASSED (`openspec validate add-platform-account-management --strict`)

---

## 🎯 功能需求（用户需求）

根据原始需求，需要实现以下接口：

1. ✅ **分页查询列表**
   - 查询条件：账号名称
   - 返回值：名称、手机号、创建时间、状态（启用/停用）
   - **包含超级管理员**

2. ✅ **新增平台账号**
   - 表单参数：名称、手机号（登录账号）、登录密码、状态（启用/禁用）、选择角色（多选）

3. ✅ **编辑平台账号**
   - 参考新增接口

4. ✅ **修改密码**
   - 表单参数：新密码（无需旧密码）

5. ✅ **启用/禁用接口**
   - 独立的状态切换接口

6. ✅ **超级管理员出现在列表中**
   - 列表自动包含 `user_type IN (1, 2)` 的账号

---

## 🔧 技术实现方案

### 1. 新增接口列表

#### 核心管理接口
| 方法 | 路径 | 说明 | 实现方式 |
|------|------|------|---------|
| `GET` | `/api/admin/platform-accounts` | 平台账号列表（含超管） | **新增** `ListPlatformAccounts` |
| `POST` | `/api/admin/platform-accounts` | 新增平台账号 | **复用** `Create` |
| `GET` | `/api/admin/platform-accounts/:id` | 获取详情 | **复用** `Get` |
| `PUT` | `/api/admin/platform-accounts/:id` | 编辑平台账号 | **复用** `Update` |
| `DELETE` | `/api/admin/platform-accounts/:id` | 删除平台账号 | **复用** `Delete` |

#### 专用操作接口
| 方法 | 路径 | 说明 | 实现方式 |
|------|------|------|---------|
| `PUT` | `/api/admin/platform-accounts/:id/password` | 修改密码 | **新增** `UpdatePassword` |
| `PUT` | `/api/admin/platform-accounts/:id/status` | 启用/禁用 | **新增** `UpdateStatus` |

#### 角色管理接口
| 方法 | 路径 | 说明 | 实现方式 |
|------|------|------|---------|
| `POST` | `/api/admin/platform-accounts/:id/roles` | 分配角色 | **增强** `AssignRoles` |
| `GET` | `/api/admin/platform-accounts/:id/roles` | 获取角色列表 | **复用** `GetRoles` |
| `DELETE` | `/api/admin/platform-accounts/:id/roles/:role_id` | 移除单个角色 | **复用** `RemoveRole` |

### 2. 新增 DTO

```go
// UpdatePasswordRequest 修改密码请求
type UpdatePasswordRequest struct {
    NewPassword string `json:"new_password" validate:"required,min=8,max=32"`
}

// UpdateStatusRequest 状态切换请求
type UpdateStatusRequest struct {
    Status int `json:"status" validate:"required,min=0,max=1"`
}

// PlatformAccountListRequest 平台账号列表请求
type PlatformAccountListRequest struct {
    Page     int    `json:"page" query:"page" validate:"omitempty,min=1"`
    PageSize int    `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100"`
    Username string `json:"username" query:"username" validate:"omitempty,max=50"`
    Phone    string `json:"phone" query:"phone" validate:"omitempty,max=20"`
    Status   *int   `json:"status" query:"status" validate:"omitempty,min=0,max=1"`
}
```

### 3. 新增 Service 方法

```go
// UpdatePassword 修改密码
func (s *Service) UpdatePassword(ctx context.Context, accountID uint, newPassword string) error

// UpdateStatus 状态切换
func (s *Service) UpdateStatus(ctx context.Context, accountID uint, status int) error

// ListPlatformAccounts 平台账号列表查询（自动筛选 user_type IN (1,2)）
func (s *Service) ListPlatformAccounts(ctx context.Context, req *model.PlatformAccountListRequest) ([]*model.Account, int64, error)
```

### 4. 角色分配增强

**修改前**：
```go
type AssignRolesRequest struct {
    RoleIDs []uint `json:"role_ids" validate:"required,min=1"` // 必填，至少1个
}
```

**修改后**：
```go
type AssignRolesRequest struct {
    RoleIDs []uint `json:"role_ids" validate:"omitempty"` // 可选，允许空数组
}
```

**业务逻辑调整**：
- ✅ 允许传递空数组 `[]` 清空所有角色
- ✅ 超级管理员（`user_type=1`）禁止分配角色，返回错误
- ✅ 平台用户（`user_type=2`）可分配无限个平台角色

---

## 📝 API 使用示例

### 1. 查询平台账号列表

**请求**：
```http
GET /api/admin/platform-accounts?page=1&page_size=20&username=admin&status=1
```

**响应**：
```json
{
  "code": 0,
  "msg": "success",
  "data": {
    "items": [
      {
        "id": 1,
        "username": "admin",
        "phone": "13800000000",
        "user_type": 1,
        "status": 1,
        "created_at": "2025-01-14T10:00:00Z",
        "updated_at": "2025-01-14T10:00:00Z"
      },
      {
        "id": 2,
        "username": "platform_user",
        "phone": "13900000000",
        "user_type": 2,
        "status": 1,
        "created_at": "2025-01-14T11:00:00Z",
        "updated_at": "2025-01-14T11:00:00Z"
      }
    ],
    "total": 2,
    "page": 1,
    "size": 20
  },
  "timestamp": "2025-01-14T10:30:00Z"
}
```

### 2. 新增平台账号

**请求**：
```http
POST /api/admin/platform-accounts
Content-Type: application/json

{
  "username": "new_platform_user",
  "phone": "13700000000",
  "password": "SecurePass@123",
  "user_type": 2
}
```

**响应**：
```json
{
  "code": 0,
  "msg": "success",
  "data": {
    "id": 3,
    "username": "new_platform_user",
    "phone": "13700000000",
    "user_type": 2,
    "status": 1,
    "created_at": "2025-01-14T12:00:00Z"
  },
  "timestamp": "2025-01-14T12:00:00Z"
}
```

### 3. 修改密码

**请求**：
```http
PUT /api/admin/platform-accounts/3/password
Content-Type: application/json

{
  "new_password": "NewSecurePass@456"
}
```

**响应**：
```json
{
  "code": 0,
  "msg": "success",
  "data": null,
  "timestamp": "2025-01-14T12:05:00Z"
}
```

### 4. 启用/禁用账号

**请求**：
```http
PUT /api/admin/platform-accounts/3/status
Content-Type: application/json

{
  "status": 0
}
```

**响应**：
```json
{
  "code": 0,
  "msg": "success",
  "data": null,
  "timestamp": "2025-01-14T12:10:00Z"
}
```

### 5. 分配角色（支持空数组）

**清空所有角色**：
```http
POST /api/admin/platform-accounts/3/roles
Content-Type: application/json

{
  "role_ids": []
}
```

**分配多个角色**：
```http
POST /api/admin/platform-accounts/3/roles
Content-Type: application/json

{
  "role_ids": [1, 2, 3]
}
```

**响应**：
```json
{
  "code": 0,
  "msg": "success",
  "data": [
    {
      "id": 10,
      "account_id": 3,
      "role_id": 1,
      "status": 1
    }
  ],
  "timestamp": "2025-01-14T12:15:00Z"
}
```

### 6. 超级管理员保护

**尝试为超级管理员分配角色**（会被拒绝）：
```http
POST /api/admin/platform-accounts/1/roles
Content-Type: application/json

{
  "role_ids": [1]
}
```

**响应**：
```json
{
  "code": 1001,
  "msg": "超级管理员不允许分配角色",
  "data": null,
  "timestamp": "2025-01-14T12:20:00Z"
}
```

---

## 🔐 业务规则

### 用户类型筛选
- ✅ **平台账号列表**：自动筛选 `user_type IN (1, 2)`
- ✅ **包含超级管理员**：`user_type=1` 的账号出现在列表中

### 角色分配规则
| 用户类型 | 允许分配角色数量 | 角色类型限制 | 是否允许清空角色 |
|---------|----------------|-------------|----------------|
| 超级管理员（1） | ❌ 不允许分配 | - | ❌ |
| 平台用户（2） | ✅ 无限制 | 只能分配平台角色（`role_type=1`） | ✅ |
| 代理账号（3） | ✅ 最多 1 个 | 只能分配客户角色（`role_type=2`） | ✅ |
| 企业账号（4） | ✅ 最多 1 个 | 只能分配客户角色（`role_type=2`） | ✅ |

### 密码规则
- ✅ 长度：8-32 位
- ✅ 存储：bcrypt 哈希
- ✅ 修改：无需验证旧密码（管理员重置场景）

### 状态规则
- ✅ 启用：`status=1`
- ✅ 禁用：`status=0`
- ✅ 禁用账号无法登录（认证层拦截）

---

## 📂 文件清单

### 提案文件
- `openspec/changes/add-platform-account-management/proposal.md` - 变更提案
- `openspec/changes/add-platform-account-management/tasks.md` - 实现任务清单
- `openspec/changes/add-platform-account-management/README.md` - 本文档

### Spec Deltas
- `openspec/changes/add-platform-account-management/specs/role-permission/spec.md` - 角色分配逻辑调整
- `openspec/changes/add-platform-account-management/specs/user-organization/spec.md` - 平台账号管理增强

---

## ✅ 验证结果

```bash
$ openspec validate add-platform-account-management --strict
Change 'add-platform-account-management' is valid
```

**验证通过**：所有 delta specs 格式正确，需求完整，场景覆盖充分。

---

## 🚀 下一步

### 1. 审查提案
请审查以下文件：
- `openspec/changes/add-platform-account-management/proposal.md` - 确认业务需求和影响范围
- `openspec/changes/add-platform-account-management/tasks.md` - 确认实现任务清单
- `openspec/changes/add-platform-account-management/specs/*/spec.md` - 确认需求定义

### 2. 批准后开始实现
批准后，我将按照 `tasks.md` 的顺序逐步实现：
1. Model 层（DTO 定义）
2. Service 层（业务逻辑）
3. Handler 层（HTTP 处理）
4. 路由注册
5. 单元测试
6. 集成测试
7. 文档更新

### 3. 实现完成后归档
实现完成并测试通过后，使用以下命令归档：
```bash
openspec archive add-platform-account-management
```

---

## 📞 问题反馈

如有任何问题或需要调整，请告知：
- 业务需求是否准确？
- 接口设计是否合理？
- 角色分配逻辑是否符合预期？
- 是否需要额外功能？
