Files
dukang/杜康好客-v3.4.17-门店套餐审核快捷入口.md
T
jacy 1c91e6bae9
CI / verify (push) Has been cancelled
v3.4.17 门店套餐审核快捷入口
2026-08-16 11:57:01 +08:00

68 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 杜康好客 · v3.4.17 门店套餐审核快捷入口
> **2026-08-16** · PRD §套餐变更审核 · admin-web / API(ops)
> 目标:把「套餐变更审核」能力前置到**门店详情-套餐页签**与**门店列表操作栏**,让总部在不离开列表/详情流的情况下即可发现待审套餐并一键进入审核(含线上 vs 待审对照)。
## 范围
| 项 | 交付 |
|----|------|
| A. 门店详情·套餐页签 待审提醒 | 存在 `status=PENDING` 的套餐变更时,页签顶部黄色 Alert + 「审核 / 对比」按钮 |
| B. 审核 / 对比 跳转 | 复用现有 `StorePackageAuditsPage`,跳转 `/store-package-audits?requestId=xxx` 自动打开审核抽屉(抽屉内已含线上 vs 待审并排对照) |
| C. 门店列表 操作栏快捷入口 | 有待审套餐时显示「审核套餐」「对比」两个按钮,跳转同一地址(与详情页审核功能一致) |
| D. 列表接口补 `pendingPackageAuditId` | `GET /admin/stores` 返回每家店当前待审套餐变更的 `requestId`(一次批量查询,无 schema 变更) |
| E. 审核后提醒自动刷新 | 审核完成 dispatch `admin:package-audit-changed`,套餐页签监听后刷新提醒 |
## A / B. 门店详情·套餐页签
组件:`apps/admin-web/src/components/AdminStorePackagesSection.tsx`
- 现有 `GET /admin/stores/:storeId/packages` 已返回 `pendingRequest`(含 `id`/`status`/`packages`),此前被组件丢弃;本次**捕获 `pendingRequest`** 存入 state。
-`pendingRequest.status === 'PENDING'`
- 页签顶部渲染 `<Alert type="warning">`:「该门店有待审核套餐」。
- 提醒内放「审核」「对比」两个按钮,均 `navigate('/store-package-audits?requestId=' + pendingRequest.id)`
- 空套餐门店同样展示该提醒(不依赖 `live` 是否有数据)。
- 跳转后由 `StorePackageAuditsPage` 读取 `?requestId=` 自动打开抽屉:抽屉内左侧「线上已审核套餐」、右侧「待审核套餐」并排 `diffPackages` 对照;抽屉右上「通过 / 驳回」即审核动作。两套按钮语义:审核=处置,对比=看差异,落点同一页面。
## C. 门店列表·操作栏
组件:`apps/admin-web/src/pages/StoresPage.tsx`
- `StoreRow` 增加 `pendingPackageAuditId?: string | null`
- 操作列(原「详情 / 评价」)在 `pendingPackageAuditId` 存在时追加「审核套餐」「对比」按钮,均 `navigate('/store-package-audits?requestId=' + row.pendingPackageAuditId)`
- 操作列宽度 140 → 220,允许换行,避免按钮被挤压。
## D. 列表接口补 `pendingPackageAuditId`
后端:`server/dukang-api/src/modules/ops/admin-stores.service.ts``listStores`
- 取回 `items` 后,用一次查询批量取出待审变更:
`storePackageChangeRequest.findMany({ where: { storeId: { in: storeIds }, status: 'PENDING' }, select: { id, storeId } })`
-`storeId -> requestId` 映射,逐店附加 `pendingPackageAuditId`(无则 `null`)。
- `mapStoreCompat``{ ...store }` 展开透传,新字段不会被丢弃;**无 Prisma schema 变更**,发布可 `--skip-db`
## E. 审核后提醒自动刷新
- `StorePackageAuditsPage` 审核成功时调用 `notifyPackageAuditChanged()`dispatch `admin:package-audit-changed`)。
- `AdminStorePackagesSection` 监听该事件,重新拉取 `pendingRequest` 并刷新提醒(仅更新 `pendingRequest`,不触碰正在编辑的 `items`,避免覆盖未保存套餐)。
## 关键接口 / 文件
| 位置 | 说明 |
|------|------|
| `GET /admin/stores` | 列表,新增 `pendingPackageAuditId`ops/admin-stores.service.ts |
| `GET /admin/stores/:storeId/packages` | 返回 `pendingRequest`store-package.service.ts,未改,仅前端消费) |
| `GET /admin/store-package-audits/:requestId` | 审核详情(含 `livePackages` 对照) |
| `PUT /admin/store-package-audits/:requestId/audit` | 通过 / 驳回 |
| `apps/admin-web/src/components/AdminStorePackagesSection.tsx` | 套餐页签提醒 + 按钮 |
| `apps/admin-web/src/pages/StorePackageAuditsPage.tsx` | `?requestId=` 自动开抽屉 |
| `apps/admin-web/src/pages/StoresPage.tsx` | 列表操作栏快捷入口 |
## 验收
- [ ] 某门店有待审套餐变更时:门店详情-套餐页签顶部出现黄色「有待审核套餐」提醒,且「审核 / 对比」可点。
- [ ] 点「审核」或「对比」均跳到套餐审核页并自动打开该门店变更抽屉,可见线上 vs 待审对照与通过/驳回。
- [ ] 门店列表操作栏对该门店出现「审核套餐」「对比」按钮,点击同样跳转并自动打开抽屉。
- [ ] 在审核页完成审核后,返回门店详情-套餐页签,提醒消失(或被事件即时刷新)。
- [ ] 无待审套餐的门店:列表与详情页签均不出现上述入口。