商城系统运费模版的设计与实现

2023-11-03 07:50

本文主要是介绍商城系统运费模版的设计与实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对于商城系统来说,运费系统是必不可少的,最简单的就是在每个商品添加的时候设置此商品购买时候的运费,但是这个逻辑并不能满足用户的需求,无法按照客户的地址设置不同的运费,设置地区包邮,不配送等一系列的操作。那怎么能更快更简单的实现这个功能呢,这篇文章,我会将我开发CRMEB单商户系统时的设计思路拿出来和大家分享,希望大家看完能有所启发并找到更好的解决办法。

希望大家看完在动手,看一半就觉得自己行了,容易写BUG~

初版~

对于运费的计算来说,最开始就是要知道用户选择的送货地址,运费计算也不用过于精确地址信息,所以我在全国省市区的数据库里增加了城市ID字段,用户在添加地址的时候,将对应的城市ID也同时存储在用户的地址信息中,这样,用户在每次切换地址的时候,可以根据城市ID字段判断用户所处的城市。

接下来,先创建一个最简单运费模版A表,里面只有城市ID和运费,只要用户的城市ID就能找出你要付多少运费啦,但是当我设置运费的时候,发现了一个大问题,全国这么多城市,难道要一个一个的进行设置么?当然不,国家运输系统这么完善,只有很少的地区运费是不同的,我只要把不同运费的地区设置了就好。其他的,就让他用默认的数据就可以啦。于是,我创建了一条默认数据,城市ID设置为0,当用户的地址在数据里面找不到对应的运费的时候,我就给他默认的运费。

好,最简单的运费模版已经出来了,管理者可以简单的设置每个地区的运费是多少,在用户下单的时候按照地址计算运费就能得出对应地址的运费啦。

进阶版~

思考一下,商城里面包含多种多样的商品,总不能一件衣服和一台冰箱的运费是一样的吧,那岂不是很亏。所以商城里面需要多个运费模版进行不同的价格计算,我创建了新的数据B表来存储多个运费模版,包括模版名称,添加时间,A表内就可以增加B表内对应的模版ID,和城市ID和运费来计算不同运费模版下同一个城市的不同运费啦。

接下来,我考虑物流中会出现首件和续件的问题,那么我们地区运费就要增加续件的字段,来存储续件的金额,比如我购买了2件商品,商品的首件是10元,续件是5元,那么这个订单的运费就是首件加上续件的费用一共15元。

现在运费模版已经成型了,每个商品都可以使用不同的运费模版来计算整体订单的运费,购买多件商品,就可以按照不同用户地址,不同的运费模版,不同的首件和续件的费用,来确定当前订单的世纪运费了,接下来就是继续细化运费模版的其他功能了。

终极版~

江浙沪包邮?这个问题又出现在了我的脑海中,那我怎么能在模版中设置包邮信息呢?思前想后,我发现一个最简单的办法,就是把对应包邮的地址的首件和续件费用都写成0,计算的时候就不会增加运费了。

不过,如果是满多少钱进行包邮呢?如果说,我有一个上海地区的运费模版,我想用户在购买超过100元的时候给他包邮怎么办。我又开始了我的发呆时间。。。

想到了,我又给A表里增加了满额包邮的字段,用来记录此区域需要满额的金额,计算的时候将同一个运费模版下的金额加起来,只要大于了这个金额,我就直接跳过此模版的计算。

订单在购买多个商品,牵扯到多个运费模版的时候,可以在计算的时候按照运费模版进行数据的分类整理,计算出每个运费模版里面商品的件数,总金额,然后每个运费模版单独计算,先通过计算此运费模版是否满足了包邮,如果满足跳过后面的运费计算,如果没有满足包邮情况的时候,继续进行件数的首件和续件的计算,将每次计算出来的运费相加,就得出了最后的订单运费。

接下来,就是完善我们的运费模版了,模版名称,模版是按照件数、重量还是体积进行运费的计算,包邮是否还要按照别的情况进行计算。

CRMEB运费模版的实现

CRMEB单商户系统中的运费模版很强大了,不仅可以设置不同地区的运费,还可以判断运费模版是按照件数、体积还是重量进行计算。可以设置单独的包邮数据以及指定地区不送货的逻辑。首件和续件的金额计算可以设定首件件数。包邮同时判断了件数和金额。可以满足大多数商城系统管理者的需求。

运费模版的添加

后台添加运费模版的页面,填写运费模版的名称,选择该运费模版是按照那种计费方式进行计费(件数,重量,体积),选择对应的城市数据,添加运费和包邮信息等。

在这里插入图片描述

运费模版的计算逻辑

1.先获取到用户订单的商品和地址信息,将所有的商品按照运费模版进行分组整理,得到每个运费模版的商品总数,总价和此运费模版的运费金额,指定包邮信息等。 c a r t I n f o 变 量 里 面 存 储 的 就 是 该 订 单 下 所 有 的 商 品 信 息 , 包 括 金 额 , 件 数 或 体 积 或 重 量 , 对 应 的 运 费 模 版 I D 等 信 息 。 cartInfo变量里面存储的就是该订单下所有的商品信息,包括金额,件数或体积或重量,对应的运费模版ID等信息。 cartInfoIDaddr里面包含用户现在选择的的地址信息,用于最后查询包邮或者运费。

在这里插入图片描述

2.按照用户当前选择的地址,根据当前地址数据内的city_id查询当前地址是否在指定包邮的地区内,然后在判断商品件数和金额是否大于设定的件数和金额,满足条件在运费模版的数组中删除此运费模版的数据。

在这里插入图片描述

3.经过步骤2,$temp_num数组中,只会剩下需要计算运费的数据,系统接下来会在先计算出首件运费最大值,设置初始运费为0开始计算订单所需运费。

在这里插入图片描述

4.循环计算运费,将首件最大的运费模版设置为首件计算,剩余的模版都按照续件进行金额的计算,如果有多个首件金额等于最大值,会将多个运费模版当作首件进行计算,最后取得运费最大值返回。
在这里插入图片描述
如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点star: http://github.crmeb.net/u/defu 不胜感激 !

这篇关于商城系统运费模版的设计与实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/336692

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S