上一版为去掉冗余把「类型」整列删了,用户要求的报表列结构中该列仍在, 现恢复:导出与列表均保留「类型」列,值恒为「拣选」(存货位不参与统计,报表中不会出现) 验证(基准日 2026-10-08、30 天): - 导出表头为 仓库 / 仓位 / 类型 / 商品编码 / 库存数量 / 仓位SKU数 / 商品销量 / 分摊销量 / 商品日销 / 动销等级 / 统计天数 / 统计基准日 - 11897 行,类型列取值集合仅 ['拣选'],空值 0 行;分摊销量合计 98087 = 去重商品销量合计 98087 - 列表接口 binTypes=['拣选'],明细类型集合仅 ['拣选'] - 单测 9/9 通过;语法检查 182 文件通过;eslint 无报错、vite build 成功
91 lines
4.2 KiB
JavaScript
91 lines
4.2 KiB
JavaScript
/** 拣选库位动销分析 —— 表头与口径说明(粒度:仓位 × 商品编码) */
|
||
|
||
export const PICKING_BIN_COLUMNS = [
|
||
{
|
||
key: 'warehouse',
|
||
label: '仓库',
|
||
tip: '聚水潭主仓(按 wms_co_id 单仓独立统计,不合并分仓)',
|
||
},
|
||
{
|
||
key: 'binName',
|
||
label: '仓位',
|
||
tip: '系统仓位编码(jst_packInventoryInfo.bin);同一仓位有多个商品时会出现多行',
|
||
},
|
||
{
|
||
key: 'binType',
|
||
label: '类型',
|
||
tip: '统计范围固定为拣选位(bin_group 为空的仓位);存货位不纳入动销分析,报表中不会出现',
|
||
},
|
||
{
|
||
key: 'skuId',
|
||
label: '商品编码',
|
||
tip: '商品编码(jst_packInventoryInfo.sku_id),一行就是一个「仓位 × 商品」组合',
|
||
},
|
||
{
|
||
key: 'stockQty',
|
||
label: '库存数量',
|
||
tip: '该商品在这个仓位上的当前库存件数(同一仓位多行的库存相加 = 仓位库存)',
|
||
},
|
||
{
|
||
key: 'salesQty',
|
||
label: '商品销量',
|
||
tip: '近 N 天该商品的销量(整档,不按仓位分摊):同一商品占几个仓位,这几行显示的销量都一样,所以这一列不能直接按行求和',
|
||
},
|
||
{
|
||
key: 'dailySales',
|
||
label: '商品日销',
|
||
tip: '商品销量 ÷ 统计天数,动销等级严格按此值划分',
|
||
},
|
||
{
|
||
key: 'gradeKey',
|
||
label: '动销等级',
|
||
tip: '按商品日销划分:爆款≥20 / 热卖款 10~20 / 平销款 3~10 / 滞销款-1 1~3 / 滞销款-2 0~1 / 销售=0',
|
||
},
|
||
];
|
||
|
||
export const PICKING_BIN_WINDOW_OPTIONS = [
|
||
{ label: '近 7 天', value: 7 },
|
||
{ label: '近 15 天', value: 15 },
|
||
{ label: '近 30 天', value: 30 },
|
||
{ label: '近 60 天', value: 60 },
|
||
];
|
||
|
||
export const PICKING_BIN_DEFAULT_DAYS = 30;
|
||
|
||
/** 动销等级展示色(与后端 key 对应) */
|
||
export const PICKING_BIN_GRADE_COLORS = {
|
||
hot: 'red',
|
||
best: 'volcano',
|
||
normal: 'blue',
|
||
slow1: 'gold',
|
||
slow2: 'default',
|
||
zero: 'default',
|
||
};
|
||
|
||
export const PICKING_BIN_DESCRIPTION = [
|
||
'【统计范围】只统计拣选位(bin_group 为空的仓位);存货位不纳入动销分析。',
|
||
'',
|
||
'【粒度】一行 = 一个「仓位 × 商品编码」组合。一个仓位放了 N 个商品就显示 N 行,列表与导出一致。',
|
||
' 库存数量 = 该商品在这个仓位上的实际库存(同一仓位多行相加 = 仓位总库存)。',
|
||
'',
|
||
'【动销等级口径】按「商品日销」分档:商品日销 = 该商品近 N 天销量 ÷ N。',
|
||
' 爆款:日销 ≥ 20;热卖款:10 ≤ 日销 < 20;平销款:3 ≤ 日销 < 10;',
|
||
' 滞销款-1:1 ≤ 日销 < 3;滞销款-2:0 < 日销 < 1;销售=0:窗口内该商品无销量。',
|
||
' 等级判断的是商品本身的销售速度,与其摆放位置无关 —— 同一件商品占几个仓位,等级都相同。',
|
||
'默认统计窗口为近 30 天,可切换 7 / 15 / 30 / 60 天。',
|
||
'',
|
||
'【为什么不用分摊销量来定等级】',
|
||
' 同一 SKU 常同时占用多个同类型仓位(崔桥工厂仓实测 3290 个拣选 SKU 中 1431 个跨多个拣选位,最多 24 个)。',
|
||
' 若把销量先摊到每个仓位再定等级,一件日销 100 的爆款放在 10 个仓位就会被算成日销 10 —— 判断的是「摆法」而不是商品。',
|
||
'',
|
||
'【商品销量为什么不能直接按行求和】',
|
||
' 商品销量取的是整档销量(不除以占用仓位数),同一件商品跨仓位会重复出现,所以该列相加无意义。',
|
||
' 需要按行求和请用导出文件里的「分摊销量」列:商品销量 ÷ 其占用的同类型仓位数。',
|
||
' 恒等式已实测校验(差异 0):全部行分摊销量之和 = 有库位记录的那些 SKU 的销量之和。',
|
||
' 注意它小于全仓销量:jst_packInventoryInfo 只覆盖部分 SKU 的仓位数据,无仓位记录的 SKU 销量不计入任何库位。',
|
||
'',
|
||
'数据来源:库存取 rpt.jst_packInventoryInfo(按仓库 + 仓位 + 商品汇总);',
|
||
'销量取 rpt.jst_Orders × rpt.jst_OrderItem(按 send_date,排除 Delete/Cancelled),与「每日进销存」发货口径一致。',
|
||
'统计范围:只取 bin_group 为空的拣选位,存货位(bin_group=存货)不参与统计。',
|
||
];
|