义乌,十二山头,左手一只锤,右手一只捶,都忘了我是怎么拍的照
#Quiz #Scenario #Express #Price
在跨境物流领域,包裹的运费是受包裹重量(实重),三边尺寸(体积重),始发地和目的地的邮编(分区)约束的,本篇是实际业务中按分区阶梯计算价格的简化场景。
@史荣久 / 2020-09-06 / CC-BY-SA-3.0
## 1.需求描述
业务部门的同事会维护一张excel的报价表,格式和数据简化如下。
阶梯 ⁄ 邮编 | 9* | 8* | 92551* |
25 | 10 | 20 | 5 |
50 | 15 | 25 | 10 |
75 | 20 | 30 | 15 |
其中,标题和内容的说明如下,
第一行是表头,阶梯报价和邮编分区的匹配模式
第一列为收费重量(kg)的闭开区间,如25表示,25≤重量<50
第二列以后是匹配的报价,邮编以`9`,`8`和`92551`开头的价格
美国邮编有`5`位和`5-4`两种格式
匹配模式中的`*`为通配符
小于最小重(如25kg)按最小重单价取值
大于最大重(如75kg)按最大重单价取值
重量单位为kg,保留三位小数,向上取整
价格单位为元,保留两位小数,向上取整
举例,客户订单JPFB000A,目的地为ONT8,其邮编是(92551-9534,为`5-4`格式),收费重量为30kg。那么,
重量30kg在[25,50)区间,所以在第二行(25kg)取值
邮编匹配`9*`和`92551*`匹配,所以可取10或5(元/kg)
多个匹配时,相识度高者优先,所以取5(元/kg)
相似度,即编辑距离更短,或匹配字符更多。
如abc匹配时,`abc*` 高于 `a*`,高于`*c`
要求`*`只能一个,必须在首尾,不可在中间。
所以,这个包裹的费用为 30KG * 5元/KG = 150元。
## 2.基本要求
新建一个spring或springboot工程,数据库使用mysql,java8环境。
设计zone_price的表结构以支持价格的存取和计算。
设计PriceService,能支持订单的分区价格计算。
有TestCase,满足ONT8等的边界测试。
可简化价格表导入功能,录入静态数据。
无法实现部分以TODO和md或伪代码说明思路。
至少要保证TestCase通过运行。
时间不限,期间可联网。
## 3.加分功能
根据个人能力和实际情况,完成以下任意内容(包括但不限于)
匹配模式,增加区间,如`92551-92553`,优先级高于通配符
增加价格表(csv)导入功能,做必要的实际工程中必须有的检查
价格表包含生效日时和失效日时
必要的异常处理,性能优化,代码质量
--
※ 我们的征途是星辰大海 ※