# 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** 日志应包含:操作人、操作时间、操作类型、导入数量