good luck to you

商城项目 产品运费模块 设计说明

文章目录

简要说明

  • 逻辑说明
  • 计价方式
  • 数据库设计

逻辑说明

  • 产品在不包邮情况下,需调用运费模板;
  • 运费模板计价方式分为:按件数、按重量、按体积三种。当然,根据业务需求,可添加其它计价方式。
  • 一个运费模板的组成:运费模板名字、描述、计价方式、一个或多个配送区域。
  • 一个运费模板可以有多个配送区域,每个配送区域对应不同的运费计算方式。

这里需要注意运费模板的默认配送区域。网上有资料说一个运费模板中必须要有一种配送至全国的默认配送区域。但有这样一种运费模板需求:某种产品运送至河南、北京才会产生运费,其余地区不需要运费。当然,你可以把全国配送区域的运费填写为0,但这样个人认为不是特别合适。所以,本文中运费模板不需要有一个必需的配送至全国的默认配送区域,但一个运费模板中至少要有一个配送区域。在计算运费时,如果某个区域不存在在该运费模板中,即认为配送至该区域时不存在运费。

计价方式

本文提供三种计价方式:件数、重量、体积。

件数

  • 首件:首件并非单件产品,可理解为多少件内的产品。
  • 首件运费:顾名思义即为多少件内产品的运费。
  • 续件:可理解为在首件数量基础上,每新增产品的数量。
  • 续件运费:每新增多少件产品,需新增多少运费。
  • 配送区域:全国/省/市/区县。

重量(克)

  • 首重:多少重量内的产品。
  • 首重运费:顾名思义即为多少重量内产品的运费。
  • 续重:可理解为在首重量基础上,每新增产品的重量。
  • 续重运费:每新增多少重量,需新增多少运费。
  • 配送区域:全国/省/市/区县。

体积(立方米)

  • 首体积:多少体积内的产品。
  • 首体积运费:顾名思义即为多少体积内产品的运费。
  • 续体积:可理解为在首体积基础上,每新增产品的体积。
  • 续体积运费:每新增多少体积,需新增多少运费。
  • 配送区域:全国/省/市/区县。

为方便理解,我们设计几个运费模板示例,并计算其运费结果:

ceil() 函数向上舍入为最接近的整数。

件数运费模板示例:

运费模板

配送区域:全国
首件 = 5
首件运费 = 10
续件 = 2
续件运费 = 3

运费计算

# 购买数量 <= 首件数量
购买件数 = 3
运费 = 10

# 购买数量 > 首件数量
购买件数 = 6
运费公式 = 10 + ceil( ( 6 - 5 ) / 2 ) * 3 = 13
运费结果 = 10 + 3 = 13

# 购买数量 > 首件数量
购买件数 = 8
运费公式 = 10 + ceil( ( 8 - 5 ) / 2 ) * 3 = 16
运费结果 = 10 + 6 = 16

重量运费模板示例:

运费模板

配送区域:全国
首重 = 5
首重运费 = 10
续重 = 3
续重运费 = 8

运费计算

# 单个产品重3克

# 购买重量 <= 首重量
购买件数 = 1
总重 = 1 * 3 = 3
运费 = 10

# 购买重量 > 首重量
购买件数 = 2
总重 = 2 * 3 = 6
运费公式 = 10 + ceil( ( 6 - 5 ) / 3 ) * 8 = 18
运费结果 = 10 + 8 = 18

# 购买重量 > 首重量
购买件数 = 3
总重 = 3 * 3 = 9
运费公式 = 10 + ceil( ( 9 - 5 ) / 3 ) * 8 = 26
运费结果 = 10 + 16 = 26

区域运费模板示例:

运费模板

配送区域1:全国
首件 = 5
首件运费 = 10
续件 = 2
续件运费 = 3

配送区域2:河南、北京
首件 = 5
首件运费 = 20
续件 = 2
续件运费 = 6

运费计算

# 送往河南/北京
# 购买数量 <= 首件数量
购买件数 = 3
运费 = 20

# 送往河南/北京
# 购买数量 > 首件数量
购买件数 = 6
运费公式 = 20 + ceil( ( 6 - 5 ) / 2 ) * 6 = 26
运费结果 = 20 + 6 = 26

# 送往河南/北京
# 购买数量 > 首件数量
购买件数 = 8
运费公式 = 20 + ceil( ( 8 - 5 ) / 2 ) * 6 = 32
运费结果 = 20 + 12 = 32

# 送往上海
# 购买数量 <= 首件数量
购买件数 = 3
运费 = 10

数据库设计

这里只展示表单结构,重要字段均有备注说明。

运费模板表

CREATE TABLE `luck_freight` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL DEFAULT '' COMMENT '运费模板名字',
  `type` tinyint(3) NOT NULL DEFAULT '1' COMMENT '计价方式 1=件数 2=重量 3=体积',
  `description` varchar(255) NOT NULL DEFAULT '' COMMENT '简要说明',
  `create_time` timestamp NULL DEFAULT NULL,
  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `status` tinyint(3) NOT NULL DEFAULT '1' COMMENT '0=Disabled 1=Enabled 99=Delete',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COMMENT='运费模板表';

数据截图:

运费模板配送区域表

CREATE TABLE `luck_freight_value` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `freight_id` int(11) NOT NULL DEFAULT '0' COMMENT '运费模板ID',
  `first_key` varchar(100) NOT NULL DEFAULT '' COMMENT '首件/首重/首体积',
  `first_value` decimal(10,2) NOT NULL DEFAULT '0.00',
  `second_key` varchar(100) NOT NULL DEFAULT '' COMMENT '续件/续重/续体积',
  `second_value` decimal(10,2) NOT NULL DEFAULT '0.00',
  `ship_area` varchar(255) NOT NULL DEFAULT '0' COMMENT '配送区域 0=全国 城市ID以,切割',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=54 DEFAULT CHARSET=utf8mb4 COMMENT='运费模板配送区域表';

数据截图:

产品运费关联表

CREATE TABLE `luck_product_freight` (
  `product_id` int(11) NOT NULL DEFAULT '0',
  `freight` tinyint(3) NOT NULL DEFAULT '1' COMMENT '是否包邮 1=包邮 2=不包邮',
  `freight_id` int(11) NOT NULL DEFAULT '0',
  `weight` varchar(50) NOT NULL DEFAULT '' COMMENT '重量 单位克',
  `volume` varchar(50) NOT NULL DEFAULT '' COMMENT '体积 单位立方米'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='产品运费关联表';
原文链接:,转发请注明来源!

发表评论