﻿# VISTA Link 用例文档

> 对应 PRD V0.250

> P0、P1、P2-A、P2-B、P2-C 的定义和内部 MVP 范围见 PRD §8。

> 本文包含 VISTA Link B 端用例、打开分享页面所需的 HOMEVISTA 客户访问端用例，以及后续项目总览、数据追踪、购房客户追踪、营销统计和页面打开邮件通知用例。AI 与智能体用例不计入本文的 108 个用例，另见 [VISTA Link AI 与智能体用例文档](./VISTA_Link_AI与智能体用例文档.md)。

> 修订记录见 [VISTA Link 用例文档修订记录](./VISTA_Link_用例文档_修订记录.md)。

---

## 顶层用例图

> 图中每个一级用例只连接主要角色；其他角色能否执行该用例，以 PRD 默认角色权限和自定义角色权限为准。

```plantuml
@startuml
left to right direction
skinparam shadowing false
skinparam nodesep 30
skinparam ranksep 40

actor "用户" as User
actor "销售人员" as Sales
actor "销售经理" as Mgr
actor "营销企划" as Marketing
actor "项目管理员" as Admin
actor "购房客户" as Buyer

rectangle "VISTA Link" {
  rectangle "登录与账号访问" {
    usecase "登录" as L_Login
    usecase "找回密码" as L_ResetPassword
    usecase "选择项目" as L_SelectProject
    usecase "切换项目" as L_SwitchProject
    usecase "查看个人信息" as L_Profile
    usecase "修改密码" as L_ChangePassword
    usecase "退出登录" as L_Logout
    usecase "接受项目邀请" as L_AcceptInvite
  }

  rectangle "客户管理" {
    usecase "查看和维护客户资料" as C_Profile
    usecase "更新客户当前状态" as C_State
    usecase "管理客户标签" as C_Tag
    usecase "分配或转移客户负责人" as C_Transfer
    usecase "导入客户" as C_Import
    usecase "导出客户" as C_Export
    usecase "删除客户" as C_Delete
    usecase "恢复已删除客户" as C_Restore
    usecase "维护客户状态列表" as C_StateConfig
    usecase "维护客户标签库" as C_TagConfig
  }

  rectangle "项目总览" {
    usecase "查看项目总览" as O_View
  }

  rectangle "素材管理" {
    usecase "查看和维护素材信息" as M_Material
    usecase "维护素材标签库" as M_Tag
  }

  rectangle "页面库" {
    usecase "查看分享页面" as S_View
    usecase "使用自由模板新建页面" as S_Create
    usecase "复制分享页面" as S_Copy
    usecase "编辑分享页面" as S_Edit
    usecase "添加、删除和排序 Widget" as S_Widget
    usecase "删除分享页面" as S_Delete
    usecase "选择页面素材" as S_Material
    usecase "调整 Widget 内容和展示形式" as S_Display
    usecase "预览页面" as S_Preview
    usecase "复制无参数固定链接或展示二维码" as S_Share
    usecase "指定客户并复制带参数访问地址" as S_Target
    usecase "设置或取消公开访问" as S_Public
    usecase "停用或启用固定链接" as S_LinkStatus
    usecase "查看固定链接关联客户" as S_Relation
    usecase "开始现场讲解" as S_Presentation
  }

  rectangle "营销跟进" {
    usecase "查看购房客户追踪" as F_Tracking
    usecase "查看营销统计" as F_Stats
    usecase "报告访问数据问题" as F_ReportData
    usecase "纠正访问数据" as F_CorrectData
    usecase "进行并结束现场讲解" as F_Presentation
    usecase "查看和处理自己的讲解记录" as F_PresentationRecord
    usecase "处理停用成员异常讲解" as F_AdminPresentation
  }

  rectangle "系统设置" {
    usecase "维护项目成员" as P_Member
    usecase "邮件邀请项目成员" as P_Invite
    usecase "编辑项目成员显示名称和角色" as P_AssignRole
    usecase "维护角色" as P_Role
    usecase "配置角色功能权限" as P_Permission
    usecase "查看操作日志" as P_Log
  }
}

rectangle "HOMEVISTA 客户访问端" {
  usecase "访问分享页面" as C_Visit
}

' 用户登录与账号访问
User -- L_Login
User -- L_ResetPassword
User -- L_SelectProject
User -- L_SwitchProject
User -- L_Profile
User -- L_ChangePassword
User -- L_Logout
User -- L_AcceptInvite

' 销售人员
Sales -- C_Profile
Sales -- C_State
Sales -- C_Tag
Sales -- C_Export
Sales -- O_View
Sales -- S_View
Sales -- S_Create
Sales -- S_Copy
Sales -- S_Edit
Sales -- S_Widget
Sales -- S_Delete
Sales -- S_Material
Sales -- S_Display
Sales -- S_Preview
Sales -- S_Share
Sales -- S_Target
Sales -- S_Public
Sales -- S_LinkStatus
Sales -- S_Relation
Sales -- S_Presentation
Sales -- F_Tracking
Sales -- F_Stats
Sales -- F_ReportData
Sales -- F_Presentation
Sales -- F_PresentationRecord

' 销售经理专属
Mgr -- C_Transfer
Mgr -- F_CorrectData

' 营销企划
Marketing -- M_Material
Marketing -- M_Tag

' 项目管理员
Admin -- C_Import
Admin -- C_Delete
Admin -- C_Restore
Admin -- C_StateConfig
Admin -- C_TagConfig
Admin -- P_Member
Admin -- P_Invite
Admin -- P_AssignRole
Admin -- P_Role
Admin -- P_Permission
Admin -- P_Log
Admin -- F_AdminPresentation

' 购房客户在 HOMEVISTA 客户访问端访问分享页面
Buyer -- C_Visit
@enduml
```

---

## 通用界面与错误处理

- VISTA Link 用户界面只提供日文和英文，不提供简体中文；默认语言优先使用用户保存的语言，没有用户设置时使用当前项目默认语言。用户输入的姓名、备注等内容不自动翻译。
- 用户没有功能权限或试图访问其他项目的数据时，系统展示「401 无权限」页面，提供「返回上一页」操作。
- 用户没有某项功能权限时，系统隐藏对应菜单和操作入口。
- 用户停留在页面期间权限被移除时，系统在下一次读取或保存时重新检查权限；检查不通过时停止操作，不写入未保存内容，并展示无权限提示。
- 用户访问已经删除的业务对象时，系统提示「内容不存在或已被删除」。

---

## 登录与账号访问

> 本节面向 VISTA Link 用户。VISTA Link 使用 HOMEVISTA 统一账号和统一登录状态；原型可以展示参考现有统一登录服务的登录界面。用户登录后选择项目进入业务界面；进入后可以切换项目并查看个人信息。购房客户不使用 VISTA Link 登录。

#### UC-登录与账号访问-01 用户登录

- **优先级**：P0

```plantuml
@startuml
left to right direction
actor "用户" as User

usecase "登录" as UC1

User --> UC1
@enduml
```

- **用例目标**：用户通过 HOMEVISTA 统一登录进入 VISTA Link 项目选择页。
- **角色**：用户
- **前置条件**：用户可以打开 VISTA Link。
- **触发**：用户需要进入 VISTA Link。

**主流程：**

1. 用户打开 VISTA Link。
2. 系统检查 HOMEVISTA 统一登录状态。
3. 登录状态失效时，系统展示 HOMEVISTA 统一登录页面，说明登录后将进入 VISTA Link，并提供统一账号当前支持的登录方式和「忘记密码」入口。
4. 登录状态失效时，用户完成统一登录。
5. 登录状态有效，或用户完成登录后，VISTA Link 建立当前访问会话。
6. 系统读取用户处于启用状态的可访问项目。
7. 系统展示项目选择页。

**异常流程：**

- 4a. 用户未通过统一登录校验 → 系统不建立 VISTA Link 访问会话，并按统一登录规则提示。
- 4b. 登录服务不可用或请求超时 → 系统说明当前无法登录，并提供重试操作。
- 6a. 用户没有处于启用状态的可访问项目 → 系统提示「当前账号尚未开通 VISTA Link，请联系项目管理员」，不进入业务界面。

**业务规则：**

- 统一登录服务负责身份认证、登录安全限制和密码处理；VISTA Link 不另行定义账号密码规则。
- 登录界面可以展示为 VISTA Link 的访问入口，但账号、密码和登录状态属于 HOMEVISTA 统一登录。
- VISTA Link 的项目成员可以处于待接受状态；待接受成员尚不能进入项目。
- 用户无需先进入旧 B 端；旧 B 端不是登录入口。
- VISTA Link 不使用旧 B 端账号状态或权限完成登录判断。
- 登录成功不代表用户可以进入任意项目。
- 已登录用户直接打开有权访问的具体业务页面地址时，系统将对应项目设为当前项目并直接进入；无权访问时展示「401 无权限」页面。
- 登录状态有效期优先使用统一登录服务的规则。统一登录服务没有可用规则时，自最后一次用户操作起连续 8 小时无操作则登录信息过期，不另设绝对最长时长。
- 浏览器关闭后，只要登录状态仍有效，再次打开可以继续登录；同一账号允许在多个浏览器或设备登录。
- 登录信息过期前不提前提醒；过期时提示「登录信息已经过期」并立即退出。未保存内容不保留，用户重新登录后处理。
- 密码、认证凭证、Token 和 VISTA Link 登录会话凭证不得写入操作日志。

**后置条件：**

- 系统已建立有效登录会话；用户尚未选择当前项目。

---

#### UC-登录与账号访问-02 用户找回密码

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "用户" as User

usecase "找回密码" as UC1

User --> UC1
@enduml
```

- **用例目标**：用户忘记密码时通过登录邮箱设置新密码。
- **角色**：用户
- **前置条件**：用户已打开 HOMEVISTA 统一登录页面。
- **触发**：用户选择「忘记密码」。

**主流程：**

1. 系统展示登录邮箱输入框。
2. 用户填写邮箱并提交。
3. 系统统一提示「如果该邮箱已注册，重置邮件会发送到该邮箱」。
4. 用户打开邮件中的有效地址。
5. 系统展示新密码和确认密码输入框。
6. 用户填写并提交新密码。
7. 统一登录服务更新密码。
8. 系统提示修改成功并返回统一登录页面。

**异常流程：**

- 2a. 邮箱为空或格式错误 → 系统在字段旁提示，且不提交。
- 4a. 重置地址过期或已经使用 → 系统提示地址不可用，并提供重新申请入口。
- 6a. 两次密码不一致或不符合密码规则 → 系统在对应字段旁提示，且不修改密码。
- 7a. 请求失败 → 系统不修改密码，并提示稍后重试。

**业务规则：**

- 申请结果不暴露邮箱是否已注册。
- 邮件发送、地址有效期、申请频率和密码规则由统一登录服务处理。
- 找回密码流程不包含账号激活或重发激活邮件。

**后置条件：**

- 成功时用户可以使用新密码登录；失败时原密码不变。

---

#### UC-登录与账号访问-03 用户选择项目

- **优先级**：P0

```plantuml
@startuml
left to right direction
actor "用户" as User

usecase "选择项目" as UC1

User --> UC1
@enduml
```

- **用例目标**：用户选择本次进入 VISTA Link 使用的项目。
- **角色**：用户
- **前置条件**：用户已登录，并已进入项目选择页。
- **触发**：用户需要进入一个有权访问的项目。

**主流程：**

1. 系统以卡片形式展示用户处于启用状态的可访问项目。
2. 每张卡片展示默认意向图和项目名称；同名项目需要区分时显示项目编号。
3. 用户选择一个项目。
4. 系统确认目标项目仍可用，且用户在该项目中的成员关系仍为启用。
5. 系统把目标项目设为当前项目。
6. 系统读取用户在当前项目中的角色和功能权限。
7. 系统进入当前项目的项目总览。

**异常流程：**

- 1a. 用户没有可访问项目 → 系统提示联系项目管理员，不进入业务界面。
- 4a. 目标项目已停用、删除或用户项目访问已停用 → 系统不进入目标项目，并刷新可访问项目列表。

**业务规则：**

- 即使用户只有一个可访问项目，系统也先展示项目选择页。
- 项目选择页不展示用户无权访问或项目访问已停用的项目。
- 用户选择项目后才可以读取和展示该项目业务数据。
- 项目选择不改变用户在其他项目中的成员关系和角色。
- 用户通过有权访问的具体业务页面地址进入时，仍直接进入对应页面。

**后置条件：**

- 目标项目已成为当前项目，业务界面使用该项目的角色、功能权限和数据。

---

#### UC-登录与账号访问-04 用户切换项目

- **优先级**：P0

```plantuml
@startuml
left to right direction
actor "用户" as User

usecase "切换项目" as UC1

User --> UC1
@enduml
```

- **用例目标**：用户从当前项目切换到另一个有权访问的项目。
- **角色**：用户
- **前置条件**：用户已进入 VISTA Link 业务界面，并至少还有一个可访问项目。
- **触发**：用户需要处理另一个项目的业务。

**主流程：**

1. 用户打开左侧栏顶部的项目切换入口。
2. 系统展示当前项目和其他处于启用状态的可访问项目。
3. 用户选择目标项目。
4. 系统确认目标项目仍可用，且用户在目标项目中的成员关系仍为启用。
5. 系统把目标项目设为当前项目。
6. 系统重新读取用户在目标项目中的角色和功能权限。
7. 系统刷新业务界面并进入目标项目的项目总览。

**异常流程：**

- 3a. 当前页面存在未保存修改 → 系统提示切换后未保存内容将丢失；用户取消时留在当前项目，用户确认时放弃未保存内容并继续步骤 4。
- 4a. 目标项目已停用、删除或用户项目访问已停用 → 系统不切换，并刷新可访问项目列表。

**业务规则：**

- 项目切换入口不展示用户无权访问或项目访问已停用的项目。
- 当前项目不作为可再次选择的目标。
- 项目切换不复制、移动或修改业务数据。
- 项目切换后不得继续展示原项目的客户、素材、页面、固定链接、统计、系统设置或操作日志。
- 同一用户在不同项目中的角色和功能权限分别生效。
- 直接打开其他项目的业务地址不能绕过当前项目和项目访问权限检查。

**后置条件：**

- 目标项目已成为当前项目，原项目数据未发生修改。

---

#### UC-登录与账号访问-05 用户查看个人信息

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "用户" as User

usecase "查看个人信息" as UC1

User --> UC1
@enduml
```

- **用例目标**：用户查看自己的姓名和登录邮箱。
- **角色**：用户
- **前置条件**：用户已登录 VISTA Link。
- **触发**：用户从账号入口进入「个人信息」。

**主流程：**

1. 系统展示用户姓名和登录邮箱。
2. 用户可以修改姓名并保存。
3. 系统保存姓名并提示成功。

**异常流程：**

- 2a. 姓名去除首尾空格后为空 → 系统不保存，并在字段旁提示。
- 3a. 保存失败 → 系统保留用户输入，并提示稍后重试。

**业务规则：**

- 登录邮箱只读。
- 个人信息页面不提供修改密码表单或入口。
- 页面不展示 SSO 技术名称、账号来源或项目来源。
- 修改个人姓名不改变项目成员关系、项目角色和项目访问状态。
- 修改姓名更新 HOMEVISTA 统一账号姓名，并作用于该统一账号使用的其他项目。

**后置条件：**

- 成功时个人姓名已更新；失败时原个人信息不变。

---

#### UC-登录与账号访问-06 用户修改密码

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "用户" as User

usecase "修改密码" as UC1

User --> UC1
@enduml
```

- **用例目标**：已登录用户修改自己的登录密码。
- **角色**：用户
- **前置条件**：用户已登录 VISTA Link。
- **触发**：用户从账号菜单进入「修改密码」。

**主流程：**

1. 系统展示独立的修改密码页面。
2. 用户输入当前密码、新密码和确认密码。
3. 用户提交修改。
4. 统一登录服务校验当前密码和新密码。
5. 系统更新密码并提示成功。

**异常流程：**

- 2a. 任一字段为空 → 系统在对应字段旁提示，且不提交。
- 4a. 当前密码错误 → 系统不修改密码，并在当前密码字段旁提示。
- 4b. 两次新密码不一致或不符合密码规则 → 系统不修改密码，并在对应字段旁提示。
- 4c. 请求失败 → 系统不修改密码，并提示稍后重试。

**业务规则：**

- 修改密码和个人信息是账号菜单中的两个独立入口。
- 修改密码由统一登录服务处理，VISTA Link 界面不展示 SSO 技术名称。
- 修改密码成功后，该账号在所有浏览器和设备中的统一登录状态失效，需要重新登录。
- 密码不得写入操作日志。
- 项目管理员不能在成员管理中修改其他用户的密码。

**后置条件：**

- 成功时新密码生效；失败时原密码不变。

---

#### UC-登录与账号访问-07 用户退出登录

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "用户" as User

usecase "退出登录" as UC1

User --> UC1
@enduml
```

- **用例目标**：用户结束当前登录会话。
- **角色**：用户
- **前置条件**：用户已登录 VISTA Link。
- **触发**：用户需要退出 VISTA Link。

**主流程：**

1. 用户选择退出登录。
2. 系统使当前登录会话失效。
3. 系统返回 HOMEVISTA 统一登录入口。

**异常流程：**

- 无。

**业务规则：**

- 退出登录不改变登录账号、项目成员关系、项目访问状态或角色。
- 手动退出只使当前浏览器中的登录会话失效；使用同一会话的其他标签页同时失效。
- 其他浏览器或设备中的登录会话不受本次退出影响。
- 当前不提供「退出所有设备」功能。
- 退出后通过浏览器返回、刷新原页面或直接打开原地址时，系统不得展示 VISTA Link 数据，并返回登录界面。
- 用户再次登录后需要重新选择项目。
- 登录会话过期后，系统停止展示当前项目数据并返回登录界面；用户重新登录后仍需重新选择项目。
- 登录信息过期前不提前提醒；过期时系统提示登录信息已经过期并立即退出，不保留未保存内容。

**后置条件：**

- 当前浏览器中的登录会话已失效，使用同一会话的页面不能继续访问 VISTA Link；其他浏览器或设备中的登录会话不受本次退出影响。

---

#### UC-登录与账号访问-08 受邀用户接受项目邀请

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "用户" as User

usecase "接受项目邀请" as UC1

User --> UC1
@enduml
```

- **用例目标**：受邀用户通过有效邀请地址完成登录并加入项目。
- **角色**：用户
- **前置条件**：邀请邮件已成功发送，项目成员处于待接受状态，邀请地址仍在 7 天有效期内。
- **触发**：用户打开邀请邮件中的 VISTA Link 邀请地址。

**主流程：**

1. 系统检查邀请地址仍有效，且项目成员状态为待接受。
2. 已有 HOMEVISTA 统一账号的用户使用原账号登录；新用户先使用统一账号邮件中的初始密码并按统一账号规则设置新密码。
3. 系统确认当前登录账号与受邀邮箱一致。
4. 系统将项目成员状态从待接受改为启用。
5. 系统进入项目选择页并展示受邀项目。

**异常流程：**

- 1a. 邀请地址已过期、已经使用或因重发而失效 → 系统说明邀请不可用，不启用项目成员。
- 2a. 用户未完成统一登录或初始密码修改 → 系统不启用项目成员。
- 3a. 当前登录账号与受邀邮箱不一致 → 系统提示退出当前账号后重新打开邀请地址，不启用项目成员。

**业务规则：**

- 邀请地址自最近一次成功发送起 7 天有效，重发成功后旧地址立即失效。
- 已有统一账号的用户继续使用原账号和密码；新用户的初始密码由统一账号通过另一封邮件发送。
- 用户接受邀请时使用项目管理员最后保存的显示名称和角色。
- 接受邀请不改变该用户在其他项目中的成员状态和角色。

**后置条件：**

- 项目成员状态已变为启用，受邀项目出现在项目选择页。

---

## 项目总览

> 项目总览是所有已启用项目成员选择或切换项目后的统一首页。本节以销售人员为主要角色，其他角色执行相同操作。

#### UC-项目总览-01 销售查看项目总览

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "查看项目总览" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售快速了解当前项目的客户、页面、链接和负责人总体情况。
- **角色**：销售人员
- **前置条件**：销售已选择当前项目，且项目成员关系处于启用状态。
- **触发**：销售进入当前项目，或需要查看当前项目的总体情况。

**主流程：**

1. 销售选择或切换项目后，系统进入项目总览。
2. 系统按本月读取当前项目可用的最新数据，并展示统计数据最后更新时间。
3. 系统展示当前客户总数、未分配负责人客户数、可访问页面数和启用链接数。
4. 系统展示本月新增客户数和访问客户数。
5. 系统按客户当前负责人展示客户数量和本月访问客户数，并包含「未分配」。
6. 销售具备客户追踪所需权限时，系统展示进入客户追踪的入口。
7. 销售具备「查看营销统计」功能权限时，系统展示进入营销统计的入口。

**异常流程：**

- 2a. 数据读取失败且没有旧结果 → 系统显示错误提示和重试操作。
- 2b. 数据读取失败但已有旧结果 → 系统保留旧结果和最后更新时间，并显示错误提示和重试操作。
- 4a. 本月没有新增客户或客户访问 → 系统在对应数据中显示 0，不影响当前客户、页面、链接和负责人数据。
- 6a. 销售缺少「查看客户」或「购房客户追踪查看」功能权限 → 系统不显示客户追踪入口。
- 7a. 销售缺少「查看营销统计」功能权限 → 系统不显示营销统计入口。

**业务规则：**

- 项目总览只展示当前项目数据，不提供项目筛选或跨项目合计。
- 当前项目中处于启用状态的成员都可以进入项目总览，不设置独立的查看权限。
- 所有用户看到相同的当前项目总体数据，不按角色显示不同内容。
- 客户总数、未分配负责人客户数、可访问页面数和启用链接数使用当前状态；新增客户数和访问客户数使用当前时间范围。
- 访问客户数的计算规则与营销统计一致。
- 团队负责情况按客户当前负责人计算，不按页面或固定链接创建人计算。
- 团队负责情况只说明客户负责和访问情况，不作为销售业绩排名。
- 项目总览不展示客户活动明细、访问趋势、页面排行、内容排行或客户排行。
- 项目总览不展示销售额、合同、成交、跟进任务完成率或系统推断的转化率。

**后置条件：**

- 项目、客户和统计数据未发生修改。

---

#### UC-项目总览-02 销售按时间筛选项目总览

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "按时间筛选项目总览" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售查看当前项目本周或本月的新增客户和访问客户情况。
- **角色**：销售人员
- **前置条件**：销售已进入项目总览。
- **触发**：销售需要切换本周或本月的项目总体情况。

**主流程：**

1. 销售选择本周或本月。
2. 系统按所选时间更新新增客户数、访问客户数和团队访问客户数。
3. 系统保留当前客户总数、未分配负责人客户数、可访问页面数和启用链接数。
4. 系统继续展示统计数据最后更新时间；修改时间范围不改变该时间。

**异常流程：**

- 2a. 所选时间内没有新增客户或客户访问 → 系统在对应数据中显示 0，并保留其他总体数据。
- 2b. 数据读取失败 → 系统保留所选时间和原有结果，并显示错误提示和重试操作。

**业务规则：**

- 项目总览默认显示本月。
- 本周从本周一开始统计至当天。
- 本月从当月 1 日开始统计至当天。
- 时间范围不改变当前项目、客户当前负责人或统计数据最后更新时间。

**后置条件：**

- 项目总览已按所选时间显示，业务数据未发生修改。

---

## 客户管理

#### UC-客户管理-01 销售浏览客户列表

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "浏览客户列表" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售查看当前项目内的客户基础资料。
- **角色**：销售人员
- **前置条件**：销售已登录，并可进入客户列表。
- **触发**：销售进入客户管理模块。

**主流程：**

1. 销售进入客户列表。
2. 系统展示当前项目内的客户基础资料；每条记录包含姓名、当前状态和标签。
3. 系统按创建时间倒序排列客户。

**异常流程：**

- 2a. 当前项目内没有客户 → 系统显示「暂无客户」。

**业务规则：**

- 客户列表默认按创建时间倒序排序。
- 客户负责人不限制可见范围；具备查看客户权限的成员可以查看当前项目内全部未删除客户。
- 客户列表分页展示，每页条数可配置。
- 标签超过三个时，列表展示前三个标签，其余标签显示为「+N」。

**后置条件：**

- 系统未修改客户数据。

---

#### UC-客户管理-02 销售按姓名搜索客户

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "按姓名搜索客户" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售在当前项目内按客户姓名查找客户。
- **角色**：销售人员
- **前置条件**：销售已进入客户列表。
- **触发**：销售需要查找已知客户。

**主流程：**

1. 销售在客户列表输入姓名关键词。
2. 系统在当前项目内的客户基础资料中按姓名查询。
3. 系统展示匹配结果；每条记录包含姓名、当前状态和标签，并保留当前标签和状态筛选。
4. 销售清空关键词后，系统恢复未按姓名搜索的客户列表，并保留当前标签和状态筛选。

**异常流程：**

- 2a. 没有客户符合姓名关键词 → 系统显示「暂无客户」，并保留当前关键词、标签筛选和状态筛选。

**业务规则：**

- 姓名搜索只作用于当前项目内的客户基础资料。

**后置条件：**

- 客户列表已按姓名关键词显示，客户数据未发生修改。

---

#### UC-客户管理-03 销售筛选客户

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "筛选客户" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售按客户标签和当前状态查找当前项目内的客户。
- **角色**：销售人员
- **前置条件**：销售已进入客户列表。
- **触发**：销售需要查找带有特定标签或处于特定状态的客户。

**主流程：**

1. 销售打开客户列表中的筛选条件。
2. 系统展示当前项目内的客户标签和客户状态。
3. 销售选择一个或多个标签，并可选择一个客户状态。
4. 系统在当前项目内查询符合所选条件的客户。
5. 系统展示筛选结果；每条记录包含姓名、当前状态和标签，并保留当前姓名关键词。
6. 销售移除部分筛选条件后，系统按剩余条件重新查询。
7. 销售移除全部筛选条件后，系统恢复未筛选的客户列表。

**异常流程：**

- 4a. 没有客户符合所选条件 → 系统显示「暂无客户」，并保留已选筛选条件。

**业务规则：**

- 客户标签来自当前项目的客户标签库。
- 客户状态来自当前项目的客户状态列表。
- 选择多个标签时，客户必须同时包含全部已选标签。
- 客户状态一次只能选择一个。
- 同时选择标签和客户状态时，客户必须同时满足所选状态和全部已选标签。

**后置条件：**

- 系统未修改客户数据。

---

#### UC-客户管理-04 销售查看客户详情

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "查看客户详情" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售查看当前项目内某个客户的基础资料。
- **角色**：销售人员
- **前置条件**：销售已进入客户列表。
- **触发**：销售需要了解某个客户的资料。

**主流程：**

1. 销售从客户列表打开目标客户详情。
2. 系统查询当前项目内目标客户的基础资料。
3. 系统展示姓名、联系渠道、来源、当前状态、负责人、购房意向、标签、备注和创建时间。

**异常流程：**

- 2a. 目标客户不存在或已删除 → 系统提示「客户不存在」。
**业务规则：**

- 客户详情展示完整标签，不受客户列表最多展示三个标签的限制。

**后置条件：**

- 系统未修改客户数据。

---

#### UC-客户管理-05 销售创建客户

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "创建客户" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售在当前项目内创建一条客户基础资料。
- **角色**：销售人员
- **前置条件**：销售已进入客户列表，并具备「创建客户」功能权限。
- **触发**：销售获得新客户信息，需要创建客户资料。

**主流程：**

1. 销售在客户列表选择「创建客户」。
2. 系统展示客户创建表单。
3. 销售填写姓名。
4. 销售按需填写手机号、备用电话、邮箱、LINE、WhatsApp、购房意向和备注。
5. 销售按需选择来源、客户状态和负责人。
6. 销售未选择客户状态时，系统使用当前项目的默认状态；未选择负责人时，系统使用当前登录用户。
7. 销售选择「保存」。
8. 系统校验姓名和字段格式，并按各联系渠道的判重规则检查手机号、邮箱、LINE、WhatsApp 是否与当前项目内已有客户重复。
9. 校验通过后，系统创建客户并生成创建时间。
10. 系统返回客户列表，新客户出现在列表中。

**异常流程：**

- 8a. 姓名为空 → 系统提示「姓名为必填」，不保存客户。
- 8b. 手机号、邮箱、LINE 或 WhatsApp 与已有客户重复 → 系统只提示发生重复的字段，不展示重复值或另一客户的资料；系统不创建客户。

**业务规则：**

- 创建客户时只有姓名必填，其余字段选填。
- 客户来源可选官网咨询、线下活动、朋友介绍、门店咨询、外部 CRM 或其他。
- 手机号、邮箱、LINE、WhatsApp 在当前项目内必须唯一。
- 手机号和 WhatsApp 判重前统一全角与半角数字，忽略空格、连字符和括号；日本号码以 `0` 开头或以 `+81` 开头视为同一号码。
- 邮箱判重前去除首尾空格并忽略大小写；邮箱内部的连字符、点和加号保持原义，不删除也不互相替换。
- LINE 判重前只去除首尾空格，大小写是否相同按 LINE 标识规则处理。
- 已删除客户不占用联系方式唯一值。
- 姓名不用于重复检查。
**后置条件：**

- 当前项目内新增一条客户基础资料。
- 客户创建时间已生成。

---

#### UC-客户管理-06 销售编辑客户资料

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "编辑客户资料" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售修改当前项目内客户的基础资料。
- **角色**：销售人员
- **前置条件**：销售已打开目标客户详情，并具备「编辑客户」功能权限。
- **触发**：客户基础资料需要更新。

**主流程：**

1. 销售从客户列表或客户详情进入编辑页面。
2. 系统展示姓名、联系渠道、来源、购房意向和备注的当前值，同时只读展示创建时间。
3. 销售修改一个或多个可编辑字段。
4. 销售选择「保存」。
5. 系统校验姓名和字段格式。
6. 手机号、邮箱、LINE 或 WhatsApp 发生修改时，系统检查是否与当前项目内其他客户重复。
7. 校验通过后，系统保存修改。
8. 系统记录修改项、修改前值、修改后值、操作人和操作时间。

**异常流程：**

- 5a. 姓名为空 → 系统提示「姓名为必填」，不保存修改。
- 6a. 手机号、邮箱、LINE 或 WhatsApp 与已有客户重复 → 系统只提示发生重复的字段，不展示重复值或另一客户的资料；系统不保存修改。

**业务规则：**

- 客户基础资料编辑范围包括姓名、联系渠道、来源、购房意向和备注，不包括客户状态、客户标签和客户负责人。
- 由无参数固定链接访问认证后自动创建的客户，来源显示为「链接访问认证」。
- 销售修改客户来源时，只能选择官网咨询、线下活动、朋友介绍、门店咨询、外部 CRM 或其他。
- 手机号、邮箱、LINE、WhatsApp 在当前项目内必须唯一。
- 创建、编辑和导入客户使用相同的联系方式判重规则：手机号和 WhatsApp 统一全角与半角数字，忽略空格、连字符和括号，并将日本号码的 `0` 与 `+81` 写法视为相同；邮箱只去除首尾空格并忽略大小写，内部连字符、点和加号保持原义；LINE 只去除首尾空格，大小写按 LINE 标识规则处理。
- 已删除客户不占用联系方式唯一值。
- 创建时间不可手动修改。
- 修改客户资料不删除客户已有的固定链接关联关系。

**后置条件：**

- 客户基础资料已更新，并留下修改日志。

---

#### UC-客户管理-07 销售修改客户状态

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "修改客户状态" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售根据客户当前的销售进度更新客户状态。
- **角色**：销售人员
- **前置条件**：销售已打开目标客户详情，并具备「修改客户当前状态」功能权限。
- **触发**：客户当前的销售进度发生变化。

**主流程：**

1. 销售选择修改客户状态。
2. 系统展示当前状态和可选择的新状态。
3. 销售选择新状态并保存。
4. 系统更新客户当前状态。
5. 系统记录原状态、新状态、操作人和操作时间，并写入客户修改日志。

**异常流程：**

- 无。

**业务规则：**

- 一个客户只有一个当前状态。
- 客户状态在当前项目内生效。
- 可选择的新状态来自当前项目内未停用的客户状态，不包括客户的当前状态。
- 状态变更历史可在客户详情中查看。

**后置条件：**

- 客户当前状态已更新，状态变更历史和修改日志已保存。

---

#### UC-客户管理-08 销售调整客户标签

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "调整客户标签" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售更新某个客户当前使用的客户标签集合。
- **角色**：销售人员
- **前置条件**：销售已打开目标客户详情，并具备「使用客户标签」功能权限。
- **触发**：销售需要增加或移除客户标签。

**主流程：**

1. 销售在客户详情打开客户标签编辑入口。
2. 系统展示该客户当前使用的标签，以及当前项目内已有的客户标签。
3. 销售选择要增加的标签，取消选择要移除的标签。
4. 销售需要新标签且具备「新增客户标签」功能权限时，输入新标签名称。
5. 系统检查当前项目内是否存在同名标签；不存在时创建新标签，初始使用人数为 0，并记录标签创建操作。
6. 销售明确选择是否将新标签加入当前客户。
7. 销售保存本次标签集合。
8. 系统更新当前客户的标签，并记录修改前后的标签、操作人和操作时间。

**异常流程：**

- 4a. 销售不具备「新增客户标签」功能权限 → 系统不提供新增入口，销售只能选择已有标签。
- 5a. 新标签名称与已有标签重复 → 系统不创建标签，并提示销售选择已有同名标签。

**业务规则：**

- 客户标签来自当前项目的客户标签库。
- 销售人员默认可以新增客户标签，当前项目可以关闭该权限。
- 新增客户标签不会自动加到当前客户，销售需要明确选择。
- 从客户移除标签只影响当前客户，不删除标签库中的标签，也不影响其他客户。

**后置条件：**

- 当前客户的标签集合已更新，并留下修改日志。

---

#### UC-客户管理-09 销售经理分配或转移客户负责人

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "销售经理" as Manager

usecase "分配或转移客户负责人" as UC1

Manager --> UC1
@enduml
```

- **用例目标**：销售经理为没有负责人的客户设置负责人，或将已有客户转交给其他成员。
- **角色**：销售经理
- **前置条件**：销售经理已打开目标客户详情，并具备「分配或转移客户负责人」功能权限。
- **触发**：目标客户尚未分配负责人，或需要由其他成员继续跟进。

**主流程：**

1. 操作人在目标客户详情选择「分配负责人」或「转移负责人」。
2. 系统展示当前负责人和当前项目内处于启用状态的可选成员；客户没有负责人时，当前负责人留空。
3. 操作人选择新的负责人并确认。
4. 系统更新客户负责人。
5. 系统记录原负责人、新负责人、操作人和操作时间。
6. 系统保留该客户已有的固定链接关联关系。

**业务规则：**

- 客户负责人表示该客户的主要跟进人。
- 通过链接访问认证自动创建的客户负责人为空，可以由销售经理或项目管理员后续分配。
- 分配或转移负责人不会把固定链接或分享页面转交给新的客户负责人。
- 分配或转移负责人不删除客户已有的固定链接关联关系。
- 已停用成员不能被选为新负责人；客户当前负责人停用后仍保留负责人关系，并显示为「姓名（已停用）」；成员重新启用后恢复正常姓名显示。
- 客户负责人不限制客户可见范围。具备查看客户权限的成员可以查看当前项目内全部未删除客户。

**后置条件：**

- 客户负责人已设置或更新，并留下修改日志。

---

#### UC-客户管理-10 项目管理员导入客户

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "导入客户" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员通过 CSV 文件批量创建当前项目内的客户基础资料。
- **角色**：项目管理员
- **前置条件**：项目管理员已进入客户列表，并具备「导入客户」功能权限。
- **触发**：项目管理员需要导入外部客户数据。

**主流程：**

1. 项目管理员在客户列表选择「导入」。
2. 项目管理员上传 CSV 文件。
3. 系统解析文件，检查导入字段和每行数据。
4. 系统按手机号、邮箱、LINE、WhatsApp 检查当前项目和导入文件中的重复数据。
5. 系统展示导入预览，并标记可导入和不可导入的数据；重复数据展示行号和重复字段名称，不展示另一客户资料。
6. 项目管理员确认导入。
7. 系统创建通过检查的客户，并展示成功数量和未导入数量。

**异常流程：**

- 3a. 文件无法解析或不是支持的 CSV 格式 → 系统提示文件问题，不进入导入预览。
- 3b. 某行缺少姓名 → 系统标记该行为不可导入，不创建该客户。
- 4a. 发现重复联系方式 → 系统将所有受影响的导入行标记为不可导入，不修改已有客户。
- 5a. 没有可导入的数据 → 系统展示检查结果，不提供确认导入操作。

**业务规则：**

- 导入字段包括姓名、手机号、备用电话、邮箱、LINE、WhatsApp、来源、购房意向和备注。
- 客户导入只用于批量新增客户，不更新已有客户。
- 姓名必填，但不参与重复检查。
- 系统在当前项目和本次导入文件中，按手机号、邮箱、LINE、WhatsApp 检查重复。
- 手机号和 WhatsApp 判重前统一全角与半角数字，忽略空格、连字符和括号；日本号码以 `0` 开头或以 `+81` 开头视为同一号码。
- 邮箱判重前去除首尾空格并忽略大小写；邮箱内部的连字符、点和加号保持原义。
- LINE 判重前只去除首尾空格，大小写是否相同按 LINE 标识规则处理。
- 已删除客户不占用联系方式唯一值。
- 任一联系方式与当前项目已有客户重复时，该导入行不可导入。
- 任一联系方式在本次导入文件中重复时，所有使用该字段值的导入行均不可导入。
- 导入文件中部分数据未通过检查时，不影响其他通过检查的数据导入。
- 来源为空时保持为空。
- 导入创建的客户使用当前项目默认状态，不自动添加客户标签。
- 新建客户的创建时间使用导入时间。

**后置条件：**

- 通过检查的客户基础资料已创建；不可导入的数据未创建，也未修改已有客户。

---

#### UC-客户管理-11 销售导出客户

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "导出客户" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售将当前客户列表中的客户资料导出为 CSV 文件。
- **角色**：销售人员
- **前置条件**：销售已进入客户列表，并具备「导出客户」功能权限。
- **触发**：销售需要导出客户资料。

**主流程：**

1. 销售在客户列表选择「导出」。
2. 系统读取当前项目内符合当前搜索和筛选条件、当前用户可见且未删除的客户资料。
3. 系统展示本次导出范围和导出字段。
4. 销售确认导出。
5. 系统生成 CSV 文件。
6. 系统记录导出操作人、操作时间、搜索和筛选条件及导出数量。

**异常流程：**

- 2a. 符合当前条件的客户超过 10,000 条 → 系统不生成文件，并提示缩小搜索或筛选范围后重试。

**业务规则：**

- 默认导出当前搜索和筛选结果。
- 不支持只导出列表中临时勾选的部分客户。
- 单次最多导出 10,000 条；超过时系统提示缩小搜索或筛选范围后重试。
- 导出字段包括姓名、客户状态、手机号、备用电话、邮箱、LINE、WhatsApp、来源、负责人、标签、购房意向、备注和创建时间。
- 导出数据不脱敏。
- 操作日志不保存导出文件内容或逐条客户资料。

**后置条件：**

- 系统已生成客户 CSV 文件，并留下导出操作日志。

---

#### UC-客户管理-12 项目管理员删除客户

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "删除客户" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员将客户移入已删除客户，并在保留期内允许恢复。
- **角色**：项目管理员
- **前置条件**：项目管理员已打开目标客户详情，并具备「删除客户」功能权限。
- **触发**：当前项目内的客户需要删除。

**主流程：**

1. 项目管理员在客户列表或客户详情选择「删除」。
2. 系统展示删除确认，说明客户将进入「已删除客户」并保留 90 天，原客户标识参数和浏览器会话立即失效。
3. 项目管理员确认删除。
4. 系统将客户移入仅项目管理员可见的「已删除客户」。
5. 系统保留完整客户资料和固定链接关联关系 90 天，并使原客户标识参数和浏览器会话失效。
6. 系统记录删除操作人和操作时间。

**异常流程：**

- 3a. 项目管理员取消删除 → 系统不修改客户及其关联数据。

**业务规则：**

- 删除客户必须经过二次确认。
- 删除后的 90 天内不匿名化客户资料，仅项目管理员可以查看和恢复。
- 删除客户不删除固定链接，也不影响固定链接关联的其他客户。
- 已删除客户不占用手机号、邮箱、LINE 或 WhatsApp 的唯一值。
- 删除满 90 天后，系统最终匿名化客户，清除个人字段、负责人和固定链接关联关系，且不可恢复。
- 删除客户后保留历史访问记录和统计，客户在历史记录中统一显示为「已删除客户」。
- 删除客户不减少已经产生的历史统计。
- 删除和恢复日志在 90 天保留期内显示客户姓名或编号；最终匿名化后，历史日志改为匿名客户标识。

**后置条件：**

- 客户已移入「已删除客户」，资料和关联关系进入 90 天保留期，原客户标识参数和浏览器会话已失效，并留下删除操作日志。

---

#### UC-客户管理-13 项目管理员查看客户状态列表

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "查看客户状态列表" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员查看当前项目的客户状态设置。
- **角色**：项目管理员
- **前置条件**：项目管理员已登录，并具备「维护状态列表」功能权限。
- **触发**：项目管理员需要检查当前客户状态设置。

**主流程：**

1. 项目管理员打开客户状态管理。
2. 系统查询当前项目内全部客户状态。
3. 系统按设定顺序展示状态名称、启用状态、默认状态标识和系统预置标识。

**业务规则：**

- 客户状态在当前项目内生效。
- 系统预置客户状态为「未设置」「签约」「未签约」。
- 「未设置」是项目初始的默认客户状态。
- 当前项目只有一个默认客户状态。
- 三个系统预置客户状态不能改名或删除，且始终保留。
- 当前默认状态不能停用或删除。

**后置条件：**

- 系统未修改客户状态设置。

---

#### UC-客户管理-14 项目管理员新增客户状态

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "新增客户状态" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员在当前项目内增加一个客户状态。
- **角色**：项目管理员
- **前置条件**：项目管理员已登录，并具备「维护状态列表」功能权限。
- **触发**：现有客户状态无法表示需要记录的整体销售进度。

**主流程：**

1. 项目管理员在客户状态列表选择「新增状态」。
2. 系统展示状态名称输入项。
3. 项目管理员输入状态名称并保存。
4. 系统校验状态名称不为空，且当前项目内不存在同名状态。
5. 系统将新状态加入当前项目的客户状态列表，并显示在列表第一位。
6. 系统记录操作人和操作时间。

**异常流程：**

- 4a. 状态名称为空 → 系统不保存，并提示填写状态名称。
- 4b. 当前项目内已存在同名状态 → 系统不保存，并提示「该状态已存在」。

**业务规则：**

- 新增客户状态只在当前项目内生效。
- 客户状态名称在当前项目内不能重复。
- 未保存过手动排序时，客户状态默认按添加时间倒序显示。
- 新增状态显示在第一位，其他状态保持当前顺序。
- 新增状态不会自动替换当前默认状态，也不会改变已有客户的当前状态。

**后置条件：**

- 当前项目的客户状态列表中新增一个状态，并留下操作日志。

---

#### UC-客户管理-15 项目管理员修改客户状态名称

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "修改客户状态名称" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员修改一个现有客户状态的名称。
- **角色**：项目管理员
- **前置条件**：项目管理员已登录，具备「维护状态列表」功能权限，目标状态已存在且不是系统预置客户状态。
- **触发**：客户状态名称需要调整。

**主流程：**

1. 项目管理员在客户状态列表选择目标状态。
2. 系统展示当前状态名称。
3. 项目管理员输入新名称并保存。
4. 系统校验新名称不为空，且不与当前项目内其他客户状态同名。
5. 系统保存新的状态名称。
6. 系统记录操作人和操作时间。

**异常流程：**

- 4a. 新名称为空 → 系统不保存，并提示填写状态名称。
- 4b. 新名称与当前项目内其他客户状态同名 → 系统不保存，并提示「该状态已存在」。

**业务规则：**

- 客户状态名称在当前项目内不能重复。
- 系统不为「未设置」「签约」「未签约」提供改名操作。
- 修改状态名称不改变状态的启用状态、默认状态标识和显示顺序。
- 修改状态名称不改变客户当前状态，也不产生客户状态变更历史。

**后置条件：**

- 状态名称已更新，并留下操作日志。

---

#### UC-客户管理-16 项目管理员调整客户状态排序

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "调整客户状态排序" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员调整客户状态的显示顺序。
- **角色**：项目管理员
- **前置条件**：项目管理员已登录，具备「维护状态列表」功能权限。
- **触发**：客户状态的显示顺序需要调整。

**主流程：**

1. 项目管理员在客户状态列表选择调整排序。
2. 系统按当前顺序展示全部客户状态。
3. 项目管理员调整一个或多个状态的位置。
4. 系统展示调整后的完整顺序。
5. 项目管理员保存。
6. 系统保存新的显示顺序，并记录操作人和操作时间。

**异常流程：**

- 无。

**业务规则：**

- 保存后的顺序用于客户状态列表和所有客户状态选择项。
- 新增状态显示在第一位，其他状态保持当前顺序。
- 调整顺序不改变客户状态名称、启用状态、默认状态标识和客户当前状态。

**后置条件：**

- 当前项目的客户状态显示顺序已更新，并留下操作日志。

---

#### UC-客户管理-17 项目管理员设置默认客户状态

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "设置默认客户状态" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员指定系统为新创建且未单独指定状态的客户自动使用的客户状态。
- **角色**：项目管理员
- **前置条件**：项目管理员已登录，具备「维护状态列表」功能权限。
- **触发**：系统创建新客户时使用的初始状态需要调整。

**主流程：**

1. 项目管理员在客户状态列表选择目标状态。
2. 系统确认目标状态未停用且不是当前默认状态，并展示「设为默认状态」操作。
3. 项目管理员执行「设为默认状态」。
4. 系统将目标状态设为当前项目唯一的默认状态，并取消原默认状态的标识。
5. 系统记录操作人和操作时间。

**异常流程：**

- 无。

**业务规则：**

- 当前项目只有一个默认客户状态。
- 当前默认客户状态不提供「设为默认状态」操作。
- 停用的客户状态不能设为默认状态。
- 手工创建客户未选择状态、批量导入客户或访问认证自动创建客户时，系统使用当前项目的默认状态。
- 修改后的默认状态只适用于之后创建的客户，不修改已有客户的当前状态。

**后置条件：**

- 当前项目的默认客户状态已更新，并留下操作日志。

---

#### UC-客户管理-18 项目管理员停用客户状态

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "停用客户状态" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员停止继续使用一个客户状态，同时保留已有客户所引用的状态。
- **角色**：项目管理员
- **前置条件**：项目管理员已登录，具备「维护状态列表」功能权限，目标状态已存在、未停用且不是当前默认状态。
- **触发**：某个客户状态不再用于新客户或后续状态修改。

**主流程：**

1. 项目管理员在客户状态列表选择目标状态。
2. 执行「停用状态」。
3. 系统提示停用后该状态不再供新建客户或修改客户状态选择，已有客户继续保留该状态。
4. 项目管理员确认停用。
5. 系统将目标状态标记为停用。
6. 系统记录操作人和操作时间。

**异常流程：**

- 无。

**业务规则：**

- 停用状态不再出现在创建客户和修改客户状态的可选项中。
- 已有客户继续保留原状态，不自动改为其他状态。
- 已被客户使用的停用状态仍不能删除。
- 当前默认状态不提供停用操作；项目管理员需先将其他未停用状态设为默认状态。
- 停用的客户状态可以重新启用。

**后置条件：**

- 目标客户状态已停用，并留下操作日志。

---

#### UC-客户管理-19 项目管理员重新启用客户状态

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "重新启用客户状态" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员恢复使用一个已停用的客户状态。
- **角色**：项目管理员
- **前置条件**：项目管理员已登录，具备「维护状态列表」功能权限，目标状态已存在且已停用。
- **触发**：业务需要重新使用某个已停用的客户状态。

**主流程：**

1. 项目管理员在客户状态列表选择已停用的目标状态。
2. 项目管理员执行「重新启用」。
3. 系统将目标状态标记为启用。
4. 系统记录操作人和操作时间。

**异常流程：**

- 无。

**业务规则：**

- 重新启用后，目标状态恢复到新建客户和修改客户状态的选择项中。
- 重新启用不改变目标状态的显示顺序。
- 重新启用不自动将目标状态设为默认状态。
- 重新启用不修改已有客户的当前状态。

**后置条件：**

- 目标客户状态已重新启用，并留下操作日志。

---

#### UC-客户管理-20 项目管理员删除未使用客户状态

- **优先级**：P2-B

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "删除未使用客户状态" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员删除一个未被任何客户使用的客户状态。
- **角色**：项目管理员
- **前置条件**：项目管理员已登录，并具备「维护状态列表」功能权限。
- **触发**：某个客户状态不再需要保留。

**主流程：**

1. 项目管理员在客户状态列表选择目标状态。
2. 项目管理员执行「删除状态」。
3. 系统检查目标状态是否为系统预置状态、当前默认状态，以及是否正被客户使用。
4. 检查通过后，系统展示状态名称和删除后无法恢复的提示，并要求二次确认。
5. 项目管理员确认删除。
6. 系统删除目标状态。
7. 系统记录操作人和操作时间。

**异常流程：**

- 3a. 目标状态是系统预置状态 → 系统拒绝删除，并提示系统预置状态不能删除。
- 3b. 目标状态是当前默认状态 → 系统拒绝删除，并提示先设置其他默认状态。
- 3c. 目标状态仍被客户使用 → 系统拒绝删除，并提示先将相关客户改为其他状态。
- 5a. 项目管理员取消删除 → 系统保留目标状态。

**业务规则：**

- 系统预置状态、当前默认状态和已使用状态不能删除。
- 其他未使用的自定义状态可以直接删除，不要求先停用。
- 客户状态不提供合并操作。

**后置条件：**

- 确认删除后，目标状态已从当前项目的客户状态列表删除，并留下操作日志。

---

#### UC-客户管理-21 项目管理员查看客户标签库

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "查看客户标签库" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员查看当前项目内的客户标签及使用人数。
- **角色**：项目管理员
- **前置条件**：项目管理员已登录，并具备「维护客户标签库」功能权限。
- **触发**：项目管理员需要检查客户标签及其使用情况。

**主流程：**

1. 项目管理员打开客户标签库。
2. 系统查询当前项目内全部客户标签。
3. 系统按创建时间倒序展示每个标签的名称和使用人数。

**异常流程：**

- 2a. 当前项目没有客户标签 → 系统展示空状态。

**业务规则：**

- 客户标签在当前项目内生效，与素材标签分开管理。
- 使用人数是当前带有该标签的客户数量。

**后置条件：**

- 系统未修改客户标签库。

---

#### UC-客户管理-22 项目管理员搜索客户标签

- **优先级**：P2-B

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "搜索客户标签" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员按名称查找当前项目内的客户标签。
- **角色**：项目管理员
- **前置条件**：项目管理员已进入客户标签库。
- **触发**：项目管理员需要查找某个客户标签。

**主流程：**

1. 项目管理员在客户标签库输入标签名称关键词。
2. 系统在当前项目的客户标签库中查询名称包含关键词的标签。
3. 系统展示匹配标签的名称和使用人数。
4. 项目管理员清空关键词后，系统恢复完整标签列表。

**异常流程：**

- 2a. 没有匹配标签 → 系统展示空结果，并保留当前关键词。

**业务规则：**

- 标签名称包含关键词即为匹配。

**后置条件：**

- 系统未修改客户标签库。

---

#### UC-客户管理-23 项目管理员新增客户标签

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "新增客户标签" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员在当前项目内创建一个客户标签。
- **角色**：项目管理员
- **前置条件**：项目管理员已进入客户标签库，并具备「新增客户标签」功能权限。
- **触发**：现有客户标签不能表示需要记录的客户特征。

**主流程：**

1. 项目管理员在客户标签库选择「新增标签」。
2. 项目管理员输入标签名称并保存。
3. 系统校验标签名称不为空。
4. 系统检查当前项目内是否存在同名客户标签。
5. 不存在同名标签时，系统创建客户标签，初始使用人数为 0。
6. 系统记录操作人和操作时间。

**异常流程：**

- 3a. 标签名称为空 → 系统不保存，并提示填写标签名称。
- 4a. 标签名称与已有客户标签重复 → 系统拒绝保存，并提示使用已有标签。

**业务规则：**

- 新标签只在当前项目内生效。
- 客户标签名称在当前项目内不能重复。
- 新增标签不会自动添加到任何客户。

**后置条件：**

- 当前项目的客户标签库新增一个标签，并留下操作日志。

---

#### UC-客户管理-24 项目管理员修改客户标签名称

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "修改客户标签名称" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员修改一个现有客户标签的名称。
- **角色**：项目管理员
- **前置条件**：项目管理员已进入客户标签库，具备「维护客户标签库」功能权限，且目标标签已存在。
- **触发**：客户标签名称需要调整。

**主流程：**

1. 项目管理员在客户标签库选择目标标签。
2. 系统展示当前标签名称和使用人数。
3. 项目管理员输入新名称并保存。
4. 系统校验新名称不为空，并检查当前项目内是否存在同名客户标签。
5. 校验通过后，系统更新标签名称。
6. 系统同步更新所有引用位置的标签展示名称。
7. 系统记录操作人和操作时间。

**异常流程：**

- 4a. 新名称为空 → 系统不保存，并提示填写标签名称。
- 4b. 新名称与已有客户标签重复 → 系统拒绝保存，并提示使用合并标签操作。

**业务规则：**

- 客户标签名称在当前项目内不能重复。
- 修改标签名称不改变标签的使用人数，也不改变客户与该标签的关系。

**后置条件：**

- 标签名称及所有引用位置已更新，并留下操作日志。

---

#### UC-客户管理-25 项目管理员合并客户标签

- **优先级**：P2-B

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "合并客户标签" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员将一个客户标签及其客户关系合并到另一个已有标签。
- **角色**：项目管理员
- **前置条件**：项目管理员已进入客户标签库，具备「维护客户标签库」功能权限，且源标签和目标标签均已存在。
- **触发**：当前项目内存在重复或含义相近的客户标签。

**主流程：**

1. 项目管理员在客户标签库选择要合并的源标签。
2. 项目管理员从当前项目内其他客户标签中选择目标标签。
3. 系统展示源标签、目标标签和受影响的客户数量。
4. 项目管理员确认合并。
5. 系统将所有客户使用的源标签替换为目标标签。
6. 同一客户原本同时具有源标签和目标标签时，系统只保留目标标签。
7. 系统删除源标签。
8. 系统记录操作人和操作时间。

**异常流程：**

- 2a. 项目管理员将源标签选为目标标签 → 系统不允许确认合并。
- 4a. 源标签或目标标签在确认前已被删除 → 系统不执行合并，并刷新标签列表。

**业务规则：**

- 目标标签必须是当前项目内已存在的其他客户标签。
- 合并后不保留源标签。

**后置条件：**

- 源标签已被目标标签替换，客户标签关系已更新，并留下操作日志。

---

#### UC-客户管理-26 项目管理员删除未使用客户标签

- **优先级**：P2-B

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "删除未使用客户标签" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员删除一个未被任何客户使用的客户标签。
- **角色**：项目管理员
- **前置条件**：项目管理员已进入客户标签库，并具备「维护客户标签库」功能权限。
- **触发**：某个客户标签不再需要保留。

**主流程：**

1. 项目管理员在客户标签库选择目标标签。
2. 项目管理员执行「删除标签」。
3. 系统检查该标签的当前使用人数。
4. 使用人数为 0 时，系统展示标签名称和删除后无法恢复的提示，并要求二次确认。
5. 项目管理员确认删除。
6. 系统删除目标标签。
7. 系统记录操作人和操作时间。

**异常流程：**

- 3a. 目标标签仍被客户使用 → 系统拒绝删除，并提示先从客户移除该标签或将其合并到其他标签。
- 5a. 项目管理员取消删除 → 系统保留目标标签。

**业务规则：**

- 已使用标签不能直接删除。

**后置条件：**

- 目标标签未被使用时，已从当前项目的客户标签库删除，并留下操作日志。

---

#### UC-客户管理-27 项目管理员恢复已删除客户

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "恢复已删除客户" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员在 90 天保留期内恢复已删除客户。
- **角色**：项目管理员
- **前置条件**：项目管理员具备「恢复客户」功能权限，目标客户仍处于删除后的 90 天保留期内。
- **触发**：项目管理员需要恢复误删或仍需继续使用的客户。

**主流程：**

1. 项目管理员进入「已删除客户」。
2. 系统展示仍在 90 天保留期内的客户及删除时间。
3. 项目管理员选择目标客户并确认恢复。
4. 系统按当前规则检查该客户的手机号、邮箱、LINE 和 WhatsApp 是否与现有客户冲突。
5. 检查通过后，系统恢复原客户编号、完整资料、负责人和删除时保留的固定链接关联关系。
6. 系统记录恢复操作人和操作时间。

**异常流程：**

- 4a. 任一联系方式已被其他现有客户使用 → 系统指出冲突字段，不恢复客户；不展示另一客户资料。
- 5a. 客户已超过 90 天保留期并完成最终匿名化 → 系统提示客户不能恢复。

**业务规则：**

- 恢复使用原客户编号，不新建客户。
- 恢复不会恢复删除前的客户标识参数或浏览器身份会话。
- 客户需要重新取得访问地址或重新完成身份认证后才能继续以该客户身份访问。
- 恢复后的负责人若已停用，继续显示为「姓名（已停用）」。

**后置条件：**

- 客户恢复为当前项目内可使用的客户；原客户标识参数和浏览器身份会话仍然失效，并留下恢复操作日志。

---

## 素材管理

> 素材管理用例的主要角色为营销企划。项目管理员默认也可查看当前项目素材、维护素材说明和素材标签。素材由 A 端制作并上线，分类也由 A 端定义。VISTA Link B 端不上传、创建、删除素材或维护素材分类。

#### UC-素材管理-01 营销企划浏览素材列表

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "营销企划" as Marketing

usecase "浏览素材列表" as UC1

Marketing --> UC1
@enduml
```

- **用例目标**：营销企划查看当前项目内已经上线的素材。
- **角色**：营销企划
- **前置条件**：营销企划已登录，并具备「查看素材」功能权限。
- **触发**：营销企划进入素材管理。

**主流程：**

1. 营销企划进入素材管理。
2. 系统展示当前项目内已经上线的素材。
3. 列表展示素材名称、分类、标签和该分类的关键信息；资料集素材同时展示文件类型。

**异常流程：**

- 2a. 没有可展示的素材 → 系统显示空状态。

**业务规则：**

- 素材列表只显示当前项目内的素材，不提供项目筛选器。
- 每个项目只显示一条项目概览内容，该内容包含项目名称、项目背景图和项目简介。
- WALK 和 VR 作为其他素材的内容形式展示，不单独生成分类筛选项。
- 每份完整的预约配置是一条素材，预约操作入口不单独生成素材记录。
- 素材分类不包含外部服务。
- 素材分类以 A 端定义为准，B 端不维护另一套分类。
- 素材没有 A 端定义的分类、分类缺失或来源信息不完整时，不进入 B 端可用素材列表。
- 素材原有分类被 A 端停用、删除或移除后，不再进入 B 端可用素材列表和 Widget 候选素材列表。
- 素材分类失效不等于素材下线或删除；固定链接不再展示分类已经失效的素材内容。
- 素材类型用于系统判断 Widget 候选素材，不作为素材列表的展示字段或筛选条件。
- 建筑环视属于三维建筑的内容信息，不单独生成素材记录或分类筛选项。
- 资料集中的 PDF、图片和视频作为文件类型展示，但第一版不提供文件类型筛选。
- 各分类的关键信息按 PRD §4.2.1 展示。
- 链接类素材必须具有明确业务类型，不能只保存没有含义的地址。
- 来场预约等操作入口由对应 Widget 提供，不属于素材。当前 C 端没有资料下载操作。
- VISTA Link B 端不提供素材上传、创建或删除操作。
- VISTA Link B 端不提供素材分类的新增、修改、删除或排序操作。
- 已下线或已删除的素材不在素材列表中展示。
- 素材列表默认按更新时间倒序展示。
- 素材列表分页展示。

**后置条件：**

- 素材数据未发生修改。

---

#### UC-素材管理-02 营销企划按名称搜索素材

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "营销企划" as Marketing

usecase "按名称搜索素材" as UC1

Marketing --> UC1
@enduml
```

- **用例目标**：营销企划按名称查找可访问的素材。
- **角色**：营销企划
- **前置条件**：营销企划已进入素材列表。
- **触发**：营销企划需要查找已知素材。

**主流程：**

1. 营销企划在素材列表输入素材名称关键词。
2. 系统在当前素材列表中查找名称包含该关键词的素材。
3. 系统展示匹配结果，并保留当前筛选条件。
4. 营销企划清空关键词后，系统恢复素材列表。

**异常流程：**

- 2a. 没有素材符合名称关键词 → 系统显示空状态，并保留当前关键词和筛选条件。

**业务规则：**

- 名称搜索与当前筛选条件共同生效。

**后置条件：**

- 素材列表已按名称关键词显示，素材数据未发生修改。

---

#### UC-素材管理-03 营销企划筛选素材列表

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "营销企划" as Marketing

usecase "筛选素材列表" as UC1

Marketing --> UC1
@enduml
```

- **用例目标**：营销企划按分类或标签缩小素材范围。
- **角色**：营销企划
- **前置条件**：营销企划已进入素材列表。
- **触发**：营销企划需要按分类或标签缩小素材范围。

**主流程：**

1. 营销企划在素材列表选择一个分类、一个或多个标签，或同时使用两类条件。
2. 系统在当前项目内展示同时满足当前分类和全部已选标签的素材。
3. 系统展示筛选结果，并保留素材名称关键词。
4. 营销企划清除全部筛选条件后，系统恢复仅受当前素材名称关键词影响的素材列表。

**异常流程：**

- 2a. 没有素材符合筛选条件 → 系统显示空状态，并保留当前筛选条件。

**业务规则：**

- 第一版提供分类和标签筛选，不提供类型、文件类型、其他结构化信息或项目筛选。
- 选择多个标签时，素材必须同时带有全部已选标签。
- 素材名称关键词与当前分类和标签筛选条件同时生效。

**后置条件：**

- 素材列表已按所选条件显示，素材数据未发生修改。

---

#### UC-素材管理-04 营销企划查看素材详情

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "营销企划" as Marketing

usecase "查看素材详情" as UC1

Marketing --> UC1
@enduml
```

- **用例目标**：营销企划查看素材的内容、属性和内部使用说明。
- **角色**：营销企划
- **前置条件**：营销企划已进入素材列表。
- **触发**：营销企划需要了解某个素材的内容和属性。

**主流程：**

1. 营销企划从素材列表打开目标素材详情。
2. 系统展示素材名称、分类、标签、素材说明、更新时间和来源端提供的完整结构化信息；项目概览内容展示项目名称、项目背景图和项目简介，预约配置展示预约配置名称和预约表单，资料集素材同时展示文件类型，三维建筑素材展示产品类型和建筑环视信息，其他分类不显示素材类型。
3. 来源端支持受限预览时，营销企划选择「预览」。
4. 系统在 B 端内部展示素材内容，不显示来源系统地址，也不提供复制预览地址的操作。

**异常流程：**

- 1a. 目标素材已下线或已删除 → 系统提示素材不可用，不展示素材详情。
- 1b. 目标素材不属于当前项目 → 系统拒绝访问，不展示素材详情。
- 3a. 来源端无法提供受登录和当前项目权限限制的预览 → 系统不展示「预览」入口，素材详情继续展示缩略图、素材信息和结构化信息。

**业务规则：**

- VISTA Link 不修改平台提供的原始素材和原始属性。
- 查看素材权限包含查看来源端支持的内部内容预览，不单独设置预览权限。
- 素材预览只供已登录且具备当前项目访问权限的 B 端用户核对内容，不作为分享链接。
- 素材详情不显示来源系统地址，不提供复制素材预览地址的操作。
- 预览地址被复制后，未登录或没有当前项目访问权限的访问者仍不能查看素材。
- 购房客户只能通过分享页面的固定链接查看素材。
- 素材预览不创建或修改分享页面和固定链接，也不产生购房客户访问记录。
- 素材详情中只有素材说明和素材标签可由具备相应权限的成员维护。
- 项目概览内容按项目保存为一条完整内容，项目名称、项目背景图和项目简介不拆成多条素材。
- 预约配置按完整配置保存为一条素材，来场预约 Widget 中的操作入口不单独作为素材。
- 三维建筑的产品类型只能是 `BUILDING VISTA 3D Lite`、`BUILDING VISTA 3D` 或 `CITY VISTA`，建筑环视作为三维建筑的内容信息展示。
- 户型等结构化素材继续展示来源端提供的面积、LDK、楼栋、楼层等结构化属性和关联信息，不压成普通图片或标签。

**后置条件：**

- 素材数据未发生修改。

---

#### UC-素材管理-05 营销企划编辑素材说明

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "营销企划" as Marketing

usecase "编辑素材说明" as UC1

Marketing --> UC1
@enduml
```

- **用例目标**：营销企划维护素材的内部使用说明。
- **角色**：营销企划
- **前置条件**：营销企划已打开当前项目内的目标素材详情，并具备「维护素材说明」功能权限。
- **触发**：素材需要补充或调整内部使用说明。

**主流程：**

1. 营销企划在素材详情选择「编辑素材说明」。
2. 营销企划输入、修改或清空素材说明。
3. 营销企划确认保存。
4. 系统保存素材说明。

**异常流程：**

- 无。

**业务规则：**

- 素材说明为可选自由文本，用于记录素材用途、使用建议和经验信息。
- 素材说明不展示给购房客户。
- 销售在新建、复制或编辑分享页面并选择素材时可以查看素材说明。
- 新增、修改或清空素材说明时，系统以「素材」为对象类型记录修改前内容、修改后内容、操作人和操作时间。

**后置条件：**

- 目标素材的说明已更新，并留下操作日志。

---

#### UC-素材管理-06 营销企划调整素材标签

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "营销企划" as Marketing

usecase "调整素材标签" as UC1
usecase "新增素材标签" as UC2

Marketing --> UC1
Marketing --> UC2
UC2 ..> UC1 : <<extend>>
@enduml
```

- **用例目标**：营销企划更新某个素材使用的标签集合。
- **角色**：营销企划
- **前置条件**：营销企划已打开当前项目内的目标素材详情，并具备「使用素材标签」功能权限。
- **触发**：营销企划需要标记或调整素材适用场景。

**主流程：**

1. 营销企划在素材详情打开素材标签选择器。
2. 营销企划选择要加入的已有标签，或移除当前素材已有标签。
3. 如需创建新标签且具备「新增素材标签」功能权限，营销企划执行「新增素材标签」用例；创建成功的标签加入本次选中集合。
4. 营销企划确认本次标签集合并保存。
5. 系统更新该素材的标签集合。

**异常流程：**

- 无。

**业务规则：**

- 素材标签属于当前项目，与客户标签分开维护。
- 营销企划可在同一次编辑中添加标签、移除标签或同时进行两种调整，保存后统一更新标签集合。
- 仅当营销企划需要创建新标签且具备「新增素材标签」功能权限时，执行「新增素材标签」扩展用例。
- 未新增标签时，营销企划仍可使用已有标签完成本用例。
- 加入或移除标签只影响当前素材，不修改其他素材。

**后置条件：**

- 目标素材的标签集合已更新。

---

#### UC-素材管理-07 营销企划查看素材标签库

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "营销企划" as Marketing

usecase "查看素材标签库" as UC1

Marketing --> UC1
@enduml
```

- **用例目标**：营销企划查看当前项目的素材标签及其使用情况。
- **角色**：营销企划
- **前置条件**：营销企划已登录，并具备「维护素材标签库」功能权限。
- **触发**：营销企划需要查看项目内素材标签及使用情况。

**主流程：**

1. 营销企划打开素材标签库。
2. 系统按创建时间倒序展示当前项目内的素材标签名称和使用素材数。

**异常流程：**

- 2a. 当前项目没有素材标签 → 系统显示空状态。

**业务规则：**

- 素材标签在当前项目内生效。
- 使用素材数只统计当前项目内使用该标签的素材。

**后置条件：**

- 素材标签数据未发生修改。

---

#### UC-素材管理-08 营销企划搜索素材标签

- **优先级**：P2-B

```plantuml
@startuml
left to right direction
actor "营销企划" as Marketing

usecase "搜索素材标签" as UC1

Marketing --> UC1
@enduml
```

- **用例目标**：营销企划按名称查找素材标签。
- **角色**：营销企划
- **前置条件**：营销企划已进入素材标签库。
- **触发**：营销企划需要查找某个素材标签。

**主流程：**

1. 营销企划在素材标签库输入标签名称关键词。
2. 系统展示名称包含关键词的标签及其使用素材数。
3. 营销企划清空关键词后，系统恢复标签列表。

**异常流程：**

- 2a. 没有标签符合名称关键词 → 系统显示空状态，并保留当前关键词。

**业务规则：**

- 素材标签名称包含关键词即为匹配。

**后置条件：**

- 素材标签列表已按名称关键词显示，标签数据未发生修改。

---

#### UC-素材管理-09 营销企划新增素材标签

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "营销企划" as Marketing

usecase "新增素材标签" as UC1

Marketing --> UC1
@enduml
```

- **用例目标**：营销企划在当前项目内新增素材标签。
- **角色**：营销企划
- **前置条件**：营销企划已进入素材标签库，并具备「新增素材标签」功能权限。
- **触发**：营销企划需要增加素材标签。

**主流程：**

1. 营销企划在素材标签库选择「新增标签」。
2. 营销企划输入标签名称并保存。
3. 系统检查标签名称不为空。
4. 系统检查当前项目内是否存在同名素材标签。
5. 检查通过后，系统创建素材标签，初始使用素材数为 0。

**异常流程：**

- 3a. 标签名称为空 → 系统不保存，并提示填写标签名称。
- 4a. 标签名称与已有素材标签重复 → 系统不保存，并提示该标签已存在。

**业务规则：**

- 素材标签名称在当前项目内不能重复。
- 新增素材标签的初始使用素材数为 0，不自动添加到任何素材。
- 新增素材标签时，系统记录操作人和操作时间。

**后置条件：**

- 当前项目内新增一个使用素材数为 0 的素材标签，并留下操作日志。

---

#### UC-素材管理-10 营销企划修改素材标签名称

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "营销企划" as Marketing

usecase "修改素材标签名称" as UC1

Marketing --> UC1
@enduml
```

- **用例目标**：营销企划修改素材标签名称。
- **角色**：营销企划
- **前置条件**：营销企划已进入素材标签库，具备「维护素材标签库」功能权限，且目标标签已存在。
- **触发**：素材标签名称需要调整。

**主流程：**

1. 营销企划在素材标签库选择目标标签。
2. 系统展示当前标签名称和使用素材数。
3. 营销企划输入新名称并保存。
4. 系统检查新名称不为空，且不与当前项目内其他素材标签重名。
5. 检查通过后，系统更新标签名称。
6. 系统同步更新所有引用位置的标签展示名称。

**异常流程：**

- 4a. 新名称为空 → 系统不保存，并提示填写标签名称。
- 4b. 新名称与当前项目内其他素材标签重复 → 系统不保存，并提示该标签已存在。

**业务规则：**

- 素材标签名称在当前项目内不能重复。
- 修改标签名称不改变标签的使用素材数，也不改变素材与该标签的关系。
- 修改素材标签名称时，系统记录操作人和操作时间。

**后置条件：**

- 目标素材标签名称及所有引用位置已更新，并留下操作日志。

---

#### UC-素材管理-11 营销企划合并素材标签

- **优先级**：P2-B

```plantuml
@startuml
left to right direction
actor "营销企划" as Marketing

usecase "合并素材标签" as UC1

Marketing --> UC1
@enduml
```

- **用例目标**：营销企划将重复或相近的素材标签合并为已有标签。
- **角色**：营销企划
- **前置条件**：营销企划已进入素材标签库，并具备「维护素材标签库」功能权限。
- **触发**：营销企划需要整理重复或含义相近的素材标签。

**主流程：**

1. 营销企划在素材标签库选择要合并的源标签。
2. 营销企划从当前项目内其他素材标签中选择目标标签。
3. 系统展示源标签、目标标签和使用源标签的素材数量。
4. 营销企划确认合并。
5. 系统将使用源标签的素材改为使用目标标签。
6. 同一素材原本同时具有源标签和目标标签时，系统只保留目标标签。
7. 系统删除源标签。

**异常流程：**

- 4a. 源标签或目标标签在确认前已被删除 → 系统不执行合并，并刷新素材标签列表。

**业务规则：**

- 合并目标必须是当前项目内已存在的其他素材标签，不能选择源标签本身。
- 同一素材同时具有源标签和目标标签时，合并后只保留目标标签。
- 合并后不保留源标签。
- 合并素材标签时，系统记录操作人和操作时间。

**后置条件：**

- 源标签已删除，使用源标签的素材已改用目标标签，并留下操作记录。

---

#### UC-素材管理-12 营销企划删除未使用素材标签

- **优先级**：P2-B

```plantuml
@startuml
left to right direction
actor "营销企划" as Marketing

usecase "删除未使用素材标签" as UC1

Marketing --> UC1
@enduml
```

- **用例目标**：营销企划删除未被素材使用的标签。
- **角色**：营销企划
- **前置条件**：营销企划已进入素材标签库，并具备「维护素材标签库」功能权限。
- **触发**：营销企划需要删除不再保留的素材标签。

**主流程：**

1. 营销企划在素材标签库选择目标标签。
2. 营销企划执行「删除标签」。
3. 系统检查该标签的当前使用素材数。
4. 使用素材数为 0 时，系统展示标签名称并要求二次确认。
5. 营销企划确认删除。
6. 系统删除目标标签。

**异常流程：**

- 3a. 目标标签仍被素材使用 → 系统拒绝删除，并提示先从素材移除该标签或将其合并到其他标签。
- 5a. 营销企划取消删除 → 系统保留目标标签。

**业务规则：**

- 已被素材使用的标签不能直接删除，需先从素材移除或合并到其他标签。
- 删除素材标签时，系统记录操作人和操作时间。

**后置条件：**

- 目标素材标签已删除，并留下操作记录。

---

## 页面库

> 页面库只展示当前项目内的页面实例，包括默认页面和销售自己创建的页面，不单独展示或管理模板。默认页面由 A 端提供，可预览、分享和复制，项目成员不能直接编辑或删除；界面只显示「默认」，不显示内部来源名称。自己创建的页面仅创建人和项目管理员可见，并且只有创建人可以编辑或删除。页面只保存一份最新内容，不保存草稿或历史版本。页面库不提供项目筛选或私有、公司共享设置。项目管理员可以查看当前项目内全部分享页面和固定链接，并管理当前项目内全部固定链接的启停状态，但不能编辑或删除其他成员创建的页面。购房客户打开固定链接后的访问流程归属于 HOMEVISTA 客户访问端，见“客户访问端”章节。

> 默认页面和自己创建的页面都使用所属项目当前主题。主题由 A 端设置，VISTA Link 不提供主题选择或页面单独修改入口；主题变化不要求重新保存页面，页面预览和客户页面在下次打开或刷新时使用最新主题。

#### UC-页面库-01 销售浏览页面库

- **优先级**：P0

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "浏览页面库" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售查看自己可使用的分享页面。
- **角色**：销售人员
- **前置条件**：销售已登录，并具备「查看分享页面」功能权限。
- **触发**：销售需要查看可使用的分享页面

**主流程：**

1. 销售进入页面库。
2. 系统展示可查看的分享页面缩略图、页面名称和状态。
3. 系统默认按最近更新时间倒序排列。

**异常流程：**

- 2a. 没有可查看的分享页面 → 系统显示空状态。

**业务规则：**

- 页面缩略图使用页面保存的系统默认封面图，不从页面素材中自动截取。
- 默认页面对具备「查看分享页面」功能权限的项目成员可见。
- 自己创建的页面仅创建人和项目管理员可见。
- 页面库只显示当前项目内的页面，不提供项目筛选。
- 页面库不提供私有或公司共享设置。
- 默认页面不显示编辑和删除操作；销售可以预览、分享或复制。
- A 端页面下架后，B 端保留页面基本信息和固定链接，标记为「来源页面已下架」，暂停同步、停止内容访问且不允许复制；A 端恢复上架后继续同步并恢复访问和复制。
- A 端页面删除后，B 端保留页面基本信息和固定链接，标记为「来源页面已删除」，停止内容访问，并与原页面永久脱离，不再同步且不允许复制。A 端以后出现的同名页面视为新页面。
- A 端页面下架或删除不改变固定链接地址、启用状态、公开状态或客户关联关系，但固定链接不能展示已经不可用的来源页面内容。
- A 端停用 Widget 后，该 Widget 不再出现在新建页面的可选列表中；已保存页面、预览、固定链接和客户访问仍按已保存内容展示，再次编辑或复制时才要求替换或删除。
- 自己创建的页面保存成功后显示最新更新时间；再次保存后，固定链接立即使用最新保存内容。
- 销售只能编辑和删除自己创建的页面。

**后置条件：**

- 分享页面数据未发生修改。

---

#### UC-页面库-02 销售按名称搜索分享页面

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "按名称搜索分享页面" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售按名称查找可使用的分享页面。
- **角色**：销售人员
- **前置条件**：销售已进入页面库。
- **触发**：销售需要查找一个分享页面。

**主流程：**

1. 销售在页面库输入名称关键词。
2. 系统在当前页面库中查找名称包含该关键词的分享页面。
3. 系统展示匹配结果。
4. 销售清空关键词后，系统恢复页面库。

**异常流程：**

- 2a. 没有分享页面符合名称关键词 → 系统显示空状态，并保留当前关键词。

**业务规则：**

- 搜索只在当前销售可查看的分享页面中执行。
- 页面名称包含当前关键词时，系统将该页面列入结果。

**后置条件：**

- 页面库已按名称关键词显示，分享页面数据未发生修改。

---

#### UC-页面库-03 销售查看页面详情

- **优先级**：P0

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "查看页面详情" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售查看分享页面的内容和固定链接信息。
- **角色**：销售人员
- **前置条件**：销售已登录并具备「查看分享页面」功能权限；目标页面是销售有权查看的默认页面或本人创建的页面。
- **触发**：销售需要确认页面内容、素材和分享设置

**主流程：**

1. 销售从页面库打开目标分享页面。
2. 系统展示页面封面、页面名称、备注和状态。
3. 系统按页面顺序展示 Widget 及其已配置内容；使用素材的 Widget 同时展示素材名称和类型；提供来场预约等操作的 Widget 展示功能名称和功能说明。
4. 系统展示对应固定链接、链接状态、关联客户数、页面创建人和创建时间。

**异常流程：**

- 1a. 目标分享页面已删除 → 系统提示页面不存在，不展示详情。
- 1b. 目标页面不属于当前项目，或由其他成员创建 → 系统提示无法查看该页面，不展示详情。

**业务规则：**

- 每个分享页面只对应一条固定链接。
- A 端本身不保存固定链接；A 端页面进入 B 端页面库时，由 B 端自动创建唯一固定链接并默认启用、默认不公开。
- 固定链接展示页面最新保存内容。
- 默认页面只允许预览、分享和复制，不显示编辑和删除操作。
- A 端页面下架或删除后，详情只展示页面基本信息和固定链接，并分别显示「来源页面已下架」或「来源页面已删除」；两种状态都停止内容访问且不允许复制。
- 自己创建的页面详情展示最新保存内容，不提供草稿、版本列表或历史版本恢复。
- 页面详情和预览使用当前项目主题，B 端不展示页面主题选择项。
- 销售可以编辑、预览、分享和删除自己创建的页面。
- 项目管理员可以查看当前项目内全部分享页面，但不能编辑或删除其他成员创建的页面。

**后置条件：**

- 分享页面数据未发生修改。

---

#### UC-页面库-04 销售使用自由模板新建页面

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "使用自由模板新建页面" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售使用所有项目共用的自由模板创建分享页面。
- **角色**：销售人员
- **前置条件**：销售已进入页面库，并具备「新建分享页面」功能权限。
- **触发**：销售需要从空白页面开始组合 Widget 和素材。

**主流程：**

1. 销售在页面库选择「新建页面」。
2. 系统展示页面名称、备注和多张默认封面图，并自动选中一张。
3. 销售输入页面名称，按需填写备注，并可换成其他默认封面或上传自己的图片。
4. 系统使用自由模板显示当前项目的新页面内容；页头和项目联系信息页脚由自由模板提供，不作为 Widget。
5. 销售按 Widget 定义添加、删除、排序和配置业务 Widget。
6. 销售打开预览，确认客户将看到的页面内容。
7. 系统检查页面名称、Widget 实例数量、素材数量、素材状态和素材类型。
8. 检查通过且销售确认保存后，系统保存页面，创建唯一固定链接并默认启用，然后打开页面详情；固定链接立即展示最新保存内容。

**异常流程：**

- 3a. 页面名称为空 → 系统指出必填项，不创建页面。
- 3b. 上传文件无法读取或不是图片 → 系统提示无法使用该文件，并保留当前选中的封面。
- 7a. Widget 实例数量不符合定义 → 系统指出对应 Widget，不保存页面。
- 7b. Widget 缺少必需素材、素材数量不符合定义、素材类型不匹配，或素材已下线或删除 → 系统指出对应问题，不保存页面。

**业务规则：**

- 新页面自动使用当前项目，不展示项目字段。
- 系统至少提供一张默认封面图；新建页面时自动选中一张，销售可以保留或换成其他默认封面。
- 销售可以上传自己的图片作为页面封面；上传图片只属于当前页面，不进入素材库。
- 上传图片在封面选择区、页面库和页面详情中按 16:9 展示。
- 页面封面不从素材库选择。
- 空白模板即自由模板，所有项目共用一套；自由模板必须存在且不能停用。
- 自由模板由 A 端维护，B 端不展示模板管理入口，也不能选择 A 端页面使用的模板。
- 页头和项目联系信息页脚属于自由模板的固定部分，不属于 Widget，销售不能自由修改。
- 自由模板更新后，使用该模板创建的页面只按新模板展示页头和项目联系信息页脚等固定公共部分。
- 自由模板更新不增加、删除或修改已有页面中的 Widget 实例、素材、Widget 顺序及销售填写的页面内容。
- 销售只能使用已经注册的 Widget，不能创建 Widget 类型或修改字段结构。
- 首次保存成功时，系统自动创建唯一固定链接并默认启用，不提供手动生成入口；固定链接立即按当前访问设置提供访问。
- 新页面的创建人为当前销售，只向创建人和项目管理员展示。

**后置条件：**

- 当前项目新增一个由当前销售创建的分享页面及其唯一固定链接；固定链接为启用状态并展示最新保存内容。

---

#### UC-页面库-05 销售复制分享页面

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "复制分享页面" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售把 A 端提供页面或自己创建的页面复制为独立分享页面。
- **角色**：销售人员
- **前置条件**：销售已打开当前项目内可复制的 A 端提供页面或本人创建页面，并具备「复制分享页面」功能权限。
- **触发**：销售需要在现有页面的基础上调整内容。

**主流程：**

1. 销售在 A 端提供页面或本人创建页面的卡片或详情中选择「复制页面」。
2. 系统展示页面名称、备注和多张默认封面图；默认名称为「原页面名称（复制）」，默认选中原页面封面。
3. 销售确认或修改页面名称，并保留原封面、换成其他默认封面或上传自己的图片。
4. 系统复制原页面的备注、封面、Widget 实例、展示形式、素材及其顺序，显示当前项目的新页面内容。
5. 销售按 Widget 定义添加、删除、排序和配置 Widget。
6. 销售打开预览，确认客户将看到的新页面内容。
7. 系统检查页面名称、必需 Widget、Widget 实例数量、素材数量、素材状态和素材类型。
8. 检查通过且销售确认保存后，系统以当前销售为创建人保存新页面，创建新的唯一固定链接并默认启用，然后打开新页面详情；固定链接立即展示最新保存内容。

**异常流程：**

- 3a. 页面名称为空 → 系统指出必填项，不创建页面。
- 3b. 上传文件无法读取或不是图片 → 系统提示无法使用该文件，并保留原封面或当前选中的默认封面。
- 4a. A 端提供页面已下架、来源已删除或不属于当前项目 → 系统不创建页面。
- 4b. 原页面包含已停用 Widget → 系统保留其他复制内容，并要求销售替换或删除已停用 Widget；处理完成前不能保存。
- 7a. Widget 实例、素材数量、素材状态或素材类型不符合 Widget 定义 → 系统指出对应问题，不保存新页面。

**业务规则：**

- A 端提供页面和销售本人创建的页面可以复制；不能复制其他销售创建的页面。
- 复制操作不修改原页面。
- 复制目标固定为全局当前项目；复制操作中不再选择项目，也不允许跨项目复制。
- 复制后的页面名称默认为「原页面名称（复制）」，销售可以修改。
- 复制内容包括备注、封面、Widget 实例、展示形式、素材及其顺序。
- A 端提供页面的备注由 A 端填写，复制后进入新页面备注；销售本人创建页面的备注也一并复制。
- 备注只供销售查看，不在页面预览、客户访问页面或固定链接中展示。
- 复制页面时默认沿用原页面封面，销售可以换成系统提供的其他默认封面。
- 销售可以上传自己的图片作为新页面封面；上传图片只属于新页面，不进入素材库。
- 页面封面不从素材库选择。
- 复制内容不包括原页面的固定链接、链接状态、关联客户或客户标识参数。
- 新页面的创建人为当前销售，只向创建人和项目管理员展示。
- 已停用 Widget 不在新建页面的可选列表中；复制页面遇到已停用 Widget 时，必须替换或删除后才能保存。
- 新页面首次保存成功时，系统创建新的唯一固定链接并默认启用；固定链接立即按当前访问设置提供访问。

**后置条件：**

- 当前项目新增一个由当前销售创建的分享页面及其唯一固定链接；原页面未发生修改。

---

#### UC-页面库-06 销售编辑分享页面

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "编辑分享页面" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售更新自己创建的分享页面内容和呈现方式。
- **角色**：销售人员
- **前置条件**：销售具备「编辑分享页面」功能权限，目标分享页面由本人创建。
- **触发**：销售需要更新页面内容或呈现方式。

**主流程：**

1. 销售打开目标分享页面。
2. 系统展示页面名称、备注、页面封面、Widget 及其已配置内容。
3. 销售按需修改页面名称、备注、页面封面和 Widget 配置；页面封面可以换成其他默认封面或上传自己的图片。
4. 销售预览当前尚未保存的页面内容。
5. 销售确认保存。
6. 系统检查页面名称、必需 Widget、Widget 实例数量、素材数量、素材状态和素材类型。
7. 系统保存页面，固定链接立即展示最新保存内容。
8. 系统保持固定链接地址、二维码、启用状态、公开状态、客户关联关系和客户标识参数不变。

**异常流程：**

- 1a. 目标分享页面已删除 → 系统提示页面不存在，销售不能进入编辑。
- 1b. 目标页面为 A 端提供页面或其他成员创建的页面 → 系统不显示编辑入口；直接进入编辑地址时，系统展示「401 无权限」页面并允许返回上一页。
- 3a. 上传文件无法读取或不是图片 → 系统提示无法使用该文件，并保留当前页面封面。
- 5a. 保存时销售的编辑权限已发生变化 → 系统提示无权编辑，不保存修改。
- 6a. 页面名称为空、页面封面未选择，或缺少 Widget 定义要求的必需内容 → 系统指出对应问题，不保存修改。
- 6b. Widget 实例数量或素材数量不符合定义 → 系统指出对应 Widget，不保存修改。
- 6c. 任一素材已下线、已删除、不属于当前项目或不符合所在 Widget 的素材类型要求 → 系统指出对应素材，不保存修改。
- 6c1. 任一素材的原有分类已停用、删除或被移除 → 系统指出对应素材，要求更换或移除；处理完成前不保存修改。
- 6d. 页面包含已停用 Widget → 系统标出对应 Widget，要求替换或删除；处理完成前不保存。

**业务规则：**

- A 端提供页面不得由项目成员直接编辑；需要调整时必须先复制。
- 销售只能编辑自己创建的页面。
- 编辑页面时可以保留当前封面，也可以换成系统提供的其他默认封面。
- 销售可以上传自己的图片作为页面封面；上传图片只属于当前页面，不进入素材库。
- 页面封面不从素材库选择。
- 保存页面后，固定链接地址、二维码、启用状态、公开状态、客户关联关系和客户标识参数保持不变；固定链接立即展示最新保存内容。
- 页头和项目联系信息页脚由自由模板提供，不属于 Widget，也不能由销售自由修改。
- 销售可以添加已注册 Widget，并按 Widget 定义删除、排序和调整内容。
- 页面使用的素材必须属于当前项目、处于上线状态，并符合所在 Widget 的素材类型和数量要求。
- 页面中的素材分类失效时，固定链接不再展示该素材；销售再次编辑时必须更换或移除该素材后才能保存。
- 销售不能创建 Widget 类型、修改 Widget 字段结构、输入任意尺寸或自由拖动排版。
- 已停用 Widget 仍可在已保存页面中展示；再次编辑时必须替换或删除后才能保存。
- 保存前的预览使用当前未保存内容和与 C 端相同的 Widget 展示规则。
- 页面不提供版本列表、历史版本查看或回退。
- 页面名称、备注和封面不提供单独保存操作；任一修改都随整页保存，因此页面含已停用 Widget 时必须先替换或删除。

**后置条件：**

- 目标分享页面已保存；固定链接立即展示最新保存内容。

---

#### UC-页面库-07 销售添加 Widget

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "添加 Widget" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售向当前未保存页面加入一个已经注册的 Widget。
- **角色**：销售人员
- **前置条件**：销售正在新建、复制或编辑自己创建的分享页面。
- **触发**：销售需要增加一种展示内容或操作能力。

**主流程：**

1. 销售在页面编辑区选择「添加 Widget」。
2. 系统展示当前可用的已注册 Widget，以及各 Widget 允许的实例数量。
3. 销售选择一个 Widget。
4. 系统检查当前页面中该 Widget 的实例数量。
5. 检查通过后，系统将 Widget 加入当前未保存页面。

**异常流程：**

- 2a. 当前没有可添加的 Widget → 系统显示空状态。
- 4a. 当前页面中的 Widget 已达到允许的最大实例数量 → 系统不添加，并提示数量限制。

**业务规则：**

- B 端只能添加来源系统已经注册的 Widget。
- 一个页面是否允许多个相同 Widget、最多允许几个，由 Widget 定义决定。
- 销售不能创建 Widget 类型或修改 Widget 字段结构。
- 添加 Widget 只修改当前未保存内容，不自动保存页面。

**后置条件：**

- 所选 Widget 已加入当前未保存页面。

---

#### UC-页面库-08 销售删除 Widget

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "删除 Widget" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售从当前未保存页面中移除 Widget 定义允许删除的实例。
- **角色**：销售人员
- **前置条件**：销售正在新建、复制或编辑自己创建的分享页面。
- **触发**：销售不再需要当前未保存页面中的某个 Widget。

**主流程：**

1. 销售选择当前未保存页面中的目标 Widget。
2. 系统根据 Widget 定义检查该实例是否允许删除。
3. 允许删除时，销售执行删除。
4. 系统从当前未保存页面中移除该 Widget 及其当前配置。

**异常流程：**

- 2a. Widget 不允许删除，或删除后会低于最少实例数量 → 系统不提供删除操作。

**业务规则：**

- 自由模板提供的页头和项目联系信息页脚不属于 Widget，因此不出现在 Widget 删除操作中。
- 其他 Widget 是否允许删除及最少实例数量，由 Widget 定义决定。
- 删除 Widget 不删除其引用的原始素材。
- 删除 Widget 不改写已经产生的历史访问记录；历史记录保留访问发生时的 Widget 名称和实际内容或素材。
- 删除 Widget 只修改当前未保存内容，不自动保存页面。

**后置条件：**

- 允许删除的目标 Widget 已从当前未保存页面中移除。

---

#### UC-页面库-09 销售调整 Widget 顺序

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "调整 Widget 顺序" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售在 Widget 定义允许的范围内调整页面内容顺序。
- **角色**：销售人员
- **前置条件**：销售正在新建、复制或编辑自己创建的分享页面。
- **触发**：销售需要改变页面中 Widget 的先后顺序。

**主流程：**

1. 销售选择要移动的 Widget。
2. 系统显示该 Widget 允许移动到的位置。
3. 销售选择目标位置。
4. 系统更新当前未保存页面中的 Widget 顺序。

**异常流程：**

- 2a. Widget 定义不允许移动，或没有其他允许位置 → 系统不提供移动操作。

**业务规则：**

- Widget 是否允许移动及可移动范围，由 Widget 定义决定。
- 自由模板提供的页头和项目联系信息页脚位置固定，不参与 Widget 排序。
- B 端不提供自由拖动、任意网格排版或任意位置摆放。
- 调整顺序只修改当前未保存内容，不自动保存页面。

**后置条件：**

- 当前未保存页面已按允许的位置更新 Widget 顺序。

---

#### UC-页面库-10 销售为 Widget 选择素材

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "为 Widget 选择素材" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售从当前项目中选择符合 Widget 定义的素材。
- **角色**：销售人员
- **前置条件**：销售正在编辑页面，并已打开一个支持选择素材的 Widget。
- **触发**：销售需要为 Widget 添加或更换素材。

**主流程：**

1. 销售打开目标 Widget 的素材选择。
2. 系统先限定当前项目和上线状态，再按该 Widget 允许的素材类型自动过滤候选素材。
3. 系统展示候选素材的名称、分类、标签、素材说明和该分类的关键信息；资料集素材同时展示文件类型。
4. 销售按 Widget 允许的素材数量选择素材并确认。
5. 系统将确认的素材加入当前 Widget 的未保存内容。

**异常流程：**

- 2a. 当前项目没有符合 Widget 类型要求的素材 → 系统显示空状态。
- 4a. 选择数量低于最少数量或超过最大数量 → 系统提示数量限制，不确认选材。
- 5a. 确认前素材已下线、删除或类型发生变化 → 系统标出不可用素材，不将其加入当前页面。

**业务规则：**

- WALK Widget 只能选择 WALK 素材，VR Widget 只能选择 VR 素材；支持 PDF 素材的 Widget 只能选择其定义允许的 PDF 素材。
- 一个 Widget 支持多种素材类型时，候选列表只显示这些允许类型。
- 用户不能取消 Widget 自带的素材类型限制。
- 候选素材只包含当前项目内处于上线状态的素材。
- 素材标签选项只来自当前候选素材。
- 素材数量及内容顺序由 Widget 定义决定。
- 选材只修改当前未保存内容，不修改素材、素材标签或素材说明。

**后置条件：**

- 符合要求的素材已加入当前 Widget 的未保存内容。

---

#### UC-页面库-11 销售按名称搜索候选素材

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "按名称搜索候选素材" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售按名称查找当前 Widget 可用的素材。
- **角色**：销售人员
- **前置条件**：销售已打开目标 Widget 的素材选择。
- **触发**：销售知道素材名称或其中的关键词。

**主流程：**

1. 销售输入素材名称关键词。
2. 系统在当前 Widget 的候选素材中查找名称包含关键词的素材。
3. 系统展示匹配结果，并保留当前分类和标签筛选条件。
4. 销售清空关键词后，系统恢复未按名称搜索的候选素材。

**异常流程：**

- 2a. 没有候选素材符合关键词 → 系统显示空状态，并保留关键词和当前筛选条件。

**业务规则：**

- 搜索范围已经限定为当前项目内、处于上线状态且符合 Widget 类型要求的素材。
- 候选素材必须具有 A 端定义的分类和完整来源信息；缺少分类或来源信息不完整的素材不进入候选列表。
- 名称关键词与当前分类和标签筛选条件同时生效。
- 搜索不修改素材或当前页面内容。

**后置条件：**

- 候选素材已按名称关键词显示。

---

#### UC-页面库-12 销售筛选候选素材

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "筛选候选素材" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售按分类或素材标签缩小当前 Widget 的候选素材范围。
- **角色**：销售人员
- **前置条件**：销售已打开目标 Widget 的素材选择。
- **触发**：销售需要从候选素材中查找特定分类或标签的素材。

**主流程：**

1. 系统展示当前候选素材使用的分类和素材标签。
2. 销售选择一个分类、一个或多个素材标签，或同时使用两类条件。
3. 系统展示同时满足当前分类和全部已选标签的候选素材。
4. 销售移除部分筛选条件后，系统按剩余条件重新筛选。
5. 销售移除全部筛选条件后，系统恢复未筛选的候选素材。

**异常流程：**

- 3a. 没有候选素材符合全部条件 → 系统显示空状态，并保留当前筛选条件。

**业务规则：**

- 筛选范围已经限定为当前项目内、处于上线状态且符合 Widget 类型要求的素材。
- 第一版提供分类和标签筛选，不提供类型、文件类型或其他结构化信息筛选。
- 素材标签选项只包含当前候选素材使用的标签。
- 选择多个素材标签时，候选素材必须同时带有全部已选标签。
- 名称关键词与分类和标签筛选条件同时生效。
- 筛选不修改素材、素材标签、已选素材或当前页面内容。

**后置条件：**

- 候选素材已按当前筛选条件显示。

---

#### UC-页面库-13 销售调整 Widget 内容和展示形式

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "调整 Widget 内容和展示形式" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售按 Widget 定义修改可编辑内容和展示形式。
- **角色**：销售人员
- **前置条件**：销售正在新建、复制或编辑自己创建的分享页面。
- **触发**：销售需要调整 Widget 的内容或呈现方式。

**主流程：**

1. 销售选择当前未保存页面中的目标 Widget。
2. 系统展示该 Widget 允许编辑的字段和展示形式。
3. 销售修改允许编辑的内容，并从允许的展示形式中选择。
4. 系统更新当前未保存页面中的 Widget 配置。

**异常流程：**

- 2a. Widget 没有可编辑字段且只有一种展示形式 → 系统不显示编辑入口。
- 3a. 输入内容不符合 Widget 字段规则 → 系统指出对应字段，不更新当前内容。

**业务规则：**

- Widget 的内容、数据来源、可编辑字段和展示形式由 Widget 定义决定。
- Widget 只有一种展示形式时不显示展示形式选择项。
- 销售不能输入任意宽度或高度，也不能修改 Widget 字段结构。
- 来场预约 Widget 自动使用当前项目适用的预约配置，不要求用户选择预约操作入口。
- 自由模板提供的页头和项目联系信息页脚不属于 Widget，不在本用例中编辑。
- 手机、平板和 PC 的响应方式由 Widget 和 C 端定义，B 端不分别配置三套内容。

**后置条件：**

- 当前 Widget 的未保存配置已更新。

---

#### UC-页面库-14 销售预览页面

- **优先级**：P0

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "预览页面" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售确认购房客户实际看到的页面效果。
- **角色**：销售人员
- **前置条件**：销售有权查看目标页面，或正在新建、复制、编辑页面。
- **触发**：销售需要检查页面内容和不同设备尺寸下的显示结果。

**主流程：**

1. 销售选择「预览」。
2. 系统使用与 HOMEVISTA 客户访问端相同的 Widget 规则渲染当前页面内容。
3. 页面存在未保存修改时，系统预览当前未保存内容，而不是最近一次保存内容。
4. 销售在 PC、平板和手机查看尺寸之间切换。
5. 系统按所选尺寸重新展示同一份页面内容。

**异常流程：**

- 2a. 页面缺少必需 Widget、素材类型不匹配或素材不可用 → 系统在预览中指出对应问题。
- 2b. C 端 Widget 渲染规则暂时不可用 → 系统提示暂时无法预览，不用替代样式冒充正式效果。

**业务规则：**

- 预览与客户正式访问使用同一套 Widget 展示规则。
- 预览使用当前未保存内容；页面备注不在预览中展示。
- 预览和客户页面都使用所属项目当前主题；B 端不提供主题选择。
- 预览不要求客户身份认证。
- 预览不会创建或修改固定链接。
- 预览不产生客户访问记录或统计数据。
- 设备尺寸切换只改变查看尺寸，不生成三套页面内容。
- 预览在新的浏览器标签页打开独立页面，不使用弹窗，也不放在编辑区旁边。

**后置条件：**

- 页面已保存内容和当前未保存内容均未因预览发生修改。

---

#### UC-页面库-15 销售删除分享页面

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "删除分享页面" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售删除自己不再使用的分享页面。
- **角色**：销售人员
- **前置条件**：销售具备「删除分享页面」功能权限，且目标分享页面由本人创建。
- **触发**：销售不再需要目标分享页面。

**主流程：**

1. 销售在页面库或页面详情选择「删除」。
2. 系统提示删除后对应固定链接将自动停用，客户关联关系和客户标识参数仍会保留。
3. 销售完成二次确认。
4. 系统删除分享页面，并自动停用对应固定链接。

**异常流程：**

- 1a. 目标页面为 A 端提供页面或其他成员创建的页面 → 系统不显示删除入口；直接发起删除时，系统展示「401 无权限」页面并允许返回上一页。
- 3a. 销售取消删除 → 系统保留目标分享页面和固定链接。

**业务规则：**

- A 端提供页面不能由项目成员删除。
- 销售只能删除自己创建的页面。
- 删除分享页面不删除原始素材、客户关联关系或客户标识参数。
- 删除分享页面后，对应固定链接自动停用。
- 已删除页面对应的固定链接继续保留并自动停用，且不能手动重新启用。
- 购房客户打开已删除页面对应的固定链接时，系统显示「页面已被删除」。
- 删除分享页面不删除历史访问记录和统计；历史记录保留访问发生时的页面名称并标记「页面已删除」。
- 删除分享页面时，系统记录操作人和操作时间。

**后置条件：**

- 目标分享页面已删除，对应固定链接已停用，并留下操作记录。

---

#### UC-页面库-16 销售直接复制无参数固定链接

- **优先级**：P0

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "直接复制无参数固定链接" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售用一次操作取得可直接发送的无参数固定链接。
- **角色**：销售人员
- **前置条件**：销售具备「复制无参数固定链接」功能权限，可查看目标分享页面，且目标固定链接已启用。
- **触发**：销售需要立即取得分享页面的访问地址。

**主流程：**

1. 销售在页面详情选择「复制链接」。
2. 系统将无参数固定链接写入剪贴板。
3. 固定链接已公开时，系统显示「已复制。任何取得链接的人都可以查看」；固定链接未公开时，系统显示「已复制。客户首次访问时需要验证身份」。

**异常流程：**

- 2a. 浏览器无法将链接写入剪贴板 → 系统显示完整链接和「自动复制失败，请手动复制」，不显示「已复制」。

**业务规则：**

- 复制前不要求销售选择发送渠道或客户。
- 自动复制成功后的提示可提供「指定客户」入口，不影响销售离开页面。
- 停用的固定链接不提供复制操作，页面提示销售先启用链接。
- A 端提供页面和销售自己创建且已经保存的页面都可以直接分享。
- 无参数固定链接不包含客户标识参数。
- VISTA Link 不负责发送分享链接或销售消息，也不读取外部聊天或邮件工具中的内容。
- 直接复制无参数固定链接不生成用户可见记录或操作日志。

**后置条件：**

- 主流程完成后，无参数固定链接已写入剪贴板。
- 异常流程 2a 发生后，系统已显示完整链接供手动复制。
- 固定链接未发生变化。

---

#### UC-页面库-17 销售指定客户并复制带参数访问地址

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "指定客户并复制带参数访问地址" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售为一位客户取得能够直接识别客户的访问地址。
- **角色**：销售人员
- **前置条件**：销售已打开目标分享页面，具备「指定客户并复制带参数访问地址」功能权限，能够查看目标客户，且目标固定链接已启用。
- **触发**：销售准备向一位已有客户发送分享页面，并希望客户打开时可以直接识别身份。

**主流程：**

1. 销售在页面详情选择「指定客户」。
2. 系统展示销售能够查看的客户。
3. 销售选择一位目标客户并确认。
4. 客户与固定链接尚未建立关系时，系统建立关系，并记录首次关联来源为「销售指定客户」、首次关联时间和操作人；已建立关系时保留原关联信息。
5. 系统取得该固定链接与目标客户唯一有效的客户标识参数；已有有效参数时复用原参数。
6. 系统将带客户标识参数的访问地址写入剪贴板。

**异常流程：**

- 2a. 没有可选择的客户 → 系统显示空状态，不生成访问地址。
- 3a. 目标客户已删除或销售已无法查看 → 系统不生成访问地址，并提示重新选择客户。
- 6a. 浏览器无法将访问地址写入剪贴板 → 系统显示完整访问地址和「自动复制失败，请手动复制」。

**业务规则：**

- 一次只能指定一位客户。
- 客户标识参数不直接包含客户编号、邮箱、手机号等信息。
- 客户标识参数只对当前固定链接和目标客户的关系有效。
- 带参数访问地址仍指向原固定链接，不作为新的分享链接。
- 同一固定链接与同一客户只保留一个有效客户标识参数；重复指定该客户时返回同一访问地址。
- 客户与固定链接已有关系时，保留原首次关联来源和首次关联时间。
- 固定链接停用期间，带参数访问地址不能访问；客户与固定链接的关系和客户标识参数继续保留。
- 固定链接重新启用后，原带参数访问地址恢复可用。
- 删除客户后，该客户对应的客户标识参数永久失效。
- 当前不提供按客户单独停用参数的操作。
- 停用的固定链接不提供指定客户和生成访问地址的操作，页面提示销售先启用链接。
- 只在销售指定客户并首次建立客户与固定链接的关系时记录操作人和操作时间。
- 客户与固定链接已有关系时，重复取得同一访问地址不新增用户可见记录或操作日志。
- 指定客户用于身份识别，不是账号级访问授权；任何取得该地址的人都可能被识别为目标客户。
- VISTA Link 只生成并复制访问地址，不负责发送。

**后置条件：**

- 带参数访问地址已写入剪贴板，或已显示完整地址供手动复制；必要时已建立客户与固定链接的关系并记录首次关联信息。

---

#### UC-页面库-18 销售展示无参数固定链接二维码

- **优先级**：P2-B

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "展示无参数固定链接二维码" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售展示无参数固定链接二维码，供客户扫码访问分享页面。
- **角色**：销售人员
- **前置条件**：销售具备「展示二维码」功能权限，可查看目标分享页面，且目标固定链接已启用。
- **触发**：销售需要让客户通过扫码打开分享页面。

**主流程：**

1. 销售在页面详情选择「二维码」。
2. 系统展示无参数固定链接二维码。
3. 固定链接已公开时，系统在二维码旁显示「任何取得二维码的人都可以查看」；固定链接未公开时，系统显示「首次访问需要验证身份」。

**异常流程：**

- 无。

**业务规则：**

- 二维码始终对应无参数固定链接。
- 当前不生成指定客户二维码。
- 展示二维码前不要求销售选择发送渠道或客户。
- 停用的固定链接不提供二维码操作，页面提示销售先启用链接。
- 展示二维码不生成用户可见记录或操作日志。

**后置条件：**

- 无参数固定链接二维码已展示，固定链接未发生变化。

---

#### UC-页面库-19 销售停用或启用固定链接

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "停用或启用固定链接" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售通过启用或停用固定链接，控制购房客户是否可以访问对应分享页面。
- **角色**：销售人员
- **前置条件**：销售已打开页面详情，并具备「停用或启用链接」功能权限；目标固定链接对应的分享页面由本人创建。项目管理员可以操作当前项目内的全部固定链接。
- **触发**：销售需要允许或停止购房客户访问对应分享页面。

**主流程：**

1. 系统展示目标固定链接对应的页面名称和当前状态。
2. 固定链接处于启用状态时，销售选择停用；系统说明无参数固定链接和所有带客户标识参数的访问地址都将停止访问，并要求确认。
3. 销售确认停用。
4. 固定链接处于停用状态时，销售选择启用。
5. 系统将固定链接更新为销售选择的状态。
6. 系统记录目标链接、变化前后的状态、操作人和操作时间。
7. 系统展示更新后的固定链接状态。

**异常流程：**

- 3a. 销售取消停用 → 系统不改变固定链接状态。
- 4a. 销售尝试启用已删除页面对应的固定链接 → 系统提示页面已删除，不改变固定链接状态。
- 4b. 非项目管理员尝试停用或启用 A 端提供页面的固定链接，或其他成员创建页面的固定链接 → 系统不提供操作入口；直接发起操作时，系统展示无权限提示。

**业务规则：**

- 停用固定链接后，无参数固定链接和所有带客户标识参数的访问地址均不能访问。
- 停用固定链接不删除客户与固定链接的关系或客户标识参数。
- 重新启用固定链接后，无参数固定链接和原带客户标识参数的访问地址恢复可用。
- 已删除页面对应的固定链接不能手动重新启用。
- 固定链接不能按客户分别停用。
- 项目管理员可以停用或启用当前项目内全部固定链接；除项目管理员外，具备该功能权限的用户只能操作本人创建的分享页面对应的固定链接。
- 非项目管理员不能停用或启用 A 端提供页面的固定链接。

**后置条件：**

- 目标固定链接状态已更新，并留下状态变化记录；停用后相关访问地址停止访问，重新启用后相关访问地址恢复可用。

---

#### UC-页面库-20 销售查看固定链接关联客户列表

- **优先级**：P2-B

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "查看固定链接关联客户列表" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售查看固定链接关联的客户。
- **角色**：销售人员
- **前置条件**：销售已打开目标固定链接，并具备「查看关联客户」和「查看客户」功能权限。
- **触发**：销售需要确认哪些客户已关联该固定链接。

**主流程：**

1. 销售从页面详情打开目标固定链接的关联客户列表。
2. 系统展示客户姓名、客户编号、首次关联来源和首次关联时间。

**异常流程：**

- 2a. 固定链接尚未关联客户 → 系统显示空状态。

**业务规则：**

- 一条固定链接可以关联多个客户。
- 客户与固定链接的首次关联来源包括销售指定客户和客户通过无参数固定链接完成身份认证。
- 关联客户列表不展示客户联系方式和备注。

**后置条件：**

- 客户关联关系未发生修改。

---

#### UC-页面库-21 销售设置或取消公开访问

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "设置或取消公开访问" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售设置本人分享页面是否允许未识别访客直接查看。
- **角色**：销售人员
- **前置条件**：销售已打开页面详情，具备「设置或取消公开访问」功能权限，目标固定链接对应的分享页面由本人创建。项目管理员可以设置当前项目内全部固定链接。
- **触发**：销售需要改变目标分享页面的身份认证要求。

**主流程：**

1. 系统展示固定链接当前访问设置：公开或需要认证。
2. 销售选择新的访问设置。
3. 销售把链接设为公开时，系统提示任何取得链接的人都可以直接查看，且匿名访问不进入客户追踪或营销统计，并要求确认。
4. 销售确认设置公开，或直接取消公开。
5. 系统更新固定链接的公开状态。
6. 系统记录目标链接、变化前后的公开状态、操作人和操作时间。
7. 系统展示更新后的访问设置。

**异常流程：**

- 3a. 销售取消设置公开 → 系统不改变公开状态。
- 4a. 目标分享页面已删除 → 系统不改变公开状态，并提示页面已删除。
- 4b. 销售已经不能管理目标固定链接 → 系统不改变公开状态，并提示无权操作。

**业务规则：**

- 固定链接创建时默认不公开。
- 设置公开不改变固定链接地址、二维码、启用状态、客户关联关系或客户标识参数。
- 公开状态和启用状态分别生效；公开但停用的固定链接不能访问。
- 公开链接允许未识别访客直接查看；匿名访问不创建客户、客户关联关系、客户访问会话或客户浏览记录。
- 公开链接带有有效客户标识参数，或浏览器已有有效客户访问会话时，系统仍按已识别客户处理。
- 取消公开后，未识别访客需要通过邮箱验证码完成身份认证；已有客户关联关系和客户标识参数继续保留。
- 项目管理员可以设置当前项目内全部固定链接；其他具备该功能权限的项目成员只能设置本人创建页面对应的固定链接。
- 非项目管理员不能设置 A 端提供页面对应固定链接的公开状态。

**后置条件：**

- 固定链接公开状态已更新，并留下公开状态变化记录。

---

#### UC-页面库-22 销售开始现场讲解

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "开始现场讲解" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售使用页面最新保存内容向身边客户进行现场讲解。
- **角色**：销售人员
- **前置条件**：销售具备「进行现场讲解」和目标页面的「查看分享页面」功能权限。
- **触发**：销售需要在现场向已有客户或临时客户展示项目内容。

**主流程：**

1. 销售从页面详情选择「现场讲解」，或从客户详情选择「现场讲解」。
2. 从页面详情进入时，销售选择当前项目内已有客户或「临时讲解」；从客户详情进入时，销售选择当前项目内已保存、来源正常且自己有权查看的页面。
3. 系统展示目标页面最新保存内容和已选客户或「未关联客户」。
4. 销售确认开始讲解。
5. 系统创建一条进行中的现场讲解记录，并进入现场讲解页面。
6. 系统展示「现场讲解中」、首次开始时间和「结束讲解」。

**异常流程：**

- 1a. 销售缺少「进行现场讲解」功能权限 → 系统不展示入口；直接访问时进入无权限页面。
- 2a. 销售选择已有客户但缺少「查看客户」功能权限 → 系统不展示客户选择，只允许选择「临时讲解」。
- 2b. 目标页面尚未首次保存 → 系统提示「请先保存页面」，不开始讲解。
- 2c. 目标页面来源已下架或删除 → 系统提示页面不可用，不开始讲解。
- 2c. 目标页面已删除，或销售失去页面查看权限 → 系统不开始讲解。
- 4a. 销售在其他设备或浏览器已有进行中的讲解 → 系统展示原讲解，要求销售选择继续或结束，不创建第二条记录。
- 5a. 创建讲解记录失败 → 系统保留当前页面和选择结果，提示重试，不进入讲解页面。

**业务规则：**

- 现场讲解使用页面最新保存内容；页面保存新内容后，讲解页面刷新或重新请求内容时使用最新内容。
- 同一销售在所有设备和浏览器中同时只能有一条进行中的现场讲解记录。
- 固定链接的启用、公开和认证状态不影响现场讲解。
- 临时讲解不要求先创建客户，也不记录预约到场或到场人数。
- 开始现场讲解不产生客户访问会话、客户自主访问记录或页面打开邮件通知。

**后置条件：**

- 系统已创建一条进行中的现场讲解记录；客户自主访问数据未发生修改。

---

## 客户访问端

> 客户访问端指 HOMEVISTA 面向购房客户的展示端。购房客户不登录 VISTA Link；本章只描述购房客户通过分享链接访问页面的用例。

#### UC-客户访问端-01 购房客户通过带参数访问地址查看分享页面

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "购房客户" as Buyer

usecase "通过带参数访问地址查看分享页面" as UC1

Buyer --> UC1
@enduml
```

- **用例目标**：购房客户通过带客户标识参数的访问地址完成身份识别并查看分享页面。
- **角色**：购房客户
- **前置条件**：购房客户已取得带客户标识参数的访问地址。
- **触发**：购房客户打开销售分享的访问地址。

**主流程：**

1. 购房客户打开带客户标识参数的访问地址。
2. 系统检查分享页面和固定链接状态。
3. 系统确认客户标识参数有效，且对应客户未删除。
4. 当前浏览器没有其他客户身份，或浏览器身份与参数对应客户相同时，系统识别为参数对应客户。
5. 系统在当前浏览器保存客户访问会话凭证。
6. 系统读取页面最新保存内容并展示分享页面；客户产生浏览或操作后，系统保存对应的访问行为记录。

**异常流程：**

- 2a. 分享页面已删除 → 系统显示「页面已被删除」，不展示内容。
- 2b. 固定链接已停用 → 系统显示失效提示，不展示内容。
- 3a. 参数无效或对应客户已删除 → 系统忽略该参数，并检查当前浏览器中的客户访问会话。
- 3a1. 客户访问会话有效且对应客户未删除 → 系统识别为该客户，继续执行步骤 5 至 6。
- 3a2. 没有有效客户访问会话，且固定链接已公开 → 系统按匿名访问直接展示分享页面，不创建客户、客户关联关系、客户访问会话或客户浏览记录。
- 3a3. 没有有效客户访问会话，且固定链接未公开 → 系统要求购房客户通过邮箱验证码确认身份；认证成功后匹配或创建客户，继续执行步骤 5 至 6。
- 3a4. 购房客户未完成或未通过邮箱验证码 → 系统不展示分享页面。
- 4a. 参数对应客户与浏览器中的客户不同 → 系统展示脱敏身份确认页面，默认继续使用当前浏览器身份。
- 4a1. 购房客户选择当前浏览器身份 → 系统忽略本次参数，识别为当前客户，继续执行步骤 5 至 6。
- 4a2. 购房客户选择访问地址指定身份 → 系统识别为参数对应客户，继续执行步骤 5 至 6。

**业务规则：**

- 有效客户标识参数可以直接识别客户，不再要求邮箱验证码。
- 参数对应客户与浏览器身份不同时，系统不能直接覆盖当前身份。
- 客户识别完成后，页面地址不再显示客户标识参数，减少购房客户从地址栏复制并转发带参数地址的风险。
- 客户访问会话凭证保存在当前浏览器中，不出现在访问地址中，也不是客户标识参数。
- 带参数访问地址仍使用原固定链接，不产生新的分享链接。
- 客户与固定链接已有关系时，系统保留原首次关联来源和首次关联时间。
- 通过客户访问会话或邮箱验证码识别的客户尚未关联当前固定链接时，系统建立关系，并记录首次关联来源为「客户访问认证」和首次关联时间。
- 指定客户不是账号级访问授权；其他人取得该地址后，也可能被识别为参数对应客户。
- 非公开链接的未识别客户不能查看分享页面。
- 客户页面读取素材最新可用内容；素材来源更新后不要求销售重新保存页面。
- 页面保存新内容后，客户刷新、重新打开或继续请求页面内容时使用最新保存内容。
- 已发生的访问行为记录保留实际对象信息，不因页面之后修改而改写。

**后置条件：**

- 购房客户已被识别并查看分享页面，当前浏览器已保存客户访问会话凭证。

---

#### UC-客户访问端-02 购房客户通过非公开无参数固定链接查看分享页面

- **优先级**：P0

```plantuml
@startuml
left to right direction
actor "购房客户" as Buyer

usecase "通过非公开无参数固定链接查看分享页面" as UC1

Buyer --> UC1
@enduml
```

- **用例目标**：购房客户通过非公开无参数固定链接确认身份并查看分享页面。
- **角色**：购房客户
- **前置条件**：购房客户已取得未公开的无参数固定链接，或扫描了对应二维码。
- **触发**：购房客户打开无参数固定链接。

**主流程：**

1. 购房客户打开无参数固定链接。
2. 系统检查分享页面和固定链接状态。
3. 系统检查当前浏览器中的客户访问会话。
4. 浏览器没有有效客户访问会话时，系统展示邮箱验证码入口。
5. 购房客户输入邮箱，获取并输入一次性验证码。
6. 系统校验验证码并确认邮箱。
7. 系统按已验证邮箱匹配已有客户；无法匹配时，系统创建新客户并生成客户编号，负责人为空。
8. 客户与固定链接尚未建立关系时，系统建立关联关系，记录首次关联来源为「客户访问认证」和首次关联时间。
9. 系统在当前浏览器保存客户访问会话凭证。
10. 系统读取页面最新保存内容并展示分享页面；客户产生浏览或操作后，系统保存对应的访问行为记录。

**异常流程：**

- 2a. 分享页面已删除 → 系统显示「页面已被删除」，不展示内容。
- 2b. 固定链接已停用 → 系统显示失效提示，不展示内容。
- 3a. 浏览器会话有效且对应客户未删除 → 系统识别为该客户，直接执行步骤 8 至 10。
- 3b. 浏览器会话指向已删除客户 → 系统使原会话失效，继续执行步骤 4。
- 6a. 邮箱验证码错误或超过 10 分钟有效期 → 系统提示重新输入或重新获取验证码，不展示内容。
- 6b. 同一项目和邮箱在滚动 24 小时内已发送 10 次验证码，或距离上次成功发送不足 60 秒 → 系统提示达到发送限制，不展示内容。
- 6c. 同一验证码连续输入错误 5 次 → 系统锁定该次验证 30 分钟，不展示内容。
- 6d. 身份认证服务暂时不可用 → 系统提示稍后重试，不展示内容。
- 6e. 购房客户不完成邮箱验证码 → 系统不展示分享页面。

**业务规则：**

- 邮箱必须通过一次性验证码确认，不能只凭输入的邮箱识别客户。
- 验证码为 6 位数字，仅能成功使用一次，有效期 10 分钟。
- 同一项目和邮箱最多在滚动 24 小时内成功发送 10 次验证码；两次成功发送至少间隔 60 秒。
- 验证码连续输入错误 5 次后锁定 30 分钟。
- 认证邮箱已存在时，系统关联已有客户；不存在时，系统在当前项目创建客户，姓名取邮箱前缀，来源设为「链接访问认证」，状态使用当前项目默认状态，负责人为空。
- 认证邮箱匹配到已有客户时，保留该客户当前的负责人。
- 客户访问会话凭证保存在当前浏览器中，不出现在访问地址中，也不是客户标识参数。
- 同一浏览器再次访问当前项目下的其他无参数固定链接时，可以继续使用有效客户访问会话。
- 客户访问会话自建立或最近一次有效使用起保留 30 天，仅适用于当前浏览器和当前项目。
- 客户使用不同浏览器、清除 Cookie 或会话失效后，需要重新认证。
- 二维码对应无参数固定链接，扫码后的访问规则与直接打开无参数固定链接相同。
- 已删除客户不参与邮箱匹配；新客户不继承已删除客户的固定链接关联关系或其他历史数据。
- 非公开链接的未识别客户不能查看分享页面。
- 邮箱验证码属于身份认证消息，只用于确认访问者邮箱，不用于发送分享链接或销售消息。
- 客户页面读取素材最新可用内容；素材来源更新后不要求销售重新保存页面。
- 页面保存新内容后，客户刷新、重新打开或继续请求页面内容时使用最新保存内容。
- 已发生的访问行为记录保留实际对象信息，不因页面之后修改而改写。

**后置条件：**

- 购房客户已被识别并查看分享页面；必要时已创建负责人为空的客户、建立链接关联关系并保存客户访问会话凭证。

---

#### UC-客户访问端-03 购房客户通过公开固定链接查看分享页面

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "购房客户" as Buyer

usecase "通过公开固定链接查看分享页面" as UC1

Buyer --> UC1
@enduml
```

- **用例目标**：购房客户通过公开固定链接直接查看分享页面。
- **角色**：购房客户
- **前置条件**：购房客户已取得公开固定链接或扫描了对应二维码，访问地址没有有效客户标识参数，当前浏览器没有有效客户访问会话。
- **触发**：购房客户打开公开固定链接。

**主流程：**

1. 购房客户打开公开固定链接。
2. 系统检查分享页面、固定链接状态和公开状态。
3. 系统确认固定链接已启用且已公开。
4. 系统直接展示分享页面最新保存内容。

**异常流程：**

- 2a. 分享页面已删除 → 系统显示「页面已被删除」，不展示内容。
- 2b. 固定链接已停用 → 系统显示失效提示，不展示内容。
- 3a. 固定链接已取消公开 → 系统按非公开无参数固定链接要求购房客户完成身份认证。

**业务规则：**

- 未识别访客查看公开链接时，不要求邮箱验证码。
- 未识别访客查看公开链接时，不创建客户、客户与固定链接的关系或客户访问会话。
- 匿名访问不进入购房客户追踪或营销统计。
- 公开固定链接和对应二维码使用同一访问规则。
- 公开状态不改变固定链接地址或页面内容。
- 公开链接带有有效客户标识参数，或浏览器已有有效客户访问会话时，系统按已识别客户处理并记录访问。
- 客户页面读取素材最新可用内容；素材来源更新后不要求销售重新保存页面。

**后置条件：**

- 购房客户已查看分享页面；客户、客户关联关系和客户浏览记录未发生变化。

---

### 数据记录与计算规则

- **优先级**：P1

本节是 UC-客户访问端-01、UC-客户访问端-02，以及 UC-客户访问端-03 中已识别客户访问分支的自动处理规则，不单独建立用户用例。

**业务规则：**

- 客户完成身份识别并成功打开分享页面后，系统开始一次访问并计入访问次数。
- 访问开始时，系统保存客户、页面、固定链接和开始时间；不保存可重新展示的旧页面副本。
- 同一次访问中的页面公共操作、Widget 浏览、浏览操作和明确动作必须关联到该次访问，并保存实际对象的名称、标识、主要参数和发生时间。
- 认证页面、页面打开失败和未识别访客的匿名访问不产生客户访问记录，也不进入购房客户追踪或营销统计。
- 同一次访问中刷新页面或切换 Widget 不增加访问次数。
- 客户打开不同分享页面时，各自生成访问记录。
- 客户关闭页面或连续无有效操作达到 C 端定义的时限后，本次访问结束。
- 本次访问是否结束继续使用 PRD §4.6.3 和 C 端已有判断。
- 页面成功打开后没有其他有效操作，仍计 1 次访问，本次有效访问时长为 0。
- 尚未结束的访问不进入平均访问时长计算。
- C 端记录访问开始、访问结束、页面公共操作和 Widget 浏览；具体 Widget 发生其已定义的浏览操作或明确动作时，再记录对应操作。
- 当前已确认的页面公共操作为成功切换语言；其他页面公共操作按独立统计定义逐项审核后补充。
- 切换语言记录切换前语言、切换后语言和发生时间，只进入访问时间线，不增加页面访问次数、内容浏览次数或客户操作次数。
- 每个 Widget 的需求分别确定需要上报的浏览内容、普通浏览操作和明确动作，以及面向销售的对象名称、主要参数和有效时长条件。
- 页面公共操作和各 Widget 的具体统计内容按 [VISTA Link B 端统计需求定义](./VISTA_Link_B端统计需求定义.md) 逐项确认；尚未确认时，B 端不假定会提供某项浏览、操作或时长。
- 明确动作由页面公共组件或 Widget 定义并提供，表示具有明确业务含义的客户操作，例如来场预约提交；当前 C 端没有资料下载操作，VISTA Link 不要求上报或统计下载；未被 C 端定义的联系等操作不进入当前统计。
- 图片切换、内容展开、播放暂停和 Widget 切换等浏览操作不属于明确动作。
- 系统记录客户触发了明确动作，不表示预约已经完成。
- 列表条目、3D 命名视角、地图地点等具体对象只有实际产生并上报记录后才进入访问过程；页面中存在该对象不表示客户浏览过该对象。
- 列表条目只有点击记录时，只记录点击时间和具体对象，不推断详情已经成功打开，也不补造浏览时长。
- 普通浏览操作是否同时形成内容浏览记录，由对应 Widget 的统计定义明确；B 端不能只根据点击、选择或切换记录自行增加内容浏览次数或浏览时长。
- 未上报的旋转、缩放、拖动、平移等 Widget 内部操作不生成销售可见记录，系统也不根据其他记录推断。
- 页面总时长、内容区域有效浏览时长和具体对象有效浏览时长是不同层级的结果；上层时长可以包含下层时长，不能相加。
- 点击、选择或切换记录本身没有有效浏览时长；有效浏览时长使用 C 端提供的完整浏览结果，不根据点击时间推算。
- 分享页面名称、实际固定链接地址、进入时间和访问总时长来自单次访问记录。
- 内容或素材名称、分类和主要参数来自访问发生时保存的历史信息。
- 页面公共操作、浏览操作和明确动作的名称、具体对象与发生时间来自 C 端按照页面公共组件或对应 Widget 需求实际提供的结果。
- 每次访问保留访问 IP 地址、User-Agent 原始值、浏览器名称与版本、操作系统名称与版本、设备类型和来源地址（Referer）。
- 访问基础信息归属于单次访问记录，不作为独立统计指标。
- Referer 允许为空，系统不能只根据 Referer 判断分享链接的实际发送渠道。
- 访问基础信息供访问记录还原、问题排查和后续统计使用。
- Widget 记录至少能够关联客户、分享页面、固定链接、单次访问和 Widget 实例，并保留实际内容、素材或操作对象在发生时的名称及标识；浏览记录另外提供有效时长，浏览操作和明确动作提供面向销售的名称、对象和发生时间。
- 访问数据状态为正常时，访问和行为记录按 PRD 规则进入客户追踪、营销统计和 AI 建议依据。
- 访问数据部分缺失时，系统保留能够确认的访问和行为，不补造缺失的次数、时长或操作，并在单次访问中显示「数据不完整」。
- 系统发现数据疑点或项目成员报告数据问题时，访问数据进入待检查，暂不进入营销统计或新的 AI 建议依据。
- 访问数据无法确认到客户、固定链接、单次访问或实际操作对象，或者与已保存记录重复、冲突时，状态为异常。
- 异常数据不归入其他客户或链接，不进入客户追踪、营销统计或 AI 建议依据。
- 经确认属于机器人、自动监测、内部测试、重复数据或其他无效访问时，访问数据标记为已排除，不进入客户追踪、营销统计或 AI 建议依据。
- 非客户访问的识别与排除规则由系统统一提供，项目不能自行新增、修改或停用。
- 延迟到达的数据能够确认归属时，系统按实际发生时间补入原访问并更新访问数据状态；不能确认时继续按异常数据处理。
- 数据状态变化或纠正确认后，系统重新计算受影响的客户追踪和营销统计；完成前显示「数据更新中」。
- PDF 作为 Widget 中的素材记录，不作为 Widget 类型记录。
- 有效操作、连续无操作时限、异常关闭处理和单次时长上限最终由 C 端需求定义；B 端使用 C 端上报结果，不自行改写。
- 客户追踪和营销统计的日期范围按日本时间计算，开始日期和结束日期均包含在内。
- 页面访问按进入时间归入日期和筛选范围；内容浏览、浏览操作和明确动作按各自发生时间归入日期和筛选范围。
- 一次访问跨越日期时，页面访问次数和本次访问总时长归入进入日期；跨日后发生的内容浏览、浏览操作和明确动作归入实际发生日期。
- 访问次数和活跃客户数据应在访问开始后 1 分钟内更新。
- 有效访问时长、平均访问时长和内容浏览时长应在访问结束后 5 分钟内更新。
- 延迟到达的数据按实际发生时间补入历史统计。
- 页面、Widget 或素材之后被修改或删除时，历史记录保留访问发生时的名称和对象信息。
- 页面之后修改、素材更新或对象删除时，不改写已经发生的访问行为记录。
- 删除客户、页面、Widget 或素材，或停用固定链接，不减少已经产生的历史统计。
- 时间筛选按访问实际发生时间判断；客户在访问发生后被删除，不影响该访问进入对应时间段的统计。
- 多个已删除客户仍按各自原客户标识分别计算，不因界面统一显示为「已删除客户」而合并。

### 页面打开邮件通知规则

- **优先级**：P2-B

页面打开邮件通知是客户首次成功打开页面后的自动处理，不单独建立用户用例。

**业务规则：**

- 同一客户第一次通过某条固定链接成功打开分享页面时，系统向该客户的当前负责人发送一次邮件。
- 认证页面、B 端页面预览、页面打开失败和匿名访问不发送邮件。
- 刷新、重复打开标签页、同一次访问中的 Widget 切换和之后再次访问都不重复发送。
- 客户没有负责人时不发送，也不改发给页面创建人或项目管理员。
- 收件人账号必须处于启用状态，并同时具备「查看客户」和「购房客户追踪查看」功能权限。
- 收件人不需要具备「查看营销统计」功能权限。
- 客户首次打开时没有负责人，之后才分配负责人，不补发过去的通知。
- 邮件包含客户姓名、分享页面名称、首次打开时间，以及进入该客户追踪详情的 VISTA Link 地址。
- 邮件不展示客户意向、浏览时长或系统判断的关注程度。
- 邮件发送失败不影响客户浏览，邮件重试不得产生重复通知。

---

## 营销跟进

> 购房客户追踪、营销统计和现场讲解的主要角色均为销售人员。项目管理员、销售经理和其他角色能否执行，以 PRD 默认角色权限和自定义角色权限为准；营销企划默认拥有「查看营销统计」功能权限，不默认拥有「购房客户追踪查看」或「进行现场讲解」功能权限。

#### UC-营销跟进-01 销售浏览待跟进客户列表

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "浏览待跟进客户列表" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售查看当前项目内已经产生自主访问或已关联现场讲解记录的客户。
- **角色**：销售人员
- **前置条件**：销售具备「查看客户」和「购房客户追踪查看」功能权限。
- **触发**：销售需要根据客户最近的自主访问或现场接待记录决定后续动作。

**主流程：**

1. 销售进入购房客户追踪。
2. 系统展示客户姓名、负责人、最近活跃时间和一条最近行为。

**异常流程：**

- 1a. 用户缺少「查看客户」或「购房客户追踪查看」功能权限 → 系统拒绝访问，不展示客户追踪数据。
- 2a. 当前项目内没有客户产生过自主访问或已关联现场讲解记录 → 系统显示空状态。
- 2b. 数据读取失败 → 系统显示错误提示和重试操作，不显示为空状态。

**业务规则：**

- 系统不向缺少「购房客户追踪查看」功能权限的用户展示购房客户追踪菜单或入口。
- 列表范围为当前项目内产生过客户自主访问记录，或已经关联有效现场讲解记录的客户。
- 待跟进客户列表不是客户状态，不新增「待跟进」或「已跟进」状态。
- 列表默认按最近活跃时间倒序展示。
- 最近活跃时间取客户最近一次自主访问的最后活跃时间或最近一次有效现场讲解结束时间中的较晚者；未正常结束的讲解使用最后可靠记录时间。
- 最近行为使用最近一次自主访问中最后一条已上报的内容浏览或客户操作记录，或最近一次有效现场讲解摘要中的较晚者。
- 最近行为展示实际素材或内容名称和客观行为；内容浏览存在有效时长时显示时长，客户操作显示操作名称。
- 最近行为来自现场讲解时显示「现场讲解」标识，不表现为客户自主浏览或客户操作。
- 普通浏览操作只在客户追踪详情的访问过程中展示，不作为待跟进客户列表的最近行为。
- 列表不根据停留时长、访问次数或浏览内容标记客户意向或跟进优先级。
- 客户没有负责人时，负责人字段留空。
- 已删除客户不进入待跟进客户列表。
- 无效讲解不用于计算最近活跃时间或最近行为。

**后置条件：**

- 客户和浏览记录未发生修改。

---

#### UC-营销跟进-02 销售查看购房客户追踪详情

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "查看购房客户追踪详情" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售分开查看单个客户的自主访问和已关联现场讲解记录。
- **角色**：销售人员
- **前置条件**：销售具备「查看客户」和「购房客户追踪查看」功能权限。
- **触发**：销售需要了解一个客户的实际浏览情况。

**主流程：**

1. 销售从待跟进客户列表、客户详情、营销统计中的客户排行或页面统计详情打开客户追踪详情。
2. 系统展示客户姓名和负责人。
3. 系统展示访问次数、浏览分享页面数、浏览内容数、平均访问时长、首次访问时间和最近访问时间。
4. 系统以最近 30 天为默认时间，展示按日期统计的访问次数趋势。
5. 系统先按分享页面分组，再展示客户实际浏览的素材或内容、素材主要参数、浏览次数和累计有效浏览时长。
6. 系统在「客户操作」中展示来场预约等已经定义操作的名称、发生次数和最近发生时间。
7. 系统按访问时间倒序展示每次访问的分享页面名称、实际固定链接地址、进入时间和访问总时长。
8. 单次访问的数据部分缺失时，系统显示「数据不完整」。
9. 单次访问处于待检查时，系统显示「待检查」和问题类型。
10. 系统在每次访问中按发生时间展示客观行为、具体对象和有效浏览时长；具体对象有结构化参数时，在下一行展示参数名称和值。
11. 系统把有效现场讲解与客户自主访问按时间顺序展示在同一时间线中，并使用「现场讲解」标识。
12. 现场讲解记录展示讲解页面、讲解人、首次开始时间、结束时间、结束状态、页面前台总展示时长，以及实际打开内容的次数和展示时长。

**异常流程：**

- 3a. 目标客户没有访问记录 → 系统保留客户信息，并显示无访问记录的空状态。
- 4a. 所选时间内没有访问 → 系统保留顶部累计数据，访问趋势、内容浏览情况和访问记录显示空状态。
- 7a. 数据读取失败 → 系统显示错误提示和重试操作，不显示为没有访问。
- 10a. 客户只有现场讲解、没有自主访问 → 系统按无自主访问展示顶部累计数据、访问趋势和内容浏览情况，时间线正常展示现场讲解记录。

**业务规则：**

- 未选择固定链接时，顶部 6 项数据按该客户在当前项目内的全部历史记录计算，不受时间筛选影响。
- 浏览分享页面数按客户实际成功打开过的分享页面去重计算。
- 浏览内容数按「分享页面 + 实际内容或素材」去重计算。
- 平均访问时长等于已经结束访问的有效访问时长总和除以已经结束的访问次数。
- 未选择固定链接时，首次访问时间和最近访问时间使用当前项目全部历史记录中最早和最晚的成功访问时间；选择固定链接时，改为使用该链接全部历史记录中最早和最晚的成功访问时间。
- 同一客户同一天访问多次时，访问趋势显示当天实际访问次数。
- 访问趋势不区分首次访问和回访。
- 所选时间中没有访问的日期显示为 0。
- 内容浏览情况先按分享页面分组，页面内的素材或内容默认按累计有效浏览时长从高到低排列。
- 页面分组展示页面名称、访问次数和累计有效访问时长。
- 素材或内容项展示访问发生时的名称、素材类型和有业务意义的主要参数。
- 某项没有有效浏览时长但产生了客户操作时，保留操作记录，不补造浏览时长。
- 单次访问使用三层记录：分享页面和固定链接、页面中的内容区域、内容区域内实际产生的内容浏览或操作。
- 内容区域在系统内部对应 Widget 实例；销售页面只显示面向客户的内容区域名称、具体对象和客观行为。
- 每条访问过程记录按「发生时间 + 客观行为 + 具体对象 + 有效浏览时长」展示；没有完整有效时长时不显示时长。
- 具体对象优先使用客户实际看到的内容、素材、列表条目、命名视角或地图地点名称，不显示技术事件名称。
- 补充信息只展示访问发生时保存的结构化参数，必须同时显示参数名称和值，并按对应内容类型的固定顺序排列；同一对象名称或参数值不重复展示。
- 主行已经展示点击对象时，补充信息不再重复该对象；没有其他有效补充信息时不显示第二行。
- 客户操作只展示操作名称、操作对象和发生时间，不显示第二行，也不展示预约时间、联系方式、处理结果等实际业务信息。
- 浏览操作只进入访问过程，不进入「客户操作」汇总；来场预约等已经定义的明确动作进入「客户操作」汇总。
- 列表中的条目只有实际产生并上报记录后才展示；只有点击记录时不推断详情已打开，也不补造浏览时长。
- 3D 建筑外观和周边地图只展示 Widget 实际上报的命名视角、立面、地点分类、具体地点等记录；未上报的旋转、缩放、拖动和平移不展示。
- 页面总时长、内容区域有效浏览时长和具体对象有效浏览时长不能相加。
- 页面不展示 Widget 名称、Widget 类型或 Widget 实例编号。
- 系统内部保留 Widget 实例编号，用于区分内容所在位置和计算浏览数据。
- 历史记录保留访问发生时的页面名称、实际内容或素材名称、素材类型和主要参数；相关对象后续修改或删除时，不改写已有历史记录。
- 访问数据部分缺失时，页面只展示和计算能够确认的访问和行为，不补造缺失记录。
- 待检查访问在访问记录中保留供项目成员处理，但暂不进入营销统计或新的 AI 建议依据。
- 访问数据异常时，不进入客户追踪，也不改记到其他客户或固定链接。
- 系统只展示客观浏览和动作记录，不判断客户意向。
- PDF 作为 Widget 中的素材展示，不作为 Widget 类型展示。
- 页面、Widget 或素材已经删除时，历史记录保留访问发生时的名称并显示对应删除标记，不能进入已删除对象的详情。
- 客户已删除时，历史访问记录中的客户显示为「已删除客户」。
- 页面不显示客户当前是否在线。
- 现场讲解不显示固定链接、客户访问来源、客户访问会话或身份认证字段。
- 现场讲解不能增加或改写顶部 6 项累计访问数据、访问趋势和内容浏览情况。
- 讲解人修改客户关联后，记录从原客户时间线移除并进入新客户时间线。
- 标记为「无效讲解」的记录不进入任何客户的购房客户追踪。

**后置条件：**

- 客户和浏览记录未发生修改。

---

#### UC-营销跟进-03 销售按固定链接筛选客户追踪

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "按固定链接筛选客户追踪" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售查看客户通过某一条固定链接产生的累计数据和浏览记录。
- **角色**：销售人员
- **前置条件**：销售已进入客户追踪详情，且该客户关联了两条以上固定链接。
- **触发**：销售需要区分客户通过不同固定链接产生的浏览行为。

**主流程：**

1. 销售打开固定链接筛选条件。
2. 系统展示该客户关联的全部固定链接、对应分享页面名称和实际链接地址。
3. 销售选择一条固定链接。
4. 系统按该客户通过所选固定链接产生的全部历史记录重新计算顶部 6 项累计数据。
5. 系统只展示该固定链接对应的访问趋势、内容浏览情况和访问记录。
6. 销售清除固定链接筛选。
7. 系统恢复展示该客户在当前项目内全部固定链接的数据。

**异常流程：**

- 5a. 客户尚未通过所选固定链接访问 → 系统显示「该客户还没有通过这条链接访问」，不显示错误。

**业务规则：**

- 客户只有一条或没有关联固定链接时，不显示固定链接筛选。
- 已停用的固定链接可以用于查看历史记录。
- 分享页面已删除时，筛选项保留访问发生时的页面名称并标记「页面已删除」，且不能进入已删除页面的编辑或预览页面。
- 固定链接筛选同时作用于顶部累计数据、访问趋势、内容浏览情况和访问记录。
- 固定链接筛选不改变客户基本信息。

**后置条件：**

- 客户追踪已按所选固定链接显示，业务数据未发生修改。

---

#### UC-营销跟进-04 销售按时间筛选客户追踪

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "按时间筛选客户追踪" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售查看客户在指定时间内的访问趋势、内容浏览情况和访问记录。
- **角色**：销售人员
- **前置条件**：销售已进入客户追踪详情。
- **触发**：销售需要查看客户在特定时间内的浏览行为。

**主流程：**

1. 销售选择最近 7 天、最近 30 天、全部时间或自定义时间。
2. 系统按所选时间更新访问趋势、内容浏览情况和访问记录。
3. 系统继续展示不受时间筛选影响的顶部累计数据。

**异常流程：**

- 2a. 所选时间内没有访问 → 系统保留顶部累计数据，其他区域显示空状态。
- 2b. 数据读取失败 → 系统保留筛选条件，并显示错误提示和重试操作。

**业务规则：**

- 客户追踪默认显示最近 30 天。
- 时间筛选不改变顶部 6 项累计数据。
- 客户追踪的时间筛选独立于营销统计的时间筛选。
- 固定链接筛选已经生效时，时间筛选只更新该固定链接的数据。

**后置条件：**

- 客户追踪已按所选时间显示，业务数据未发生修改。

---

#### UC-营销跟进-05 销售按日期查看客户访问记录

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "按日期查看客户访问记录" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售查看客户在访问趋势中某一天产生的访问记录。
- **角色**：销售人员
- **前置条件**：销售已进入客户追踪详情，并看到访问趋势。
- **触发**：销售需要查看客户某一天的具体访问过程。

**主流程：**

1. 销售在访问趋势中选择一个日期。
2. 系统只展示该日期内的访问记录。
3. 系统保留当前固定链接和时间筛选条件。

**异常流程：**

- 2a. 所选日期没有访问 → 系统显示访问记录空状态。

**业务规则：**

- 日期筛选只影响访问记录，不重新计算顶部累计数据和内容浏览情况。
- 同一日期内的访问按进入时间倒序展示。

**后置条件：**

- 访问记录已按所选日期显示，业务数据未发生修改。

---

#### UC-营销跟进-06 销售按浏览内容查看客户访问记录

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "按浏览内容查看客户访问记录" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售查看客户浏览某项实际内容或素材时对应的访问记录。
- **角色**：销售人员
- **前置条件**：销售已进入客户追踪详情，并看到内容浏览情况。
- **触发**：销售需要查看某项内容出现在客户哪些访问中。

**主流程：**

1. 销售在内容浏览情况中选择一项实际内容或素材。
2. 系统只展示包含该项内容的访问记录。
3. 系统保留当前固定链接和时间筛选条件。

**异常流程：**

- 2a. 对应访问记录暂时无法读取 → 系统显示错误提示和重试操作。

**业务规则：**

- 内容筛选只影响访问记录，不重新计算顶部累计数据和访问趋势。
- Widget 名称相同但实际内容或素材不同的项目分别筛选。
- PDF 按所属 Widget 和 PDF 素材名称筛选，不作为 Widget 类型筛选。

**后置条件：**

- 访问记录已按所选内容显示，业务数据未发生修改。

---

#### UC-营销跟进-07 销售查看分享页面访问记录

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "查看分享页面访问记录" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售查看一个分享页面在不同客户中的访问情况。
- **角色**：销售人员
- **前置条件**：销售具备「购房客户追踪查看」功能权限，并可查看目标固定链接。
- **触发**：销售需要查看目标分享页面产生的客户访问记录。

**主流程：**

1. 销售从页面详情选择访问记录。
2. 系统按进入时间倒序展示客户姓名、分享页面名称、实际固定链接地址、进入时间和本次访问总时长。
3. 单次访问的数据部分缺失时，系统显示「数据不完整」。
4. 单次访问处于待检查时，系统显示「待检查」和问题类型。
5. 系统在每次访问中按发生时间展示客观行为、具体对象和有效浏览时长；具体对象有结构化参数时，在下一行展示参数名称和值。

**异常流程：**

- 1a. 用户缺少「购房客户追踪查看」功能权限，或不能查看目标固定链接 → 系统拒绝访问，不展示访问记录。
- 2a. 目标固定链接没有客户访问记录 → 系统显示空状态。
- 2b. 数据读取失败 → 系统显示错误提示和重试操作，不显示为空状态。

**业务规则：**

- 分享页面未删除时，页面详情中的访问记录入口受分享页面查看范围限制。
- 匿名访问不进入分享页面访问记录。
- 客户编号不在分享页面访问记录中展示。
- 分享页面访问记录只展示客户姓名，不展示联系方式、备注等其他客户资料。
- 客户已删除时，历史访问记录中的客户显示为「已删除客户」。
- 单次访问的三层记录、对象名称、结构化参数、时长和 Widget 展示规则与 UC-营销跟进-02 一致。
- 浏览操作只进入访问过程；来场预约等已经定义的明确动作同时作为「客户操作」展示。
- 客户操作只展示操作名称、操作对象和发生时间，不显示第二行，也不展示预约时间、联系方式、处理结果等实际业务信息。
- 链接复制和二维码展示不产生访问记录。
- 页面已删除后，历史访问记录继续在购房客户追踪中保留，访问发生时的页面名称标记「页面已删除」。
- 访问数据部分缺失时，只展示能够确认的访问和行为，不补造缺失记录。
- 待检查访问保留在访问记录中供项目成员处理，但暂不进入营销统计或新的 AI 建议依据。
- 访问数据异常时，不进入分享页面访问记录。

**后置条件：**

- 访问记录未发生修改。

---

#### UC-营销跟进-08 销售查看营销统计

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "查看营销统计" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售查看当前项目的整体访问情况、页面排行和客户排行。
- **角色**：销售人员
- **前置条件**：销售具备「查看营销统计」功能权限。
- **触发**：销售需要了解当前项目在一段时间内的客户访问情况。

**主流程：**

1. 销售进入营销统计。
2. 系统按本月读取当前项目的最新统计。
3. 系统展示访问客户数、首次访问客户数和回访客户数。
4. 系统按日期展示当前项目全部分享页面的访问客户数。
5. 系统展示页面名称、访问客户数、访问次数、平均访问时长和最近访问时间组成的页面排行。
6. 系统展示客户姓名、客户负责人、浏览页面数、访问次数、平均访问时长、最近访问时间、最近浏览内容和最近客户操作组成的客户排行。
7. 系统展示统计数据最后更新时间。

**异常流程：**

- 2a. 本月没有客户访问 → 系统显示「这段时间还没有客户访问」，不显示一排 0 或空图表。
- 2b. 数据读取失败 → 系统显示错误提示和重试操作，不显示为没有访问。

**业务规则：**

- 营销统计只显示当前项目数据，不提供项目筛选。
- 具备「查看营销统计」功能权限的用户看到相同的当前项目统计，不按角色显示不同内容。
- 系统不向缺少「查看营销统计」功能权限的用户展示营销统计菜单；用户直接访问时，系统拒绝访问。
- 整体访问情况汇总当前项目全部分享页面；首次访问和回访按客户在当前项目的历史有效访问判断，不按单个页面分别计算。
- 访问客户数按所选时间内产生过有效访问的客户去重计算。
- 首次访问客户数按客户在当前项目的首次历史有效访问发生在所选时间内的客户去重计算。
- 回访客户数按客户在当前项目的首次历史有效访问早于所选时间，且在所选时间内再次产生有效访问的客户去重计算。
- 首次访问客户数和回访客户数互不重复，两者之和等于访问客户数。
- 访问客户趋势不区分首次访问客户和回访客户。
- 同一客户同一天访问一个或多个分享页面、访问一次或多次，在访问客户趋势中均只计 1 位客户。
- 页面排行默认按访问次数从高到低排列；访问次数相同时，依次按访问客户数和最近访问时间排列。
- 页面已删除时保留历史统计，页面名称标记「页面已删除」；销售仍可查看其历史统计详情，但不能进入已删除页面的编辑或预览页面。
- 客户排行只包含所选时间内至少产生过 1 次有效访问的客户；同一客户只列 1 行。
- 创建或导入但没有访问记录的客户不进入客户排行。
- 客户排行默认按访问次数从高到低排列；访问次数相同时按最近访问时间倒序排列。
- 最近浏览内容显示最后一条已上报的实际内容或素材名称，不展示 Widget 名称。
- 最近客户操作只展示来场预约等已经定义的客观操作；没有时显示空值。
- 内容统计只使用客户在分享页面中的实际浏览，不统计素材被加入分享页面的次数。
- 访问数据异常时不进入营销统计；部分缺失时只使用能够确认的访问和行为结果，不推算缺失数据。
- 匿名访问、链接复制次数、二维码展示次数和发送渠道不进入营销统计。
- 页面不展示环比、同比、增加或下降比例。
- 页面不根据停留时长、访问次数或浏览内容判断客户意向。
- 页面不提供统计导出、打印或分享筛选结果。
- 用户同时具备「查看客户」和「购房客户追踪查看」功能权限时，客户排行和页面统计详情中的客户提供进入客户追踪详情的操作。
- 用户没有「查看客户」或「购房客户追踪查看」功能权限时，仍可查看统计中的客户数据，但不显示进入客户追踪详情的操作。
- 已删除客户在所选时间内产生过有效访问时，继续进入相关统计和客户排行，并显示为「已删除客户」。
- 客户排行不向已删除客户提供进入客户资料或客户追踪详情的操作。
- 页面不展示客户分数、意向等级或系统判断的跟进优先级。
- 页面不显示客户当前是否在线。
- 页面保持打开时，每 1 分钟自动刷新统计数据。

**后置条件：**

- 统计数据未发生修改。

---

#### UC-营销跟进-09 销售按时间筛选营销统计

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "按时间筛选营销统计" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售查看当前项目在指定时间内的营销统计。
- **角色**：销售人员
- **前置条件**：销售已进入营销统计。
- **触发**：销售需要查看特定时间内的客户访问情况。

**主流程：**

1. 销售选择本周、本月或自定义时间。
2. 系统按所选时间更新整体访问情况、页面排行和客户排行；进入页面统计详情时，该详情使用相同的时间条件。
3. 系统展示所用统计数据的最后更新时间；修改时间范围不改变该时间。

**异常流程：**

- 2a. 所选时间内没有客户访问 → 系统显示「这段时间还没有客户访问」。
- 2b. 数据读取失败 → 系统保留所选时间，并显示错误提示和重试操作。

**业务规则：**

- 营销统计默认显示本月。
- 本周从本周一开始，统计至当天。
- 本月从当月 1 日开始，统计至当天。
- 一个公共时间筛选同时作用于整体访问情况、页面排行、客户排行和页面统计详情。
- 时间筛选只改变统计范围，不改变统计数据最后更新时间。
- 时间筛选不改变当前项目范围。
- 营销统计的时间筛选独立于客户追踪详情的时间筛选。

**后置条件：**

- 营销统计已按所选时间显示，业务数据未发生修改。

---

#### UC-营销跟进-10 销售按客户负责人筛选营销统计

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "按客户负责人筛选营销统计" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售查看指定客户负责人名下客户的访问情况。
- **角色**：销售人员
- **前置条件**：销售已进入营销统计。
- **触发**：销售需要查看某位客户负责人或未分配客户的访问情况。

**主流程：**

1. 销售打开客户负责人筛选。
2. 系统展示「不限负责人」、当前项目中的客户负责人和「未分配」。
3. 销售选择一位客户负责人或「未分配」。
4. 系统按所选条件更新整体访问情况、页面排行和客户排行；进入页面统计详情时，该详情使用相同的时间和客户负责人条件。
5. 销售选择「不限负责人」。
6. 系统恢复展示不按客户负责人限制的统计。

**异常流程：**

- 4a. 所选负责人名下没有访问记录 → 系统显示「该负责人名下暂时没有访问记录」，并提供清除筛选操作。
- 4b. 数据读取失败 → 系统保留筛选条件，并显示错误提示和重试操作。

**业务规则：**

- 客户负责人筛选默认选择「不限负责人」。
- 「不限负责人」表示不按客户负责人限制统计范围，仍只统计产生过有效访问的数据，并包含未分配负责人客户的有效访问。
- 「未分配」包含当前没有负责人的客户。
- 客户负责人按客户资料中的当前负责人判断，不按页面创建人、固定链接创建人或其他操作人判断。
- 客户负责人筛选只是查看条件，不改变用户可以查看的统计数据范围。
- 时间筛选已经生效时，客户负责人筛选只统计所选时间内的数据。

**后置条件：**

- 营销统计已按所选客户负责人显示，业务数据未发生修改。

---

#### UC-营销跟进-11 销售搜索客户排行

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "搜索客户排行" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售按客户姓名在客户排行中找到目标客户。
- **角色**：销售人员
- **前置条件**：销售已进入营销统计。
- **触发**：销售需要在客户排行中找到某位客户。

**主流程：**

1. 销售输入客户姓名关键词。
2. 系统在当前时间和客户负责人筛选结果的客户排行中查找姓名包含关键词的客户。
3. 系统展示匹配的客户排行。
4. 销售清除关键词。
5. 系统恢复展示当前筛选条件下的全部客户排行。

**异常流程：**

- 3a. 没有客户符合关键词 → 系统显示无匹配客户的空状态，并保留关键词。

**业务规则：**

- 搜索只作用于客户排行，不重新计算整体访问情况、页面排行或页面统计详情。
- 搜索范围不包含所选时间内没有有效访问的客户。
- 搜索不改变时间或客户负责人筛选条件。

**后置条件：**

- 客户排行已按关键词显示，业务数据未发生修改。

---

#### UC-营销跟进-12 销售查看页面统计详情

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "查看页面统计详情" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售查看一个分享页面的内容浏览和访问客户情况。
- **角色**：销售人员
- **前置条件**：销售已进入营销统计，并看到页面排行。
- **触发**：销售需要了解某个分享页面的具体访问情况。

**主流程：**

1. 销售在页面排行中选择一个分享页面。
2. 系统展示该页面在当前筛选条件下的访问客户数、访问次数和平均访问时长。
3. 系统展示该页面中各项实际内容或素材的浏览客户数、浏览次数和累计有效浏览时长。
4. 系统展示访问过该页面的客户。
5. 销售返回营销统计。
6. 系统保留原时间和客户负责人筛选条件。

**异常流程：**

- 2a. 页面统计读取失败 → 系统显示错误提示和重试操作，不显示为没有访问。
- 3a. 页面没有可统计的内容浏览记录 → 系统保留页面访问数据，并显示内容浏览空状态。

**业务规则：**

- 页面统计详情使用营销统计当前的时间和客户负责人筛选条件。
- 内容默认按浏览客户数从高到低排列；浏览客户数相同时，依次按浏览次数和累计有效浏览时长排列。
- 访问客户默认按客户通过该页面产生的访问次数从高到低排列。
- 页面已删除时仍可查看历史统计详情，页面名称标记「页面已删除」，但不能进入已删除页面的编辑或预览页面。
- 用户同时具备「查看客户」和「购房客户追踪查看」功能权限时，客户提供进入客户追踪详情的操作。
- 用户缺少「查看客户」或「购房客户追踪查看」功能权限时，仍可查看客户数据，但不显示进入客户追踪详情的操作。
- 已删除客户显示为「已删除客户」，不提供进入客户资料或客户追踪详情的操作。
- 页面统计详情不展示单次访问过程。

**后置条件：**

- 页面统计和筛选条件未发生修改。

---

#### UC-营销跟进-13 销售查看内容浏览客户

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "查看内容浏览客户" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售查看哪些客户浏览过页面中的某项实际内容或素材。
- **角色**：销售人员
- **前置条件**：销售已进入页面统计详情，并看到内容浏览情况。
- **触发**：销售需要了解某项内容被哪些客户浏览。

**主流程：**

1. 销售在页面统计详情中选择一项实际内容或素材。
2. 系统展示在当前时间和客户负责人筛选条件下浏览过该项内容的客户名单。
3. 销售具备「查看客户」和「购房客户追踪查看」功能权限时，系统提供进入客户追踪详情的操作。

**异常流程：**

- 2a. 对应客户名单读取失败 → 系统显示错误提示和重试操作。
- 3a. 销售缺少「查看客户」或「购房客户追踪查看」功能权限 → 系统继续展示客户名单，但不显示进入客户追踪详情的操作。

**业务规则：**

- 客户名单只包含产生过有效浏览记录的已识别客户。
- 已删除客户在所选时间内浏览过该项内容时，继续进入客户名单并显示为「已删除客户」。
- 客户名单不向已删除客户提供进入客户资料或客户追踪详情的操作。
- 不同实际内容或素材分别展示客户名单。
- 匿名访问不进入客户名单。
- 系统不根据浏览记录判断客户意向。

**后置条件：**

- 客户和统计数据未发生修改。

---

#### UC-营销跟进-14 销售刷新营销统计

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "刷新营销统计" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售取得当前筛选条件下的最新营销统计。
- **角色**：销售人员
- **前置条件**：销售已进入营销统计。
- **触发**：销售需要立即查看最新统计结果。

**主流程：**

1. 销售选择手动刷新。
2. 系统保留当前时间、客户负责人和客户姓名搜索条件。
3. 系统取得最新统计，更新当前页面显示的整体访问情况、页面排行和客户排行。
4. 系统展示本次取得的统计数据对应的最后更新时间；没有产生新的统计数据时，最后更新时间保持不变。

**异常流程：**

- 3a. 数据读取失败 → 系统保留原统计结果和筛选条件，并显示错误提示和重试操作。

**业务规则：**

- 手动刷新不改变当前项目和筛选条件。
- 手动刷新只查询当前可用的最新统计，不自行改变统计数据最后更新时间。
- 访问次数、访问客户数、页面排行和客户排行数据应在访问开始后 1 分钟内更新。
- 有效访问时长、平均访问时长和内容浏览时长应在访问结束后 5 分钟内更新。
- 页面不根据未结束访问推算平均访问时长。

**后置条件：**

- 页面已展示最新可用统计，业务数据未发生修改。

---

#### UC-营销跟进-15 销售进行并结束现场讲解

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "进行并结束现场讲解" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售完成一次现场讲解并保存实际展示记录。
- **角色**：销售人员
- **前置条件**：销售已开始现场讲解，并具备「进行现场讲解」和目标页面的「查看分享页面」功能权限。
- **触发**：销售开始向身边客户展示页面内容。

**主流程：**

1. 系统使用页面最新保存内容展示讲解页面。
2. 销售在页面中打开需要讲解的内容。
3. 系统记录实际打开内容、第一次和最后一次打开时间、打开次数及可靠的页面前台展示时长。
4. 销售可以在未关联客户时选择已有客户，或创建客户后关联。
5. 销售选择「结束讲解」。
6. 系统结束本次讲解，展示页面、客户关联、首次开始时间、结束时间、结束方式和展示内容摘要。

**异常流程：**

- 3a. 页面切到后台、设备锁屏或页面关闭 → 系统停止计算对应期间的展示时长。
- 4a. 销售选择已有客户但缺少「查看客户」功能权限 → 系统不允许关联客户，讲解继续保持未关联。
- 4b. 销售创建客户但缺少「创建客户」功能权限 → 系统不展示创建客户操作。
- 5a. 结束结果未能保存 → 系统将记录标记为「未正常结束」，保留最后可靠记录时间。
- 6a. 当前项目、账号、项目访问、讲解权限或页面查看权限失效 → 系统停止讲解，保存已经可靠记录的内容，并记录对应结束方式。

**业务规则：**

- 页面在讲解期间保存新内容时，讲解页面刷新或重新请求内容后使用最新内容；来源页面下架、删除或分享页面被删除时，系统停止讲解，并保留已经可靠记录的内容。
- 页面前台总展示时长按讲解页面实际处于前台的可靠时间计算；多个内容区域同时显示时不能重复相加。
- 展示记录只表示销售展示了什么，不表示客户关注、喜欢或具有购买意向。
- 客户在讲解中被删除时，讲解可以结束，关联客户显示为「已删除客户」。
- 现场讲解不产生客户自主访问数据，也不自动修改客户状态。

**后置条件：**

- 系统已保存一条结束或未正常结束的现场讲解记录；客户自主访问数据未发生修改。

---

#### UC-营销跟进-16 销售处理未正常结束的讲解

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "处理未正常结束的讲解" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售继续或结束自己未正常结束的现场讲解。
- **角色**：销售人员
- **前置条件**：销售在当前项目存在一条未正常结束的现场讲解记录。
- **触发**：销售重新打开原讲解、开始另一场讲解或进入自己的讲解记录。

**主流程：**

1. 系统展示原讲解页面、客户关联、首次开始时间、最后可靠记录时间和已有展示摘要。
2. 系统要求销售选择「继续讲解」或「结束讲解」。
3. 销售选择「继续讲解」。
4. 系统使用同一条记录和页面最新保存内容恢复讲解，并保存本次恢复时间。
5. 销售结束讲解。
6. 系统按各段可靠展示时长之和更新记录。

**异常流程：**

- 3a. 销售选择「结束讲解」 → 系统以最后可靠记录时间作为结束时间，以本次操作时间作为异常处理时间，并结束记录。
- 4a. 销售缺少「进行现场讲解」或页面查看权限 → 系统不允许继续，只允许按最后可靠记录时间结束。
- 4b. 恢复失败 → 系统保留原记录和已有可靠时长，提示重试或结束讲解。

**业务规则：**

- 首次开始时间在恢复后保持不变。
- 未正常结束至恢复之间的时间不计入页面前台展示时长。
- 异常处理时间不能替代最后可靠记录时间或结束时间。
- 销售未处理原记录前不能开始另一场讲解。

**后置条件：**

- 原记录已经继续进行或结束；系统没有创建第二条进行中记录。

---

#### UC-营销跟进-17 销售查看自己的讲解记录

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "查看自己的讲解记录" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售查看并处理自己在当前项目进行的现场讲解。
- **角色**：销售人员
- **前置条件**：销售已进入当前项目。
- **触发**：销售需要查看当天讲过的页面或处理未关联、未正常结束的记录。

**主流程：**

1. 销售进入营销跟进中的「讲解记录」。
2. 系统按开始时间倒序展示讲解页面、关联客户或「未关联客户」、首次开始时间、结束状态、有效状态和页面前台总展示时长。
3. 销售打开一条记录。
4. 系统展示页面名称、开始与结束情况，以及实际打开内容的次数和展示时长。

**异常流程：**

- 2a. 没有讲解记录 → 系统显示空状态。
- 2b. 数据读取失败 → 系统显示错误提示和重试操作，不显示为空状态。
- 4a. 销售缺少「查看客户」权限 → 系统隐藏关联客户身份和客户入口，继续展示讲解页面、时间、状态和展示摘要。

**业务规则：**

- 讲解记录默认只展示当前登录销售在当前项目发起的记录。
- 该列表不提供按其他销售人员查看、比较或排名。
- 无效讲解继续保留并显示「无效讲解」及理由。
- 已关联客户的日常查看以购房客户追踪为主。
- 查看关联客户身份和进入客户追踪需要「查看客户」和「购房客户追踪查看」功能权限。

**后置条件：**

- 讲解记录未发生修改。

---

#### UC-营销跟进-18 销售修改现场讲解客户关联

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "修改现场讲解客户关联" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售把现场讲解记录改为关联正确的客户。
- **角色**：销售人员
- **前置条件**：销售具备「进行现场讲解」和「查看客户」功能权限，目标记录由本人创建且不是无效讲解。
- **触发**：销售发现未关联记录需要关联客户，或已关联记录选错了客户。

**主流程：**

1. 销售打开自己的讲解记录详情。
2. 销售选择当前项目内另一位未删除客户。
3. 系统要求销售填写修改理由，并展示修改前客户和修改后客户。
4. 销售填写理由并确认修改。
5. 系统更新当前客户关联。
6. 系统从原客户的购房客户追踪移除该记录，并将记录放入新客户的购房客户追踪。
7. 系统在讲解记录中保存修改前客户、修改后客户、修改理由、操作人和操作时间。

**异常流程：**

- 2a. 目标客户已删除或不属于当前项目 → 系统不允许选择。
- 3a. 修改理由为空或去除首尾空格后为空 → 系统提示填写理由，不保存修改。
- 4a. 权限在确认前被收回 → 系统不修改客户关联，并显示无权限提示。
- 5a. 保存失败 → 系统保留原客户关联和原客户时间线，提示重试。

**业务规则：**

- 修改客户关联不增加新的现场讲解记录，也不修改页面、展示内容和时长。
- 修改客户关联不是一种讲解状态，不设置「关联错误」状态或标记；修改后以当前关联客户为准。
- 修改理由仅供内部查看，不进入客户追踪时间线。
- 客户追踪只展示当前有效客户关联，不同时展示修改前客户。
- 无效讲解不能修改客户关联。

**后置条件：**

- 讲解记录已关联当前正确客户，并保留完整关联修改历史。

---

#### UC-营销跟进-19 销售将现场讲解标记无效

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales

usecase "将现场讲解标记无效" as UC1

Sales --> UC1
@enduml
```

- **用例目标**：销售将误操作或测试产生的记录排除出正式讲解历史。
- **角色**：销售人员
- **前置条件**：销售具备「进行现场讲解」功能权限，目标记录由本人创建且已经结束。
- **触发**：销售确认该记录不代表一次真实现场讲解。

**主流程：**

1. 销售打开自己的讲解记录详情并选择「标记无效」。
2. 系统展示该记录的页面、客户关联、开始时间和影响范围，并进行二次确认。
3. 系统要求销售填写无效理由。
4. 销售填写理由并确认。
5. 系统将记录标记为「无效讲解」。
6. 系统从客户追踪、待跟进客户最近活跃时间和最近行为中排除该记录。
7. 系统保存无效理由、操作人和操作时间。

**异常流程：**

- 2a. 记录仍在进行中或未正常结束 → 系统要求先结束记录，不允许标记无效。
- 3a. 无效理由为空或去除首尾空格后为空 → 系统提示填写理由，不保存修改。
- 4a. 销售取消二次确认 → 系统保持原记录不变。
- 5a. 保存失败 → 系统保持记录有效，并提示重试。

**业务规则：**

- 无效讲解保留原页面、客户关联、时间、展示内容、理由、操作人和操作时间。
- 无效讲解不能恢复、继续讲解或修改客户关联。
- 标记无效不删除讲解记录。
- 需要保留的真实讲解应重新开始并形成新记录。

**后置条件：**

- 记录已标记为无效，并从客户追踪和最近活跃数据中排除。

---

#### UC-营销跟进-20 项目管理员处理停用成员异常讲解

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "处理停用成员异常讲解" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员处理已经无法进入项目的成员留下的异常讲解记录。
- **角色**：项目管理员
- **前置条件**：目标讲解人的当前项目访问已停用，项目管理员具备处理目标记录所需的客户权限。
- **触发**：项目管理员需要处理停用成员留下的未正常结束、未关联客户或误操作记录。

**主流程：**

1. 项目管理员进入停用成员异常讲解列表。
2. 系统只展示该成员留下的未正常结束、未关联客户或可标记无效的记录。
3. 项目管理员打开目标记录。
4. 项目管理员选择结束未正常结束记录、关联或修改客户关联，或者标记无效。
5. 系统要求项目管理员填写处理理由。
6. 项目管理员填写理由并确认。
7. 系统保存处理结果、理由、处理人和处理时间。

**异常流程：**

- 2a. 目标成员仍可进入当前项目 → 系统不向项目管理员展示其异常讲解，由讲解人自行处理。
- 4a. 项目管理员选择客户但缺少「查看客户」权限 → 系统不允许关联或修改客户关联。
- 4b. 项目管理员选择创建客户但缺少「创建客户」权限 → 系统不展示创建客户操作。
- 5a. 处理理由为空或去除首尾空格后为空 → 系统提示填写理由，不保存处理。
- 7a. 保存失败 → 系统保留原记录，提示重试。

**业务规则：**

- 项目管理员不能通过该入口浏览停用成员的其他正常讲解记录。
- 结束未正常结束记录时，结束时间使用最后可靠记录时间，当前处理时间另记为异常处理时间。
- 修改客户关联后，客户追踪只展示新的有效关联。
- 标记无效后，记录不进入任何客户追踪或最近活跃数据。

**后置条件：**

- 停用成员留下的目标异常记录已经处理，并保留项目管理员的处理理由和时间。

---

#### UC-营销跟进-21 销售报告访问数据问题

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售人员" as Sales
usecase "报告访问数据问题" as UC1
Sales --> UC1
@enduml
```

- **用例目标**：销售报告一条访问记录中的归属、重复、时长或非客户问题。
- **角色**：销售人员
- **前置条件**：销售已进入客户追踪或分享页面访问记录，并可以查看目标访问。
- **触发**：销售发现访问数据可能不准确。

**主流程：**

1. 销售在目标访问中选择「报告问题」。
2. 系统展示访问客户、页面、进入时间和当前数据状态。
3. 销售选择问题类型，并可以填写补充说明。
4. 销售提交问题。
5. 系统将访问数据标记为待检查，保留报告人、报告时间、问题类型和说明。

**异常流程：**

> 3a. 销售未选择问题类型 → 系统提示选择问题类型，不提交。

> 4a. 目标访问已进入待检查 → 系统显示已有问题类型和提交时间，不重复提交。

> 4b. 目标访问已被纠正或排除 → 系统显示当前处理结果，不使用旧页面内容提交。

> 5a. 提交失败 → 系统保留已填内容，提示重试。

**业务规则：**

- 问题类型包括归属错误、重复计算、异常时长、非客户访问和其他数据问题。
- 可以查看目标访问的项目成员都可以报告问题。
- 待检查数据保留在访问记录中，但暂不进入营销统计或新的 AI 建议依据。
- 报告问题不直接改变客户归属、访问次数或时长。

**后置条件：**

- 目标访问已进入待检查，并保留问题报告。

---

#### UC-营销跟进-22 销售经理纠正访问数据

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "销售经理" as Manager
usecase "纠正访问数据" as UC1
Manager --> UC1
@enduml
```

- **用例目标**：销售经理检查待处理的访问数据并确认正确结果。
- **角色**：销售经理
- **前置条件**：销售经理具备「纠正访问数据」功能权限，并已打开一条待检查访问。
- **触发**：销售经理需要处理已报告或系统发现的数据问题。

**主流程：**

1. 系统展示原访问记录、当前客户归属、问题类型、报告说明和已有数据状态。
2. 销售经理选择确认原记录有效、更正客户归属或排除记录。
3. 更正客户归属时，销售经理选择当前项目内未删除的目标客户。
4. 销售经理填写纠正理由并确认。
5. 系统保存纠正结果、纠正前结果、操作人、操作时间和理由。
6. 系统将受影响的客户追踪和营销统计标记为数据更新中。
7. 重新计算完成后，系统更新相关明细、汇总、排行、最近活动和数据最后更新时间。

**异常流程：**

> 2a. 选择排除记录 → 系统要求选择排除原因；保存后记录标记为已排除。

> 3a. 目标客户已删除或不属于当前项目 → 系统不允许选择。

> 4a. 理由为空或去除首尾空格后为空 → 系统提示填写理由，不保存。

> 5a. 目标访问已被其他人处理 → 系统显示最新结果，不覆盖已有处理。

> 5b. 保存失败 → 系统保留原记录和已填内容，提示重试。

> 7a. 重新计算失败 → 系统显示更新失败和重试操作，不把旧结果显示为最新数据。

**业务规则：**

- 项目管理员和销售经理默认具备「纠正访问数据」功能权限；自定义角色可通过权限配置获得。
- 纠正不提供直接填写访问次数、浏览次数或时长的操作。
- 无法确认正确客户时，只能排除记录，不归入推测的客户。
- 纠正不删除原始访问事实或原纠正记录。
- 纠正结果进入操作日志。
- 数据状态或归属变化后，受影响的旧 AI 结果由 AI PRD 按依据变化规则处理。

**后置条件：**

- 访问数据已按确认结果保留、更正归属或排除。
- 受影响的客户追踪和营销统计已重新计算或明确显示更新状态。

---

## 系统设置

> 本节用例按默认执行角色「项目管理员」命名。项目成员被分配项目管理员角色后，可以执行对应操作；自定义角色获得相同功能权限时，也可以执行相应用例。A 端负责企业、租户、项目和首个项目管理员关系的开通；统一登录服务负责用户身份认证和密码处理；VISTA Link 负责项目成员关系、角色和功能权限。旧 VISTA 的账户、项目成员关系和角色权限可以由技术人员一次性迁移，但该过程不在 VISTA Link 界面执行，因此不建立项目管理员用例。

#### UC-系统设置-01 项目管理员浏览项目成员列表

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "浏览项目成员列表" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员查看当前项目的 VISTA Link 项目成员。
- **角色**：项目管理员
- **前置条件**：项目管理员已登录，并具备「查看成员」功能权限。
- **触发**：项目管理员需要查看当前项目中的项目成员。

**主流程：**

1. 项目管理员进入项目成员管理。
2. 系统按当前项目读取项目成员。
3. 列表展示成员在当前项目中的显示名称、登录邮箱、项目访问状态和角色摘要。

**业务规则：**

- 项目成员状态包括待接受、启用和停用。
- 项目成员列表至少包含当前登录的项目管理员本人。
- 项目成员列表只展示当前项目成员，不展示该用户在其他项目中的角色和状态。
- 项目成员列表不展示成员来源。
- 项目成员列表使用当前项目显示名称，不使用账号姓名代替。
- 项目成员列表不提供修改其他用户账号姓名、登录邮箱、密码或登录账号状态的操作。

**后置条件：**

- 成员数据未发生修改。

---

#### UC-系统设置-02 项目管理员查看项目成员详情

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "查看项目成员详情" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员查看成员在当前项目中的显示名称、登录邮箱、访问状态和角色。
- **角色**：项目管理员
- **前置条件**：项目管理员已进入项目成员列表。
- **触发**：项目管理员需要查看某个项目成员在当前项目中的状态和角色。

**主流程：**

1. 项目管理员从成员列表打开目标成员。
2. 系统展示成员在当前项目中的显示名称、只读登录邮箱、项目访问状态和一个或多个角色。

**异常流程：**

- 1a. 目标成员不属于当前项目，或已不存在 → 系统不展示成员详情。

**业务规则：**

- 项目成员状态包括待接受、启用和停用。
- 项目成员必须绑定一个或多个当前项目角色。
- 成员详情不逐项展开多个角色合并后的功能权限。
- 成员详情不展示项目名称、其他项目中的成员关系或成员来源。
- 成员详情允许修改当前项目显示名称和角色，不提供修改账号姓名、登录邮箱或登录凭证的操作。

**后置条件：**

- 成员数据未发生修改。

---

#### UC-系统设置-03 项目管理员通过邮件邀请项目成员

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "邮件邀请项目成员" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员填写当前项目显示名称和登录邮箱、分配一个或多个角色并发送项目邀请邮件。
- **角色**：项目管理员
- **前置条件**：项目管理员已进入项目成员列表，并具备「邀请成员」功能权限。
- **触发**：项目管理员需要邀请用户进入项目。

**主流程：**

1. 项目管理员在成员管理选择「邀请成员」。
2. 系统展示显示名称、登录邮箱和角色选择。
3. 项目管理员填写显示名称和登录邮箱，并选择一个或多个角色。
4. 项目管理员确认邀请。
5. 系统检查显示名称、邮箱、项目成员关系和已选角色。
6. 系统向目标邮箱发送邀请邮件。
7. 邮件发送成功后，系统创建待接受状态的项目成员关系，并保存当前项目显示名称和所选角色。
8. 系统记录当前项目显示名称、目标邮箱、已分配角色、操作人和操作时间。

**异常流程：**

- 3a. 显示名称去除首尾空格后为空 → 系统在显示名称字段旁提示，且不提交。
- 3b. 邮箱为空或格式错误 → 系统在邮箱字段旁提示，且不提交。
- 5a. 目标邮箱已经是启用或停用成员 → 系统不重复邀请，并提示查看现有成员。
- 5b. 目标邮箱已有待接受邀请 → 系统提示当前邀请状态，并允许在符合重发限制时重新发送。
- 5c. 没有选择角色 → 系统不邀请成员，并提示至少选择一个角色。
- 5d. 保存前，已选择的角色被删除 → 系统不邀请成员，并刷新可选角色。
- 6a. 邀请邮件发送失败 → 系统提示发送失败，不创建项目成员关系，也不计入发送次数；用户可以重新邀请。

**业务规则：**

- 本用例通过邮件发出项目邀请；只有邮件发送成功才创建待接受成员，邮件未发出不计为邀请成功。
- 同一邀请邮箱最多成功发送 10 次邀请邮件，不按 24 小时重置；两次成功发送至少间隔 60 秒。
- 邀请地址自成功发送起 7 天有效，成功接受后不能再次使用。
- 已有 HOMEVISTA 统一账号的用户使用原账号接受邀请；新用户由统一账号通过另一封邮件取得初始密码。
- 待接受成员尚未从邀请地址完成确认，不能进入当前项目。
- 用户接受邀请的流程见「UC-登录与账号访问-08 受邀用户接受项目邀请」。
- 项目管理员可以在成员详情修改待接受成员的显示名称和角色。
- 受邀成员的当前项目显示名称使用邀请时填写的名称。
- 当前项目显示名称不修改用户的账号姓名或其他项目中的显示名称。
- 登录邮箱用于识别登录账号，成员创建后在成员管理中只读。
- 受邀成员必须分配一个或多个角色。
- 成员有多个角色时，系统合并这些角色的功能权限，不指定其中一个角色为默认角色。
- 同一用户可以属于多个项目；本次邀请不改变该用户在其他项目中的角色和状态。
- 登录账号和密码由统一登录服务处理，成员邀请界面不展示 SSO 技术名称。

**后置条件：**

- 邀请邮件发送成功后已建立待接受成员、分配角色并留下操作记录。

---

#### UC-系统设置-04 项目管理员编辑项目成员显示名称和角色

- **优先级**：P1

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "编辑项目成员显示名称和角色" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员修改目标成员在当前项目中的显示名称，并增加或移除角色。
- **角色**：项目管理员
- **前置条件**：项目管理员具备「调整成员角色」功能权限，且目标成员属于当前项目。
- **触发**：项目管理员需要修改目标成员的当前项目显示名称或角色。

**主流程：**

1. 项目管理员打开成员详情。
2. 系统展示可编辑的当前项目显示名称、只读登录邮箱、当前角色和当前项目内可选角色。
3. 项目管理员修改显示名称，增加或移除角色，并确认保存。
4. 系统更新成员在当前项目中的显示名称和角色；目标成员处于启用状态时，当前项目访问状态立即失效，需要重新进入项目。
5. 系统记录目标成员、修改前后显示名称、修改前后角色、操作人和操作时间。

**异常流程：**

- 3a. 显示名称去除首尾空格后为空 → 系统拒绝保存，并在显示名称字段旁提示。
- 3b. 调整后成员没有任何角色 → 系统拒绝保存，并提示至少保留一个角色。
- 3c. 项目管理员尝试移除自己的项目管理员角色 → 系统拒绝保存，并提示需由其他项目管理员操作。
- 3d. 项目管理员尝试移除当前项目最后一名项目管理员的项目管理员角色 → 系统拒绝保存，并提示当前项目必须保留至少一名项目管理员。
- 3e. 保存前，已选择的角色被删除 → 系统不保存修改，并刷新可选角色。

**业务规则：**

- 成员显示名称只在当前项目使用，不修改账号姓名、登录邮箱或其他项目中的显示名称。
- 登录邮箱在成员详情中只读。
- 成员必须保留一个或多个当前项目内角色；多个角色的功能权限合并计算。
- 系统不为成员指定默认角色。
- 角色变更只影响目标成员在当前项目中的功能权限，不改变其在其他项目中的角色。
- 待接受成员和启用成员都可以修改显示名称和角色。
- 停用成员不能修改显示名称和角色；重新启用后可以修改。
- 角色变更后，启用成员当前项目访问状态失效；重新进入项目后使用最新功能权限。

**后置条件：**

- 目标成员在当前项目中的显示名称和角色已更新，并留下操作记录。

---

#### UC-系统设置-05 项目管理员停用或启用项目访问

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "停用或启用项目访问" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员调整目标成员是否可以进入当前项目。
- **角色**：项目管理员
- **前置条件**：项目管理员具备「停用或启用项目访问」功能权限，并已打开目标成员。
- **触发**：项目管理员需要停止或恢复目标成员对当前项目的访问。

**主流程：**

1. 系统展示目标成员当前的项目访问状态和可执行操作。
2. 状态为启用时，项目管理员选择「停用」；状态为停用时，项目管理员选择「启用」。
3. 选择「停用」时，系统说明该成员将不能继续访问当前项目，同时展示其当前负责客户数量，并要求确认。
4. 项目管理员确认停用；选择「启用」时，系统不显示确认提示，直接进入下一步。
5. 系统检查目标成员和本次状态变更。
6. 系统更新目标成员在当前项目中的访问状态。
7. 停用时，系统立即终止该成员对当前项目的访问；如果该成员正处于当前项目，系统返回项目选择页。
8. 系统记录目标成员、修改前状态、修改后状态、操作人和操作时间。

**异常流程：**

- 5a. 项目管理员尝试停用自己对当前项目的访问 → 系统拒绝操作，并提示不能停用当前项目中的自己。
- 5b. 项目管理员尝试停用当前项目最后一名处于启用状态的项目管理员 → 系统拒绝操作，并提示必须保留至少一名可用项目管理员。
- 5c. 目标成员已不存在，或项目访问状态已被其他操作改变 → 系统不保存本次修改，并刷新成员状态。

**业务规则：**

- 项目访问状态只包括启用和停用。
- 停用不删除项目成员、角色、业务数据或历史记录。
- 停用不清空客户负责人；该成员负责的客户继续显示「姓名（已停用）」。
- 停用后，该成员不能在项目选择页选择当前项目，也不能通过旧地址继续访问当前项目数据。
- 停用或启用只影响当前项目，不改变登录账号，也不影响该用户访问其他项目。
- 重新启用后，该项目重新出现在成员的可访问项目列表中。

**后置条件：**

- 目标成员在当前项目中的访问状态已更新，并留下操作记录。

---

#### UC-系统设置-06 项目管理员浏览角色列表

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "浏览角色列表" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员查看当前项目可用的默认角色和自定义角色。
- **角色**：项目管理员
- **前置条件**：项目管理员已登录，并具备「查看角色」功能权限。
- **触发**：项目管理员需要查看当前项目已有的角色。

**主流程：**

1. 项目管理员进入角色管理。
2. 系统展示四个默认角色和当前项目创建的自定义角色。
3. 每个角色展示角色名称、角色类型和当前使用人数。

**业务规则：**

- 默认角色为销售人员、销售经理、营销企划和项目管理员。
- 角色类型包括默认角色和自定义角色。
- 当前使用人数为当前项目内已绑定该角色的成员数量；没有成员使用时显示为 0。
- 角色列表不展示功能权限数量。
- 角色列表只显示当前项目角色，不展示其他项目中的同名角色。

**后置条件：**

- 角色数据未发生修改。

---

#### UC-系统设置-07 项目管理员查看角色详情

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "查看角色详情" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员查看角色及其功能权限。
- **角色**：项目管理员
- **前置条件**：项目管理员已进入角色列表。
- **触发**：项目管理员需要了解某个角色允许执行哪些操作。

**主流程：**

1. 项目管理员从角色列表打开目标角色。
2. 系统展示角色名称、角色类型、当前使用人数，以及按菜单模块分组的已配置功能权限。

**异常流程：**

- 1a. 目标角色已不存在，或不属于当前项目 → 系统不展示角色详情。

**业务规则：**

- 数据范围不属于角色字段，不在角色详情中展示为可配置项。
- 默认角色的功能权限可以调整，但默认项目管理员角色必须保留 PRD §4.7.2 列出的功能权限。
- 角色详情只反映当前项目配置；其他项目中的同名角色可以有不同权限。

**后置条件：**

- 角色数据未发生修改。

---

#### UC-系统设置-08 项目管理员创建自定义角色

- **优先级**：P2-B

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "创建自定义角色" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员在当前项目内创建自定义角色。
- **角色**：项目管理员
- **前置条件**：项目管理员已进入角色列表，并具备「创建角色」功能权限。
- **触发**：现有角色不能满足当前项目的需要。

**主流程：**

1. 项目管理员在角色管理选择「创建角色」。
2. 系统展示角色名称和按菜单模块分组的功能权限选项。
3. 项目管理员输入角色名称，并选择一个或多个功能权限。
4. 项目管理员保存角色。
5. 系统检查角色名称和功能权限。
6. 系统在当前项目内创建自定义角色。
7. 系统记录角色名称、功能权限、操作人和操作时间。

**异常流程：**

- 5a. 角色名称去除首尾空格后为空 → 系统不创建角色，并提示填写角色名称。
- 5b. 角色名称与当前项目内的默认角色或自定义角色重名 → 系统不创建角色，并提示该角色名称已存在。
- 5c. 没有选择功能权限 → 系统不创建角色，并提示至少选择一个功能权限。

**业务规则：**

- 自定义角色只能使用系统已定义的功能权限点。
- 功能权限按左侧菜单对应的一级模块分组，组内列出该模块的具体权限。
- 自定义角色不配置通用数据范围；成员的数据范围按当前项目和业务对象规则判断。
- 创建的角色只在当前项目可用，不自动复制到其他项目。

**后置条件：**

- 当前项目内新增一个自定义角色，并留下操作记录。

---

#### UC-系统设置-09 项目管理员修改自定义角色名称

- **优先级**：P2-B

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "修改自定义角色名称" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员修改当前项目内自定义角色的名称。
- **角色**：项目管理员
- **前置条件**：项目管理员具备「修改角色」功能权限，并已打开目标自定义角色。
- **触发**：项目管理员需要使自定义角色名称更符合当前用途。

**主流程：**

1. 项目管理员选择修改角色名称。
2. 系统展示当前角色名称。
3. 项目管理员输入新名称并保存。
4. 系统检查新名称。
5. 系统更新角色名称。
6. 系统记录目标角色、修改前名称、修改后名称、操作人和操作时间。

**异常流程：**

- 4a. 新名称去除首尾空格后为空 → 系统不保存，并提示填写角色名称。
- 4b. 新名称与当前项目内的默认角色或其他自定义角色重名 → 系统不保存，并提示该角色名称已存在。
- 4c. 目标角色已被删除 → 系统不保存，并返回角色列表。

**业务规则：**

- 默认角色名称固定，系统不提供修改入口。
- 修改角色名称不改变该角色的功能权限和成员绑定关系。
- 修改只影响当前项目中的目标角色。

**后置条件：**

- 目标自定义角色名称已更新，并留下操作记录。

---

#### UC-系统设置-10 项目管理员配置角色功能权限

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "配置角色功能权限" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员调整角色可执行的操作。
- **角色**：项目管理员
- **前置条件**：项目管理员具备「配置权限」功能权限，并已打开目标角色。
- **触发**：项目管理员需要调整该角色可以执行哪些操作。

**主流程：**

1. 项目管理员打开目标角色的功能权限配置。
2. 系统按左侧菜单对应的一级模块分组展示可配置权限点和该角色当前配置。
3. 项目管理员选择需要授予或移除的功能权限并保存。
4. 系统检查修改后的功能权限。
5. 系统更新角色功能权限。
6. 使用该角色的成员在下一次操作时使用最新功能权限。
7. 系统记录目标角色、修改前功能权限、修改后功能权限、操作人和操作时间。

**异常流程：**

- 4a. 修改后没有保留任何功能权限 → 系统拒绝保存，并提示至少保留一个功能权限。
- 4b. 项目管理员尝试移除默认项目管理员角色必须保留的功能权限 → 系统拒绝保存，并提示该权限不能移除。
- 4c. 目标角色已被删除 → 系统不保存，并返回角色列表。

**业务规则：**

- 功能权限决定用户可以执行哪些操作；用户仍须处于目标数据的可访问范围内。
- 功能权限必须按菜单模块分组展示，不能用一整块无分组列表展示。
- 默认角色和自定义角色都必须保留至少一个功能权限。
- 默认项目管理员角色必须保留以下功能权限：查看成员、邀请成员、调整成员角色、停用或启用项目访问、查看角色、创建角色、修改角色、删除角色、配置权限和查看操作日志。
- 数据范围不在角色中配置。
- 功能权限修改只影响当前项目中的目标角色。

**后置条件：**

- 目标角色的功能权限已更新，并留下操作记录。

---

#### UC-系统设置-11 项目管理员删除角色

- **优先级**：P2-C

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "删除角色" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员删除当前项目不再使用的角色。
- **角色**：项目管理员
- **前置条件**：项目管理员具备「删除角色」功能权限，并已进入角色列表。
- **触发**：当前项目不再需要某个自定义角色。

**主流程：**

1. 项目管理员从角色列表选择目标自定义角色。
2. 项目管理员选择「删除」。
3. 系统展示角色名称并要求确认删除。
4. 项目管理员确认删除。
5. 系统再次检查角色类型和当前使用人数。
6. 系统删除自定义角色。
7. 系统记录目标角色、删除前角色名称、功能权限、操作人和操作时间。

**异常流程：**

- 5a. 目标角色已被分配给一个或多个成员 → 系统不删除角色，并提示先移除成员的角色绑定。
- 5b. 目标角色已被其他操作删除 → 系统返回角色列表。

**业务规则：**

- 系统不为默认角色提供删除入口。
- 已分配给成员的自定义角色不能删除。
- 删除自定义角色不改变其他角色、成员或历史操作日志。
- 删除只影响当前项目中的目标角色。

**后置条件：**

- 目标自定义角色已删除，并留下操作记录。

---

#### UC-系统设置-12 项目管理员查看操作日志

- **优先级**：P2-A

```plantuml
@startuml
left to right direction
actor "项目管理员" as Admin

usecase "查看操作日志" as UC1

Admin --> UC1
@enduml
```

- **用例目标**：项目管理员集中查看当前项目内需要留存的操作记录。
- **角色**：项目管理员
- **前置条件**：项目管理员已登录，并具备「查看操作日志」功能权限。
- **触发**：项目管理员需要确认某项数据由谁或由什么功能在何时修改。

**主流程：**

1. 项目管理员进入系统设置中的操作日志。
2. 系统按操作时间倒序展示当前项目内的日志。
3. 每条日志展示所属功能、对象类型、对象名称或编号、操作内容、修改前内容、修改后内容、操作人或系统来源和操作时间。
4. 项目管理员按所属功能、对象类型、对象名称或编号、操作人或时间范围筛选日志。
5. 日志超过一页时，项目管理员翻页查看其他记录。

**异常流程：**

- 2a. 当前项目尚无操作日志 → 系统展示暂无记录。
- 4a. 没有符合筛选条件的日志 → 系统展示暂无符合条件的记录。

**业务规则：**

- 操作日志入口统一放在系统设置中；客户详情和其他业务详情不单独提供操作日志入口。
- 日志对象类型固定包括成员、角色、客户、客户状态、客户标签、素材、素材标签、页面、Widget、固定链接、访问数据和客户与固定链接关系；项目管理员不能新增、修改或删除对象类型。
- 日志包括邮件邀请项目成员、成员显示名称、成员角色和项目访问状态、角色管理、客户资料与客户基础配置、素材说明、素材标签、分享页面新建/复制/编辑/删除、Widget 与页面内容修改、固定链接公开和启停等需要留存的操作。
- 销售指定客户并首次建立客户与固定链接的关系时，日志记录固定链接、目标客户、操作人和操作时间；重复取得同一访问地址时不新增记录，不记录完整客户标识参数。
- 客户通过无参数固定链接完成身份认证并建立关系时，日志记录固定链接、客户、认证方式和操作时间，不记录邮箱验证码。
- 客户与固定链接的关系日志不记录链接内容、链接复制或二维码展示。
- 客户删除后的 90 天保留期内，相关日志继续显示客户姓名或编号，便于项目管理员确认删除和恢复操作；最终匿名化后，日志改为匿名客户标识。
- 客户删除和恢复均记录操作人、操作时间和客户标识；恢复不会删除原删除日志。
- 访问数据纠正日志记录纠正前结果、纠正后结果、理由、操作人和操作时间。
- 操作日志只能查看，不能修改或删除。
- 日志不得记录密码、认证凭证、Token、VISTA Link 登录会话凭证、邮箱验证码或完整客户标识参数。

**后置条件：**

- 操作日志和业务数据均未发生修改。
