大厂交易系统从0到1(01)-一笔交易到底涉及多少张表?

2024-01-18 14:44

本文主要是介绍大厂交易系统从0到1(01)-一笔交易到底涉及多少张表?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

退款逻辑,1个业务单号--关联多个支付单号--也关联多个退款单号?退款单号,关联优惠券返还的,也可在退款单列表关联吗?返还比例多少,是在优惠券系统设置?

整个交易、支付、清结算、账务体系杂糅,会产生很多单据、单号。再考虑正向、逆向,他们的关系更复杂。

本文就来搞定订单、账单、支付记录、支付单、支付请求、卡消费记录、券核销记录等单据,他们在交易正、逆向中是如何联系的,又有怎么样的数据关系。

0 场景

在某平台购买一次家政阿姨上门保洁服务,总价120元,分2次支付,“先预付80元,再后付40元”,预付时用一张20元优惠券,微信支付60元。

1 3个核心,6大单据及关系

以上场景发生并非依赖一个系统实现,而是通过3个核心实现:交易核心、支付核心、卡券营销核心,每个核心内会产生相应的单据。

1.1 交易核心

交易核心安排交易流程,包含:

  • 订单子系统
  • 账单子系统
① 订单

订单子系统内会生成订单,订单记录了平台跟用户的本次交易信息:

  • 买了啥
  • 总价多少
  • 用户用啥支付的
  • ...
订单号商品金额优惠金额预付后付订单状态
666家政阿姨¥120.00¥20.00¥80.00¥40.00支付成功
② 账单

账单子系统产生账单,账单记录订单要如何结算的信息,为后续的支付、卡券核销做准备,该 case产生2笔账单:

  • 预付账单
  • 后付账单
订单号账单ID金额优惠金额应付支付状态账单类型
666666-1¥80.00¥20.00¥60.00成功预付
666666-2¥40.00¥0.00¥40.00成功后付
③ 账单支付记录

一笔账单需要被用户支付(结算),账单中的支付方式是广义支付方式,包括卡、券、满减、积分及渠道支付,如case的预付账单优惠20元,渠道支付60,假设用户选择微信支付:

账单ID支付方式金额支付状态外部流水号
666-1优惠券¥20.00成功
666-2微信支付¥60.00成功3435566

交易核心的3类单据,一对多对多关系。

1.2 卡券营销核心

① 券核销记录

券系统内记录的用户的券绑定信息、冻结及核销记录;卡系统记录了用户卡余额的消耗记录、卡余额退回记录。

卡券的变动记录依赖交易核心的推动,交易核心如何推动卡券建立联系?靠账单支付记录单据。案例中因为用了一张20元的券,所以券系统核销了该券,假设有一笔核销记录:

券编号券类型金额券状态订单号账单流水号
Q001代金券¥20.00已使用666666-1-1

这条记录与账单支付记录之间建立了关联:

图片

1.3 支付核心

60元走微信支付,即请求外部支付渠道完成支付,这部分支付走的就是支付核心。

① 支付单

支付核心是处理走外部支付通道的支付处理业务。支付核心会产生2类单据:

  • 正向支付的支付单和支付请求明细
  • 退款单和退款请求明细
账单ID支付单号支付方式金额支付状态外部流水号
666-1pay001微信支付¥60.00成功324345
② 支付请求

一笔支付可能请求渠道多次,因此还要建立一个支付请求的明细:

支付单号支付请求号支付方式金额支付状态外部流水号
pay001pay001-1微信支付¥60.00失败
pay001pay001-2微信支付¥60.00成功

支付单和支付请求是1对多:

该case支付在3个核心内产生的全部单据形成的关系:

至此,正向形成的单据及单据之间的关系讲解完毕。

2 逆向单据的产生和关系

这时再看逆向订单退款就容易。逆向只是正向的反向,依然3个核心和单据维度,只是单据变成逆向单:

  • 订单变成退单
  • 账单变成退款账单
  • 账单支付记录变成账单退款记录
  • 支付单变成退款单
  • ...

2.1 逆向都是基于正向

没有正向单据,就没逆向单据,如用户没下单,就不会取消订单、也不会操作订单退回,支付也是如此,没有原支付成功,就不会有退款。

2.2 支付退款基于原支付单

支付核心的退款,是支付单,不能脱离原支付单,退款可:

  • 全退
  • 部分退
  • 多次退

但绝不会超过原支付金额。

2.3 逆向由订单发起

订单是逆向的起点,就是只有业务产生逆向处理,如退了部分商品或订单差评产生部分退回等,才会产生支付的逆向。

因此,退款不一定有订单逆向,也可能是订单产生的差评罚款或其他原因,但都是基于订单,即退款基于订单发起。

2.4 交易需控制逆向的顺序

订单产生了逆向,因为订单用了卡、券、积分、微信支付等多种支付方式。逆向发生后,先处理谁,先退券还是先退积分,还是先退微信支付的金额?

若是全额退还好说,毕竟最终都会逆向处理,但部分退呢?

支付了80,用了20元券,微信支付60,现在要退40,咋退?是退20的券微信退20,还是微信退40?因此需要一个逆向顺序的控制,case中设置这样的顺序及设置了券不返还的策略:

这样的规则下,若预付单只退50元,那么看预付单的情况:

按“券>卡>渠道”的退款顺序逆向:

  • 先处理20元券,因为券不返还,所以就只是将券变成已取消,这样就会从营销中台的成本中核销掉
  • 而30元从微信支付退
  • 所以,用户部分退50元,在这样的逆向策略下,只能拿回30元

关注我,紧跟本系列专栏文章,咱们下篇再续!

作者简介:魔都国企技术专家兼架构,多家大厂后台研发和架构经验,负责复杂度极高业务系统的模块化、服务化、平台化研发工作。具有丰富带团队经验,深厚人才识别和培养的积累。

参考:

  • 编程严选网

    本文由博客一文多发平台 OpenWrite 发布!

这篇关于大厂交易系统从0到1(01)-一笔交易到底涉及多少张表?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/619334

相关文章

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

集中式版本控制与分布式版本控制——Git 学习笔记01

什么是版本控制 如果你用 Microsoft Word 写过东西,那你八成会有这样的经历: 想删除一段文字,又怕将来这段文字有用,怎么办呢?有一个办法,先把当前文件“另存为”一个文件,然后继续改,改到某个程度,再“另存为”一个文件。就这样改着、存着……最后你的 Word 文档变成了这样: 过了几天,你想找回被删除的文字,但是已经记不清保存在哪个文件了,只能挨个去找。真麻烦,眼睛都花了。看

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

01 Docker概念和部署

目录 1.1 Docker 概述 1.1.1 Docker 的优势 1.1.2 镜像 1.1.3 容器 1.1.4 仓库 1.2 安装 Docker 1.2.1 配置和安装依赖环境 1.3镜像操作 1.3.1 搜索镜像 1.3.2 获取镜像 1.3.3 查看镜像 1.3.4 给镜像重命名 1.3.5 存储,载入镜像和删除镜像 1.4 Doecker容器操作 1.4

【H2O2|全栈】Markdown | Md 笔记到底如何使用?【前端 · HTML前置知识】

Markdown的一些杂谈 目录 Markdown的一些杂谈 前言 准备工作 认识.Md文件 为什么使用Md? 怎么使用Md? ​编辑 怎么看别人给我的Md文件? Md文件命令 切换模式 粗体、倾斜、下划线、删除线和荧光标记 分级标题 水平线 引用 无序和有序列表 ​编辑 任务清单 插入链接和图片 内嵌代码和代码块 表格 公式 其他 源代码 预

大厂算法例题解之网易2018秋招笔试真题 (未完)

1、字符串碎片 【题目描述】一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,“aaabbaaac” 是由下面碎片组成的:‘aaa’,‘bb’,‘c’。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的 平均长度是多少。 输入描述: 输入包括一个字符串 s,字符串 s 的长度 length(1 ≤ length ≤ 50),s 只含小写字母(‘a’-‘z’) 输出描述

滚雪球学MyBatis(01):教程导读

MyBatis简介 前言 欢迎回到我们的MyBatis系列教程。在上期的内容中,我们详细介绍了MyBatis的基本概念、特点以及它与其他ORM框架(如Hibernate)的对比。我们还探讨了MyBatis在数据访问层中的优势,并解释了为什么选择MyBatis作为我们的持久化框架。在阅读了上期的内容后,相信大家对MyBatis有了初步的了解。 在本期内容中,我们将深入探讨MyBatis的基本配

大厂面试:小米嵌入式面试题大全及参考答案(130+道 12万长文)

Flink 架构介绍 Flink 是一个分布式流处理和批处理框架,具有高吞吐、低延迟、高可靠等特点。其架构主要由以下几个部分组成: 客户端(Client):负责将作业提交到集群,并与作业管理器进行交互,获取作业的状态信息。客户端可以是命令行工具、IDE 插件或者自定义的应用程序。作业管理器(JobManager):负责接收客户端提交的作业,协调资源分配,调度任务执行,并监控作业的执

量化交易面试:什么是连贯风险度量?

连贯风险度量(Coherent Risk Measures)是金融风险管理中的一个重要概念,旨在提供一种合理且一致的方式来评估和量化风险。连贯风险度量的提出是为了克服传统风险度量方法(如VaR,风险价值)的一些局限性。以下是对连贯风险度量的详细解释: 基本概念: 连贯风险度量是指满足特定公理的风险度量方法,这些公理确保了风险评估的一致性和合理性。 这些公理包括:非负性、次可加性、同质性和单调

python+selenium2轻量级框架设计-01框架结构

接下来会介绍一个比较简单的框架结构,先看一下分类 config文件夹里放的是配置文件 framework文件夹里面放的是公共类,常用类,还有读配置文件类、日志类、截图类、发送邮件、生成测试报告、操作读取数据库、读取Excel等,后面几篇会一一介绍 logs文件夹存放生成的日志文件 pageobject存放页面类包括元素的定位等 screenshots文件放的是生成的截图 test_