fix: some
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 业务用户组维护
|
||||
|
||||
后台 MUST 提供业务用户组列表、详情、创建、更新与删除能力(GET/POST /api/admin/business-user-groups、GET/PUT/DELETE /api/admin/business-user-groups/{id})。列表 MUST 支持 page/page_size/enabled/keyword/business_line 筛选,且每项 MUST 返回 business_line_name。创建时 code(1-64)与 name 必填,编码未删除组内唯一且创建后不可修改;business_line 可空(standard/smart/other),sort/enabled/remark 可选。更新 MUST 仅允许名称、业务线、排序、启停与备注,且 business_line 支持三态:字段缺失不修改、传 "" 清空、传枚举设置;删除 MUST 携带 {"confirm": true},仅无成员组可删除。
|
||||
|
||||
#### Scenario: 查询业务用户组列表
|
||||
|
||||
- **GIVEN** 用户进入业务用户组维护页
|
||||
- **WHEN** 前端以 page/page_size/enabled/keyword/business_line 发起列表查询
|
||||
- **THEN** 前端 MUST 展示分页结果且每项显示 business_line_name
|
||||
- **AND** 下拉数据源复用该列表接口
|
||||
|
||||
#### Scenario: 创建时编码不可变
|
||||
|
||||
- **GIVEN** 用户填写名称与稳定编码创建用户组
|
||||
- **WHEN** 提交成功或编码重复被后端拒绝
|
||||
- **THEN** 编码在创建后 MUST NOT 出现在编辑表单中
|
||||
- **AND** 编码重复时 MUST 展示后端返回的"业务用户组编码已存在"
|
||||
|
||||
#### Scenario: 业务线三态更新
|
||||
|
||||
- **GIVEN** 用户编辑某组的业务线
|
||||
- **WHEN** 表单传 ""、传枚举或省略该字段
|
||||
- **THEN** 前端 MUST 分别按"清空 / 设置 / 不修改"构造请求体
|
||||
|
||||
#### Scenario: 删除需二次确认
|
||||
|
||||
- **GIVEN** 用户点击删除某组
|
||||
- **WHEN** 确认弹窗提交
|
||||
- **THEN** 前端 MUST 携带 {"confirm": true}
|
||||
- **AND** 有成员时 MUST 提示"用户组仍有成员,只能停用或先移走成员"且不做物理删除
|
||||
- **AND** 无成员时删除成功并刷新列表
|
||||
|
||||
### Requirement: 成员归属批量维护
|
||||
|
||||
后台 MUST 支持按平台用户账号把成员批量设置进组(PUT /api/admin/business-user-groups/{id}/members)与批量清空(DELETE /api/admin/business-user-groups/members,携带 body account_ids)。两种操作 MUST 复用同一校验:所有账号必须是启用平台用户且目标组启用,任一账号无效则整批不生效;清空后账号回到未分组;一账号至多一组。
|
||||
|
||||
#### Scenario: 批量设置成员
|
||||
|
||||
- **GIVEN** 用户在成员管理中选择多个启用平台账号
|
||||
- **WHEN** 保存成员归属
|
||||
- **THEN** 前端 MUST 以 account_ids 数组整体替换每个账号原归属
|
||||
- **AND** 刷新后成员关系与最新分组一致
|
||||
|
||||
#### Scenario: 批量清空成员
|
||||
|
||||
- **GIVEN** 用户选择若干账号执行清空
|
||||
- **WHEN** 提交清空
|
||||
- **THEN** 前端 MUST 调用 DELETE /api/admin/business-user-groups/members 并携带 account_ids body
|
||||
- **AND** 清空成功的账号回到未分组
|
||||
|
||||
#### Scenario: 停用组的成员展示
|
||||
|
||||
- **GIVEN** 某组被停用但仍有成员
|
||||
- **WHEN** 用户在成员管理或店铺列表看到该组
|
||||
- **THEN** 前端 MUST 展示"已停用"标记并提供改组/清空入口
|
||||
|
||||
### Requirement: 访问控制与入口
|
||||
|
||||
业务用户组维护入口 MUST 仅对超级管理员与平台账号可见,代理/企业账号 MUST NOT 渲染入口;所有按钮 MUST 受权限码控制。
|
||||
|
||||
#### Scenario: 菜单按角色隐藏
|
||||
|
||||
- **GIVEN** 代理或企业账号登录
|
||||
- **WHEN** 系统渲染菜单
|
||||
- **THEN** MUST NOT 展示业务用户组菜单项
|
||||
|
||||
#### Scenario: 按钮权限控制
|
||||
|
||||
- **GIVEN** 平台账号具备部分业务用户组权限
|
||||
- **WHEN** 渲染操作按钮
|
||||
- **THEN** 前端 MUST 按 business_user_group:create/update/delete/members 控制显隐
|
||||
@@ -0,0 +1,75 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 店铺列表/详情业务用户组字段与筛选
|
||||
|
||||
店铺列表查询 MUST 支持 business_user_group_id、business_line、ungrouped 三个新筛选;列表与详情响应 MUST 提供 5 个只读推导字段:business_user_group_id(可空)、business_user_group_code、business_user_group_name、business_user_group_enabled、business_user_group_business_line。组停用仍返回组且 enabled=false(不算未分组);店铺不存组,字段实时推导,前端 MUST NOT 缓存或回写,改动组成员后重新拉取列表。
|
||||
|
||||
#### Scenario: 按业务用户组筛选
|
||||
|
||||
- **GIVEN** 用户在店铺列表选择业务用户组、业务线或勾选"未分组"
|
||||
- **WHEN** 发起列表查询
|
||||
- **THEN** 前端 MUST 提交 business_user_group_id/business_line/ungrouped 参数
|
||||
- **AND** ungrouped=true 表示无负责人或负责人无分组
|
||||
|
||||
#### Scenario: 展示组字段
|
||||
|
||||
- **GIVEN** 店铺属于某启用或停用的业务用户组
|
||||
- **WHEN** 渲染列表或详情
|
||||
- **THEN** 前端 MUST 展示组名称/编码/业务线
|
||||
- **AND** 组停用时 MUST 标记"已停用"且仍展示组归属
|
||||
|
||||
### Requirement: 勾选批量交接平台业务员
|
||||
|
||||
店铺列表 MUST 支持勾选店铺批量交接平台业务员(PUT /api/admin/shops/business-owner/batch,body shop_ids 1-500 去重 + business_owner_account_id)。字段缺失 MUST 按参数错误处理(400);传 null 表示清空负责人;传 ID 表示换绑。任一店铺不存在/已删除/越权或目标非启用业务员时整批不写入,前端 MUST 统一提示"无权限操作该资源或资源不存在";成功响应含 batch_key/shop_count/cleared。
|
||||
|
||||
#### Scenario: 批量换绑
|
||||
|
||||
- **GIVEN** 用户勾选 1-500 家店铺并选择启用业务员
|
||||
- **WHEN** 提交批量交接
|
||||
- **THEN** 前端 MUST 提交 shop_ids(去重)与 business_owner_account_id
|
||||
- **AND** 成功后展示 shop_count 并刷新列表
|
||||
|
||||
#### Scenario: 批量清空负责人
|
||||
|
||||
- **GIVEN** 用户勾选店铺并选择"清空负责人"
|
||||
- **WHEN** 提交批量交接
|
||||
- **THEN** 前端 MUST 显式提交 business_owner_account_id: null
|
||||
- **AND** MUST NOT 省略该字段
|
||||
|
||||
#### Scenario: 整批失败统一提示
|
||||
|
||||
- **GIVEN** 批量交接请求因任一店铺或目标账号不满足条件而被后端拒绝
|
||||
- **WHEN** 前端收到 1005
|
||||
- **THEN** 前端 MUST 展示统一文案且不写入任何店铺
|
||||
|
||||
### Requirement: 业务负责人 CSV 导入
|
||||
|
||||
店铺列表 MUST 支持通过 CSV 导入批量交接/清空业务负责人。流程 MUST 为:前端自带模板(表头 店铺编码,操作类型,业务员登录账号,备注,操作类型仅"换绑"或"清空")-> POST /api/admin/storage/upload-url(purpose=shop_import)拿预签名 URL 直传(15 分钟有效)-> POST /api/admin/shops/business-owner-imports(file_key)创建异步任务 -> 轮询 GET /api/admin/shops/business-owner-imports/{id} 展示结果。行级失败不等于任务失败:任务 status=3 也可能有失败行,MUST 按 items[] 展示明细;表头/编码不符为任务级失败,items 为空数组,只展示 error_message。
|
||||
|
||||
#### Scenario: 下载模板并上传
|
||||
|
||||
- **GIVEN** 用户进入导入界面
|
||||
- **WHEN** 点击下载模板或选择文件
|
||||
- **THEN** 前端 MUST 提供表头完全一致的模板文件
|
||||
- **AND** 上传后 MUST 以 purpose=shop_import 获取上传地址并直传
|
||||
|
||||
#### Scenario: 创建任务并轮询
|
||||
|
||||
- **GIVEN** 文件上传成功拿到 file_key
|
||||
- **WHEN** 提交创建导入任务
|
||||
- **THEN** 前端 MUST 携带 file_key 调用创建接口
|
||||
- **AND** MUST 轮询任务详情直到 status 为已完成(3)或失败(4)
|
||||
|
||||
#### Scenario: 展示行级失败明细
|
||||
|
||||
- **GIVEN** 任务完成但存在失败行
|
||||
- **WHEN** 前端渲染结果
|
||||
- **THEN** 前端 MUST 展示 total_count/success_count/fail_count
|
||||
- **AND** MUST 按 items[] 展示各行的 line/shop_code/operation_type/status/reason
|
||||
- **AND** 失败行保留原负责人
|
||||
|
||||
#### Scenario: 任务级失败提示
|
||||
|
||||
- **GIVEN** 表头或编码不符导致任务级失败
|
||||
- **WHEN** 前端渲染结果
|
||||
- **THEN** 前端 MUST 只展示 error_message 且明细为空
|
||||
Reference in New Issue
Block a user