# 店铺管理 — 测试用例

> **依据：** 《店铺管理功能需求.md》v1.3.6、《店铺管理技术方案.md》v1.3  
> **范围：** 平台管理端 **店铺管理**（列表、添加、编辑、店铺账号管理、删除）及 `IShopFacade` 对外契约；商家端 **`/agri/seller/shop`** 资料维护（§8.4）  
> **排除：** **店铺设置**（见《店铺设置测试用例.md》）、商家端完整登录与 `shop_id` 切换、子管理员 CRUD、会员体系；商品上架/审核、分类维护的独立用例（删店仅验证商品 Facade 阻断条件）；C 端下单 E2E 仅通过 `isShopOpenForOrder` 单元/接口契约验证，不展开用户商城页面  
> **环境：** RuoYi v3.9.2；接口基路径 `/agri/shop`；选商户复用 `/agri/merchant/selectList`、`openShopCheck`

---

## 用例编号说明

| 前缀 | 类型 | 工具 |
|------|------|------|
| SHP-UT-xxx | 单元测试 | JUnit 5 + Mockito |
| SHP-API-xxx | 接口测试 | Apifox / REST Assured + 平台 Token |
| SHP-UI-xxx | 界面测试 | Playwright（Chromium/Chrome） |

---

## 一、单元测试

### SHP-UT-001 商户已有账号时创建店铺

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | createShop |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit + Mockito |
| **测试目的** | 验证有账号时仅 insert `biz_shop` |
| **前置条件** | 商户已有 `biz_merchant_account`；`checkOpenShop` 通过 |
| **测试步骤** | `createShop(dto)` 仅含店名、头像、merchantId |
| **预期结果** | 仅插入 shop；`shop_status=0`（默认）；不 insert account |

### SHP-UT-001b 商户无经营账号阻断开店

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | createShop |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 v1.3.5 前置校验 |
| **前置条件** | 商户无 account 行 |
| **测试步骤** | `createShop(dto)` |
| **预期结果** | 失败；msg 含「尚未配置经营账号」 |

### SHP-UT-002 创建店铺同事务 incrementShopCount

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | createShop 事务 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 §7.5 与商户 shop_count 回写 |
| **前置条件** | Mock `IMerchantShopFacade` |
| **测试步骤** | 创建成功 |
| **预期结果** | 同一 `@Transactional` 内调用 `incrementShopCount(merchantId)` 一次 |

### SHP-UT-003 同商户第二家店不新建账号行

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | createShop |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证同商户多店共用已有账号 |
| **前置条件** | 商户已有 account 与 1 家店 |
| **测试步骤** | 第 2 家店 POST 不含账号字段 |
| **预期结果** | 仅 insert `biz_shop`；account 表行数不变 |

### SHP-UT-003b 电话与状态可选

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | createShop |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 shop_phone/shop_status 选填 |
| **前置条件** | 商户已有账号 |
| **测试步骤** | dto 省略 phone、status；再测仅传非法 phone |
| **预期结果** | 省略时成功且 status=0；非法 phone 失败 |

### SHP-UT-006 店名未删除范围内唯一

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 店名校验 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 S8 |
| **前置条件** | 未删除店名「测试店」已存在 |
| **测试步骤** | 新增同名店 |
| **预期结果** | 失败；「店铺名称已存在」 |

### SHP-UT-007 checkOpenShop 经营未完善阻断

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | IMerchantFacade |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit + Mockito |
| **测试目的** | 验证 S1 开店前置 |
| **前置条件** | `biz_complete=0` |
| **测试步骤** | `createShop` 前调 `checkOpenShop` |
| **预期结果** | 不创建；reason 经营信息未完善 |

### SHP-UT-008 不设单商户开店数量上限

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | createShop |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 S2 |
| **前置条件** | 商户已有 10 家店；经营完整、认证正常 |
| **测试步骤** | 继续 `createShop` |
| **预期结果** | 成功；不因 `shop_count` 拒绝 |

### SHP-UT-009 编辑 UPDATE 排除 merchant_id

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | updateShop |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 S7 |
| **前置条件** | shop 绑定 merchantId=1 |
| **测试步骤** | PUT 体传 `merchantId=2` |
| **预期结果** | 库中仍为 1 |

### SHP-UT-010 开业→停业 confirm=false 不落库

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | updateShop |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 S12 两步确认 |
| **前置条件** | `shop_status=0` |
| **测试步骤** | `shopStatus=1, confirm=false` |
| **预期结果** | `needConfirm=true`；DB 仍为开业 |

### SHP-UT-011 开业→停业 confirm=true 持久化

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | updateShop |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证停业保存 |
| **前置条件** | 开业店铺 |
| **测试步骤** | `shopStatus=1, confirm=true` |
| **预期结果** | `shop_status=1`；不触发商品状态 UPDATE |

### SHP-UT-012 停业→开业无需 confirm

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | updateShop |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 §3.5 |
| **前置条件** | `shop_status=1` |
| **测试步骤** | `shopStatus=0` 无 confirm |
| **预期结果** | 直接成功为开业 |

### SHP-UT-013 isShopOpenForOrder 停业返回 false

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | IShopFacade |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 S13 契约 |
| **前置条件** | `shop_status=1`，`del_flag=0` |
| **测试步骤** | `isShopOpenForOrder(shopId)` |
| **预期结果** | `false` |

### SHP-UT-014 isShopOpenForOrder 逻辑删除返回 false

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | IShopFacade |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证删店后不可下单 |
| **前置条件** | `del_flag=2` |
| **测试步骤** | `isShopOpenForOrder` |
| **预期结果** | `false` |

### SHP-UT-015 删店预检-存在出售中商品

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | deleteCheck |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit + Mockito |
| **测试目的** | 验证 §11.2 商品条件 |
| **前置条件** | `IGoodsFacade.hasBlockingGoods=true` |
| **测试步骤** | `deleteCheck(shopId)` |
| **预期结果** | `canDelete=false`；含下架商品提示 |

### SHP-UT-016 删店预检-仅已下架商品可删

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | deleteCheck |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证不要求零商品 |
| **前置条件** | 仅有 status=4 商品；无订单 |
| **测试步骤** | `deleteCheck` |
| **预期结果** | `canDelete=true` |

### SHP-UT-017 删店成功 decrementShopCount 且保留账号

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | deleteShop |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 §11.5 末店删账号保留 |
| **前置条件** | 商户仅 1 店；预检通过 |
| **测试步骤** | `deleteShop` |
| **预期结果** | shop `del_flag=2`；`decrementShopCount`；`biz_merchant_account` 仍 `del_flag=0` |

### SHP-UT-018 批量删除任一条失败整批不删

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 批量删除 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 §3.8 |
| **前置条件** | ID1 可删；ID2 有阻塞商品 |
| **测试步骤** | `DELETE` 两 ID |
| **预期结果** | 失败；两条 shop 均未逻辑删除 |

### SHP-UT-019 改登录名 confirm=false 返回 needConfirm

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | updateAccount |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 §7.3 |
| **前置条件** | 有账号 |
| **测试步骤** | 新 loginName，`confirm=false` |
| **预期结果** | `needConfirm=true`；confirmMessage 含「同步至该商户下全部店铺」 |

### SHP-UT-020 改登录名后同商户多店展示一致

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | updateAccount |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 S5 同步 |
| **前置条件** | 同商户 2 店；`confirm=true` |
| **测试步骤** | 更新 `sys_user.user_name`（confirm=true） |
| **预期结果** | `sys_user` 更新；`biz_merchant_account` 关联不变；列表 JOIN 两店展示新登录名 |

### SHP-UT-021 重置密码 BCrypt 存储

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | updateAccount |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证密码加密 |
| **前置条件** | — |
| **测试步骤** | `password=新密码` 保存 |
| **预期结果** | 库中 password 为 BCrypt；非明文 |

### SHP-UT-022 ～ SHP-UT-024 店铺设置（已迁出）

> **废止：** 逐店 settings 及 `biz_shop` 策略字段已删除。相关用例见 **《店铺设置测试用例.md》**（SSS-UT-* / SSS-API-*）。

### SHP-UT-025 登录名唯一校验（账号管理接口）

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | updateAccount |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 §7.6 账号改登录名唯一 |
| **前置条件** | 其他商户已占用手机号 X |
| **测试步骤** | `PUT .../account` 改 login 为 X |
| **预期结果** | 校验失败；「登录名已存在」 |

### SHP-UT-026 冻结商户 checkOpenShop 失败

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | IMerchantFacade |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 §13.2 不可新开店 |
| **前置条件** | `cert_status=1` |
| **测试步骤** | `checkOpenShop` |
| **预期结果** | `allowed=false`；商户已冻结 |

### SHP-UT-027 编辑店名排除自身唯一

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | updateShop |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证编辑店名规则 |
| **前置条件** | 店 A 名称「店1」 |
| **测试步骤** | A 编辑仍用「店1」 |
| **预期结果** | 保存成功 |

---

## 二、接口测试

### SHP-API-001 列表分页与默认排序

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | GET /list |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证列表基础 |
| **前置条件** | `agri:shop:list`；≥2 未删店铺 |
| **测试步骤** | `GET /agri/shop/list?pageNum=1&pageSize=10` |
| **预期结果** | `code=200`；`create_time` 倒序；无 `del_flag=2` |

### SHP-API-002 关键词模糊检索

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | GET /list |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §5 关键词 |
| **前置条件** | 店名含「农资」 |
| **测试步骤** | `GET /list?keyword=农资` |
| **预期结果** | 命中店名/商户名/账号相关记录 |

### SHP-API-003 按店铺状态筛选

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | GET /list |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证状态筛选 |
| **前置条件** | 停业店存在 |
| **测试步骤** | `GET /list?shopStatus=1` |
| **预期结果** | 全部 `shopStatus=1` |

### SHP-API-004 按商户名称筛选（详情跳转）

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | GET /list |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §4.2 merchantName |
| **前置条件** | 某商户下有多店 |
| **测试步骤** | `GET /list?merchantName=张三农资` |
| **预期结果** | 均为该商户店铺 |

### SHP-API-005 商户已有账号时添加店铺成功

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | POST / |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证开店主流程 S3/S4（v1.3.5） |
| **前置条件** | 经营完整正常商户 **且已有** `biz_merchant_account`；`agri:shop:add`；未占用店名 |
| **测试步骤** | `POST /` 提交 shopName、shopAvatar、merchantId（phone/status 可省略） |
| **预期结果** | `code=200`；`shopStatus=0`；商户 `shop_count+1`；**不** 新建 account |

### SHP-API-006 同商户第二家店添加成功

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | POST / |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §7.2 第二家店 |
| **前置条件** | 商户已有 1 店及账号 |
| **测试步骤** | `POST /` 仅店名、头像、merchantId（§7.2 样例） |
| **预期结果** | 成功；account 行数不变；`shop_count` 再 +1 |

### SHP-API-007 添加缺少必填字段失败

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | POST / |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证必填 |
| **前置条件** | — |
| **测试步骤** | 缺 `shopName` 或 `shopAvatar` |
| **预期结果** | 失败；无新店铺 |

### SHP-API-008 店名重复失败

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | POST / |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 S8 |
| **前置条件** | 店名已存在 |
| **测试步骤** | 重复 `shopName` 提交 |
| **预期结果** | 「店铺名称已存在」 |

### SHP-API-009 商户无经营账号不可开店

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | POST / |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 S4（v1.3.5） |
| **前置条件** | 经营完整但 **无** `biz_merchant_account` |
| **测试步骤** | `POST /` 合法店名与头像 |
| **预期结果** | 失败；「该商户尚未配置经营账号…」 |

### SHP-API-010 商户经营未完善不可开店

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | POST / |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 S1 |
| **前置条件** | `biz_complete=0` 商户 |
| **测试步骤** | `POST /` |
| **预期结果** | 失败；「请先完善该商户的经营与结算信息」 |

### SHP-API-011 冻结商户不可开店

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | POST / |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证商户状态阻断 |
| **前置条件** | `cert_status=1` |
| **测试步骤** | `POST /` |
| **预期结果** | 失败；与 `openShopCheck` reason 一致 |

### SHP-API-012 高 shop_count 商户仍可连续开店

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | POST / |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 S2 无上限 |
| **前置条件** | 商户 `shop_count≥5` 且均可开店 |
| **测试步骤** | 再 `POST /` 新店 |
| **预期结果** | 成功 |

### SHP-API-013 获取店铺详情

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | GET /{shopId} |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证详情契约 |
| **前置条件** | `agri:shop:query` |
| **测试步骤** | `GET /agri/shop/{id}` |
| **预期结果** | 含店铺字段、`merchantId`/`merchantName` 只读、账号摘要、`canDelete` |

### SHP-API-014 编辑店铺基础信息成功

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | PUT / |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证编辑主流程 |
| **前置条件** | 开业店；`agri:shop:edit` |
| **测试步骤** | 修改 `shopDesc`、`shopPhone`；`shopStatus` 不变 |
| **预期结果** | `code=200`；字段更新；商户认证不变 |

### SHP-API-015 编辑传 merchantId 无效

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | PUT / |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 S7 |
| **前置条件** | shop 属 merchant 1 |
| **测试步骤** | body 改 `merchantId=2` |
| **预期结果** | 仍为 merchant 1 |

### SHP-API-016 开业→停业两步确认

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | PUT / |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 S12 |
| **前置条件** | 开业店 |
| **测试步骤** | 1. `shopStatus=1, confirm=false` 2. `confirm=true` |
| **预期结果** | 步骤1 `needConfirm`；步骤2 `shop_status=1` |

### SHP-API-017 停业→开业直接成功

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | PUT / |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证停业恢复无需 confirm |
| **前置条件** | 停业店 |
| **测试步骤** | `shopStatus=0` 保存 |
| **预期结果** | 直接开业 |

### SHP-API-018 查询商户经营账号

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | GET /merchant/{id}/account |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证账号管理查询 |
| **前置条件** | 同商户 2 店；`agri:shop:account` |
| **测试步骤** | `GET .../account` |
| **预期结果** | `adminName`、`loginName` 脱敏；`shops` 数组 2 条 |

### SHP-API-019 修改管理员姓名与重置密码

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | PUT /merchant/{id}/account |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证账号维护 |
| **前置条件** | 有账号 |
| **测试步骤** | `PUT` 改 `adminName`、传新 `password` |
| **预期结果** | 成功；登录可用新密码（若商家端已实现） |

### SHP-API-020 修改登录名两步确认

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | PUT /merchant/{id}/account |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §7.3 |
| **前置条件** | 新登录名未占用 |
| **测试步骤** | `confirm=false` 再 `confirm=true` |
| **预期结果** | 预检含同步文案；确认后 login 更新；两店列表展示一致 |

### SHP-API-021 登录名重复失败

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | PUT /merchant/{id}/account |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证平台唯一 |
| **前置条件** | 其他商户已用号码 X |
| **测试步骤** | 改为 X |
| **预期结果** | 「登录名已存在」 |

### SHP-API-022 ～ SHP-API-024 店铺设置（已迁出）

> **废止：** `GET/PUT /{id}/settings` 已移除。见 **《店铺设置测试用例.md》** SSS-API-001～004。

### SHP-API-025 删除预检通过

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | GET /{id}/deleteCheck |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证删店正向 |
| **前置条件** | 无出售中/待审核；无未完成订单 |
| **测试步骤** | `GET .../deleteCheck` |
| **预期结果** | `canDelete=true` |

### SHP-API-026 删除预检-阻塞商品

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | GET /{id}/deleteCheck |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §11.2 |
| **前置条件** | 存在 `goods_status` 为 1 或 2 的商品 |
| **测试步骤** | `deleteCheck` |
| **预期结果** | `canDelete=false`；含商品处理提示 |

### SHP-API-027 逻辑删除成功 shop_count 减 1

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | DELETE /{ids} |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证删店主流程 S10 |
| **前置条件** | SHP-API-025 通过；`agri:shop:remove` |
| **测试步骤** | `DELETE /agri/shop/{id}` |
| **预期结果** | 列表不可见；`del_flag=2`；商户 `shop_count-1` |

### SHP-API-028 批量删除部分失败整批取消

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | DELETE /{ids} |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证批量策略 |
| **前置条件** | 一可删一不可删 |
| **测试步骤** | `DELETE id1,id2` |
| **预期结果** | 「部分店铺不满足删除条件」；均未删除 |

### SHP-API-029 列表经营账号脱敏

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | GET /list |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §7.4 |
| **前置条件** | login=13800138000 |
| **测试步骤** | 查列表 `accountLoginName` |
| **预期结果** | 形如 `138****8000` |

### SHP-API-030 无 add 权限新增 403

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 权限 |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 `@PreAuthorize` |
| **前置条件** | Token 无 `agri:shop:add` |
| **测试步骤** | `POST /` |
| **预期结果** | 403；无新数据 |

### SHP-API-031 GET merchant account 供账号管理页

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | GET /merchant/{id}/account |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证账号管理页查询 |
| **前置条件** | 商户已有店 |
| **测试步骤** | 打开账号管理前调用 account 接口 |
| **预期结果** | 返回 loginName、adminName 及下属 shops 列表 |

### SHP-API-032 复用 merchant selectList 仅完整商户

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | GET /agri/merchant/selectList |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证添加页选商户 S1 |
| **前置条件** | 完整/不完整/冻结商户各一 |
| **测试步骤** | `GET /agri/merchant/selectList` |
| **预期结果** | 仅含经营完整且认证正常商户 |

---

## 三、界面测试（Playwright）

> **通用前置：** 平台管理员已登录；Chromium；菜单「农资管理 → 店铺管理」（路由以实现为准）。

### SHP-UI-001 进入店铺列表页

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 列表加载 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright (Chrome) |
| **测试目的** | 验证菜单与列表列 |
| **前置条件** | `agri:shop:list` |
| **测试步骤** | 登录 → 打开店铺管理 |
| **预期结果** | 展示店名、头像、商户名、状态、经营账号、操作；分页默认 |

### SHP-UI-002 关键词检索店铺

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 高级检索 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright |
| **测试目的** | 验证 §5 关键词 |
| **前置条件** | 存在店名含「测试店」 |
| **测试步骤** | 输入关键词 → 查询 |
| **预期结果** | 列表仅匹配店铺/商户/账号相关行 |

### SHP-UI-003 按开业/停业筛选

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 高级检索 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright |
| **测试目的** | 验证状态筛选 |
| **前置条件** | 有停业店 |
| **测试步骤** | 选「停业」→ 查询 |
| **预期结果** | 列表均为停业状态 |

### SHP-UI-004 清空检索恢复默认列表

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 高级检索 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright |
| **测试目的** | 验证清空条件 |
| **前置条件** | 已筛选缩小结果 |
| **测试步骤** | 点重置/清空 → 查询 |
| **预期结果** | 恢复全量未删店铺列表 |

### SHP-UI-005 添加店铺-完整表单提交

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 添加店铺 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright |
| **测试目的** | 验证开店 UI 主流程 |
| **前置条件** | 可选完整商户 **且已有经营账号**；有 add 权限 |
| **测试步骤** | 新增 → 选商户 → 填店名/头像 → 提交（电话可选） |
| **预期结果** | 成功；列表新店状态=开业；商户店铺数+1 |

### SHP-UI-006 添加第二家店（同商户）

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 添加店铺 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright |
| **测试目的** | 验证同商户多店 |
| **前置条件** | 商户已有 1 店 |
| **测试步骤** | 选同商户 → 填新店名/头像 → 提交 |
| **预期结果** | 成功；列表多一条；账号展示与首店一致 |

### SHP-UI-007 添加必填项为空校验

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 添加店铺 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright |
| **测试目的** | 验证前端校验 |
| **前置条件** | 打开新增 |
| **测试步骤** | 不填店名或头像直接提交 |
| **预期结果** | 表单项错误提示；不提交成功 |

### SHP-UI-008 选经营未完善商户不可选或提交失败

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 添加店铺 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright |
| **测试目的** | 验证 S1 UI |
| **前置条件** | 存在待完善商户 |
| **测试步骤** | 打开商户下拉/搜索 |
| **预期结果** | 不出现该商户；或选后提交提示完善经营信息 |

### SHP-UI-009 编辑页商户与经营账号只读

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 编辑店铺 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright |
| **测试目的** | 验证 §8.2 |
| **前置条件** | 有店铺 |
| **测试步骤** | 点编辑 |
| **预期结果** | 所属商户、经营账号不可改 |

### SHP-UI-010 编辑开业→停业二次确认

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 编辑店铺 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright |
| **测试目的** | 验证 S12 UI |
| **前置条件** | 开业店 |
| **测试步骤** | 状态改停业 → 保存 |
| **预期结果** | 弹窗含「用户端将无法下单」；确认后列表为停业 |

### SHP-UI-011 停业店仍可编辑/账号管理

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 列表操作 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright |
| **测试目的** | 验证 §7.2 |
| **前置条件** | 停业店 |
| **测试步骤** | 检查操作列按钮 |
| **预期结果** | 编辑、店铺账号管理可用；**无** 逐店「店铺设置」 |

### SHP-UI-012 店铺账号管理-展示下属店铺

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 店铺账号管理 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright |
| **测试目的** | 验证 §9.2 |
| **前置条件** | 同商户 2 店 |
| **测试步骤** | 任一家店点「店铺账号管理」 |
| **预期结果** | 展示管理员、脱敏登录名、下属 2 店名称与状态 |

### SHP-UI-013 改登录名二次确认同步文案

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 店铺账号管理 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright |
| **测试目的** | 验证 §9.4 |
| **前置条件** | 有 account 权限 |
| **测试步骤** | 改登录名 → 保存 |
| **预期结果** | 确认框含「同步至该商户下全部店铺」；成功后两店列表账号一致 |

### SHP-UI-014 ～ SHP-UI-015 店铺设置（已迁出）

> 见 **《店铺设置测试用例.md》** SSS-UI-*（独立菜单「店铺设置」）。

### SHP-UI-016 删除店铺二次确认

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 删除店铺 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright |
| **测试目的** | 验证 §11.3 |
| **前置条件** | 满足删店条件 |
| **测试步骤** | 删除 → 确认「不可恢复经营」 |
| **预期结果** | 列表消失；成功提示 |

### SHP-UI-017 有出售中商品时删除失败提示

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 删除店铺 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright |
| **测试目的** | 验证删店商品约束 |
| **前置条件** | 店内有出售中商品 |
| **测试步骤** | 点删除 |
| **预期结果** | 提示「请先下架或处理完商品后再删除店铺」 |

### SHP-UI-018 无 add 权限隐藏新增按钮

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 权限 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright |
| **测试目的** | 验证按钮权限 |
| **前置条件** | 角色仅 list+query |
| **测试步骤** | 进入列表 |
| **预期结果** | 无「新增」按钮 |

### SHP-UI-019 列表无会员相关字段

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 列表展示 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright |
| **测试目的** | 验证 S6 |
| **前置条件** | 打开列表 |
| **测试步骤** | 检查表头 |
| **预期结果** | 无会员名称/会员绑定列；为经营账号展示 |

### SHP-UI-020 从商户详情跳转带 merchantName 筛选

| 要素 | 内容 |
|------|------|
| **测试模块** | 店铺管理 |
| **测试项** | 协作跳转 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright |
| **测试目的** | 验证 §13.3 |
| **前置条件** | 商户详情有「查看店铺」；该商户有多店 |
| **测试步骤** | 商户详情点击跳转 |
| **预期结果** | 打开店铺列表且检索框带商户名；仅显示该商户店铺 |

### SHP-UI-021 生成随机密码（已迁出）

> **废止（v1.3.5）：** 添加店铺不再采集密码；随机密码若 UI 提供，见 **《商户管理测试用例》** 入驻绑定账号相关用例。

### SHP-UI-022 子管理员上限输入非法值（已迁出）

> 见 **《店铺设置测试用例.md》** SSS-API-004 / SSS-UI-*。

### SHP-UT-027 商家端改店名更新 biz_shop

| 要素 | 内容 |
|------|------|
| **用例编号** | SHP-UT-027 |
| **测试项** | `updateSellerShopProfile` |
| **测试目的** | 验证草稿第 7 条、§8.4 同源 |
| **步骤** | `updateSellerShopProfile(shopId, dto)` |
| **预期结果** | `shopMapper.update` 写入新名称/头像/电话；平台 list SQL 读同一行 |

### SHP-API-033 GET /agri/seller/shop

| 要素 | 内容 |
|------|------|
| **用例编号** | SHP-API-033 |
| **测试项** | 商家端资料查询 |
| **前置条件** | `X-Shop-Id`；`agri:seller:shop:query` |
| **预期结果** | 200；返回当前店名称/头像/电话 |

### SHP-API-034 PUT /agri/seller/shop 成功后平台 list 一致

| 要素 | 内容 |
|------|------|
| **用例编号** | SHP-API-034 |
| **测试项** | 商家端改资料 |
| **步骤** | PUT 改 `shopName` → `GET /agri/shop/list` |
| **预期结果** | 列表展示新名称 |

### SHP-API-035 GET /agri/seller/shop/employeeStats（协作）

| 要素 | 内容 |
|------|------|
| **用例编号** | SHP-API-035 |
| **测试项** | 商家端员工概览 |
| **详册** | 商家端《店铺设置测试用例》SS-API-017～020；自动化见 `SellerShopControllerTest.employeeStats_*` |
| **预期结果** | 200；返回当前店员工数 + 商户配额；与 `GET /agri/seller/employee/quota` 一致 |

---

## 四、用例统计

| 类型 | 数量 | 编号段 |
|------|------|--------|
| 单元测试 | 27 | SHP-UT-001～027 |
| 接口测试 | 32 | SHP-API-001～032 |
| 界面测试 | 22 | SHP-UI-001～022 |
| **合计** | **81** | — |

---

## 五、业务规则覆盖索引

| 规则 | 对应用例（示例） |
|------|------------------|
| S1 | SHP-UT-007, SHP-API-010, SHP-UI-008, SHP-API-032 |
| S2 | SHP-UT-008, SHP-API-012 |
| S3 | SHP-UT-001, SHP-API-005 |
| S4/S5 | SHP-UT-001b/003/019/020/025, SHP-API-005/006/009, SHP-UI-006/013 |
| S6 | SHP-UI-019 |
| S7 | SHP-UT-009, SHP-API-015, SHP-UI-009 |
| S8 | SHP-UT-006, SHP-API-008 |
| S9 | SHP-UT-011（无商品级联） |
| S10 | SHP-UT-015～018, SHP-API-025～028, SHP-UI-016/017 |
| S11 | SHP-UT-022/024, SHP-API-022/023, SHP-UI-014/015 |
| S12 | SHP-UT-010/011, SHP-API-016, SHP-UI-010 |
| S13 | SHP-UT-013/014（Facade 契约） |

---

## 六、测试数据建议

| 数据 | 用途 |
|------|------|
| 经营完整 + 已有经营账号商户 | 开店、selectList |
| 经营完整但无账号商户 | SHP-API-009 / SHP-UT-001b |
| 同商户第二店 | 不新建 account |
| 经营未完善 / 冻结商户 | 开店阻断 |
| 首家店 + 同商户第二店 | 共用已有账号 |
| 多店商户（≥5） | S2 无上限 |
| 开业/停业店各一 | 状态编辑、Facade |
| 含出售中/待审核商品的店 | 删店阻断 |
| 仅已下架商品的店 | 删店正向 |
| 未占用店名 | 唯一性正向 |

---

*文档版本：v1.2 · 关联《店铺管理功能需求.md》v1.3.6、《店铺管理技术方案.md》v1.3*
