Java生鲜电商平台-电商订单系统全解析

时间:2022-07-27 13:02:01

Java生鲜电商平台-电商订单系统全解析

说明:Java生鲜电商平台-电商订单系统全解析主要讲解OMS的内容,设计,开发,架构等知识.

今天分享将会分为以下三个环节来阐述:

1.订单系统的介绍

2.订单系统的解构

3.垂直电商订单系统设计思路

一、什么是订单系统?

订单管理系统(OMS)是物流管理系统的一部分,通过对客户下达的订单进行管理及跟踪,动态掌握订单的进展和完成情况,提升物流过程中的作业效率,从而节省运作时间和作业成本,提高物流企业的市场竞争力。顾名思义,电商系统就是用户、平台、商户等对于订单的管控、跟踪的系统,衔接着商品中心、wms、促销系统、物流系统等,是电子商务的基础模块;

简单地说订单管理系统作为整个电商的核心,管理着所有的交易进出,可以说没有订单系统电商就无法流畅地运转;

一个好的订单管理系统需要有很好地扩展性和流畅性,在一个电商产品从0-1的过程,订单系统作为其基础模块需要提前考虑到各系统的扩展,订单系统如果在前期就能考虑到后面的扩展,相信对于电商的壮大会非常有帮助;

流畅性指的是整个交易链路需要很流畅,早期我司的订单系统做的非常庞大,但是却没有考虑到流程的通畅性,导致连基础的订单流程都没有办法正常走下去,所以,在从0到1地做一套订单系统时,需要有一些前瞻性,但落地时,以MVP去试错;

二、订单系统解构

1.订单字段

Java生鲜电商平台-电商订单系统全解析
订单字段

订单的主要信息包括支付信息 、配送信息、状态信息、促销信息、商品信息、用户信息等;

支付信息:涉及支付的字段信息,主要包括支付方式、支付金额、订单金额、优惠金额等;

促销信息:涉及促销的字段信息,主要包括优惠方式、优惠面额、折扣等;

商品信息:涉及订单中的商品字段,主要包括商品名称、单价、数量、所属店铺等;

时间信息:涉及订单流转中各个时间戳的字段,包括下单时间、支付时间、发货时间、完成时间等

状态信息:涉及订单流转中状态变更的字段,主要包括订单状态、物流状态及退款状态等;

用户信息:涉及用户的信息,比如买家姓名、注册手机号、收件人等信息;

配送信息:涉及订单配送的基本信息,比如配送方式、物流单号等;

以上这些字段构成了订单所需要的大部分信息;

2.订单体系

Java生鲜电商平台-电商订单系统全解析
订单体系

可以从三个层面来了解电商的订单管理体系,分别是用户层、系统层和底层;

用户层

这个比较好理解,就是用户日常使用的功能和页面,主要有订单列表、订单详情和退款详情等C端用户购买时会使用到的页面,系统层和底层模块为其提供支持;

系统层

在订单管理体系中,和订单最息息相关的交互系统主要有支付系统、订单系统、仓储系统;

1.支付系统

主要作用就是为订单提供支付支持,方便用户使用各种支付方式进行支付,用户支付后会将支付信息给到订单系统;

2.订单系统

作为订单管理体系的核心,起着至关重要的作用,在订单系统中会生成订单,审核订单,取消订单,还涉及到复杂的订单金额计算以及移库操作;

仓储系统:主要用来管理库存以及发货,订单到达一定状态后给到仓储系统,用于管理对应订单的打包、分拣、

备货、出库等;

底层模块

主要包括商品、支付、用户、营销、订单和消息等模块,这些模块共同组成了对上层业务、系统的支持;

大公司一般会将底层框架模块化,比如商品,会构建对应的商品中心,代码、数据库等相对独立,由商品中心开接口和soa,其他模块需要使用商品中心相关功能的时候调取接口,这样做的好处是使各个模块底层相对独立,便于管理及改动;

3.状态机

Java生鲜电商平台-电商订单系统全解析
状态机

下面来说说状态机,一般电商平台用户直观能看到的状态有上图中列举的几个,包括待支付、待配送、待收货、交易完成、退款中;

O2O没有电商中庞大的仓储系统,自然比电商的流程简单些,我将从正流程分别从正流程和逆流程来介绍;

主流程

在电商中,无论是买家端还是卖家端,都会将交易主状态分为待付款、待发货、待确认收货、交易完成,但是买家端与买家端的展示逻辑稍有不同;

在买家端,买家关心的状态无非就那么几个,即待付款、待发货、待收货和待评价,所以淘宝并未像商家端那样将全部的状态一一罗列出,而是保留了买家最关心的状态,保持整个买家端的简洁性;

而买家端中,主要解决的是商家效率的问题,所以在订单列表中会将所有的状态(即待付款、待发货、已发货、退款中、需要评价、交易完成、交易关闭)的订单全部拉出,考虑到商家订单较多的情况,出于对服务器查询的考虑以及并发的考虑,增加了三个月内订单与三个月前订单的查询区分;

首先说说待付款状态,待付款状态主要是买家下单但是没有支付的情况,待付款状态下淘宝的商家也可以进行一系列操作如改价等,买家也可以申请代付、批量操作;

待发货,该状态下会展示所有已支付,待发货的订单,淘宝目前支持的发货方式主要有四种,在线下单、手填快递单号、无纸化物流以及无需物流,操作配送之后交易状态会变更为待确认收货,大型电商平台已经采用无纸化发货的形式进行发货,即使用中端叫单,成功后会展示在已发货(商家端)和待收货(买家端)中;

待确认收货,该状态出于物流阶段,一般会根据业务、活动等来设定自动确认收货的时间,一般电商默认值是在发货后的10天为自动确认收货时间,在双十一、双十二等节日,这个时间会延长到15天,另外海外购、天猫国际等海外购物的订单自动确认时间也会相对较长,为25天;

交易完成,该状态由系统或者用户触发,在订单确认收货后,订单状态变更为交易成功,此时系统会根据是否评价过判断是否将订单展示在买家端的待评价下来引导用户对商家进行评价反馈;

退款/退货流程

一般电商中订单的逆流程主要分为退款流程和退货流程,这里简单地介绍下,后续会有专题来讲述;

发货前的逆流程

发货前的状态一般有待支付和待发货两个,待支付的订单发起逆流程后无需商家确认,直接关闭订单;

而待发货的订单发起后需要走商家的审核,商家同意后订单变为交易关闭,触发退款;

发货后的逆流程

发货后的逆流程主要包括待确认收货和交易成功的逆流程;

大致分为需要仅退款和退货退款;

仅退款:未收到货或与卖家协商同意后的申请,卖家同意后无需物流;

退货退款:已收到货需要退换的情况,卖家同意后需要走物流;

Po上我司的退款流程作为后续专题的引子吧,敬请期待...

Java生鲜电商平台-电商订单系统全解析

3、某垂直电商设计思路

笔者的公司属于某个垂直行业的电商,主要以B2B转单为主,将线上的订单转给线下门店进行配送,所以暂时不涉及商品、库存、仓库等;

以下是我司的订单流程,线上商家将订单转给线下门店,涉及的状态有待派单、待支付、待接单、待配送、待转账和交易完成;

在设计主流程的时候并不复杂,根据业务场景进行设计即可,真正复杂的部分在订单的逆流程与系统间的交互;

由于旧版的系统过于臃肿,没有办法在其上进行迭代,加之流程上有很多问题,所以打算从业务流程、系统框架、视觉设计等方面做个大改版,即解决用户使用流程中的问题,也便于后期业务功能的实现;

Java生鲜电商平台-电商订单系统全解析
生鲜电商状态机

订单系统的完整性离不开几个部分,上次讲订单字段,各种字段信息组成了一个订单详情页。如果将字段信息比喻成订单系统的血液,那订单状态的切换就好比订单系统灵活的神经,没有订单状态之间的切换,就构成不了庞大的订单系统,也满足不了很多网购时各种情况。

订单流程

订单流程是指从订单产生到完成整个流转的过程,其中包括正想流程和逆向流程。正向流程就是一个正常的网购步骤:订单生成-->支付订单-->卖家发货-->确认收货-->交易成功。而逆向流程则是各种退款流程。

正向流程

Java生鲜电商平台-电商订单系统全解析
订单正向流程

整个订单设计的流程其实是非常多的,接下来我们将从比较具体的描述一下各个环节下的实际情况:

订单生成:用户下单后,系统需要生成订单,此时需要先获取下单中涉及的商品信息,然后获取该商品所涉及到的优惠信息,如果商品不参与优惠信息,则无此环节,接着获取该账户的会员权益(这里其实需要注意的是,优惠信息与会员权益是有区别的,就好比商品满减是优惠信息,新人立减是会员权益。一个是针对商品,另一个是针对账户)。库存扣减是指可销售库存数量-1,严格来讲库存扣减目前分为两种,一种是下单减库存,另一种是付款减库存;个人觉得中小创业者也许竞争者不比淘宝中的卖家,在电商这个存量市场,需要精细化的运营才能存活下来,如此说保证用户体验才是根本,所以我这里的观点是生成订单扣减库存,这种做法会避免用户支付成功商家却没货的情况。然后计算运费,订单生成成功。

支付订单:用户支付完订单后,需要获取订单的支付信息,包括支付流水号,支付时间等。支付完订单接着就是等商家发货,但在发货过程中,往往还有一种情况存在,很正常却也比较复杂,就是订单拆单。订单拆单分两种,一种是用户挑选的商品来自于不同渠道(自营与商家,商家与商家),此时就需要拆分订单,并分开结算,这里还涉及父子订单的说法,这里不再赘述。另一种是在SKU层面上拆分订单。不同仓库,不同运输要求的SKU,包裹重量体积限制等因素都需要将订单拆分。比如商品A只在甲仓库有,商品B又只在乙仓库有,此时会将商品A与商品B拆分成两个订单。或者有些企业的做法是将商品A/B调拨到另外一个仓库统一发货,也方便了用户。订单拆单看起来简单,其实里面涉及到底层的系统支持,如你需要对每一个仓库的货品进行相对准确的盘点,且做到实时同步(涉及到仓库精细化管理);对商品进行准确分类与摆放;对商品信息记录准确无误等;这其中哪一模块都是一个浩大的工程,PM一般进入一家公司都会在原有(半成品)的基础上进行优化,大家不妨多思考一下底层业务,只有在底层做好精细化管理,才能支持线上丰富的用户需求。

商家发货:商家发货过程也有一个标准化的流程。上面也有讲到,订单拆分时会涉及到仓库间调拨,然后仓库会对商品进行打单,拣货,包装,交接快递配送。这套标准化流程如果优化好,也是一个大工程,这里不再赘述,建议大家看看库存与仓库管理方面的书籍,详细了解。

确认收货:商家发货后,就是等快递配送了,订单系统需要接入一些常用快递企业的接口,方便用户与商家在站内查询快递信息。

交易成功:收到货后,不是一个服务的结束,相反是一个服务的开始。订单系统需要在快递被签收后提醒用户对商品做评价,这里要注意,确认收到货不代表交易成功,交易成功是指在收到货X天的状态,此时订单不在售后的支持时间范围内。到此,一个订单的正向流程就算走完了。

目前我也没有研究过,不过我的经验告诉我订单系统对售后订单的处理并不比正产订单少,身为电商PM,我们的工作就是去优化这些流程,提高用户粘性。本身售后订单的出现,在某种程度上已经伤害到了用户,如果流程还一团糟的话,我们根本没有机会等到用户的复购。

逆向流程

Java生鲜电商平台-电商订单系统全解析
订单逆向流程

一个电商的基本逆向流程如上图所示,订单的逆向流程复杂就在于它几乎允许在正向流程的任何环节出现,有人会问,用户未收到货为什么还能退款,其实我们换为思考,也很容易理解,假想你是用户,买了一双鞋子,付了款发了货,正在美滋滋的等待收快递,然后刚好路过一家鞋店看到刚买的同款鞋子大促销,于是你就拿起手机点击退款,买下了这双促销的鞋子。这种场景其实是很普通也很正常的用户日常,所以我们的订单系统就必须得支持用户各种丰富的场景需求,也十分考验PM的业务渗透能力,好在电商的先行者淘宝已经做了很多基础建设和用户教育,我们直接可以拿来套用,不过还是要根据各个公司的业务情况进行修改。

取消订单:用户提交订单时,在跳转至支付前直接退出,此时用户原则上属于取消订单,因为还未付款,则比较简单,只需要将原本提交订单时扣减的库存补回即可。

支付失败:用户进行支付时退出,或者取消支付,我们将其列为支付失败状态,此时处理同上,将扣减的库存补回可销售库存即可。

付款后退款:用户支付成功后,商家还未发货,支持用户申请退款,此时如果仓库与客服是分离的,则需要先检查仓库是否已经发货,若已发货则应与客户沟通是否可以收到货后再进行退款,如果仓库还未发货,则可直接同意用户退款。或者企业接入菜鸟物流,实行截件功能,不过这种操作还不成熟,成本会比较大,不适合中小创业型公司。

缺货退款:用户支付成功后,商家发货时发现仓库缺货(如果提交订单扣减库存,则会减少缺货情况,为什么是减少而不是避免?因为仓库管理商品时没办法做到100%精准,所以信息有时候会不准确,导致线上的可销售库存显示有库存而仓库已经售空的状态),则需要与用户协商是否退款,这个流程订单系统可以做到流程化,自动化,连接消息中心和仓库管理系统去实现,难点在于消息的实时性。我就遇到过在淘宝买过一件上衣,一天过去了,商家跟我说没货了,我当时杀人的心都有了。

待收货退款:这个问题目前还没有特别完美的解决方法,商家发了货之后,用户还未收到货,此时货在路上。我曾经在一些交流群里提出过这个问题,大家的看法都不一样,大体上分为两种做法。一种是用户收到货后重新寄回;另一种是用户直接拒收包裹,包裹直接退回原地址;我个人倾向于第一种,第一种比较灵活,因为用户未收到货就退款的原因一般与商品质量关系不大,所以如果允许用户直接拒收退回,相当于商家需要承担回退运费,而本身可能与商家并无太大关系。另外一个原因就是,有些商家发货地址与退货地址不在同个地方,不支持直接退回。尽管如此,在到处强调用户体验的今天,增加用户的售后成本也是在消耗用户对平台的耐心,大家不妨去思考一下,有没有更好的解决方法。

用户拒收:同上

退货退款:用户收到货后,想要申请售后,则此时需要提供让用户输入售后原因,包括上传凭证的功能,如果与商家协商无果,还需要增加平台客服的入口,方便用户进行申诉。而协商结果/申诉成功后直接触发自动退款机制,退款后触发消息通知,同时触发交易关闭状态,整个售后过程才算结束。

我上面有好几处都提到与消息中心的对接,消息的触发等,其实这也算是订单系统设计的一部分内容,称之为订单推送,当订单状态机发生变化时,需要将对应的变化情况告知给相关人员以便了解当前订单的情况,这也是订单推送的作用。

订单推送

订单推送的触发依赖于状态机的改变,涉及到的信息包括:

· 推送对象(用户,商家,仓库)

· 推送方式(站内消息,push,短信,微信)

· 推送节点(状态机)

本文主讲订单系统的核心模块设计逻辑,订单推送的具体设计就不再此处赘述。

最终数据库设计如下:

订单主表

CREATE TABLE `order_info` (
`order_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单自增id',
`order_number` varchar(32) DEFAULT NULL COMMENT '订单号,唯一',
`order_source` varchar(255) DEFAULT NULL COMMENT '订单来源,web,weixin,h5,android,ios',
`user_id` bigint(20) DEFAULT NULL COMMENT '所属用户ID',
`pay_type` varchar(16) DEFAULT NULL COMMENT '支付类型,alipay,weixin,un_know',
`pay_status` tinyint(2) unsigned DEFAULT '0' COMMENT '支付状态;1,未付款;2,已付款, 3,线下付款,4 线下付款已收款',
`trade_status` tinyint(2) unsigned DEFAULT '0' COMMENT '交易状态。0为进行中, 1,已完成,2,为取消交易',
`best_time` datetime DEFAULT NULL COMMENT '收货人的最佳送货时间',
`order_amount` decimal(12,2) DEFAULT NULL COMMENT '订单金额',
`shipping_amount` decimal(12,2) DEFAULT NULL COMMENT '配送费用',
`pay_amount` decimal(12,2) DEFAULT NULL COMMENT '实付金额',
`trade_amount` decimal(12,2) DEFAULT NULL COMMENT '交易金额',
`order_time` datetime DEFAULT NULL COMMENT '订单下单时间',
`pay_time` datetime DEFAULT NULL COMMENT '订单支付时间',
`goods_shipping_time` datetime DEFAULT NULL COMMENT '商品出库时间',
`confirm_receiving_time` datetime DEFAULT NULL COMMENT '确认收货时间',
`outer_trade_no` varchar(48) DEFAULT NULL COMMENT '交易订单号,比如支付宝给我平台的订单号',
`order_remark` varchar(255) DEFAULT NULL COMMENT '订单备注',
`create_time` datetime DEFAULT NULL COMMENT '订单创建时间',
PRIMARY KEY (`order_id`),
KEY `index_user_id` (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单的基础信息表';

订单明细表:

CREATE TABLE `order_item` (
`item_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`order_id` bigint(20) DEFAULT NULL COMMENT '订单主表id,order_info表的order_id',
`order_number` varchar(32) DEFAULT NULL COMMENT '唯一订单号',
`order_status` tinyint(4) DEFAULT NULL COMMENT '订单项状态,1为已提交订单,2为取消订单',
`user_id` bigint(20) unsigned DEFAULT '0' COMMENT '所属用户ID',
`remark` varchar(255) DEFAULT NULL COMMENT '订单项备注,由用户提交订单前填写',
`format_name` varchar(64) DEFAULT NULL COMMENT '商品规格名称',
`goods_name` varchar(64) DEFAULT NULL COMMENT '商品名称',
`goods_number` decimal(12,2) DEFAULT NULL COMMENT '商品的数量',
`goods_price` decimal(12,2) DEFAULT NULL COMMENT '商品的单价',
`goods_amount` decimal(12,2) DEFAULT NULL COMMENT '单项总金额',
`create_time` datetime DEFAULT NULL COMMENT '订单创建时间',
PRIMARY KEY (`item_id`),
KEY `index_order_id` (`order_id`) USING BTREE,
KEY `index_buyer_id` (`user_id`),
KEY `index_format_id` (`format_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单的明细表';

订单日志表:

CREATE TABLE `order_logs` (
`log_id` bigint(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键,自动增加ID',
`user_id` bigint(20) DEFAULT NULL COMMENT '用户ID',
`order_id` bigint(10) NOT NULL COMMENT '订单ID,对应order_info中的Id',
`order_number` varchar(64) NOT NULL COMMENT '订单号',
`order_description` varchar(128) DEFAULT NULL COMMENT '订单日志描述',
`create_time` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`log_id`),
UNIQUE KEY `unique_order_number` (`order_number`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='订单日志记录表';

支付日志表:

CREATE TABLE `pay_logs` (
`log_id` bigint(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键,自动增加ID',
`user_id` bigint(20) DEFAULT NULL COMMENT '付款的用户ID',
`order_id` bigint(10) NOT NULL COMMENT '订单ID,对应order_info中的Id',
`order_number` varchar(64) NOT NULL COMMENT '订单号',
`order_amount` decimal(12,2) NOT NULL COMMENT '订单金额',
`outer_trade_no` varchar(64) DEFAULT NULL COMMENT '外部订单号,比如说支付宝交易订单号',
`status` tinyint(4) DEFAULT NULL COMMENT '支付状态,1为支付成功,-1为支付失败',
`create_time` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`log_id`),
UNIQUE KEY `unique_order_number` (`order_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='付款日志记录表';

用户取消订单记录表:

CREATE TABLE `order_cancel_logs` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自动增加ID',
`user_id` bigint(20) DEFAULT NULL COMMENT '所属买家',
`order_sn` bigint(64) DEFAULT NULL COMMENT '订单标识,如果是单个就是item_id,如果是整个订单就是orderId',
`trade_money` decimal(12,2) DEFAULT NULL COMMENT '处理的金额',
`current_money` decimal(12,2) DEFAULT NULL COMMENT '当前余额',
`last_money` double(12,2) DEFAULT NULL COMMENT '最终余额',
`remark` varchar(64) DEFAULT NULL COMMENT '备注',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户取消订单记录表';

生鲜大师 联系QQ:137071249 QQ群:793305035