交易系统:订单模型设计详解

大家好,我是汤师爷~

订单模型作为整个交易系统的核心,支撑着所有交易环节。

订单域核心概念模型

交易系统:订单模型设计详解

如图所示,为订单核心概念模型。

1、订单

在实际交易业务处理中,订单会根据不同的业务规则(如店铺、收货地址、配送方式等)拆分成多个子订单,形成一个父订单对应多个子订单的结构。这种拆分机制便于后续的订单履约和商家结算。订单包含以下核心字段:

  • 租户ID:标识订单所属的租户
  • 订单ID:订单的唯一标识
  • 父订单ID:关联的父级订单ID(如有)
  • 商家ID:关联的商家标识
  • 订单类型:区分普通订单、预售订单、跨境订单等类型
  • 下单时间:订单创建的具体时间
  • 支付方式:如现金、银行卡、移动支付、标记支付等
  • 订单状态:反映订单当前所处环节
  • 订单备注:存储订单相关的补充说明
  • 合计金额:订单商品的原始总金额
  • 实付金额:扣除优惠后的实际支付金额
  • 优惠金额:各类促销、优惠券等减免金额

2、订单明细

订单明细是订单中每一个具体商品的详细信息记录,包含以下关键信息:

  • 订单明细ID:每条明细的唯一标识
  • 订单ID:关联的订单编号
  • 商品ID和SKU ID:标识具体商品及其规格
  • 商品编码:商品的内部编码标识
  • 商品数量:购买的数量
  • 商品原价:单个商品价格
  • 商品金额:该商品的总金额
  • 商品实付:
  • 明细类型:区分普通商品、赠品等
  • 优惠金额:应用到该商品的优惠金额

2、渠道信息

记录订单的购买渠道,如电商平台、O2O平台或门店。这些信息有助于分析销售策略和客户购买行为。

3、客户信息

客户的基本信息,包括客户名称、客户类型、客户生日等,用于支持后续的营销活动和客户服务。

4、营销信息

包括订单中应用的促销活动、折扣、积分使用等信息。这些数据帮助商家追踪促销效果并了解客户购买偏好。

5、收货信息

详细记录商品买家的收货信息,包括收货人姓名、手机号码、联系电话和收货地址。

6、支付信息

记录客户的支付方式、支付状态、支付时间和支付金额。这些信息对财务管理和订单结算流程至关重要。

7、交付信息

记录了商品交付的详细情况,包括:预计送货时间、预计送达时间、预约送达时间范围(开始和结束时间)、预约自提时间范围(开始和结束时间)、自提位置、配送方式等。

8、费用明细

费用明细记录订单中的各项费用,包括运费、打包费、服务费等额外收费项目。

订单拆单场景

订单拆单是指在订单创建时,根据预设的业务规则,将一个完整订单分解为多个子订单的过程。规则通常涉及多个维度,包括商家主体、交易模式、商品属性和物流要求等。

通过拆单,系统能够满足复杂的业务需求,提高订单处理效率。以下为常见拆单场景与案例说明:

1、按商家(店铺)拆分

当订单包含多个商家的商品时,系统会按商家将其拆分为独立子订单。例如,你同时购买了服装店和数码配件店的商品,系统会将订单拆分为两个子订单,分别由各自商家备货和发货。

这样拆分可以让每个商家能独立处理订单履约、售后服务和财务结算,确保账务清晰,避免纠纷。

2、按交易模式拆分

不同交易模式往往有特定的资质要求和结算方式。以海外购为例,商品需通过跨境资质认证和海关申报,并计算关税。如果订单中既有普通国内商品,又有海外购商品,系统会将海外购部分独立成子订单,以便专门处理相关资质与税费事宜。

3、按品类拆分(如药品、生鲜)

不同品类的商品处理要求大不相同。药品需要严格遵循处方审核和药剂师复核流程。如果订单中既有处方药,也有普通日用品,系统将药品部分独立拆分,确保合规处理。

同样,生鲜食品需冷链运输。当订单同时包含生鲜与普通商品时,系统会将生鲜部分单独划分成子订单,确保冷链物流的顺利执行,避免商品的新鲜度。

4、按收货地址拆分

当用户想将订单中的商品分别送给不同城市的亲友,并且在一个订单中享受最多的优惠,系统会按收货地址进行拆分。例如,一份订单需分别配送至北京、上海和广州。系统会生成三个子订单,每个子订单对应一个收货地址,确保为各自的配送线路选择合适的物流服务。

通过合理的拆单策略,交易系统可以更灵活地满足复杂的业务场景,实现精确的分工与高效的履约。

订单状态机

交易系统:订单模型设计详解

订单状态机是指在订单处理流程中,用类似有限状态机的方式来定义和管理订单所经历的不同状态,以及状态间转换逻辑的机制。

通过状态机的设计,可以清晰、结构化地定义订单从生成到最终完成或取消的整个生命周期,明确订单在每个阶段所处的状态,以及不同状态之间的转换条件和业务规则。

订单金额计算

订单金额计算是电商交易系统中的一个核心环节,它不仅涉及基础的商品价格计算,还需要处理各类优惠、折扣、运费等多个维度的金额。下面我们通过具体示例,详细分析订单金额的计算方法和优惠分摊机制。

1、订单金额的计算示例

让我们设定一个简单场景。用户在购物车中添加了 2 个吐司面包,每个售价 20 元,共计 40 元。该订单满足两个优惠活动:

  • 当购买吐司面包时,满 40 元减免 5 元。
  • 订单金额满30,可减免 6 元配送费。

另外,还需支付 1 元的包装费用,订单的各金额计算如图所示。

  • 订单合计金额为 47 元(商品总价 40 元 + 配送费 6 元 + 包装费 1 元)。
  • 优惠金额为 11 元(包括 5 元商品减免与 6 元配送费减免)。
  • 最终用户支付金额为 36 元(47 元 - 11 元 = 36 元)。

交易系统:订单模型设计详解

2、订单优惠分摊示例

优惠分摊是指将订单中的整体优惠,合理分配到各个商品上。优惠分摊非常重要,主要作用有:

  • 准确计算每件商品在享受优惠后的实付金额,用于后续计算商品额实际收入和利润。
  • 出现售后时,可快速计算出应退还的合理金额,避免计算误差与纠纷。

下面是一个更复杂的案例,展示优惠分摊的计算过程。假设顾客的购物清单为:

  • 吐司面包 2 个,合计 40 元
  • 草莓蛋糕 1 个,合计 150 元

上述商品总计 190 元,并参与 "满 180 减 20 元" 的促销活动。此外,订单还包含 20 元的配送费和 6 元的包装费。

此时需要将 20 元的总优惠分配到各商品上,分摊逻辑是根据商品金额占比来计算:

  • 吐司面包(2 个)的分摊金额:20 元 × (40 元 / 190 元) = 4.21 元
  • 草莓蛋糕的分摊金额:20 元 × (150 元 / 190 元) = 15.79 元

当出现除不尽的情况时,系统会将最后一分钱的差额计入订单中的最后一个商品,从而保证商品的优惠金额总和与实际优惠金额完全一致。

分摊完成后,订单金额为 216 元(商品 190 元 + 配送费 20 元 + 包装费 6 元),减去 20 元优惠,顾客实际支付 196 元。

交易系统:订单模型设计详解

本文已收录于,我的技术网站:tangshiye.cn 里面有,算法Leetcode详解,面试八股文、BAT面试真题、简历模版、架构设计,等经验分享。

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/5041.html

(0)
LomuLomu
上一篇 2024 年 12 月 31 日 上午9:52
下一篇 2024 年 12 月 31 日

相关推荐

  • Python 调整Excel行高、列宽

    在Excel中,默认的行高和列宽可能不足以完全显示某些单元格中的内容,特别是当内容较长时。通过调整行高和列宽,可以确保所有数据都能完整显示,避免内容被截断。合理的行高和列宽可以使表格看起来更加整洁和专业,尤其是在包含大量数据的情况下。 本文将介绍如何通过Python调整Excel的行高列宽、或设置自适应行高列宽 。 Python Excel库 要通过Pyth…

    2024 年 12 月 24 日
    24900
  • [Java响应式编程深度解析与实践指南]

    文章框架 核心概念解析 响应式编程范式解读 基础组件剖析 技术实现原理 流量控制机制 实战案例演示 1. 引入必要组件 2. 数据模型定义 3. 接口控制器开发 4. 服务启动流程 5. 接口功能验证 高级应用场景 流量控制实现方案 技术总结 主流框架对比 Project Reactor深度探索 框架特性解析 核心组件说明 应用实例展示 案例1: Mono基…

    未分类 2025 年 5 月 12 日
    15400
  • java: JDK isn‘t specified for module ‘product-service‘问题解决

    目录 问题 解决方法 1.打开File->Project Structure… 2.将Project SDK修改为17 Oracle OpenJDK 17.0.12,并Apply,OK 问题 添加module后报错:java: JDK isn’t specified for module ‘product-service’ 查看pom.xml文件也添加了…

    2025 年 1 月 11 日
    38100
  • 【GreatSQL优化器-08】statistics和index dives

    【GreatSQL优化器-08】statistics和index dives 一、statistics和index_dives介绍 GreatSQL的优化器对于查询条件带有范围的情况,需要根据 mm tree 来估计该范围内大概有多少行,然后以此来计算cost。对于等号条件,给出了两种方法来估计对应行数–Statistics和index dives,前者不…

    2024 年 12 月 30 日
    45800
  • Java刷题常见的集合类,各种函数的使用以及常见的类型转化等等

    目录 前言 集合类 ArrayList 1. 创建和初始化 ArrayList 2.添加元素 add 3.获取元素 get 4.删除元素 remove 5.检查元素 6.遍历 ArrayList LinkedList Stack 1. 创建Stack对象 2. 压入元素 (push) 3. 弹出元素 (pop) 4. 查看栈顶元素 (peek) 5. 检查栈…

    2025 年 1 月 6 日
    38500

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信