# 用户注册工单流程

---
DDS-Section: 6. 用户注册工单流程
DDS-Lines: L322-L392
---

## 工单创建时机

**重要**：前端不允许直接调用创建工单接口，工单由 `POST /api/users` 内部自动创建。

## 流程时序

```
1. 用户 → rmdc-user-auth: POST /api/users (创建用户)
2. rmdc-user-auth: 创建用户记录 (status=disabled, 默认密码)
3. rmdc-user-auth → rmdc-work-procedure: CreateWorkflow(user_registration)
4. rmdc-work-procedure → rmdc-user-auth: workflow_id
5. rmdc-user-auth → 用户: 返回成功，工单ID
6. rmdc-work-procedure → SuperAdmin: 通知待审批
```

## 审批分支

| 操作 | 工单状态 | 用户状态 | 后续动作 |
|:---|:---|:---|:---|
| 审批通过 | approved | active | ActivateUser(user_id) |
| 审批打回 | returned | disabled (保持) | 通知修改，用户 PUT /api/users/:id |
| 撤销 | revoked | (删除) | DeletePendingUser(user_id) |
| 重新提交 | pending_review | disabled (保持) | 工单重新进入审批 |

## 工单状态与用户状态映射

| 工单事件 | 工单状态 | 用户状态 | 说明 |
|:---|:---|:---|:---|
| create | pending_review | disabled | 创建用户并提交审核 |
| approve | approved | active | 审核通过，激活用户 |
| return | returned | disabled | 打回修改 |
| resubmit | pending_review | disabled | 重新提交审核 |
| revoke | revoked | (删除) | 撤销工单，删除待审批用户 |

## 注册工单业务载荷

```go
type RegistrationWorkflowPayload struct {
    TargetUserID       int64     `json:"target_user_id"`       // 被注册用户ID
    TargetUsername     string    `json:"target_username"`      // 被注册用户名
    TargetRole         string    `json:"target_role"`          // 被注册用户角色
    RegisteredByID     int64     `json:"registered_by_id"`     // 注册人ID
    RegisteredByName   string    `json:"registered_by_name"`   // 注册人姓名
    AccountExpiresAt   time.Time `json:"account_expires_at"`   // 账户有效期
    RegistrationReason string    `json:"registration_reason"`  // 注册原因
}
```

## 注册接口设计要点

| 要点 | 说明 |
|:---|:---|
| 不暴露密码设置 | 后端自动生成默认密码（如 `Rmdc@2026`） |
| 必须设置有效期 | 非 SuperAdmin 必须选择有效期选项 |
| 自动创建工单 | 用户创建接口内部调用工单模块 |
| 工单初始状态 | 直接进入 `pending_review` |

## 回调接口

当工单状态变更时，工单模块通过 UserStatusUpdater 接口回调用户模块：

```go
// 审批通过
func (u *UserStatusUpdaterImpl) ActivateUser(userID int64) error {
    return u.userDao.UpdateStatus(userID, "active")
}

// 撤销工单
func (u *UserStatusUpdaterImpl) DeletePendingUser(userID int64) error {
    // 仅删除 status=disabled 的用户
    return u.userDao.DeleteIfDisabled(userID)
}
```
