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

前言

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

二.订单系统的详细设计

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年的程序员,无论是业务层面还是代码层面,依旧觉得自己是管中窥豹,路漫漫其修远兮,吾将上下而求索。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[MySQL]数据库概述

目录 1.什么是数据库 2.数据库分类 2.1关系型数据库 2.2非关系型数据库 1.什么是数据库 我们知道,存储数据可以使用文件来存储。那么为什么我们还要大费周章的去设计和使用数据库呢? 因为文件保存数据有以下几个缺点: 1.文件的安全性不…

Attention机制学习

写在前面 注意力机制是一个很不错的科研创新点方向,但是没有系统记录过学习过程,这里记录科研中遇到的各种注意力机制。 1. Attention机制解释 本质上来说用到attention的任务都有Query,Key,Value三个关键components,…

扩展学习|大数据挖掘与智能体ABM建模

出处:计算社会科学_中南大学_中国大学MOOC(慕课) (icourse163.org)https://www.icourse163.org/course/CSU-1466004186 ps:相关内容来自于本人笔记,若有需要请联系原作者!个人学习留存,侵权必删! 一…

可回收资源的环保螺旋盖葡萄酒

在酿酒师中,选择哪种瓶盖来保存一瓶葡萄酒主要取决于葡萄酒的种类和酿酒师自己的偏好。在20世纪70年代,澳洲朋友引进并推广了一种保存葡萄酒的新方法,这种新方法螺旋盖并在70年代获得专利,投入商业使用,澳大利亚的酿酒…

【STM32】STM32学习笔记-OLED显示屏(10)

00. 目录 文章目录 00. 目录01. OLED显示屏接线图02. OLED函数库03. OLED测试代码04. Keil调试05. 程序下载06. 附录 01. OLED显示屏接线图 02. OLED函数库 oled.h #ifndef __OLED_H #define __OLED_Hvoid OLED_Init(void); void OLED_Clear(void); void OLED_ShowChar(uint8…

图片变成动图如何操作?掌握这个办法就够了

生动有趣的gif动画图片是怎么制作的呢?其实,制作gif动图的方法很简单,无需下载任何软件,使用gif动图制作(https://www.gif.cn/)工具-GIF中文网。只需要上传jpg、png格式的图片,轻松一键就能在线…

Reinfocement Learning 学习笔记PartⅡ

文章目录 Reinfocement Learning六、随机近似与随机梯度下降(Stochastic Approximation & Stochastic Gradient Descent)6.1 Robbins-Monro Algorithm6.2 随机梯度下降 七、时序差分方法(Temporal-Difference Learning)7.1 TD…

OpenAI 承认 ChatGPT 最近的懒惰:由于用户体验到响应缓慢和无用的输出,调查正在进行中

文章目录 一. ChatGPT 指令遵循能力下降引发用户投诉1.1 用户抱怨回应速度慢、敷衍回答、拒绝回答和中断会话 二. OpenAI 官方确认 ChatGPT 存在问题,展开调查三. OpenAI 解释模型行为差异,回应用户质疑四. GPT-4 模型变更受人事动荡和延期影响 一. Chat…

【设计模式--行为型--中介者模式】

设计模式--行为型--中介者模式 中介者模式定义结构案例实现优缺点使用场景 中介者模式 定义 又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立的改变它们之间的交互。 结构 抽象中介者角色…

IntelliJ IDEA 运行 若依分离版后端

一、本地运行 一、选择打开IntelliJ IDEA项目 二、选择若依项目 如:java123 三、等待右下角的准备工作(有进度条的)完成 四、修改MySQL 五、修改资源上传目录 六、修改redis 七、然后点击运行 八、成功图 九、测试访问 二、部署服务器运行 …

策略+工厂完成支付方式选择(微信/支付宝),简单实现

需求 传参String payType wechat 使用微信支付传参String payType ali 使用支付宝支付代码不允许出现if-else 思路 把支付当作一个行为,代码中当作一个接口,payService。2个实现类,分别是微信支付实现类WeChatPayServiceImpl&#xff0c…

【数据结构】单链表的定义和操作

目录 1.单链表的定义 2.单链表的创建和初始化 3.单链表的插入节点操作 4.单链表的删除节点操作 5.单链表的查找节点操作 6.单链表的更新节点操作 7.完整代码 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助…

汽车充电协议OpenV2G的平替cbexigen!!

纵所周知,开源欧规协议 CCS 的 OpenV2G 协议不支持 ISO15118-20:2022 协议,并且软件维护者已经明确不在进行该软件的维护。 前几天在 Github 上冲浪发现了一个宝藏开源项目,完美的实现的 OpenV2G 的 Exidizer 工具的功能:cbexigen…

Goldstein枝切法对存在间断相位缺陷的解缠研究

摘要: Goldstein枝切法作为相位解缠中路径积分法的重要算法之一,其解缠结果易受到噪声或间断相位缺陷所引起的残差点影响。为了研究相位间断缺陷对解缠算法的影响,模拟了具有间断相位缺陷的数据,采用 Gold-stein枝切法进行了系统的解缠研究。…

嵌入式C语言变量、数组、指针初始化的多种操作

在敲代码的时候,我们会给变量一个初始值,以防止因为编译器的原因造成变量初始值的不确定性。 对于数值类型的变量往往初始化为0,但对于其他类型的变量,如字符型、指针型等变量等该如何初始化呢? 数值类变量初始化 整…

巴贝拉葡萄酒是单一品种还是混合品种制成的?

大多数巴贝拉葡萄酒都是由单一的巴贝拉葡萄品种制成的,许多意大利葡萄酒商开始尝试在巴贝拉葡萄酒中加入其它葡萄品种,其中两个最受欢迎的意大利品种是皮埃蒙特的巴贝拉德阿尔巴和达斯蒂。和朋友在一家意大利餐厅吃饭,被酒单吓到了&#xff1…

MySQL数据库 入门

目录 一、MySQL概述 二、MySQL安装 安装数据库 配置数据库 启动停止数据库 客户端连接数据库 三、数据模型 四、SQL 一、MySQL概述 先来讲解三个概念:数据库、数据库管理系统、 SQL 。 而目前主流的关系型数据库管理系统的市场占有率排名如下: …

Android--Jetpack--数据库Room详解一

人生何须万种愁,千里云烟一笑收 一,定义 Room也是一个ORM框架,它在SQLite上提供了一个抽象层,屏蔽了部分底层的细节,使用对象对数据库进行操作,进行CRUD就像对象调用方法一样的简单。 二,角色介…

​【EI会议征稿中】#先投稿,先送审#第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)​

#先投稿,先送审# 第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024) 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 2024年3月1日-3日 | 中国南京 会议官网&#xff1a…

外包干了4个月,测试技术退步明显

先说一下自己的情况,本科生,20年通过校招进入杭州某软件公司,干了3年的功能测试,当然有半年是被封在了家里,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我…