談談快消品中小飲料企業產品配送政策方案設計
一、摘要
在前2篇博文:
討論了飲料企業銷售管理中的可銷售產品政策和產品價格政策方案設計,除此之外還有一個重要的產品政策:產品配送政策。可能大家對飲料企業的配送政策不是很瞭解,通常電商所謂的配送政策是滿減、滿抵,走的是資金通道;而飲料企業通常指滿送(A產品滿100箱,送B產品10箱),走的是實物通道。
二、產品配送政策
1、名詞解釋
1)主發產品:滿足條件的產品,可以是單品也可以是產品組合
單品:產品A滿100箱,送產品B10箱;
產品組合:產品A+產品B滿100箱,送產品B10箱;
2)配送產品:可以是單品,也可以是產品組合;
單品:產品A滿100箱,送產品B10箱;
產品組合:產品A滿100箱,送產品B+產品C共10箱;(客戶可以選擇產品B 5箱,產品C 5箱;也可以產品B 10箱;也可以產品C 10箱等)
2、目標
1)不同客戶配送量不一樣
配送政策可以全國區域統一設定,具體市場可以設定自己市場配送政策,市場下轄區域還可以設定區域配送政策,甚至直接維護到客戶。
2)同一客戶同一主發產品配送量可以不一樣
配送政策有時間有效性,同一客戶同一產品不同時間段,配送政策可能不一。
3、設計方案
1)資料表設計
產品表特殊處理,可以標記哪些是產品組合,base_goods
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
配送政策配置主表 sale_goods_policy
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
配送政策細表 sale_goods_policy_detail
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
政策分解中間表 sale_goods_policy_level
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
政策最終生成表 sale_goods_policy_list
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
2) 具體實現
資料準備
產品資料:產品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箱 |
政策分解到 sale_goods_policy_level
政策號 | 政策型別 | 主發產品 | 客戶 | 政策來源 | 優先順序 |
---|---|---|---|---|---|
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 |
根據優先順序,去重(政策型別+產品+客戶)後結果如下 sale_goods_policy_list:
政策號 | 政策型別 | 主發產品 | 客戶 | 政策來源 | 優先順序 |
---|---|---|---|---|---|
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、訂單計算最終配送量有點複雜
1)配送產品涉及產品組合時,允許客戶調整配送產品數量;
2)計算產品配送量時,要考慮政策疊加性:一方面來自可疊加的政策(政策型別為20的政策),另一方面來自產品組合的政策;
3)訂單修改,需要重新計算配送量。