Store Management | 基础信息配置 + 员工导航 | 更新时间: 2026-02-10
stores/page.tsx (门店列表/创建),
stores/[id]/page.tsx (门店详情/编辑/员工跳转),
employees/page.tsx (读取 store_id 上下文筛选)
StoreTable.tsx,
OperatingHoursDisplay.tsx,
OperatingHoursEditor.tsx,
StoreSelector.tsx
api/stores.js (
GET /api/stores,
POST /api/stores,
GET /api/stores/:id,
PUT /api/stores/:id
)
erDiagram
stores ||--o{ employees : "has staff"
stores {
string id PK
string name
string code
string address
string city
string state
string zip_code
string timezone
jsonb business_hours
jsonb contact_info
boolean is_active
}
| 操作 | 所需权限 | 说明 |
|---|---|---|
| 查看门店列表/详情 | stores:view + 门店 scope | 需具备至少 1 家门店 scope(或 all stores) |
| 创建门店 | stores:manage + superadmin 角色约束 | 仅 superadmin 可创建,并受 checkEntityLimit('stores') 限制 |
| 编辑门店 | stores:manage + 门店 scope | 需具备目标门店范围且权限级别满足 manage |
| 跳转员工管理 | employees:view + 门店 scope | 只做导航,员工增删改权限由员工模块独立校验 |
| CUJ | 优先级 | 描述 | 触发点 | 业务价值 | E2E 状态 |
|---|---|---|---|---|---|
| L1 | P0 | 门店列表与创建 | 侧边栏 → Stores | 门店基础资料入口 | 部分覆盖 |
| L2 | P0 | 门店详情、编辑与员工跳转 | 点击门店行 | 基础资料维护 + 跨模块导航 | 部分覆盖 |
P0 基础信息配置入口 — 查看、搜索、创建门店
stores/page.tsx,
StoreTable.tsx,
GET /api/stores,
POST /api/stores
stores:view 权限,且具备门店 scope(至少 1 家门店,或 all stores)/storessuperadmin(业务强制),并拥有 stores:manage 权限generateStoreCode)getTimezoneByZipCode)POST /api/stores 创建成功(受配额检查)
superadmin,并拥有 stores:manage 权限checkEntityLimit('stores') 拒绝请求并返回权限/配额错误
P0 维护门店基础资料,并从门店上下文进入员工管理
stores/[id]/page.tsx,
GET /api/stores/:id,
PUT /api/stores/:id,
/[locale]/[tenant]/employees?store_id={id}
stores:view 权限,且具备目标门店 scope/stores/{id}stores:manage 权限,且具备目标门店 scopePUT /api/stores/:id 更新成功employees:view 权限,且具备目标门店 scope/employees?store_id={storeId}P1 负向路径覆盖 — 权限拒绝、scope 校验、配额限制
GET /api/stores,
POST /api/stores,
PUT /api/stores/:id,
GET /api/stores/:id,
/employees?store_id={id}
stores:view 权限(任意 scope)/stores 并触发 GET /api/storesstores:manage 权限,但角色不是 superadminPOST /api/stores,返回 403
stores:manage 权限,但仅有门店 A 的 scopePUT /api/stores/{storeB}(B 不在 scope 内)stores:view 权限,但不具备 employees:view| 关联模块 | 关联点 | 说明 |
|---|---|---|
| CUJ-D (Employees) | 门店上下文员工导航 | 从门店详情跳转到员工页并携带 store_id |
| CUJ-C (Day-End) | 门店详情页日结入口 | 门店详情页提供“开始日结”按钮 |
| CUJ-N (Platform) | 门店配额 | checkEntityLimit 根据租户套餐限制门店数量 |
| # | 规则 | 实现位置 |
|---|---|---|
| 1 | 创建门店仅 superadmin: 需 stores:manage 且角色为 superadmin |
POST /api/stores |
| 2 | 门店编码自动生成: generateStoreCode(name, city),前端只读展示 |
stores/page.tsx |
| 3 | 时区自动推断: 根据邮编通过 getTimezoneByZipCode() 推断 |
stores/page.tsx |
| 4 | 员工管理入口仅导航: 入口显示受 employees:view + scope 控制 |
stores/[id]/page.tsx |