线上订单里组合装以 ZH-子件A-N-子件B-M 拼接编码存在,按 sku_id 精确 匹配永远查不到子件销量;全民客户(jst_qmcust_orderlist)渠道此前完全 未纳入。两处缺失导致大量 SKU(尤其组合装子件)窗口销量被算成 0。 销量 ship CTE 拆为 4 个 UNION ALL 分支: 1) jst_Orders 普通行(sku_type<>combine) 2) jst_Orders 组合装行 JOIN jst_comboProductItem 展开为子件x数量 3) jst_qmcust_orderlist 普通行(排除拆单父单 Split/Question) 4) qmcust 组合装行同样展开 均按 send_date 窗口,仓库过滤不变。等级/日销/分摊销量随数据源自动重算。
92 lines
4.5 KiB
JavaScript
92 lines
4.5 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: '统计范围固定为真实拣选仓位(pack_type=Bin 且 bin_group 为空);箱记录和存货位不纳入动销分析',
|
||
},
|
||
{
|
||
key: 'skuId',
|
||
label: '商品编码',
|
||
tip: '商品编码(jst_packInventoryInfo.sku_id),一行就是一个「仓位 × 商品」组合',
|
||
},
|
||
{
|
||
key: 'stockQty',
|
||
label: '库存数量',
|
||
tip: '该商品在这个仓位上的当前库存件数(同一仓位多行的库存相加 = 仓位库存)',
|
||
},
|
||
{
|
||
key: 'salesQty',
|
||
label: '商品销量',
|
||
tip: '近 N 天该商品的销量(整档,不按仓位分摊):含线上订单、组合装子件拆分、全民客户(B2B分销)渠道;同一商品占几个仓位,这几行显示的销量都一样,所以这一列不能直接按行求和',
|
||
},
|
||
{
|
||
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 = [
|
||
'【统计范围】只统计真实拣选仓位(pack_type=Bin 且 bin_group 为空);箱记录(pack_type=Pack)和存货位不纳入动销分析。',
|
||
'',
|
||
'【粒度】一行 = 一个「仓位 × 商品编码」组合。一个仓位放了 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(按仓库 + 仓位 + 商品汇总);',
|
||
'销量按 send_date 窗口统计 4 个来源:① jst_Orders 普通商品行;② jst_Orders 组合装行(ZH-拼接编码)按组合装映射展开为子件;',
|
||
'③ jst_qmcust_orderlist 全民客户(B2B分销)普通行(排除拆单父单 Split);④ qmcust 组合装行同样展开。',
|
||
'统计范围:只取 pack_type=Bin 且 bin_group 为空的真实拣选仓位,箱记录(pack_type=Pack)和存货位(bin_group=存货)不参与统计。',
|
||
];
|