# {模块名称} - 用户场景文档

> **module**: {模块名}
> **doc_type**: UserJourney
> **status**: Draft / Review / Active
> **owner**: {负责人}
> **upstream_docs**: 01-prd.md
> **last_verified**: YYYY-MM-DD

---

## 用户角色

| 角色 | 描述 | 典型操作 |
|------|------|---------|
| {角色1} | {一句话描述} | {该角色在本模块中的主要操作} |

---

## 场景总览

| 场景ID | 场景名称 | 角色 | 触发条件 | 目标 |
|--------|---------|------|---------|------|
| UJ-001 | {场景名} | {角色} | {什么情况下触发} | {用户想达成什么} |

> **场景拆分规则**：一个场景涉及多角色时，拆为子场景（如 UJ-005a 员工自评、UJ-005b 经理评估），每个子场景只有一个主执行角色和一个明确的结束状态。这样便于测试映射和前端实现。

---

## 场景详情

### UJ-001: {场景名称}

**角色**: {执行角色（单一角色）}
**触发条件**: {用户在什么情况下进入此场景}
**前置条件**: {系统需要满足什么条件}

**正常路径**:

| 步骤 | 用户操作 | 系统响应 |
|------|---------|---------|
| 1 | {用户做什么} | {系统如何响应} |
| 2 | {用户做什么} | {系统如何响应} |

**异常分支**:

> 异常分支必须覆盖以下 3 类，不能只写表单校验。

| 条件 | 触发时机 | 系统行为 |
|------|---------|---------|
| {表单校验，如"必填字段为空"} | {步骤 N} | {如"阻止提交，高亮空字段"} |
| {权限异常，如"当前用户不是经理"} | {步骤 N} | {如"功能入口不可见"或"403 提示"} |
| {状态异常，如"周期不在目标阶段"} | {步骤 N} | {如"页面只读，操作按钮不可见"} |

**结束状态**: {业务状态} + {可观察结果，如"列表中该条记录状态标签变为 XXX"}

> **结束状态写法**：不要写抽象描述（如"用户获得数据"），要写具体的业务状态和页面上可观察到的变化，便于 E2E 断言。

---

> **编写规则**：
> - 每个场景单一主执行角色，多角色拆为子场景（a/b/c）
> - 异常分支必须覆盖 3 类：表单校验、权限异常、状态/并发异常
> - 结束状态 = 业务状态 + 页面可观察结果
> - 场景间通过前置条件形成依赖链（如"UJ-005b 前置条件：员工已完成自评"）
