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

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

相关文章

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in