关于处理电商系统订单状态的流转,分享下我的技术方案(附带源码)

文章目录: 前言 目的 逻辑分析 代码实现 定义状态 定义事件 定义事件的处理方法 核心代码 调用方式 小结 …

文章目录:

  • 前言

  • 目的

  • 逻辑分析

  • 代码实现

    • 定义状态

    • 定义事件

    • 定义事件的处理方法

    • 核心代码

    • 调用方式

  • 小结

前言

在设计电商系统订单模块时,订单会涉及各种状态以及状态与状态之间的流转,可扩展性可维护性 是我们需要关注的重点!本文分享一下我的技术方案。

如上图,使用 golang 实现上图的订单流转,同时当后续增加订单状态或订单事件时,可以进行快速完成。

目的

关于订单状态的处理,使用统一入口,提高程序的 可扩展性可维护性

逻辑分析

订单状态包括:默认已预订已确认已锁定

订单事件包括:创建订单确认订单修改订单支付订单

通过上图我们还知道了状态与事件之间的关系,比如只有 已确认 的订单才可以进行 修改订单

需要考虑如下问题:

  1. 当订单状态增加时,如何尽可能少的改动或改动对历史影响不大?

  2. 如果在同一入口调用,每个事件的处理方法需要的入参都有所不同,如何处理?

  3. 当某个事件完成后,有可能会进行发短信或客户端 Push 的操作,如何处理?

  4. 有可能某个事件,在不同平台(C端、商家后台、管理平台)的处理逻辑也有些不同,如何处理?

如何设计代码能够解决以上问题?

下面是我的一种代码实现,供大家参考,实现了在 创建订单 时,进行传入参数和完成后给用户发送短信,其他事件的操作,同理就可以实现。

代码实现

定义状态

当有新订单状态的增加时,在此文件中增加相应状态即可,同时维护好订单状态与订单事件之间的关系。

定义事件

当有新订单事件的增加时,在此文件中增加相应事件即可,同时维护好订单事件与事件实现方法之间的关系。

定义事件的处理方法

在此文件中维护具体的事件处理方法,如果逻辑比较复杂可以考虑拆分文件处理。

核心代码

对订单状态的操作,只需要使用 Call 方法即可!

关于方法 addHandlersCall 的代码就不贴了,在文章后面我提供了源码地址,供大家下载。

调用方式

例如当前状态为 默认状态,依次进行如下操作:

  • 创建订单,状态变为 已预订

  • 修改订单,不可操作(已预订状态不可修改);

  • 确定订单,状态变为 已确认

  • 修改订单,状态变为 已预订

  • 确定订单,状态变为 已确认

  • 支付订单,状态变为 已锁定

输出:

小结

以上就是我的技术方案,希望能对你有所帮助,感兴趣的可以再进行封装,上述代码已提交到 github go-fsm-order[1],供下载使用。

参考资料

[1]

go-fsm-order: https://github.com/xinliangnote/go-fsm-order

本文来自网络,不代表软粉网立场,转载请注明出处:https://www.rfff.net/p/8616.html

作者: HUI

发表评论

您的电子邮箱地址不会被公开。

返回顶部