订单管理系统开发经验的总结:优化流程、提升效率的关键实践

前言

一.订单管理系统的架构设计

二.订单系统的详细设计

1.拆分

2.换货

3.发货

4.拦截

5.取消

6.物流回传

三.订单系统的订单状态流转

初始状态

中间状态

异常状态

终态

四.订单系统的关键代码逻辑

五.结语


前言

两年来,整个订单管理系统经过大大小小的重构,定下来了总体框架,系统也逐渐稳定下来,23年也快结束了,总结一下自己这两年的成果,顺便锻炼下文笔。


一.订单管理系统的架构设计

先简单介绍一下什么是订单管理系统,订单管理系统用于处理和跟踪销售订单的系统,涵盖从订单接收到订单履行的整个流程,我司由于是做跨境电商的,下面的场景都是基于国外平台的业务场景,在系统设计初期基于的原则便是高内聚,低耦合,强调的是可维护性与可重用性,通俗来说 就是订单中心的逻辑尽量不做修改,灵活对接各大平台,适应各种业务场景。

我们系统主要承接了三部分的订单:第三方电商平台,toB订单,手工单,第三方电商平台主要是订单量较大的国外平台,例如亚马逊,shopify等,进行了平台API对接,对公订单是公司间购买发货的订单,对接了公司内部的TOB订单模块,手工单分两种1.是基于订单的补重改发,2.平台由于单量不够,还未到开发需要对接平台的量,创建对应的平台手工单进行发货

基本架构图

我们将未进入订单中心的订单称为SP订单,进入到订单中心的称为SO订单,SP订单进入到订单中心时,必定会有自己的平台归属

每个平台微服务都会定义一个平台订单转化器,把SP订单转化成标准的SO订单,在第一二版重构中,我们主要是规范了进入订单中心的标准字段,保证其通用性,第三次重构中,在重构中在转化器中定义了各种开关,对订单进行更加精细的控制,而不用对订单中心进行改动,比如是否需要物流地址校验,是否需要扣减库存等,这样在业务发生变动时,不用改动订单中心,只需要对平台微服务进行定制开发即可。

平台与订单管理系统交互图


二.订单系统的详细设计

订单系统主要分为四个大表,分别为 订单主表,订单明细表,包裹主表,包裹明细表

当订单进入到订单中心时,会生成一个包含所有订单明细的包裹并推送给下游业务系统,订单中心与下游发货系统通过包裹进行交互,订单系统通过包裹进行各种操作,包裹反向影响订单状态

1.拆分

一.平台订单进入到订单系统时,可能会生成包含多个sku的一个包裹,当某个sku暂时不需要发运时,则可以使用包裹拆分的功能,把不需要发货的sku拆分为一个新的包裹

二.当仓储系统发现某个sku暂时没有库存时,也可以使用拆分逻辑,把有库存的sku生成一个包裹先进行发运。

2.换货

换货操作一般发生在客服和客户共同协商需要更换货物,但是不需要重新下单的情况下,此时只要更换包裹内的sku即可,此时订单的sku不会发生变化,只会变更包裹明细的sku。

3.发货

包裹会继承订单的发运信息以及关键信息,并向下游系统发起创建出库请求

4.拦截

包裹向下游系统发起了出库请求后,客服进行拦截操作,则会向下游系统发起拦截请求,此时下游系统则会向第三方仓库发起取消(自营仓则判断是否出库,未出库则直接取消),然后作废本次的出库请求

5.取消

取消操作和拦截操作逻辑上是一样的,不过唯一不同的就是进行过取消操作的订单,无法再进行操作

6.物流回传

下游系统完成发货后,通知订单中心发货明细,订单中心通过发货明细中的sku再去通知对应的平台系统,完成平台履约

PS:订单中心和下游系统的一次出入库交互应该视为是一次完整请求,请求中应包含所有的出入库信息,两个系统之间相互独立,下游系统根据出入库请求参数即可完成一次出入库操作,下游系统不应中途再通过RPC,MQ等方式再去请求订单中心获取相关参数,以便后期的需求变动和防止下游系统和订单中心的过度耦合。


三.订单系统的订单状态流转

我们将系统订单状态分为初始状态,中间状态,异常状态,终态

初始状态

订单进入订单管理系统时最开始的状态,未生成包裹信息,在生成包裹信息时自动转换成中间状态,这个状态下,会根据平台订单状态进行更新变更

中间状态

订单生成包裹后,推送给下游系统,下游系统未返回处理信息或者返回部分发货时,订单会处于这个状态,中间状态最终会流转成异常状态或者终态,中间状态的订单不再依据平台订单状态而改变,例如 订单A处于待发货状态,平台上面变成已完成,则订单A在订单管理系统还是待发货状态,由下游系统决定订单A的订单状态扭转

异常状态

异常状态分为 1.根据下游系统返回的信息而变更的异常状态。 2.订单管理系统主动操作导致的异常状态。异常状态在下游系统都是处于无法出库的状态,需要进行人工操作后,转化成中间状态或者终态

终态

终态则表示订单已经结束了,不能进行人工操作,订单不能进行任何数据变更。

状态扭转图

四.订单系统的关键代码逻辑

订单管理系统会对接各种电商,无论是技术人员听过的,还是未听过,那我们经常需要快速对接各大平台的订单,同时兼容订单管理系统的内部逻辑,不应因为平台增加而改变原本稳定的系统,从而增加技术债务.

平台订单通过订单转化器转换成系统订单,当系统订单出库完成,需要进行物流上传时,通过平台工厂类反射生成对应的平台实现类,而每一个平台实现类都是相对独立的,当某个平台发生变化时,只需要修改对应的平台实现类即可,内部逻辑调用的抽象类提供的统一的对应接口,这样在新增平台时并不需要进行修改内部业务逻辑。

UML图

五.结语

拖拖拉拉写了半个月,这份总结总算写完了,比写代码难太多了,不知不觉也当了快7年的程序员,无论是业务层面还是代码层面,依旧觉得自己是管中窥豹,路漫漫其修远兮,吾将上下而求索。

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

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

相关文章

序列生成模型(一):序列概率模型

文章目录 前言1. 序列数据2. 序列数据的潜在规律3. 序列概率模型的两个基本问题 一、序列概率模型1. 理论基础序列的概率分解自回归生成模型 2. 序列生成 前言 深度学习在处理序列数据方面取得了巨大的成功,尤其是在自然语言处理领域。序列数据可以是文本、声音、视…

【算法Hot100系列】三数之和

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

人生感悟 | 又是一年,眼看要2024了

哈喽,你好啊,我是雷工! 刚过完大雪节气没两天,气温开始急转直下,走在路上明显感觉冷了许多。看天气预报很多地区已经开始下雪了。 看日历已经12月9号了,12月份,一年的最后一个月,2…

别小看Python的【print】函数,这些高级用法你知道吗?

文章目录 引言技巧1:格式化输出示例1:使用%s来插入字符串,使用%d来插入整数示例2:使用字符串的format()方法示例3:使用f-string格式化输出 技巧2:控制输出文本的颜色技巧3:将打印结果重定向至文…

PyVMomi 克隆虚拟机时将磁盘改为Thin模式

需求介绍: 之前已经使用pyvmomi库实现了虚拟机的自动备份,不过由于备份的虚拟机都是较为重要的系统,磁盘都是厚置备模式,终于有一天,备份目标的空间不够了,导致几个虚拟机无法备份。在不想增加磁盘的情况下…

【计算机网络】—— 详解码元,传输速率的计算|网络奇缘系列|计算机网络

🌈个人主页: Aileen_0v0🔥系列专栏: 一见倾心,再见倾城 --- 计算机网络~💫个人格言:"没有罗马,那就自己创造罗马~" 目录 码元 速率和波特 思考1 思考2 思考3 带宽(Bandwidth) 📝总结 码元…

Linux+Docker+Gitee+Jenkins自动化部署.NET Core服务

目录 一、安装Jenkins 1、跟新yum包 2、查询镜像 3、拉取镜像 4、创建Jenkins工作目录,并将容器内目录挂载到此目录上 5、启动Jenkins容器 二、Jenkins配置 1、Jenkins安装gitee码云插件 2、创建私人令牌 3、Jenkins添加全局凭据 4、系统配置 三、构建任…

C++之程序生成

一、C的发展史 截止到2023年12月,C已经更新了很多版本,并在每个版本中修复了bug和添加了新的特性,ISO C委员会每三年会对C进行一次更新: C98:于1998年发布,是最早的国际标准化版本。它包含了面向对象编程…

Typescript中Omit数据类型的理解

在 TypeScript 中&#xff0c;Omit 是一个内置的工具类型&#xff0c;它用于从对象类型中排除指定的属性&#xff0c;并返回剩余的属性。 Omit 的语法如下所示&#xff1a; type Omit<T, K> Pick<T, Exclude<keyof T, K>>;其中&#xff0c;T 表示原始类型…

D3D12可编程渲染流水线

一、初始化D3D库 启用 DirectX数学库 x86需要启用SSE2指令集&#xff0c;所有平台均需将浮点模型设置为fast。默认为&#xff1a; 精度 (/fp:precise)。 #include <DirectXMath.h> #include <DirectXPackedVector.h> 启用调试模式下的内存泄漏检测 // Enabl…

CCF-CSP真题《202309-5 阻击》思路+ c++满分题解

想查看其他题的真题及题解的同学可以前往查看&#xff1a;CCF-CSP真题附题解大全 试题编号&#xff1a;202309-5试题名称&#xff1a;阻击时间限制&#xff1a;2.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 问题描述 上回提到&#xff0c;西西艾弗岛下方有一个庞大的遗…

【面试】广告优化

a1&#xff1a;点击率公式是什么&#xff1f;点击率低的原因是什么&#xff1f; 点击率点击/曝光&#xff0c;点击率低的原因主要有两点&#xff1a;一是创意不吸引人&#xff1b;二是目标受众不准确/定向过宽不精确&#xff0c;广告曝光给了对产品不感兴趣用户 a2&#xff1a;…

mysql学习记录

insert into table_nameA(字段名) select 字段名 from table_nameA&#xff08;按照一般的select语句格式进行&#xff09; 通过此语句&#xff0c;可以根据需要抓取数据组成新记录落表 存储过程&#xff1a; 创建&#xff1a; CREATE PROCEDURE pro_name&#xff08; IN o…

mysql !=索引为什么失效

可以先看这个&#xff1a;Mysql查询条件为大于时&#xff0c;不走索引失效场景-CSDN博客 如下建立了联合索引&#xff0c; 注意查询phone是用不对劲了索引&#xff0c;key_len82 改为 !时&#xff0c; key key_len没内容&#xff0c;说明没有走索引&#xff0c;为什么没有走&…

DOS 系统(命令行)

文章目录 DOS 系统DOS 常用命令DOS 高级命令DOS 批处理命令DOS 应用场景 DOS 系统 操作系统的发展史&#xff08;DOS/Windows篇&#xff09; DOS操作系统的历史 DOS&#xff08;Disk Operating System&#xff09; 是 磁盘操作系统 的缩写&#xff0c;是一种早期的个人计算机操…

HashMap构造函数解析与应用场景

目录 1. HashMap简介 2. HashMap的构造函数 2.1 默认构造函数 2.2 指定初始容量和加载因子的构造函数 3. 构造函数参数的影响 3.1 初始容量的选择 3.2 加载因子的选择 4. 构造函数的应用场景 4.1 默认构造函数的应用场景 4.2 指定初始容量和加载因子的构造函数的应用…

10天玩转Python第8天:python 文件和异常 全面详解与代码示例

今日内容 文件操作 普通文件的操作json 文件的操作[重点] 异常处理(程序代码运行时的报错) 文件介绍 计算机的 文件&#xff0c;就是存储在某种 长期储存设备 上的一段 数据 作用: 将数据长期保存下来&#xff0c;在需要的时候使用 ​ 1.计算机只认识 二进制(0 1) 2.文件中…

myBatis-plus自动填充插件

在 MyBatis-Plus 3.x 中&#xff0c;自动填充的插件方式发生了变化。现在推荐使用 MetaObjectHandler 接口的实现类来定义字段的填充逻辑。以下是使用 MyBatis-Plus 3.x 自动填充的基本步骤&#xff1a; 1.基本配置 1.1添加 Maven 依赖&#xff1a; 确保你的 Maven 依赖中使…

10天玩转Python第9天:python 面向对象 全面详解与代码示例

今日内容 异常 模块和包 导入模块(导包)if __name__ "__main__": Unitest 框架的学习 了解, 基本组成 异常 异常传递[了解] 异常传递是 Python 中已经实现好了,我们不需要操作, 我们知道异常会进行传递. ​ 异常传递: 在函数嵌套调用的过程中, 被调用的函数 ,发…

Grafana Loki 快速尝鲜

Grafana Loki 是一个支持水平扩展、高可用的聚合日志系统&#xff0c;跟其他的聚合日志系统不同&#xff0c;Loki只对日志的元数据-标签进行索引&#xff0c;日志数据会被压缩并存储在对象存储中&#xff0c;甚至可以存储在本地文件系统中&#xff0c;能够有效降低成本&#xf…