Files
docs/自营业务/经营总览图表设计.md
2026-10-20 23:35:46 +08:00

189 lines
31 KiB
Markdown
Raw Permalink 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.
# 自营经营总览图表设计
新增 Admin「海外仓 → 经营总览」,用图表回答本仓近期出库是否变化、库存大约需要多久消化、哪些 SKU 出库多、哪些库存值得关注。页面以 SKU 为中心,所属货主只作识别;保持同仓同名 SKU 跨货主分开,不恢复已取消的货主独立筛选或经营面板。
本文件是经营总览页面、聚合接口、下钻和验收的维护入口;原始事实、同步、可售天数、观察资格、版本与权限沿用[一期方案](领星一件代发数据统计一期方案.md)。本次范围为设计与开发交接,不表示页面已经实现、上线或通过视觉验收。采集和环境操作继续按当前正式契约及用户授权执行,图表查询不调用领星。
## 菜单与页面布局
2026-10-20 用户选择本页作为[蓝白卡片式工作台风格](../界面参考/蓝白卡片式工作台风格参考.md)的首个样板:六项指标采用淡彩图标底座、蓝色大数字和轻边框圆角卡片;保留两列主图及三榜,并增加分区标题。公共外观由 Admin `src/styles/adminWorkbenchTokens.css`、`adminWorkbench.css` 管理,通过 `admin-workbench` 显式启用(同日已获授权扩展到销量、库存分析与数据采集);查询、数据口径、下钻、图表高度和原弹窗承载不变。整端推广待老板确认,视觉待人工 1920×1080、100% 截图核对。
同日按用户补充截图同步优化图表内部:公共 `src/styles/adminWorkbenchChartTheme.ts` 提供蓝白配色、灰蓝坐标、轻网格与提示框外观;本页趋势使用蓝色直线和更轻的缩放条,仅连续完整数据段填充浅色面积。柱图采用圆角条、千位分隔数值和按业务分类键稳定配色,待核验保持灰色;空榜单使用居中图标和原因说明。真实数值、零与未知、日期断线和下钻映射保留。主题由总览图表显式接入;同日按用户后续授权,共用 SKU 趋势与库存周转图表也统一接入。
新增路由 `/self-operated/overview`,模块页建议为 `apps/admin-web/src/modules/self-operated/pages/OverviewView.vue`。菜单顺序为经营总览、销量分析、库存分析、数据采集;沿用 `platform:self-operated-analytics:list`,总控统一集成路由、导航及 IAM。保留原三个页面的查询与作业入口,不更改登录后的全局首页。
总览只选一个仓库,不合并两仓库存、规则或可售天数;不增加来源账号、货主或 SKU 输入框。仓库首次为空时提示选择,返回页面可恢复最近选择;无有效仓库不查询经营接口。来源账号由已有受控配置确定,不在业务页面显示技术键。
在 `1920×1080`、100% 缩放下采用以下设计布局,正常纵向滚动,不为挤进一屏压缩图形和字体:
```text
经营总览 查看销量 查看库存 数据采集
仓库 [选择] 统计时间范围 [最近3天/最近7天/最近15天/最近30天/自定义] 查询 刷新
销量覆盖截至…… 库存采集于…… 有新数据可刷新 / 部分资料提示
──────────────────────────────────────────────────────────────────────
区间出库量 | 所选时段日均出库 | 实物库存 | 正品可售 | 有库存SKU | 无出库SKU
──────────────────────────────────────────────────────────────────────
出库趋势(日折线,约 2/3 宽) 库存消化天数分布(横向条形,约 1/3 宽)
所选日期范围;真实每日点 所选日期范围;分类数量与待核验范围
──────────────────────────────────────────────────────────────────────
所选时段热销Top10 预计消化时间最长Top10 所选时段无出库库存Top10
按出库件数的横向条形 按可售天数的横向条形 按实物件数的横向条形
```
经营总览时间筛选默认近15天(截至昨日),提供最近3天、最近7天、最近15天、最近30天及最多366天的自定义范围,移除今日;快捷范围均截至北京时间昨日。最近N天为昨日往前完整N天;自定义最晚为昨日,起止日期均包含在统计内。前端将快捷范围转换为明确CUSTOM起止日期调用现有接口,复用查询上下文时以其anchorDate固定边界,整体刷新按当前北京时间重新计算;查看销量与其他下钻统一使用响应中的实际日期。该控件同时影响趋势、区间出库与日均 KPI、库存分布和三个榜单;热销按所选日期内已采集有效出库量排序,未采齐显示部分覆盖。日均与库存评估以同一所选区间的自然日数为分母,包含今日或缺失日期时不以部分销量推算。库存数量仍来自当前固定库存版本,不代表所选日期的历史库存。
KPI 采用紧凑的一行指标带;图表是主要内容,不再以整页描述表承载。复用 Admin 密度令牌,图表不套详情字段网格或普通表格行高。图表行建议趋势约 280~320px 高;榜单给 10 条保留可读高度,不强制全部首屏可见。长 SKU 可换行或省略并提供可聚焦的完整文字;名称与货主为辅助文本,不以内部 ID 回退。
## 指标带
数值来自服务端,保留版本、单位、覆盖和未知原因。这里的件数均为出库或库存数量,不是订单数、成交收入或净销售额。
| 指标 | 展示口径 |
| --- | --- |
| 区间出库量 | 与当前全仓趋势的日点合计守恒;全日均完整才显示正式总量,否则标为“区间已采集出库量”,全无可靠值为“—” |
| 所选时段日均出库 | 本仓所选区间实际出库总量÷区间自然日数;完整仓级覆盖即可计算,不因某个 SKU 库存观察不足抹去有效出库。缺日或含未完整今日则为空 |
| 实物库存 | 当前固定库存版各货主/SKU/品质的有效实物量;冻结、次品已经包含在实物中,不重复相加;在途不加入 |
| 正品可售 | 只汇总正品有效可用数量,不再减冻结、不加在途或次品 |
| 有库存 SKU | 全品质实物量已核验大于零的货主+SKU 去重数;品质行不是独立 SKU;存在库存未知时标记“已确认 N,另 M 待核验” |
| 所选时段无出库 SKU | 有实物且满足完整所选区间零出库的 SKU 数;观察不足仅提示,库存或销量未知另外说明,不认定卖不掉 |
库存或风险总量存在依赖未知时,正式值为空,允许显示“已知小计”及未知 SKU 数;不把未知过滤后仍显示成全仓总数。单项完整性独立:库存失败不阻止完整销量图;销量不足不掩盖已核验库存。全仓可售天数、平均 SKU 可售天数、评分和“优级客户”不在指标带中。
## 五张图表
### 出库趋势
使用日折线图,横轴为北京时间业务日期,纵轴为件数,零基线;日期轴包含完整选择区间。后台按仓库及固定销量版直接汇总有效日事实,包含现在已无库存的出库商品,不从库存列表或 Top 榜单反推总量。仓级全日覆盖完整且无出库时可为零,不要求每个 SKU 均满足所选区间库存观察资格。
每个日点返回正式量、已采集量、完整性和覆盖原因。缺日断线,部分日用明确的点形/虚线及“未完整”文字;不平滑跨越缺口。今日只有一个日累计点,不画小时趋势;自定义长区间减少坐标标签密度但保留全部日点和提示。整段已采集合计等于可靠日点已采集量之和;所有日点未知时合计为空。
仓级趋势按固定已发布版本的覆盖证据判定历史日,采集滞后或待重算不将该版完整历史日统一降为未完整;待重算时明确提示展示已发布历史结果,未发布事实不混入。来源时区、数量单位、日期缺口及今日未结束的限制保留。当前库存评估仍受待重算保护;所选区间包含今日时页面直接说明完整自然日条件不满足,并提示可选择截至昨日的自定义时段,其他库存与销量可信条件仍须满足。
仓级零值与部分值单独判断:全天覆盖完整时,正式量=已采集量=有效日行合计,无行可为 0;只有部分已证明覆盖且无日行时,正式量为空、已采集量为 0、状态 PARTIAL;没有覆盖证明但存在已确认日行时仍保留日行合计为已采集量、状态 PARTIAL;没有覆盖证明且没有日行时,两值均为空、状态 UNKNOWN。连续水位外的已确认日行不能被丢弃,整个仓级趋势不套单 SKU 存在时间或库存观察门槛。
点击已知日点进入销量分析当日自定义范围;未知日不可伪造零数据下钻,改显示该日覆盖不足原因。鼠标提示和键盘聚焦均显示日期、件数、状态;不能仅依赖颜色解释未知。
### 库存消化天数分布
使用横向条形图,单位为 SKU 个数,显示“有实物库存或库存待核验 SKU 的分布”。候选取固定两版 profile 的货主+SKU 并集:明确有效且实物为零的 SKU 排除;有效正实物以及实物未知/过期的候选保留。整个库存版尚不可用时显示无库存资料,不将全部销售候选画成一个伪造的库存总量。
`bucketRuleVersion=COVERAGE_DISTRIBUTION_V1` 按以下先后顺序将每个候选只归入一个桶;上一步命中后不再落入后续桶。销量资格沿用主方案;仅在完整可信窗口及数量单位确认后,没有出库行可记零,观察不足不单独归入 UNKNOWN:
| 桶 | 判定 |
| --- | --- |
| `UNKNOWN` 库存或销量待核验 | 先检查本 SKU 实物或用于可售天数的正品可售数据异常/未知/过期;命中即归此桶。后续因销量窗口或数量质量不足无法计算时也归此桶,分别统计原因 |
| `NO_AVAILABLE` 无可售库存 | 库存有效、实物大于零且正品可售量明确为零;可包含冻结或次品,不宣称周转良好,不依赖销量资格 |
| `NO_OUTBOUND_IN_WINDOW` 所选时段无出库 | 有效正可售量、完整可信所选区间且出库为零;天数为空,不转成无限大 |
| `DAYS_0_30`、`DAYS_30_60`、`DAYS_60_90`、`DAYS_GT_90` | 正可售量、正日均且资格完整,按未舍入天数分别落 `(0,30]`、`(30,60]`、`(60,90]`、`(90,+∞)` |
在无可售库存判断之后、零出库或数值分桶之前检查销量完整性、可信状态和数量单位;不足回到 UNKNOWN。展示顺序为四个数值桶、无出库、无可售、待核验,不等于执行判定顺序。可售天数=当前正品可售量×所选区间自然日数÷区间完整出库量;SKU 的最早有效观察证据单独保留为提示,不阻断上述统计。30/60/90 仅为本版图形分组边界,不是收费、补货或优劣政策。
各桶 `skuCount` 之和必须等于 `candidateSkuCount`,并同时返回已排除的确定零实物 SKU 数。图表不展示“风险率”百分比;待核验量无法被藏进已评估分母。可在提示中显示桶内已知实物小计及未知件数范围,不把件数与 SKU 个数混用。
此分布为互斥展示分组,主方案 attention 是可并存的关注条件,两者不等价。例:全冻结且所选区间零出库 SKU 归 NO_AVAILABLE,但仍可出现在无出库库存榜。冻结、次品、可售、在途不能作为可相加的饼图组成部分。
### 三个 SKU 榜单
均为横向条形图,最多 10 个候选;三个榜单统一使用页面所选日期;无合格候选显示原因,不造空条或补足 10 个。每条展示 SKU、可用名称、所属货主及主指标,提示补充库存/日均/日期依据。同名 SKU 不跨货主合并;坐标从零开始,条长按真实数值,不截成相同最大长度。数量过大可用统一刻度单位,提示保留原值。
| 图表 | 资格与排序 | 下钻 |
| --- | --- | --- |
| 所选时段热销 Top 10 | 按所选日期已采集有效正出库量降序、单数降序、SKU/货主编码升序;部分覆盖也展示,明确标记未完整,不将未采集当零。库存缺失或售罄不阻止进入 | 条目打开同窗口 SKU 趋势;“查看 Top 100”进入销量分析相同 CUSTOM 日期范围 |
| 预计消化时间最长 Top 10 | 有效正可售、正日均、完整可信窗口;按未舍入可售天数降序,SKU/货主编码升序。零销量单列,不冒充无限天数;不等同原 slow-skus 低销量榜 | 条目打开 SKU 趋势;“查看全部”进入库存分析相同有限天数候选及天数降序 |
| 所选时段无出库库存 Top 10 | 主方案 attention=NO_OUTBOUND_IN_WINDOW:全品质有效正实物、完整可信窗口、出库零;包含全冻结/次品有实物者。按实物量降序,SKU/货主编码升序 | 条目打开 SKU 趋势;“查看全部”进入库存分析无出库关注及实物量降序 |
排名从全仓所有已授权货主的候选先算资格/排序后截取,不先截 SKU 清单或逐货主各取十个再汇总。库存或销量数据实际不足时返回待评估数量,观察不足本身不增加待评估数;榜单明确是“符合条件的 SKU”,不以没有合格候选推断库存健康。可售天数很长仍是按历史速度的估算,不标成真实库龄或一定卖不掉。
## 图表交互与视觉依据
本文件作为新增页面的设计依据,布局由上面的页面示意和本矩阵约束;实现前总控将对应记录并入模块现有 `operation-matrix.md`。既有页面承载以该矩阵的用户截图纠正为准,不读取或恢复更早的货主面板。
| 页面操作 | 承载与行为 | 设计验收 |
| --- | --- | --- |
| 仓库/统计范围查询 | 同页紧凑 QueryToolbar;查询先校验再更新,切仓清旧数据并取消旧请求 | 不增加独立货主控件,不在主区堆账号键、时区技术值、长规则 |
| 刷新 | 明确按钮整体更新版本与 queryAsOf;新数据提示不自行替换某张图 | 过期上下文显示刷新提示,不混合版本 |
| 柱/条与日点提示 | 图内提示,键盘可聚焦查看同等内容;未知日只展示缺口原因 | 不是新业务弹框,不仅靠颜色或悬浮识别数值 |
| SKU 条目趋势 | 沿用当前 1120px 居中 AppDialog,支持已有全屏/关闭;传该行 customerCode+sku 和上下文,三个榜单均使用所选范围 | 不改为列表下方详情、抽屉或新详情页;关闭取消请求 |
| 分桶或查看全部 | 导航至既有销量/库存正式页面并带准确筛选、版本和返回来源 | 目标页显示可清除的“来自经营总览”条件摘要,不重新引入货主选择器 |
| 查看采集状态 | 导航至所选仓的数据采集页 | 只查看当前状态,不触发采集/重试 |
保留屏幕阅读名称、键盘入口、焦点和足够对比度;趋势每日数值、SKU覆盖证据、库存分组说明、分布与排行榜按2026-10-13用户截图反馈统一使用居中弹框;分布与排行榜使用“查看完整明细”1040px居中弹框,提供完整名称、数值、证据及同资格的键盘下钻入口,长字段换行,正文滚动;悬浮提示只展示名称和数量并限制宽度,Top100/查看全部仍进入对应列表,不将全页默认变回表格。主图使用折线与条形,不使用 3D、雷达、仪表盘、双轴、装饰动画或无依据的“健康分”。按 2026-10-13 用户确认,自营业务图表统一使用 ECharts+vue-echarts,通过模块内 `AnalyticsChart.vue` 按需注册并使用 Canvas 渲染;坐标轴、提示框、缩放、条形及环形进度用配置维护,删除手写 SVG/CSS 绘图。日趋势与 SKU 趋势共用有效数据连线配置,未完整日用虚线,未知或缺失日期仍断线。
功能/合同评审和人工视觉验收分别记录。本设计不代替真实页面的人工 `1920×1080`、100% 截图验收,未提供截图时保留待人工确认,不声称视觉通过。
## 服务端聚合接口
新增 `GET /api/platform/v1/last-leg/self-operated-analytics/dashboard`,前端使用独立 `analyticsApi.dashboard`。现有前端 `overview` 实际调用 `sync-overview`,是采集状态接口,不能用它冒充经营聚合或改掉原语义。
入参要求 `sourceAccount,warehouseCode`,趋势参数复用 `rangePreset` 和 CUSTOM 的 `startDate,endDate`;不接受 customerCode、SKU、跨仓合并或任意 Top N。首次查询固定主方案中的两版、范围摘要、queryAsOf 及到期时间;后续切换统计范围复用上下文,显式刷新/切仓重新建立。榜单数量服务端固定 10,消化天数分组固定 V1。
在一次短只读一致快照中校验范围/版本并读取所需数据;整个响应共同使用同一上下文,不由前端并发获取多个“最新版本”后拼屏。某一数据族不可用时仅返回该族不可用,不妨碍另一族可用图形;鉴权失败、参数错误、版本无效或 SQL 失败是请求错误,不吞掉后转零或正常空图。
| 响应块 | 主要字段与要求 |
| --- | --- |
| `context` | 主方案现有完整版本上下文、统一所选范围 rangeStartDate/rangeEndDateExclusive、salesCoveredFrom/Until、库存观测起止、inventoryFreshUntil、queryExpiresAt,另含 inventoryDrilldownExpiresAt(有效库存时取前两截止时间的较早值,否则不可用);技术字段用于程序,不放主页面占位 |
| `kpis` | 六项指标各有 value/knownSubtotal、单位、dataStatus、unknownSkuCount、reasonCodes;区间出库另有正式量/已采集量,日均 averageDailyOutboundQuantity 与无出库数 noOutboundSkuCount 使用同一所选区间 |
| `salesTrend` | 每日 points 及区间汇总;每点 businessDate、outboundQuantity、observedQuantity、dataStatus、reasonCodes,最多 366 点,日轴不省略缺日 |
| `coverageDistribution` | bucketRuleVersion、candidateSkuCount、excludedZeroPhysicalSkuCount、各 bucketCode/skuCount、可选已知实物小计/未知数、dataStatus/reasonCodes;分组未知原因有摘要 |
| `hotSkus`/`longCoverageSkus`/`noOutboundSkus` | 各自实际窗口(windowStartDate/windowEndDateExclusive/calculationWindowDays)、eligibleCount、unassessableCount、items(最多 10)、dataStatus/reasonCodes;每项包含实际 customerCode+sku、名称、主指标及其单位/必要辅助值,窗口出库字段为windowOutboundQuantity。热销部分覆盖返回PARTIAL与SALES_WINDOW_INCOMPLETE,不返回该部分量推算的日均和消化天数。单点弹框复用原 daily API,不因图形新增另一份销量公式 |
计数无法确定时用空值和原因,不能把未计算的 eligibleCount/unassessableCount 默认为零。冻结、次品、在途可作为必要辅助数量,不新增会被误加总的库存占比饼图。所有经营数量的已知小计/完整总量遵守主方案;日均销售和本页库存分类均不以 SKU 观察期作为阻断条件,观察状态单独提示。
### 精确下钻合同
现有销量/库存页仅解析并传递 warehouseCode、sku,不能只拼一个新 URL 就宣称下钻已完成。此次必须扩展目标页的参数解析、初始化、取消请求、校验与返回上下文;来源条件只作为查询条件,权限仍由服务端核验。
- 通用路由条件:`warehouseCode`、可选精确 `sku,customerCode`(仅行身份,不显示独立货主选择器)、原完整版本上下文、`from=overview`。使用固定本地路由,不接受任意 return URL;编码/日期/枚举非法显式提示,不能静默忽略成全仓查询。
- 趋势日点:销量页 `analysis=SKU`、`rangePreset=CUSTOM` 且 startDate=endDate=该日。热销 Top 100:`analysis=HOT,rangePreset=CUSTOM,startDate,endDate`,日期来自榜单窗口(endDate 为 exclusive 截止前一日),不再携带 windowDays。这两个路由枚举是新增初始化合同,开发映射到现有页面状态,不能原样当作新的外部 API 字段。dashboard 的 eligibleCount 是当前已采集有效正出库候选数,热销明细沿用原 Top 100 上限,故 total=min(eligibleCount,100),前 10 名及主值必须一致;不扩展成无限热销榜。
- 无出库全部:库存页 `attention=NO_OUTBOUND_IN_WINDOW,sortBy=PHYSICAL_DESC`。最长可售全部:`/inventory-coverage` 和路由均新增 `coverageSelection=FINITE_POSITIVE`,在服务端 SQL 分页前过滤为正式有限正可售天数候选,`sortBy=COVERAGE_DAYS_DESC`;不能仅在浏览器当前页过滤,也不能把零库存、未知天数放进候选冒充同一榜单。该字段属于本地报表接口,不传领星。
- 分布条形:库存页新增 `coverageBucket` 与 `bucketRuleVersion=COVERAGE_DISTRIBUTION_V1`。服务端 `/inventory-coverage` 同步接收并按上述唯一分组谓词过滤;不能把区间点击近似替换成 attention 或一个“大于”阈值。coverageBucket 与 coverageSelection、非 ALL attention 互斥,冲突拒绝;未带 bucket 时不接收单独 ruleVersion。FINITE_POSITIVE 与非 ALL attention 也互斥。
- 日点、整榜、分桶或具体 SKU 下钻均携带同一版本上下文;条件 chip 可清除,清除后恢复目标页常规范围,但不更换仍有效的上下文。返回总览恢复原仓库、趋势范围、上下文及滚动位置;到期或版本不可用时提示整体刷新,不能悄悄换新后声称与原图一致。
库存严格下钻从原图 context 提取起止日期,向 `/inventory-coverage` 携带 `drilldownFrom=DASHBOARD,rangePreset=CUSTOM,startDate,endDate`(endDate 含当日),不携带 salesWindowDays/salesWindowEndDate。普通库存明细仍使用独立的 10/30 日选择;同一无出库关注与区间出库排序按实际窗口计算。严格下钻标志用于声明与原图一致的读取要求,不授予额外权限;from=overview 的目标页必须映射此参数。服务端从原上下文及库存 run 的真实时效重新计算 inventoryDrilldownExpiresAt,不信任客户端传入的截止时间。库存已超过有效期或上下文到期时返回明确的“原图库存已过期,请刷新总览”错误,不能按过期后的 UNKNOWN 重新分桶再冒充原图结果;前端同时禁用原库存图的分桶/榜单列表下钻。此时趋势与热销的有效读取仍可继续,普通库存页的历史/过期展示保持原规则;重新加载的过期总览仅提供普通库存诊断入口,不提供严格分桶下钻。单条 SKU 的出库趋势不受库存过期阻断。
## 数据模型与查询性能
本页不新增采集任务、调度、周月汇总、缓存平台或库龄表。2026-10-13 用户确认允许新增仓库每日汇总表 `ll_selfop_warehouse_daily_sales`,按销量版本、来源账号、仓库、业务日保存有效已采集量、异常日行数与源日行数,数量沿用六位小数。每批 SKU 日行与对应仓日汇总在同一事务写入并推进构建检查点;发布前核对汇总覆盖的源行数,成功后同事务设置销量版本 `warehouse_daily_ready`。空销量版也必须完成该验证,不能以汇总表无记录推断为零。缺少就绪证据的版本明确拒绝总览读取,重新构建发布,不回退到旧查询或补写旧版本。
趋势和仓库销量合计读取已发布仓日汇总,日期完整性、部分采集与异常口径仍由原版本覆盖证据判定;仓日汇总不证明完整自然日。SKU 明细、库存与榜单继续复用已发布 daily、snapshot、profile、run;SQL 按版本、仓库、日期限缩,库存先按货主+SKU/品质聚合,再与销量连接,禁止原始订单 Join 或逐 SKU/逐货主 N+1。版本保留与受保护版本规则同时覆盖仓日汇总;不引入额外清理调度。
趋势在数据库按业务日期聚合;三个榜单分别在完整候选上计算并排序 LIMIT 10;分桶在 SQL 中 CASE 聚合,不能从第一页库存或 Top 100 拼出全仓分布。前端一次 dashboard 响应只接收最多 366 个日点、7 个桶和 30 条榜单记录及固定 KPI,不请求全部库存,不逐货主调用 owner-overview。下钻的库存计数及谓词必须与 dashboard 共享,避免边界漂移。
沿用主方案的代表性合成数据档位:单仓 1 万货主+SKU、多个历史统计版、有后台构建及 10 个并发只读用户。新增目标为 dashboard HTTP P95≤1.5s;报告 P50/P95/P99、SQL 数、扫描行及响应大小,查询数量须为固定少量、不得随 SKU/货主数线性增长。目标未实测,不以 SVG 绘图流畅代替后端验收。首次与预热分别记录,任何测试不对领星发起压力请求。
首次加载用结构占位;无仓、无业务版本、可靠全零、观察不足、过期和失败分别呈现。主动切仓立即清旧仓图并隔离迟到响应;相同条件刷新失败可以保留旧图,但明确“刷新失败,展示上次查询”,不伪装新成功。到达库存有效期或上下文到期后,相应指标标为历史/待刷新,不继续作为当前可信结论;不靠后台轮询替换单张图。点击刷新只读本地接口,不意味着立即同步领星。
## 离线验收与评审
下表均为合成数据设计,不作为真实经营结果;开发需同步 OpenAPI、权限、目标页路由解析和直接测试,API 门禁沿后端根指引执行。原模块已有功能与人工截图结论保留,不因新增总览回退 SKU 中心布局。
| 用例 | 必须得到的结果 |
| --- | --- |
| 近15天截至昨日,切换最近3/7/15/30天/CUSTOM | 无今日选项,自定义禁选今日及未来;趋势、KPI、分布和榜单使用同一实际区间,缺日保留待评估;下钻与返回日期一致 |
| 日量 2、未知、5,今日部分 1 | 可靠值合计 8 标已采集,正式总量为空;缺日断线,今日部分;全未知合计为空,不为 0 |
| 同仓 SKU X 属货主 A 出库 2、B 出库 5,均有效 | 全仓对应日为 7;榜单与点击身份保留两条,下钻分别为 2/5 |
| 库存缺失但所选区间完整销量数据存在 | 日均、趋势、热销可用,依赖库存的图形显示未就绪,不让库存失败清空销售 |
| A 正可售 3000、30 日出库 300;B 正可售 30、出库 30 | A 可售 300、B 30,分别归 >90 和 (0,30],最长榜 A 在前;不按低销量将 B 当更积压 |
| 候选 5 个:有效正可售零出库、全冻结且零出库、库存未知、有效天数 30、有效天数 30.04;再有明确零实物 1 个 | 分别落无出库/无可售/待核验/(0,30]/(30,60];桶合计 5、排除数 1;冻结 SKU 仍能进入独立无出库库存榜 |
| 正品实物 120 含冻结 20,可售 100;次品实物 8,在途 30 | 实物 128、可售 100,不相加为 278;图中不出现这几个重叠量的库存组成饼图 |
| 整体存在未知库存或销量缺口;热销和无出库候选不足 10 个 | 标已知小计和待评估,不补齐榜单、不宣称整体无风险;完全无可靠资料不显示健康零值 |
| 90、90.04 天显示均可能接近 90;零出库的天数为空 | 比较与分桶按未舍入值,分别≤90/>90;零出库不进最长有限天数榜、不放成无限值 |
| 每个分桶点击、榜单跳转、单条趋势,随后返回;另测 200 个热销候选 | 库存分桶/最长/无出库的 total 等于对应完整候选数;热销 total=min(eligibleCount,100),200 个候选时为 100,前 10 一致。身份/版本不变,复用 1120px 趋势弹框,返回保留范围及滚动位置 |
| 图表加载途中切仓、后台发布新版、跨午夜或上下文过期 | 旧仓响应不覆盖新仓;不单图切版或自动滚动今天;到期明确刷新,库存过期不继续显示当前有效 |
| 同一版本和 30 分钟上下文仍有效,但库存先到 freshUntil,再点击原分桶/库存榜单 | 前端阻止旧图严格下钻,服务端同样拒绝,不返回改变分类的结果冒充一致;要求刷新总览,出库趋势/热销仍按其独立资格读取 |
| dashboard 或路由参数缺仓、非法桶、互斥参数冲突、客户身份调用 | 明确拒绝,不能悄悄全仓查询;平台鉴权和来源范围校验不因汇总而弱化 |
设计评审收口项:SKU 中心与现有页面一致;总览及下钻统一所选区间;分布互斥且守恒;零出库与有限天数分开;全品质实物不重叠相加;未知不隐藏;下钻需要真实参数接线和共用谓词;新增聚合接口与运行概览分开。评审不覆盖生产吞吐、真实数据对账或人工视觉验收。
本轮已分别完成数据口径、页面/接口两项独立评审,并复核修正后的合同:补齐仓级部分日零值规则、库存时效先于查询上下文到期的严格下钻门禁,以及热销完整候选数与原 Top 100 上限的区别。设计范围内无剩余阻塞,可交开发总控安排;不把该结论作为代码、性能或视觉验收通过。
后续可在真实库龄、空间占用和内部经营规则核验后增加库龄分布及成本分析,不在本页放无数据的库龄饼图、平均周转率、货主评分或费用预测。开发总控按本设计安排前后端工作,计划和测试状态由其当前对话及正式工程契约维护。
图表明细与说明弹框通过 append-to-body 挂到页面根部,避免图表卡片动画/transform限制遮罩与弹框;更换数据关闭旧弹框,日期下钻先关闭明细,长表只滚动弹框正文。库存分组说明宽760px,每日数值/覆盖证据和排行明细宽1040px,可全屏。
热销Top10完整明细按用户最新截图去重:使用1280px居中弹框,按排名、SKU、商品名称、货主、所选时段出库量、实物库存、可售库存、窗口日均、预计可售天数分列;不再拼接重复说明段落,窗口与覆盖状态只在表格上方展示。商品名称与SKU完全相同时显示—,以“SKU+空格”起始时仅去掉该重复前缀;货主+SKU身份及点击下钻保持不变,未知指标不补零。
三张Top10卡片的日常展示只保留标题、图表与必要的一行异常提示(未采齐、待评估数量或待刷新);日期、资格数量、完整性详情和统计口径收进右上角“说明”,正常状态不重复显示“完整/待评估0”。图表顶部保持对齐,预计消化天数图上与悬浮数字最多两位小数,明细保留原始精度。
出库趋势与库存消化天数分布沿用Top10的简洁展示:日期、线型图例、候选/排除数量、完整性及分组口径均在右上角“说明”查看,独立“明细”入口保留每日数据或分桶数值。图表主体保留坐标轴、单位及必要空态。