Files
dukang/docs/杜康好客-v4.0.15-开发文档.md
T
2026-09-03 16:04:10 +08:00

115 lines
4.9 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.
# 杜康好客 · v4.0.15 开发文档
> **2026-09-02** · ops / admin-web / domain / shared-types
> **主题**:HQ 概览改为分指标折线图;全局筛选不变
---
## 1. 版本目标
| # | 任务 | 类型 | 交付 |
|---|------|------|------|
| 1 | 横轴 | 体验 | 粒度 = 时间分桶(日/周/月/季/年) |
| 2 | 纵轴 | 需求 | 总量 / 增量;订单与核销再拆笔数与金额 |
| 3 | 线条 | 需求 | 用户:推广码 / 关联合伙人 / 活动;门店:关联合伙人;订单:用户 / 关联合伙人 / 商品;核销:门店 / 关联合伙人;合伙人无维度单线 |
| 4 | 布局 | 体验 | 一图一行、宽度拉满;改全局筛选全部重绘 |
| 5 | 快链 | 体验 | 「查看」只带全局城市 + 日期,不带线条维度 |
**不做**:同比、板块筛、环比卡、Prisma 迁移、新权限键。
---
## 2. 规则
**全局筛选**:粒度 + 日期 + 城市;日期旁快捷「上周 / 上月 / 上季度」;查询左侧总量 / 增量单选(互斥,只渲染对应折线图);查询右侧「下载PDF」只导出当前指标下的折线图(不含 KPI / 待办 / 版本)。改粒度**不**改日期区间。
**总量** = 该桶结束时的累计存量(含区间前基线)。**增量** = 落入该桶的新增/发生额。订单笔数按 `createdAt`,订单金额按已付 `payAmount`(`paidAt`);核销按 `RedeemRecord`。
**线条口径**(与 v4.0.14 归因一致):
| 板块 | 维度 | 字段 |
|------|------|------|
| 用户 | 推广码 | `user_promo_attribution`;空=自然量 |
| 用户 | 关联合伙人 | `assoc_partner_account_id`;空=未关联 |
| 用户 | 活动 | 关联合伙人当前 `activity_poster_id`;空=无活动 |
| 门店 | 关联合伙人 | `store.partner_account_id` |
| 订单 | 用户 | `order.user_id` |
| 订单 | 关联合伙人 | 下单用户 `assoc_partner_account_id` |
| 订单 | 商品 | `order.product_id` |
| 核销 | 门店 | `redeem.store_id` |
| 核销 | 关联合伙人 | 核销用户 `assoc_partner_account_id` |
高基数维度:按期末存量 Top 10,长尾并入「其他」;`none` 有数据则始终保留。
无对应权限则不返回该图;无任何维度权限时用户/门店/核销退回单线。城市范围只统计负责城。时间北京日历。
---
## 3. API
`GET /admin/dashboard/analytics?granularity&dateFrom&dateTo&cityId`
响应:`granularity`、`range`、`periods[]`、`charts[]`(`key/title/unit/href/series`)。不再返回 `modules` / `byPeriod` / `byCity` / `byProduct` / `byPartner` / 板块筛参数。
`GET /admin/dashboard/stats`、`/version` 不变。
---
## 4. 变更面
| 层 | 路径 |
|----|------|
| domain | `dashboard-series.ts`(累计 / TopN) |
| shared-types | `ops.ts` 折线 DTO |
| API | `admin-dashboard-lines.ts`、`admin-dashboard.service.ts`、`admin-query.dto.ts` |
| HQ | `DashboardPage.tsx`;订单/合伙人列表消费快链城市与日期 |
---
## 5. 验收
- [ ] 全局:粒度、日期、城市;日期快捷上周/上月/上季度;查询左侧总量/增量单选只出对应图
- [ ] 查询右侧下载 PDF:仅当前总量或增量折线图;不含 KPI / 待办 / 版本
- [ ] 改粒度不改日期区间;改全局筛选(除指标单选)全部折线重绘
- [ ] 每个指标×维度一张全宽折线图;合伙人仅单线
- [ ] 日粒度横轴为日期区间按日划分
- [ ] 「查看」只带 `cityId` + `createdFrom/createdTo`,不带推广码/合伙人/商品等
- [ ] 客服无合伙人/门店/核销图
- [ ] 待办卡与超管发版区不变
- [ ] domain 折线单测通过
---
## 6. 活动图上传压缩(DPT-20260902-849)
### 6.1 目标
HQ 上传活动底图时,后端用 Sharp 自动等比缩放至 v4.0.7 底图限制(最长边 ≤ 2500px、宽×高 ≤ 400 万),并在响应与表单中提示尺寸。
### 6.2 规则
- 入口:`POST /common/resources/upload`,`bizType=ACTIVITY_POSTER`、`mediaType=IMAGE`
- 尺寸合规:原样存 OSS,响应 `image.compressed=false`
- 尺寸超限:Sharp 等比缩放后存 OSS,响应含 `width/height/originalWidth/originalHeight/compressed`
- 有 alpha 通道保留 PNG;否则按原 mime 或 JPEG quality 85 输出
- 压缩后仍超过 `OSS_MAX_UPLOAD_BYTES` → 4xx,文案含当前尺寸
- **手动粘贴 URL** 仍不经上传压缩;合成时沿用 v4.0.7 校验
### 6.3 变更面
| 层 | 路径 |
|----|------|
| shared-types | `activity-poster.ts`:`activityPosterResizeTarget`、`OssUploadImageMeta`、`ACTIVITY_POSTER_UPLOAD_HINT` |
| API | `common/image/activity-poster-upload.util.ts`、`resource.service.ts` |
| HQ | `OssUpload.tsx`、`ActivityPostersPage.tsx`、`lib/upload.ts` |
无 Prisma 迁移。
### 6.4 验收
- [ ] 上传 1080×1920:成功,提示尺寸,未标记压缩
- [ ] 上传 4000×3000:成功,提示压缩后尺寸与原尺寸
- [ ] 保存后「为该合伙人下载」/ zip 导出不再报底图过大
- [ ] 非图片 / 损坏文件:明确 4xx
- [ ] AVATAR 等其他 bizType 行为不变