原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
原文链接地址:『互联网架构』软件架构-解密电商系统-订单交易业务(74)
很多人都在淘宝购买过东西,基本得流程都是一致的。
(一)订单
- 购物车
例如:jd分为自营和多家店铺的,它的购物车比较复杂些。
购物车如果保存在session中的话,用户量比较大的情况下,tomcat承受不住。比较合理的方式是保存在redis中,来一起说下redis保存的数据格式。
针对购物车结构
- CartGroup(一个店铺一个CartGroup)
- CartPkg(一个订单就是一个包裹)
- 一个订单里面就是一个List<Product>
购物车分两种,登录前购物车和登录后购物车
- 登录前是通过redis内部保存的,key=ip_类型(pc,ios,android)
- 登录后是通过用户的userid,key=userId
- 登录前到登录后他们两者通过redis进行对比,获取最新的合并结果。
- 下单
买个索尼电视,佳能的相机,这是2个店铺,配送方式不同,仓库也不一样,每个商家的优惠力度也不一样,有打五折的,有打七折的。例如:苹果打5折,我买10个,地址是在郑州,配送方式是从武汉,武汉仓库只有9个苹果,但是河北那边有2个,长沙有3个。按照订单理论如果武汉有11个,买10个刚刚够你买。但是现在武汉只有9个,所以直接就给你发了武汉的9个,河北的1个,够你的10个,这个就是就近原则。但是这样有个问题退单怎么办,整体退单要退一起退,反之不要退。 设计到订单的拆分合并。
订单号生成?订单防重。只要保证分布式下不重复就可以
- redis incr 自增
- 时间戳+自增变量
- UUID
- 电商订单的流程梳理
t_order 订单表
字段名 | 数据类型 | 是否主键 | 描述 |
---|---|---|---|
id | int | 是 | 订单编号。 |
account | String | 账号 | |
payType | varchar | 付款方式 | |
carry | varchar | 运送方式 | |
rebate | DECIMAL(9,2) | 折扣 | |
createdate | datetime | 创建日期 | |
remark | varchar | 备注、支付宝的WIDsubject | |
status | String | init:未审核;pass:已审核;send:已发货;sign:已签收;cancel:已取消;file:已归档;finish:交易完成; | |
refundStatus | String | 退款状态(直接借用了支付宝的退款状态)。WAIT_SELLER_AGREE:等待卖家同意退款;WAIT_BUYER_RETURN_GOODS:卖家同意退款,等待买家退货;WAIT_SELLER_CONFIRM_GOODS:买家已退货,等待卖家收到退货;REFUND_SUCCESS:卖家收到退货,退款成功,交易关闭 | |
paystatus | String | n:未支付;p:部分支付;y:全部支付 | |
lowStocks | String | n:库存不足;y:库存充足。默认n | |
amount | Double | 订单总金额 | |
amountExchangeScore | Int | 订单总兑换积分 | |
fee | Double | 运费总金额 | |
ptotal | Double | 商品总金额 | |
quantity | Int | 商品总数量 | |
updateAmount | String | n:没有修改过;y:修改过;默认:n | |
expressCode | String | 配送方式编码 | |
expressName | String | 配送方式名称 | |
expressNo | String | 快递运单号 | |
expressCompanyName | String | 快递公司名称 | |
confirmSendProductRemark | String | 确认发货备注 | |
otherRequirement | String | 客户的附加要求 | |
closedComment | String | 此订单的所有订单项对应的商品都进行了评论,则此值为y,表示此订单的评论功能已经关闭,默认为null,在订单状态为已发货后,则用户可以对订单进行评价。 | |
score | Int | 订单获赠的积分 |
t_orderdetail订单明细表
字段名 | 数据类型 | 是否主键 | 描述 |
---|---|---|---|
ID | int | 是 | ID号 |
orderID | int | 与t_order表的id字段关联 | |
orderdetailID | String | 订单项ID | |
productID | int | 商品ID | |
giftID | String | 商品赠品ID | |
productName | String | 商品名称 | |
price | money | 价格 | |
number | int | 数量 | |
total0 | Double | 总金额(数量*价格) | |
fee | Double | 配送费 | |
isComment | String | 是否评价过。n:未评价,y:已评价;默认n | |
lowStocks | String | n:库存不足;y:库存充足。默认n | |
s | String | 商品规格信息 |
t_orderpay 支付记录表
字段名 | 数据类型 | 是否主键 | 描述 |
---|---|---|---|
id | int | 是 | 自增 |
orderid | String | 订单ID | |
paystatus | String | 支付状态。y:支付成功,n:支付失败 | |
payamount | Double | 支付金额 | |
createtime | String | 支付时间 | |
paymethod | String | 支付方式 | |
confirmdate | String | 确认日期 | |
confirmuser | String | 确认人 | |
remark | String | 备注 | |
tradeNo | String | 支付宝交易号,以后用来发货 |
t_ordership 订单配送表
字段名 | 数据类型 | 是否主键 | 描述 |
---|---|---|---|
id | int | 是 | 自增 |
orderid | String | 订单ID | |
shipname | String | 收货人姓名 | |
shipaddress | String | 收货人详细地址 | |
provinceCode | String | 省份代码 | |
province | String | 省份 | |
cityCode | String | 城市代码 | |
city | String | 城市 | |
areaCode | String | 区域代码 | |
area | String | 区域 | |
phone | String | 手机 | |
tel | String | 座机 | |
zip | String | 邮编 | |
sex | String | 性别 | |
remark | String | 备注 |
t_orderlog订单日志表
字段名 | 数据类型 | 是否主键 | 描述 |
---|---|---|---|
id | int | 是 | 自增 |
orderid | String | 订单ID | |
account | String | 操作人 | |
createdate | date | 记录时间,默认是当前时间 | |
content | String | 日志内容 | |
accountType | String | w:会员;m:后台管理人员;p:第三方支付系统异步通知 |
t_express快递配送表
字段名 | 描述 | 类型 | 数据类型 |
---|---|---|---|
id | 自增长 | int | 唯一 |
code | 快递编码 | String | 三个值可选:EXPRESS(快递)、POST(平邮)、EMS(EMS) |
name | 快递名称 | String | |
fee | 物流费用 | Double | |
order1 | 排序 | Int |
- MQ实现最大特点:异步和解耦。(付款,订单状态,发布状态)
显示状态 | 订单状态 | 支付状态 | 发货状态 |
---|---|---|---|
已付款 | 活动订单 | 已支付 | 未发货 |
已发货 | 活动订单 | 已支付 | 已发货 |
待自提 | 活动订单 | 已支付 | 自提点签收 |
已签收 | 活动订单 | 已支付 | 用户签收 |
已拒收 | 活动订单 | 已支付 | 用户拒收 |
配送成功 | 活动订单 | 已支付 | 配送成功 |
配送失败 | 活动订单 | 已支付 | 配送失败 |
交易成功 | 已完成 | 已支付 | 配送成功 |
交易失败 | 已完成 | 已支付 | 配送失败 |
取消中 | 取消中 | 已支付 | 未发货 |
已取消 | 订单取消 | 未发货 |
(二)统一配置文件神器-Disconf
百度disconf是一套完整的基于zookeeper的分布式配置统一解决方案。
一个分布式环境中,同类型的服务往往会部署很多实例。这些实例使用了一些配置,为了更好地维护这些配置就产生了配置管理服务。通过这个服务可以轻松地管理成千上百个服务实例的配置问题.
- 官网介绍
https://github.com/knightliao/disconf
虽然3年没维护了,但是依然很给力
- 文档
-
介绍
-
disconf的模块架构图
- 快速开始
这里直说pom里面的配置,具体看disconf文档写的更清楚
<dependency>
<groupId>com.baidu.disconf</groupId>
<artifactId>disconf-client</artifactId>
<version>2.6.36</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.6</version>
</dependency>
PS:订单交易的流程和在web开发中如果多项目通过统一配置文件来进行处理。
网友评论