feat: 动销等级改为按商品日销统计,列表与导出统一到仓位×商品粒度 #60

Merged
youruo merged 1 commits from codex/picking-bin-grade-by-sku-1008 into main 2026-10-08 10:59:15 +08:00
Collaborator

背景

原动销等级按「仓位日销」判定:先把商品销量摊到每个仓位,再按仓位日均销量分档。这样一件爆款商品放在 10 个仓位就会被算成日销 1/10,判断的是摆法而不是商品本身。

内容

  • 等级口径改为商品日销:商品日销 = 该商品在窗口内的整档销量 ÷ 天数,不做仓位分摊;同一商品占几个仓位都是同一等级
  • 粒度统一:列表页与导出都改为一行 = 一个「仓位 × 商品编码」,共用同一个取数函数 fetchPickingBinSkuRows(原 bin 级 fetchPickingBinRows 删除)
  • 列表页:新增「商品编码」列,去掉已失去意义的「SKU数」列,搜索框支持按商品编码过滤,行键加入商品编码
  • 汇总卡片:主数值改为去重商品数(后缀「品」),另显示明细行数;销量按「仓库 × 商品」去重口径统计,库存仍可按行求和
  • 导出:列调整为 仓库 / 仓位 / 类型 / 商品编码 / 库存数量 / 仓位SKU数 / 商品销量 / 分摊销量 / 商品日销 / 动销等级 / 统计天数 / 统计基准日
    (商品销量跨仓位重复、不可按行求和;需要求和请用「分摊销量」列)
  • 性能:仓位类型选满时不拼 IN 过滤,避免参数嗅探把查询计划带偏
  • 口径说明、Tooltip、等级 tip 文案同步更新

验证(基准日 2026-10-08、30 天窗口、拣选位)

  • 明细 11871 行 / 去重商品 6821 个 / 库存合计 499141(与旧口径一致)
  • 跨多仓位的 2028 个商品,销量与等级不一致 0 个
  • 等级分布(去重商品):爆款 3 / 热卖 18 / 平销 183 / 滞销1 697 / 滞销2 3005 / 销售=0 2915
  • 导出恒等式:分摊销量合计 96847 = 去重商品销量合计 96847(差异 -0.0017,浮点舍入)
  • 类型与窗口切换:拣选位 11871 行、全类型 15676 行、7 天窗口均正常返回 200
  • 性能:全类型查询由原先超时(>60s)降到约 30 秒;拣选位约 13~24 秒
  • 单测 9/9 通过;后端语法检查 182 文件通过;前端 eslint 无报错、vite build 成功

授权

用户 2026-10-08 明确要求「动销等级依据商品日销统计,不要按仓位日销」,并在两个方案中选择了「商品整档销量÷天数」与「列表页也拆到仓位×商品」。

## 背景 原动销等级按「仓位日销」判定:先把商品销量摊到每个仓位,再按仓位日均销量分档。这样一件爆款商品放在 10 个仓位就会被算成日销 1/10,判断的是摆法而不是商品本身。 ## 内容 - **等级口径改为商品日销**:商品日销 = 该商品在窗口内的整档销量 ÷ 天数,不做仓位分摊;同一商品占几个仓位都是同一等级 - **粒度统一**:列表页与导出都改为一行 = 一个「仓位 × 商品编码」,共用同一个取数函数 `fetchPickingBinSkuRows`(原 bin 级 `fetchPickingBinRows` 删除) - **列表页**:新增「商品编码」列,去掉已失去意义的「SKU数」列,搜索框支持按商品编码过滤,行键加入商品编码 - **汇总卡片**:主数值改为去重商品数(后缀「品」),另显示明细行数;销量按「仓库 × 商品」去重口径统计,库存仍可按行求和 - **导出**:列调整为 仓库 / 仓位 / 类型 / 商品编码 / 库存数量 / 仓位SKU数 / 商品销量 / **分摊销量** / 商品日销 / 动销等级 / 统计天数 / 统计基准日 (商品销量跨仓位重复、不可按行求和;需要求和请用「分摊销量」列) - **性能**:仓位类型选满时不拼 `IN` 过滤,避免参数嗅探把查询计划带偏 - 口径说明、Tooltip、等级 tip 文案同步更新 ## 验证(基准日 2026-10-08、30 天窗口、拣选位) - 明细 **11871 行** / 去重商品 **6821 个** / 库存合计 **499141**(与旧口径一致) - 跨多仓位的 **2028 个商品**,销量与等级不一致 **0 个** - 等级分布(去重商品):爆款 3 / 热卖 18 / 平销 183 / 滞销1 697 / 滞销2 3005 / 销售=0 2915 - 导出恒等式:分摊销量合计 **96847** = 去重商品销量合计 **96847**(差异 -0.0017,浮点舍入) - 类型与窗口切换:拣选位 11871 行、全类型 15676 行、7 天窗口均正常返回 200 - 性能:全类型查询由原先超时(>60s)降到约 30 秒;拣选位约 13~24 秒 - 单测 9/9 通过;后端语法检查 182 文件通过;前端 eslint 无报错、`vite build` 成功 ## 授权 用户 2026-10-08 明确要求「动销等级依据商品日销统计,不要按仓位日销」,并在两个方案中选择了「商品整档销量÷天数」与「列表页也拆到仓位×商品」。
youruo added 1 commit 2026-10-08 10:59:01 +08:00
- 取数统一为 fetchPickingBinSkuRows:一行 = 一个「仓位 × 商品编码」,列表与导出共用
  商品日销 = 商品窗口整档销量 ÷ 天数(不做仓位分摊);同一商品占几个仓位都是同一等级
  另输出分摊销量 = 商品销量 ÷ 占用同类型仓位数,供按行求和
- 列表页同步拆到商品粒度:新增商品编码列,去掉 SKU数列,搜索支持商品编码
- 汇总卡片主数值改为去重商品数,另显示明细行数;销量按去重商品口径统计
- 导出新增「分摊销量」「商品日销」列,表头口径标注更明确
- 性能:仓位类型选满时不拼 IN 过滤(避免参数嗅探走坏计划),全类型查询由超时降到约 30 秒

验证(基准日 2026-10-08、30 天、拣选位):
- 明细 11871 行 / 去重商品 6821 个 / 库存合计 499141(与旧口径一致)
- 跨多仓位的 2028 个商品,销量与等级不一致 0 个
- 导出行求和:分摊销量合计 96847 = 去重商品销量合计 96847(差异 -0.0017,浮点舍入)
- 单测 9/9 通过;语法检查 182 文件通过;前端 eslint 无报错、vite build 成功
youruo merged commit 8f12b889c0 into main 2026-10-08 10:59:15 +08:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: lunanting/cangku#60
No description provided.