# 快速验证：商家门店分管账号

## 前置条件

1. 使用 JDK 21：`C:\Users\qmj\.jdks\graalvm-jdk-21.0.7`。
2. 数据库迁移只从 `updatesql/sql.md` 人工执行；Codex 不直接执行迁移。
3. 准备一个类型 1 主商家、三家归属门店和两个可接收推送的测试设备账号。

## 自动化验证

```powershell
$env:JAVA_HOME='C:\Users\qmj\.jdks\graalvm-jdk-21.0.7'
$env:Path="$env:JAVA_HOME\bin;$env:Path"
mvn -pl ruoyi-admin -am -Dtest=MerchantStoreAccessServiceTest,MerchantSubaccountControllerTest,MerchantSubaccountAdminControllerTest,MerchantNotificationRouterTest,InfoUserControllerTest,PosStoreControllerTest,PosFoodControllerAccessTest,PosOrderShOprateControllerTest -Dsurefire.failIfNoSpecifiedTests=false test
mvn -pl ruoyi-admin -am -DskipTests package
```

商家端：

```powershell
Set-Location E:\QtwCode\foodie\foodie-store
npm run build
```

平台端：

```powershell
Set-Location E:\QtwCode\foodie\foodie-admin-vue
npm run build:prod
```

## 手工验收路径

1. 主账号创建分管账号甲并授权店铺 A、B；甲登录后只看到 A、B。
2. 甲通过手工构造请求访问同主账号店铺 C 的订单、商品和退款，后端全部拒绝。
3. 甲调用新增或删除店铺、支付配置和财务接口，后端拒绝。
4. 主账号取消甲对 A 的授权；甲不重新登录，下一次访问 A 立即失败。
5. A 同时配置甲、乙且两者 App 会话有效；触发 A 通知，甲乙各有一条消息，主账号没有重复消息。
6. 甲乙均无有效 App 会话；再次触发 A 通知，主账号获得兜底消息。
7. 平台商家列表、导出和统计只出现主账号；从主商家行进入分管账号视图可看到甲乙。
8. 平台停用甲后，甲的现有会话失效；主账号尝试启用甲也不能覆盖平台状态。
9. 平台恢复甲但主账号仍停用甲，甲仍不能登录；主账号再次启用后才恢复。
10. 平台停用主商家，甲乙全部不能登录、操作或接收通知。

## 安全检查

- 请求日志、异常日志和测试输出不包含密码、RSA 密文、完整 Token 或 CID。
- 所有越权失败在业务写入之前发生，不产生部分授权、订单状态或退款状态变更。
- `git diff --check` 无空白错误；两个 Vue 仓库的原 CRLF 不被批量改写。

## 2026-08-28 自动化验证结果

- JDK 21 定向测试：38 个测试通过，0 失败、0 错误、0 跳过。
- 商品下架过滤兼容测试：1 个测试通过；旧测试夹具已按新的商家会话鉴权链补齐依赖。
- 后端完整回归：293 个测试通过，0 失败、0 错误、0 跳过。
- 后端打包：`mvn -pl ruoyi-admin -am -DskipTests package` 成功。
- 商家端：`npm run build` 成功；仅有既有 Browserslist、Node 弃用及包体积提示。
- 平台端：`npm run build:prod` 成功；存在既有 `promotion/index.vue~`、`pointcontrol/pointTier.vue~` 解析警告及包体积提示，未阻断构建。
- 数据库迁移未执行，`updatesql/sql.md` 由开发者统一手动执行。
- 尚未执行依赖真实数据库、Redis、App 会话、CID 和 iOS 云函数的手工验收；上方 10 条手工路径保持为上线前验收清单。
