企业随着生产经营的延续,其产品、产品SKU也会越来越多,当然同个产品的计量单位也可能越来越多。比如企业规模小,采购可能是按KG采购(价格可能比较贵),当企业采购量大时,采购可能就按吨来采购啦(比如白糖、粒子等)。因此企业信息化软件在解决企业产、供、销核心业务时,必须考虑到产品多单位问题。
企业通常在采购、销售环节可能部分产品可能会涉及多单位问题。特殊行业,比如快消品行业,在报损、集卡或奖盖兑现等环节部分产品也可能会涉及多单位问题。多单位通常处理流程如下:
本文将探讨一种比较简单的多单位系统实现方案。
CREATE TABLE `base_goods` (
`sid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`goods_id` varchar(32) NOT NULL,
`goods_no` varchar(20) NOT NULL COMMENT '商品编码',
`goods_name` varchar(100) NOT NULL COMMENT '商品名称',
`spec` varchar(64) DEFAULT NULL COMMENT '规格',
`unit_id` varchar(32) DEFAULT NULL COMMENT '计量单位',
`unit_scale` decimal(20,4) DEFAULT NULL COMMENT '规格系数',
`unit_weight` decimal(20,6) DEFAULT NULL,
`barcode` varchar(32) DEFAULT NULL COMMENT '箱条码',
...
PRIMARY KEY (`sid`),
UNIQUE KEY `NewIndex2` (`goods_id`,`goods_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表'
CREATE TABLE `base_goods_unit` (
`sid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`unit_id` varchar(32) DEFAULT NULL,
`unit_name` varchar(32) DEFAULT NULL COMMENT '计量单位',
...
PRIMARY KEY (`sid`),
UNIQUE KEY `NewIndex1` (`unit_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='单位表'
CREATE TABLE `base_goods_sku` (
`sid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`goods_id` varchar(32) NOT NULL COMMENT '产品ID',
`unit_id` varchar(32) NOT NULL COMMENT '单位',
`spec` varchar(64) DEFAULT NULL,
`unit_scale` decimal(20,4) DEFAULT NULL COMMENT '规格系数',
`unit_weight` decimal(20,6) DEFAULT NULL,
`barcode` varchar(32) DEFAULT NULL COMMENT '箱条码',
`is_default` char(1) DEFAULT 'N',
...
PRIMARY KEY (`sid`),
UNIQUE KEY `idx_base_goods_unit` (`goods_id`,`unit_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品多单位、sku表'
- 维护两个基本单位:unit_id = 1, unit_name = 箱;unit_id = 2, unit_name = 瓶
新增一个产品,产品单位下拉选择数据源为base_goods_unit基本单位表;
goods_id | goods_no | goods_name | unit_id | spec | unit_scale | unit_weight | bar_code |
---|---|---|---|---|---|---|---|
1 | 1001 | 596ml纯净水 | 1(箱) | 4*6 | 40 | 0.0001 | 012039988455 |
新增产品时,同时会往base_goods_sku插入一条记录,内容如下:
goods_id | unit_id | spec | unit_scale | unit_weight | bar_code | is_default |
---|---|---|---|---|---|---|
1 | 1(箱) | 4*6 | 24 | 0.0024 | 012039988455 | Y |
goods_id | unit_id | spec | unit_scale | unit_weight | bar_code | is_default |
---|---|---|---|---|---|---|
1 | 1(箱) | 4*6 | 24 | 0.0001 | 012039988455 | Y |
1 | 2(瓶) | 1*1 | 1 | 0.0001 | 012039988456 | N |
说明:
- 产品规格系数,unit_scale=24,表示 1箱 = 24最小单位,最小单位可以不维护;
- 案例维护了最小单位:瓶,因为其unit_scale = 1,则596ml水 1箱=24瓶;
- 假设596ml水,再维护一个单位:提,规格系数=12,则1箱=2提=24瓶
根据base_goods, base_goods_sku表,可以列出产品单位组合表,如下表:
goods_id | unit_id | spec | unit_scale | unit_weight | bar_code | is_default |
---|---|---|---|---|---|---|
1 | 1(箱) | 4*6 | 24 | 0.0001 | 012039988455 | Y |
1 | 2(瓶) | 1*1 | 1 | 0.0001 | 012039988456 | N |
只要对列表行项目进行采购、销售即可,菜单行项目、销售订单行项目必须包含goods_id,unit_id信息。
为了便于盘点、财务记账,仓库通常按物料默认单位进行出入库,如本例的596ml水,你默认单位为箱,假设销售了960瓶,则出库时(假设原库存为100箱):
库存减少 960/24 = 40 箱,当前库存 = 100 - 40 = 60箱。
奖盖兑现
类似“再来一瓶”,“加1元再来一瓶”促销活动,顾客向门店兑奖后,门店会向经销商兑奖,经销商则会把奖盖、集卡等交给企业业务员,并录入系统,类似xx产品,申请奖盖兑现xx只。企业销售内勤核实情况后,会根据维护的兑奖规则,根据产品多单位规格系数,折算出兑现数量(默认单位),通过:
产品报损
操作方式同”奖盖兑现“,经销商对有暇疵的产品(包装不好,沉淀等)提交报损申请,经业务员核实后,企业销售内勤根据报损产品数量单位计算最终报损数量或金额:
基本思路
不管客户上报的是瓶,还是箱,都统一换算成产品基本单位进行数量、金额计算。计算方式:
- 假设 基本单位,规格系数 = 40
- 假设第二单位,规格系数 = 20,则基本单位 = 2个 第二单位
- 此处40对应的为最小单位,最小单位可以不维护,如饮料企业通常就是箱,瓶,提;
对于产品来说一般只维护“箱”即可,假设规格系数5*6,公司员工一看就知道,该箱产品有6排,每排5瓶。
本文只讨论了多单位简单实现方案,并未讨论口味等多SKU如何简单实现。