96 lines
4.2 KiB
Markdown
96 lines
4.2 KiB
Markdown
# 杜康好客 · v4.0.14 开发文档
|
||
|
||
> **2026-09-02** · ops / admin-web / domain / shared-types
|
||
> **主题**:HQ 概览日/周/月/季/年分桶、环比、板块筛、订单/核销金额
|
||
|
||
---
|
||
|
||
## 1. 版本目标
|
||
|
||
| # | 任务 | 类型 | 交付 |
|
||
|---|------|------|------|
|
||
| 1 | 时间粒度 | 体验 | `day/week/month/quarter/year` + 自选日期 |
|
||
| 2 | 环比 | 需求 | 整段按粒度回退一档;上期 0 且本期 0 为 `—`,本期 > 0 为 `+100%` |
|
||
| 3 | 筛选分层 | 体验 | 全局只筛城市 + 时间;五板块各自筛选 |
|
||
| 4 | 金额 | 需求 | 订单/核销同时出笔数与金额 |
|
||
| 5 | 权限 | 安全 | 无权限模块后端不算不返回;城市范围只看负责城 |
|
||
|
||
**不做**:同比、测试单开关、新权限键、Prisma 迁移。
|
||
|
||
---
|
||
|
||
## 2. 规则
|
||
|
||
### 2.1 筛选分层
|
||
|
||
**全局**:粒度 + 日期 + 城市。环比窗口仍按全局日期、按粒度回退一档。
|
||
|
||
**板块筛**(只影响本板块 KPI / 趋势该系列 / 城市该系列):
|
||
|
||
| 板块 | 筛选 | 口径 |
|
||
|------|------|------|
|
||
| 用户 | 推广码、关联合伙人、活动 | 推广码=`user_promo_attribution`;关联合伙人=`assoc_partner_account_id`;活动=关联合伙人当前所选活动图(`partner_account.activity_poster_id`) |
|
||
| 合伙人 | 无 | 仅全局 |
|
||
| 门店 | 合伙人 | 门店归属主合伙人 `store.partner_account_id` |
|
||
| 订单 | 推广码、关联合伙人、活动、商品 | 推广码=`order.promo_code_id`;关联合伙人/活动同用户(下单用户);商品=`order.product_id`。笔数=`createdAt`;金额=已付 `payAmount`(`paidAt`) |
|
||
| 核销单 | 门店、关联合伙人 | 门店=`redeem.store_id`;关联合伙人=核销用户 `assoc_partner_account_id`。笔数与 `RedeemRecord.amount` |
|
||
|
||
下拉:合伙人「企业-个人」;活动=活动图标题(需 `activity_posters`)。缺对应权限则忽略该筛。
|
||
|
||
### 2.2 模块口径
|
||
|
||
| 模块 | 权限键 | 数量 | 新增 | 金额 |
|
||
|------|--------|------|------|------|
|
||
| 用户 | `users` | 区间末日存量 | `createdAt` 落入区间 | 有 `orders` 时交叉付费用户 / 客单价(跟用户筛,不跟订单筛) |
|
||
| 合伙人 | `partners` | 主账号期末存量 | 区间新签 | 交叉:支付时归属 GMV / 名下门店核销额(仅全局) |
|
||
| 门店 | `stores` | 期末存量 | 区间新签 | 交叉:本板块门店筛下的核销额(需 `benefit`) |
|
||
| 订单 | `orders` | 区间下单笔数 | 同左 | 已付 `payAmount` |
|
||
| 核销单 | `benefit` | 区间核销笔数 | 同左 | `RedeemRecord.amount` |
|
||
|
||
时间一律北京日历。周=周一~周日;季=自然季;年=自然年。
|
||
|
||
默认窗口:日=昨天~今天;周=上周一~今天;月=上月 1 日~今天;季=上季首日~今天;年=去年 1 月 1 日~今天。
|
||
|
||
### 2.3 权限与城市
|
||
|
||
- 进页仍需 `dashboard`。
|
||
- 无权限模块:后端不算、响应省略。
|
||
- 城市范围:只统计负责城市;筛选项无「未选城」。
|
||
|
||
---
|
||
|
||
## 3. API
|
||
|
||
`GET /admin/dashboard/analytics`
|
||
|
||
全局:`granularity`、`dateFrom`、`dateTo`、`cityId`(`none`=用户未选城)。
|
||
|
||
板块:`usersPromoCodeId`(`none`=无归因)、`usersPartnerAccountId`、`usersActivityPosterId`;`storesPartnerAccountId`;`ordersPromoCodeId`(`none`=无推广码)、`ordersPartnerAccountId`、`ordersActivityPosterId`、`ordersProductId`;`redeemsStoreId`、`redeemsPartnerAccountId`。
|
||
|
||
响应:`granularity`、`range`、`prevRange`、`modules`、`byPeriod`、`byCity`、`byProduct`、`byPartner`。
|
||
|
||
`GET /admin/dashboard/stats`、`/version` 不变。
|
||
|
||
---
|
||
|
||
## 4. 变更面
|
||
|
||
| 层 | 路径 |
|
||
|----|------|
|
||
| domain | `dashboard-period.ts`(分桶 / 上期 / 环比) |
|
||
| shared-types | `ops.ts` 概览 DTO |
|
||
| API | `admin-dashboard.service.ts`、`admin-dashboard-analytics.ts`、`admin-query.dto.ts` |
|
||
| HQ | `DashboardPage.tsx` |
|
||
|
||
---
|
||
|
||
## 5. 验收
|
||
|
||
- [ ] 全局只有城市与时间;五板块筛互不影响
|
||
- [ ] 日默认昨天~今天,环比为前天~昨天;周月季年按粒度回退一档
|
||
- [ ] 订单/核销同时展示笔数与金额
|
||
- [ ] 用户筛关联合伙人后只计 `assoc_partner_account_id`
|
||
- [ ] 客服(仅 users/orders):无合伙人/门店/核销卡
|
||
- [ ] 待办卡与超管发版区行为不变
|
||
- [ ] domain 周期/环比单测通过
|