在前2篇博文:
讨论了饮料企业销售管理中的可销售产品政策和产品价格政策方案设计,除此之外还有一个重要的产品政策:产品配送政策。可能大家对饮料企业的配送政策不是很了解,通常电商所谓的配送政策是满减、满抵,走的是资金通道;而饮料企业通常指满送(A产品满100箱,送B产品10箱),走的是实物通道。
单品:产品A满100箱,送产品B10箱;
产品组合:产品A+产品B满100箱,送产品B10箱;
单品:产品A满100箱,送产品B10箱;
产品组合:产品A满100箱,送产品B+产品C共10箱;(客户可以选择产品B 5箱,产品C 5箱;也可以产品B 10箱;也可以产品C 10箱等)
配送政策可以全国区域统一设定,具体市场可以设置自己市场配送政策,市场下辖区域还可以设置区域配送政策,甚至直接维护到客户。
配送政策有时间有效性,同一客户同一产品不同时间段,配送政策可能不一。
CREATE TABLE `base_goods` (
`sid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`catg_id` bigint(64) NOT NULL COMMENT '商品分类id',
`prod_type` varchar(30) NOT NULL COMMENT '商品类型',
`prod_no` varchar(20) NOT NULL COMMENT '商品编码',
`prod_name` varchar(100) NOT NULL COMMENT '商品名称',
`spec` varchar(100) DEFAULT NULL COMMENT '规格',
`spec_factor` decimal(20,4) DEFAULT NULL COMMENT '规格系数',
`jldw` bigint(20) DEFAULT NULL COMMENT '计量单位',
`sale_price` decimal(20,4) DEFAULT NULL COMMENT '销售单价',
`sale_oprice` decimal(20,4) DEFAULT NULL COMMENT '销售单价',
`cost_price` decimal(20,4) DEFAULT NULL COMMENT '标准成本价',
`py` varchar(100) DEFAULT NULL COMMENT '商品名称拼音简码',
`period` varchar(20) DEFAULT NULL COMMENT '保质期',
`bar_code` varchar(100) DEFAULT NULL COMMENT '条码',
`memo` varchar(100) DEFAULT NULL COMMENT '备注',
`is_purchase` char(1) DEFAULT NULL,
`is_sale` char(1) DEFAULT NULL,
`brand_id` bigint(64) DEFAULT '1' COMMENT '品牌id',
`detail` varchar(100) DEFAULT NULL COMMENT '详情',
`short_desc` varchar(100) DEFAULT NULL,
`pic_url` varchar(100) DEFAULT NULL COMMENT '图片',
`is_deleted` varchar(1) DEFAULT 'N',
`is_onsale` varchar(1) DEFAULT 'Y',
`is_mixed` varchar(1) DEFAULT 'N' COMMENT '是否产品组合',
`safety_stock_min` decimal(20,4) DEFAULT NULL COMMENT '安全库存下限',
`safety_stock_max` decimal(20,4) DEFAULT NULL COMMENT '安全库存上限',
`create_uid` bigint(20) DEFAULT NULL,
`create_date` datetime DEFAULT NULL,
`write_uid` bigint(20) DEFAULT NULL,
`write_date` datetime DEFAULT NULL,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表'
CREATE TABLE `base_goods_prop_ref` (
`sid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`prop_id` bigint(20) DEFAULT NULL COMMENT '产品组合ID',
`prop_type` varchar(30) DEFAULT NULL,
`prop_name` varchar(30) DEFAULT NULL COMMENT '产品组合名称',
`goods_id` bigint(20) DEFAULT NULL,
`goods_no` varchar(10) DEFAULT NULL,
`goods_name` varchar(100) DEFAULT NULL COMMENT '明细产品名称',
`write_uid` bigint(20) DEFAULT NULL,
`write_date` datetime DEFAULT NULL,
PRIMARY KEY (`sid`),
UNIQUE KEY `NewIndex1` (`prop_id`,`goods_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `sale_goods_policy` (
`sid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '流水号',
`policy_no` varchar(30) DEFAULT NULL,
`policy_type` int DEFAULT NULL COMMENT '政策类型, 10-排它, 20-叠加',
`obj_type` varchar(20) DEFAULT NULL COMMENT '对象类型',
`obj_id` bigint(20) DEFAULT NULL COMMENT '对象ID',
`obj_name` varchar(100) DEFAULT NULL COMMENT '对象名称',
`goods_id` bigint(20) DEFAULT NULL COMMENT '商品id',
`goods_name` varchar(100) DEFAULT NULL COMMENT '商品名称|商品组合名称',
`memo` varchar(255) DEFAULT NULL COMMENT '备注',
`policy_desc` varchar(200) DEFAULT NULL COMMENT '政策描述',
`s_date` datetime DEFAULT NULL COMMENT '开始日期',
`e_date` datetime DEFAULT NULL COMMENT '截止日期',
`status` varchar(10) DEFAULT NULL COMMENT '状态',
`create_uid` bigint(20) DEFAULT NULL,
`create_date` datetime DEFAULT NULL,
`write_uid` bigint(20) DEFAULT NULL,
`write_date` datetime DEFAULT NULL COMMENT '操作时间',
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `sale_goods_policy_detail` (
`sid` bigint(20) NOT NULL AUTO_INCREMENT,
`policy_id` bigint(20) DEFAULT NULL,
`policy_no` varchar(100) DEFAULT NULL,
`free_goods_id` bigint(20) DEFAULT NULL,
`cond_min` decimal(20,4) DEFAULT NULL COMMENT '开始区间 >= cond_min',
`cond_max` decimal(20,4) DEFAULT NULL COMMENT '最终区间 < cond_max',
`cond_amount` decimal(20,4) DEFAULT NULL,
`free_amount` decimal(20,4) DEFAULT NULL,
`status` varchar(10) DEFAULT NULL,
`memo` varchar(255) DEFAULT NULL,
`policy_desc` varchar(100) DEFAULT NULL,
`create_uid` bigint(20) DEFAULT NULL,
`create_date` datetime DEFAULT NULL,
`write_uid` bigint(20) DEFAULT NULL,
`write_date` datetime DEFAULT NULL,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `sale_goods_policy_level` (
`sid` bigint(20) NOT NULL AUTO_INCREMENT,
`policy_id` bigint(20) DEFAULT NULL,
`policy_no` varchar(100) DEFAULT NULL,
`client_id` bigint(20) DEFAULT NULL,
`goods_id` bigint(20) DEFAULT NULL,
`level` int(11) DEFAULT NULL,
`write_uid` bigint(20) DEFAULT NULL,
`write_date` datetime DEFAULT NULL,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `sale_goods_policy_list` (
`sid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '流水号',
`policy_date` date DEFAULT NULL COMMENT '政策日期',
`policy_type` int DEFAULT NULL COMMENT '政策类型',
`obj_id` bigint(50) DEFAULT NULL COMMENT '对象ID',
`obj_name` varchar(100) DEFAULT NULL COMMENT '对象名称',
`goods_id` bigint(20) DEFAULT NULL COMMENT '商品id',
`policy_no` varchar(100) DEFAULT NULL,
`sourceid` bigint(20) DEFAULT NULL,
`policy_desc` varchar(100) DEFAULT NULL,
`policy_desc_full` varchar(200) DEFAULT NULL COMMENT '政策描述完整版',
`memo` varchar(255) DEFAULT NULL COMMENT '备注',
`write_uid` bigint(20) DEFAULT NULL COMMENT '操作人',
`write_date` datetime DEFAULT NULL COMMENT '操作时间',
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
产品数据:产品1,产品2,组合1(产品1,产品2)
市场区域:华东市场(苏北区域、苏南区域),华中市场(鄂东区域,鄂西区域)
客户信息:客户1(华东–苏北),客户2(华东–苏南),客户3(华中–鄂东),客户4(华中–鄂西)
政策号 | 政策类型 | 产品 | 对象类型 | 对象名称 | 开始日期 | 截止日期 |
---|---|---|---|---|---|---|
18101401 | 10 | 产品1 | 全国 | 全国 | 2018-10-01 | 2018-12-30 |
18101402 | 10 | 产品1 | 市场 | 华东市场 | 2018-10-01 | 2018-12-30 |
18101403 | 20 | 产品2 | 全国 | 全国 | 2018-10-01 | 2018-12-30 |
18101404 | 10 | 产品2 | 市场 | 华中市场 | 2018-10-01 | 2018-12-30 |
18101405 | 10 | 组合1 | 全国 | 全国 | 2018-10-01 | 2018-12-30 |
18101406 | 10 | 组合1 | 地区 | 华东-苏南 | 2018-10-01 | 2018-12-30 |
产品 + 对象(对象类型,对象ID)+ 生效日期不能重复;
产品 | 对象类型 | 对象名称 | 开始日期 | 截止日期 | 是否重复 |
---|---|---|---|---|---|
产品1 | 全国 | 全国 | 2018-10-01 | 2018-12-30 | 没重复 |
产品1 | 市场 | 华东市场 | 2018-10-01 | 2018-12-30 | 没重复 |
产品1 | 市场 | 华东市场 | 2018-08-01 | 2018-12-30 | 重复,时间段有交叉 |
产品2 | 全国 | 全国 | 2018-10-01 | 2018-12-30 |
政策号 | 主发产品 | 配送产品 | 起配量(始>=) | 起配量(止<) | 配送基数 | 配送量 | 说明 |
---|---|---|---|---|---|---|---|
18101401 | 产品1 | 产品1 | 10 | 200 | 10 | 1 | [10,200)箱,每10箱送1箱 |
18101401 | 产品1 | 产品1 | 200 | - | 10 | 1.2 | [200,)箱,每10箱送1.2箱 |
18101402 | 产品1 | 产品1 | 10 | - | 10 | 1.1 | [10,)箱,每10箱送1.1箱 |
18101403 | 产品2 | 产品2 | 100 | - | 20 | 1 | [100,)箱,每20箱送1箱 |
18101404 | 产品2 | 产品2 | 100 | - | 20 | 1 | [100,)箱,每20箱送1箱 |
18101405 | 组合1 | 组合1 | 100 | - | 20 | 1 | [100,)箱,每20箱送1箱 |
18101406 | 组合1 | 组合1 | 100 | - | 20 | 1.2 | [100,)箱,每20箱送1.2箱 |
政策号 | 政策类型 | 主发产品 | 客户 | 政策来源 | 优先级 |
---|---|---|---|---|---|
18101401 | 10 | 产品1 | 客户1 | 全国 | 10 |
18101401 | 10 | 产品1 | 客户2 | 全国 | 10 |
18101401 | 10 | 产品1 | 客户3 | 全国 | 10 |
18101401 | 10 | 产品1 | 客户4 | 全国 | 10 |
18101402 | 10 | 产品1 | 客户1 | 市场 | 20 |
18101402 | 10 | 产品1 | 客户2 | 市场 | 20 |
- | - | - | - | - | - |
18101403 | 20 | 产品2 | 客户1 | 全国 | 10 |
18101403 | 20 | 产品2 | 客户2 | 全国 | 10 |
18101403 | 20 | 产品2 | 客户3 | 全国 | 10 |
18101403 | 20 | 产品2 | 客户4 | 全国 | 10 |
18101404 | 10 | 产品2 | 客户3 | 市场 | 20 |
18101404 | 10 | 产品2 | 客户4 | 市场 | 20 |
- | - | - | - | - | - |
18101405 | 10 | 组合1 | 客户1 | 全国 | 10 |
18101405 | 10 | 组合1 | 客户2 | 全国 | 10 |
18101405 | 10 | 组合1 | 客户3 | 全国 | 10 |
18101405 | 10 | 组合1 | 客户4 | 全国 | 10 |
18101406 | 10 | 组合1 | 客户2 | 地区 | 30 |
政策号 | 政策类型 | 主发产品 | 客户 | 政策来源 | 优先级 |
---|---|---|---|---|---|
18101401 | 10 | 产品1 | 客户3 | 全国 | 10 |
18101401 | 10 | 产品1 | 客户4 | 全国 | 10 |
18101402 | 10 | 产品1 | 客户1 | 市场 | 20 |
18101402 | 10 | 产品1 | 客户2 | 市场 | 20 |
- | - | - | - | - | - |
18101403 | 20 | 产品2 | 客户1 | 全国 | 10 |
18101403 | 20 | 产品2 | 客户2 | 全国 | 10 |
18101403 | 20 | 产品2 | 客户3 | 全国 | 10 |
18101403 | 20 | 产品2 | 客户4 | 全国 | 10 |
18101404 | 10 | 产品2 | 客户3 | 市场 | 20 |
18101404 | 10 | 产品2 | 客户4 | 市场 | 20 |
- | - | - | - | - | - |
18101405 | 10 | 组合1 | 客户1 | 全国 | 10 |
18101405 | 10 | 组合1 | 客户3 | 全国 | 10 |
18101405 | 10 | 组合1 | 客户4 | 全国 | 10 |
18101406 | 10 | 组合1 | 客户2 | 地区 | 30 |
订单数据:
订单号 | 订单日期 | 客户 | 产品明细 | 数量 | 单位 | 配送量 |
---|---|---|---|---|---|---|
SO18101401 | 181014 | 客户1 | 产品1 | 190 | 箱 | 29 |
- | - | - | 产品2 | 210 | 箱 | 20 |
SO18101502 | 181015 | 客户4 | 产品1 | 90 | 箱 | 9 |
- | - | - | 产品2 | 240 | 箱 | 36 |
计算订单配送量
客户1–产品1:
18101402政策,10箱起送,每10箱送1.1箱,则配送量 = 190 / 10 * 1.1 = 20.9, 20箱
18101405政策,100箱起送,每20箱送1箱,则配送量 = 190 / 20 * 1 = 9.5, 9箱(产品1+产品2,共9箱,这里取9箱产品1),配送总量:29箱
客户1–产品2:
18101403政策,100箱起送,每20箱送1箱,则配送量 = 210 / 20 * 1 = 10.5, 10箱
18101405政策,100箱起送,每20箱送1箱,则配送量 = 210 / 20 * 1 = 10.5, 10箱(产品1+产品2,共10箱,这里取10箱产品1),配送总量:20箱
客户4–产品1:
18101401政策,10箱起送,每10箱送1箱,则配送量 = 90 / 10 * 1=9箱
18101405政策,100箱起送,每20箱送1箱,则配送量 = 0箱
客户4–产品2:
18101403政策,100箱起送,每20箱送1箱,则配送量 = 240 / 20 * 1 = 12箱
18101404政策,100箱起送,每20箱送1箱,则配送量 = 240 / 20 * 1 = 12箱
18101405政策,100箱起送,每20箱送1箱,则配送量 = 240/20*1 = 12箱(产品1+产品2,共12箱,这里取12箱产品2),配送总量:36箱
本方案虽做了政策优先级控制,客户 > 地区 > 市场 > 全国,但是全国政策明细一定比市场政策明细力度小吗?未必,程序没有检测。
1)配送产品涉及产品组合时,允许客户调整配送产品数量;
2)计算产品配送量时,要考虑政策叠加性:一方面来自可叠加的政策(政策类型为20的政策),另一方面来自产品组合的政策;
3)订单修改,需要重新计算配送量。