# Spec: 中介人员黑名单管理

## ADDED Requirements

### Requirement: 系统SHALL支持查询中介黑名单列表

系统MUST提供查询功能，允许用户查询系统中已维护的中介人员/机构黑名单列表，以便了解当前黑名单库的内容。

#### Scenario: 分页查询中介黑名单列表

**Given** 用户已登录系统且具有 `dpc:intermediary:list` 权限
**When** 用户访问中介库管理页面
**Then** 系统应显示中介黑名单列表，支持分页展示

#### Scenario: 按名称模糊搜索中介黑名单

**Given** 用户已登录系统且具有 `dpc:intermediary:list` 权限
**And** 系统中存在姓名为"张三"的中介人员
**When** 用户在搜索框输入"张"并点击搜索
**Then** 系统应返回所有姓名中包含"张"的中介记录

#### Scenario: 按证件号精确搜索中介黑名单

**Given** 用户已登录系统且具有 `dpc:intermediary:list` 权限
**And** 系统中存在证件号为"110101199001011234"的中介人员
**When** 用户在搜索框输入"110101199001011234"并点击搜索
**Then** 系统应返回该证件号对应的中介记录

#### Scenario: 按中介类型筛选中介黑名单

**Given** 用户已登录系统且具有 `dpc:intermediary:list` 权限
**And** 系统中存在个人和机构两种类型的中介记录
**When** 用户选择中介类型为"个人"并点击搜索
**Then** 系统应仅返回中介类型为"个人"的记录

#### Scenario: 按状态筛选中介黑名单

**Given** 用户已登录系统且具有 `dpc:intermediary:list` 权限
**And** 系统中存在正常和停用两种状态的中介记录
**When** 用户选择状态为"正常"并点击搜索
**Then** 系统应仅返回状态为"正常"的记录

#### Scenario: 组合条件查询中介黑名单

**Given** 用户已登录系统且具有 `dpc:intermediary:list` 权限
**When** 用户同时输入名称"张"、选择中介类型为"个人"、选择状态为"正常"并点击搜索
**Then** 系统应返回同时满足所有条件的记录

---

### Requirement: 系统SHALL支持新增中介黑名单

系统MUST提供新增功能，允许用户手动添加中介人员或机构到黑名单中，以建立和维护黑名单库。

#### Scenario: 新增个人类型的中介黑名单

**Given** 用户已登录系统且具有 `dpc:intermediary:add` 权限
**When** 用户点击"新增"按钮
**And** 填写姓名为"张三"
**And** 填写证件号为"110101199001011234"
**And** 选择中介类型为"个人"
**And** 选择状态为"正常"
**And** 点击"确定"按钮
**Then** 系统应保存中介信息并提示"操作成功"
**And** 列表中应显示新增的记录

#### Scenario: 新增机构类型的中介黑名单

**Given** 用户已登录系统且具有 `dpc:intermediary:add` 权限
**When** 用户点击"新增"按钮
**And** 填写机构名称为"XX中介公司"
**And** 填写证件号为"91110000XXXXXXXXXX"
**And** 选择中介类型为"机构"
**And** 选择状态为"正常"
**And** 点击"确定"按钮
**Then** 系统应保存中介信息并提示"操作成功"
**And** 列表中应显示新增的记录

#### Scenario: 新增时不填写证件号

**Given** 用户已登录系统且具有 `dpc:intermediary:add` 权限
**When** 用户点击"新增"按钮
**And** 仅填写姓名为"张三"
**And** 不填写证件号
**And** 选择中介类型为"个人"
**And** 选择状态为"正常"
**And** 点击"确定"按钮
**Then** 系统应保存中介信息并提示"操作成功"

#### Scenario: 新增时姓名为空应校验失败

**Given** 用户已登录系统且具有 `dpc:intermediary:add` 权限
**When** 用户点击"新增"按钮
**And** 不填写姓名
**And** 点击"确定"按钮
**Then** 系统应提示"姓名/机构名称不能为空"
**And** 不保存数据

#### Scenario: 新增时姓名超过100字符应校验失败

**Given** 用户已登录系统且具有 `dpc:intermediary:add` 权限
**When** 用户点击"新增"按钮
**And** 填写姓名为101个字符的字符串
**And** 点击"确定"按钮
**Then** 系统应提示"姓名/机构名称长度不能超过100个字符"
**And** 不保存数据

#### Scenario: 新增时填写备注信息

**Given** 用户已登录系统且具有 `dpc:intermediary:add` 权限
**When** 用户点击"新增"按钮
**And** 填写必填信息
**And** 填写备注为"涉及多起违规交易"
**And** 点击"确定"按钮
**Then** 系统应保存中介信息及备注
**And** 列表中应显示新增的记录

---

### Requirement: 系统SHALL支持编辑中介黑名单

系统MUST提供编辑功能，允许用户修改已存在的中介黑名单信息，以更新或纠正数据。

#### Scenario: 编辑中介黑名单的基本信息

**Given** 用户已登录系统且具有 `dpc:intermediary:edit` 权限
**And** 系统中存在一条中介记录
**When** 用户点击该记录的"编辑"按钮
**And** 修改姓名为"李四"
**And** 点击"确定"按钮
**Then** 系统应更新中介信息并提示"操作成功"
**And** 列表中应显示更新后的姓名

#### Scenario: 编辑中介黑名单的证件号

**Given** 用户已登录系统且具有 `dpc:intermediary:edit` 权限
**And** 系统中存在一条中介记录
**When** 用户点击该记录的"编辑"按钮
**And** 修改证件号为"110101199001011235"
**And** 点击"确定"按钮
**Then** 系统应更新证件号并提示"操作成功"

#### Scenario: 编辑中介黑名单的状态为停用

**Given** 用户已登录系统且具有 `dpc:intermediary:edit` 权限
**And** 系统中存在一条状态为"正常"的中介记录
**When** 用户点击该记录的"编辑"按钮
**And** 修改状态为"停用"
**And** 点击"确定"按钮
**Then** 系统应更新状态并提示"操作成功"
**And** 该记录在列表中应显示为"停用"状态

#### Scenario: 编辑时姓名为空应校验失败

**Given** 用户已登录系统且具有 `dpc:intermediary:edit` 权限
**And** 系统中存在一条中介记录
**When** 用户点击该记录的"编辑"按钮
**And** 清空姓名字段
**And** 点击"确定"按钮
**Then** 系统应提示"姓名/机构名称不能为空"
**And** 不更新数据

---

### Requirement: 系统SHALL支持删除中介黑名单

系统MUST提供删除功能，允许用户删除不再需要的中介黑名单记录，以保持黑名单库的准确性。

#### Scenario: 删除单条中介黑名单记录

**Given** 用户已登录系统且具有 `dpc:intermediary:remove` 权限
**And** 系统中存在一条中介记录
**When** 用户点击该记录的"删除"按钮
**And** 确认删除操作
**Then** 系统应删除该记录并提示"操作成功"
**And** 列表中不再显示该记录

#### Scenario: 批量删除中介黑名单记录

**Given** 用户已登录系统且具有 `dpc:intermediary:remove` 权限
**And** 系统中存在多条中介记录
**When** 用户勾选3条记录
**And** 点击"删除"按钮
**And** 确认删除操作
**Then** 系统应删除选中的3条记录并提示"操作成功"
**And** 列表中不再显示这3条记录

---

### Requirement: 系统SHALL支持导出中介黑名单

系统MUST提供导出功能，允许用户将查询结果导出为 Excel 文件，以便进行离线分析或备份。

#### Scenario: 导出所有中介黑名单数据

**Given** 用户已登录系统且具有 `dpc:intermediary:export` 权限
**And** 系统中存在100条中介记录
**When** 用户点击"导出"按钮
**And** 不设置任何筛选条件
**Then** 系统应生成包含100条记录的 Excel 文件并下载

#### Scenario: 导出筛选后的中介黑名单数据

**Given** 用户已登录系统且具有 `dpc:intermediary:export` 权限
**And** 系统中存在个人和机构两种类型的中介记录
**When** 用户筛选中介类型为"个人"
**And** 点击"导出"按钮
**Then** 系统应生成仅包含个人类型记录的 Excel 文件并下载

#### Scenario: 导出的 Excel 文件格式正确

**Given** 用户已登录系统且具有 `dpc:intermediary:export` 权限
**When** 用户点击"导出"按钮
**Then** Excel 文件应包含以下列：姓名/机构名称、证件号、中介类型、状态、备注、创建时间
**And** 表头应使用中文显示
**And** 数据应正确显示（中介类型、状态应显示中文而非数字）

---

### Requirement: 系统SHALL支持下载 Excel 导入模板

系统MUST提供模板下载功能，允许用户下载标准的 Excel 导入模板，以便按照模板格式准备数据后批量导入。

#### Scenario: 下载导入模板

**Given** 用户已登录系统且具有 `dpc:intermediary:import` 权限
**When** 用户点击"下载模板"按钮
**Then** 系统应生成 Excel 模板文件并下载
**And** 模板应包含示例数据行
**And** 模板应包含以下列：姓名/机构名称、证件号、中介类型、状态、备注

#### Scenario: 模板中的示例数据正确

**Given** 用户已登录系统且具有 `dpc:intermediary:import` 权限
**When** 用户下载导入模板
**Then** 模板应包含至少一行示例数据
**And** 示例数据应展示正确的填写格式
**And** 中介类型示例应为"个人"或"机构"
**And** 状态示例应为"正常"或"停用"

---

### Requirement: 系统SHALL支持通过 Excel 批量导入中介黑名单

系统MUST提供批量导入功能，允许用户通过 Excel 文件批量导入中介黑名单数据，以提高数据录入效率。

#### Scenario: 导入包含有效数据的 Excel 文件

**Given** 用户已登录系统且具有 `dpc:intermediary:import` 权限
**And** 用户已准备好包含10条有效数据的 Excel 文件
**When** 用户点击"导入"按钮
**And** 选择准备好的 Excel 文件
**And** 点击"确定"
**Then** 系统应导入10条记录并提示"成功导入10条数据"
**And** 列表中应显示这10条新增记录

#### Scenario: 导入时部分数据格式错误

**Given** 用户已登录系统且具有 `dpc:intermediary:import` 权限
**And** 用户准备的 Excel 文件包含10条数据
**And** 其中2条数据的姓名字段为空
**When** 用户点击"导入"按钮
**And** 选择 Excel 文件
**And** 点击"确定"
**Then** 系统应仅导入8条有效数据
**And** 提示"成功导入8条数据，失败2条数据"
**And** 显示失败行的错误详情

#### Scenario: 导入时中介类型值不在允许范围内

**Given** 用户已登录系统且具有 `dpc:intermediary:import` 权限
**And** 用户准备的 Excel 文件中某条记录的中介类型填写为"未知"
**When** 用户点击"导入"按钮
**And** 选择 Excel 文件
**And** 点击"确定"
**Then** 系统应提示该行数据"中介类型只能填写'个人'或'机构'"
**And** 该行数据不被导入

#### Scenario: 导入时状态值不在允许范围内

**Given** 用户已登录系统且具有 `dpc:intermediary:import` 权限
**And** 用户准备的 Excel 文件中某条记录的状态填写为"未知"
**When** 用户点击"导入"按钮
**And** 选择 Excel 文件
**And** 点击"确定"
**Then** 系统应提示该行数据"状态只能填写'正常'或'停用'"
**And** 该行数据不被导入

#### Scenario: 导入时证件号超过50字符

**Given** 用户已登录系统且具有 `dpc:intermediary:import` 权限
**And** 用户准备的 Excel 文件中某条记录的证件号为51个字符
**When** 用户点击"导入"按钮
**And** 选择 Excel 文件
**And** 点击"确定"
**Then** 系统应提示该行数据"证件号长度不能超过50个字符"
**And** 该行数据不被导入

#### Scenario: 导入时备注超过500字符

**Given** 用户已登录系统且具有 `dpc:intermediary:import` 权限
**And** 用户准备的 Excel 文件中某条记录的备注为501个字符
**When** 用户点击"导入"按钮
**And** 选择 Excel 文件
**And** 点击"确定"
**Then** 系统应提示该行数据"备注长度不能超过500个字符"
**And** 该行数据不被导入

#### Scenario: 导入时选择更新支持模式

**Given** 用户已登录系统且具有 `dpc:intermediary:import` 权限
**And** 系统中已存在一条证件号为"110101199001011234"的记录
**And** 用户准备的 Excel 文件包含相同证件号的记录但姓名不同
**When** 用户点击"导入"按钮
**And** 选择 Excel 文件
**And** 勾选"更新已存在数据"选项
**And** 点击"确定"
**Then** 系统应更新该证件号对应的记录
**And** 提示包含更新成功的消息

---

### Requirement: 系统SHALL验证用户权限

系统MUST根据用户的角色和权限控制其对中介黑名单功能的访问，确保未授权用户无法执行相应操作。

#### Scenario: 无权限用户访问列表应被拒绝

**Given** 用户已登录系统
**And** 该用户不具有 `dpc:intermediary:list` 权限
**When** 用户尝试访问中介库管理页面
**Then** 系统应提示"您没有权限执行此操作"
**And** 不显示列表数据

#### Scenario: 无权限用户尝试新增应被拒绝

**Given** 用户已登录系统
**And** 该用户不具有 `dpc:intermediary:add` 权限
**When** 用户尝试点击"新增"按钮
**Then** 系统应隐藏或禁用"新增"按钮

#### Scenario: 无权限用户尝试导出应被拒绝

**Given** 用户已登录系统
**And** 该用户不具有 `dpc:intermediary:export` 权限
**When** 用户尝试点击"导出"按钮
**Then** 系统应隐藏或禁用"导出"按钮

#### Scenario: 无权限用户尝试导入应被拒绝

**Given** 用户已登录系统
**And** 该用户不具有 `dpc:intermediary:import` 权限
**When** 用户尝试点击"导入"按钮
**Then** 系统应隐藏或禁用"导入"按钮

---

### Requirement: 系统SHALL记录操作日志

系统MUST记录用户对中介黑名单的关键操作，包括新增、修改、删除、导入等操作，以便审计和追溯。

#### Scenario: 新增操作应记录日志

**Given** 用户已登录系统且具有 `dpc:intermediary:add` 权限
**When** 用户成功新增一条中介记录
**Then** 系统应在操作日志中记录
**And** 日志应包含：操作人、操作时间、操作类型、操作内容

#### Scenario: 修改操作应记录日志

**Given** 用户已登录系统且具有 `dpc:intermediary:edit` 权限
**When** 用户成功修改一条中介记录
**Then** 系统应在操作日志中记录
**And** 日志应包含：操作人、操作时间、操作类型、修改内容

#### Scenario: 删除操作应记录日志

**Given** 用户已登录系统且具有 `dpc:intermediary:remove` 权限
**When** 用户成功删除一条中介记录
**Then** 系统应在操作日志中记录
**And** 日志应包含：操作人、操作时间、操作类型、删除的记录ID

#### Scenario: 导入操作应记录日志

**Given** 用户已登录系统且具有 `dpc:intermediary:import` 权限
**When** 用户成功导入中介数据
**Then** 系统应在操作日志中记录
**And** 日志应包含：操作人、操作时间、操作类型、导入数量
