电商系列之取消订单

news2024/11/26 0:24:25

    > 插:AI时代,程序员或多或少要了解些人工智能,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

坚持不懈,越努力越幸运,大家一起学习鸭~~~

一个简单的取消订单操作背后的业务逻辑是多么的复杂。

在网购的流程中,大家一般接触的比较多的都是正向流程,即下单的流程:浏览商详、加入购物车、提交订单、确认收货等。但是系统设计的时候往往会发现逆向流程比较正向流程更加的复杂,大家经常接触的逆向流程一般主要两类:取消订单和售后退货。

今天先跟大家聊下取消订单背后的逻辑,对用户来说只是一个简单的申请取消的按钮,但是后台确实做了比较复杂的逻辑。例如要判断订单能不能取消?关联订单需不需要一起被取消?应该退多少钱给用户?等等一系列的问题。

下面先看下取消订单一个比较典型的业务流程,我拿京东作为举例。

发起申请

当在京东上下过一单之后,在我的订单里面可以看到这个订单的详情,这时候会看到“申请退款”这个选择。这里叫法不一样,有的平台这里叫做“取消订单”,这个时候你可以进行申请。

取消中

然后你可以看到取消的状态,刚刚取消后查看状态为“取消处理中”,下面的进度里面可以看到是正在进行仓库的拦截。因为订单已经产生了,系统会将订单推送到仓库系统进行生产,库内作业是有一段时间的,要拣货、打包等。如果此时订单还没出库,你发起取消订单的申请,这时候会到仓库进行拦截,找到这单告诉仓库的人不要发了。如果订单已经出库,这时候你再发起取消订单的申请,那么你的申请可能会失败,一般主流的做法是可以收货的时候进行拒收或者申请售后退货。但是要付出代价的,有的会扣你的运费,有的会扣经验值;也有免费的,但是有次数限制。

取消完成

当取消成功后,取消状态会变成已经完成,订单状态会变成已经取消。

上面只是取消订单一个比较简单的场景:一单只有一个商品。

如果一张订单中有多个商品,并且被拆成多个包裹后事情就变得复杂了。

首先一个问题是,多个包裹支不支持按照包裹维度进行取消?不支持的话只能整单取消,用户体验不是很友好,所以主流电商平台都是支持按照包裹维度进行取消的。

那么问题就来了

先看下运费的问题

原来你因为买了多个商品,达到了免邮的标准,这时候你取消其中一个包裹,那么可能达不到免邮的条件了,这个时候怎么办?

如果不收运费这其实是一个业务的漏洞,有的电商平台为了用户体验更好些,或者是避免后台逻辑过于复杂是真的没有收运费的,主要是靠风控体系来控制风险,如果一个人经常采用这种方式套运费的话是会被拉黑的。但是大部分的电商平台还是需要收运费的,当发现取消一个子单后,剩下的订单无法满足包邮的条件,那么需要用户支付运费,或者是从取消订单的退款金额里面把运费扣掉,或者是从你的虚拟账号里面把运费扣掉(比如扣你的积分)。

促销的相关问题

另外跟运费类似的是各种促销,满减、满赠、满返等也存在类似问题。

我们这里以满减作为例子,如果买了多个商品达到了满减的条件,享受了满减的优惠。当取消一个包裹单后如果满减的条件还满足,那么就可以正常取消。如果由于取消了这个包裹单满减条件达不到了,这个时候是需要把关联订单也一起取消的,不然也会存在业务漏洞。

资源回退问题

上面的条件都达到了可以正常取消订单,但是还需要考虑把生成订单时所占用的资源回退掉,这里主要是库存、券、积分等。

库存:生成订单的时候会先锁定库存,保证仓库可以正常生产,如果取消订单后,需要把这个库存释放,增加前台销售库存的可用量。具体库存的逻辑可以参考之前的文章电商技术解密—管好库存没那么容易

积分:生成订单后也会给用户发放一些虚拟资源,例如积分、经验值。订单取消后也需要把之前发放的资源进行回收。

优惠券:如果之前下单的时候使用了优惠券,那么订单取消后也需要把原来用掉的优惠券返还到用户的账号中,方便用户后面继续使用。

具体流程可以看下面的业务序列图

时序图new

可以看到一个简单的取消订单操作背后的业务逻辑是多么的复杂。上面的流程是用户自己发起取消订单,还有一种情况也会触发取消订单这个流程。当你下单后没有在规定的时间内进行付款,那么系统会自动把你的订单进行取消。因为要释放资源,主要是库存的资源。

取消订单后台的业务逻辑就先介绍到这里,可能有些遗漏或者错误,欢迎大家拍砖、讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1557426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日面经分享(Spring Boot: part2 DAO层)

1. Spring Boot DAO层的作用 a. 封装数据访问逻辑:DAO层的主要责任是封装与数据访问相关的逻辑。负责处理与数据库的交互,包括数据的增删改查等操作。通过将数据访问逻辑统一封装在DAO层中,可以提高代码的可维护性和可重用性。 b. 解耦业务逻…

java Web 疫苗预约管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 疫苗预约管理系统是一套完善的web设计系统,对理解JSP java 编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发,数据库为Mysql5.0,使…

蓝桥集训之游戏

蓝桥集训之游戏 核心思想:博弈论 区间dp 设玩家1的最优解为A 玩家2的最优解为B 1的目标就是使A-B最大 2的目标就是使B-A最大 当玩家1取L左端点时 右边子区间结果就是玩家2的最优解B-A 即当前结果为w[L] – (B-A) 当玩家1取R右端点时 左边子区间结果就是玩家2的最…

<TensorFlow学习使用P1>——《TensorFlow教程》

一、TensorFlow概述 前言: 本文中一些TensorFlow综合案例的代码逻辑一般正常,在本地均可运行。如有代码复现运行失败,原因如下: (1)运行环境配置可能有误。 (2)由于一些数据集存储空…

算法学习——LeetCode力扣图论篇2

算法学习——LeetCode力扣图论篇2 1020. 飞地的数量 1020. 飞地的数量 - 力扣(LeetCode) 描述 给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。 一次 移动 是指从一个陆地单元格走到另一个相…

实施阶段(2024年3月)

本次探究的项目化学习主题为:校内订餐系统的分析与设计 【主题情境说明】 社会大背景:国家颁发《“健康中国2030”规划纲要》,尤其关注青少年儿童膳食质量,明确提出要加强孩子食育教育,家庭、学校和社会需要共建健康…

Linux系统---如何理解Linux中的文件系统

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、理解文件系统 1.ls与stat 我们使用ls -l的时候看到的除了看到文件名,还看到了文件元数据。 每行包含7列…

【一站式学会Kotlin】第一节 kotlin 介绍

作者介绍: 百度资深Android工程师T6,在百度任职7年半。 目前:成立赵小灰代码工作室,欢迎大家找我开发Android、微信小程序、鸿蒙项目。 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默。给大家…

Unity 基于Rigidbody2D模块的角色移动

制作好站立和移动的动画后 控制器设计 站立 移动 角色移动代码如下: using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine;public class p1_c : MonoBehaviour {// 获取动画组件private Animator …

【c++】简单的日期计算器

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好啊,在我们学习了默认成员函数后,我们本节内容来完成知识的实践,来实现一个简易的日期计算器 目录 头文件声明函数函数的实现1.全缺省默认构…

TASKPROMPTER

baseline模型的预训练权重就有1.6G! 多吓人呐,当时我就暂停下载了,不建议复现

[Flutter]打包IPA

1.直接使用Xcode运行iOS工程 不用flutter构建,在Xcode中是可以独立进行构建运行和打包发布的。 1).运行项目 先将flutter的build清理 $ flutter clean $ flutter pub get 然后立即用XCode打开iOS工程运行 运行会报错: error: The sandbox is not …

gpt-llm-trainer 出炉

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

ML-Decoder: Scalable and Versatile Classification Head

1、引言 论文链接:https://openaccess.thecvf.com/content/WACV2023/papers/Ridnik_ML-Decoder_Scalable_and_Versatile_Classification_Head_WACV_2023_paper.pdf 因为 transformer 解码器分类头[1] 在少类别多标签分类数据集上表现得很好,但由于其查询…

【应用层协议原理】

文章目录 第二章 应用层2.1 应用层协议原理2.1.1 网络应用的体系结构2.1.2 客户-服务器(C/S)体系结构2.1.3 对等体(P2P)体系结构2.2.4 C/S和P2P体系结构的混合体2.2.5 进程通信问题1:对进程进行编址(addres…

厦门攸信技术亮相新技术研讨会,展现物流自动化解决方案新高度!

今日,厦门攸信信息技术有限公司受邀参加了一场备受行业关注的电子制造高端盛会——一步步新技术研讨会,凭借卓越的智能制造与物流自动化技术在会议中大放异彩。作为一家引领行业发展的企业,厦门攸信技术不仅展示了其深厚的技术底蕴&#xff0…

算法之美:堆排序原理剖析及应用案例分解实现

这段时间持续更新关于“二叉树”的专栏文章,关心的小伙伴们对于二叉树的基本原理已经有了初步的了解。接下来,我将会更深入地探究二叉树的原理,并且展示如何将这些原理应用到更广泛的场景中去。文章将延续前面文章的风格,尽量精炼…

数据结构 - 图

参考链接:数据结构:图(Graph)【详解】_图数据结构-CSDN博客 图的定义 图(Graph)是由顶点的有穷非空集合 V ( G ) 和顶点之间边的集合 E ( G ) 组成,通常表示为: G ( V , E ) ,其中, G 表示个图, V 是图 G…

深入理解 Hadoop 上的 Hive 查询执行流程

在 Hadoop 生态系统中,Hive 是一个重要的分支,它构建在 Hadoop 之上,提供了一个开源的数据仓库系统。它的主要功能是查询和分析存储在 Hadoop 文件中的大型数据集,包括结构化和半结构化数据。Hive 在数据查询、分析和汇总方面发挥…

Linux(CentOS7)安装 MySQL8

目录 下载 上传 解压 创建配置文件 初始化 MySQL 服务 启动 MySQL 服务 连接 MySQL 创建软链接 下载 官方地址: MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/选择版本前需先看一下服务器的 glibc 版本 ldd --versio…