项目介绍

订单模块

1.工程结构

订单父工程

整个订单分为订单基础模块、订单管理模块、抢单模块、历史订单模块、派单模块。

订单基础模块包括实体类,基础Mapper,状态机,分库分表等操作。

订单管理模块包括订单的创建,取消,支付,订单的查询等。

抢单模块是由服务人员或者服务机构在用户进行完支付后进行抢单。

历史订单模块是用户或者服务人员完成订单后还可以查询以往的订单,专门用来管理历史订单。

派单模块就是运营平台主动分配订单给服务人员。

2.订单管理模块

运用状态机模式

1.表设计

业务:家政类型服务项目

​	因为单个服务人员掌握的技能是有限的,所以我们在设计下单功能时,是直接选择服务下单,因为专人负责专事,所以我们订单表设计成一个表,如修空调的不搞卫生。

表字段:常用的字段

​	基本信息:订单ID,订单数量,订单类型,订单状态,单价,总价,下单人信息,支付状态,开始时间。

​	服务信息:服务ID,服务类型名称,服务项ID,服务项名称。

​	交易信息:支付服务交易单号,三方支付类型,三方支付号,退单交易单号,三方退款交易单号。

3.下单

1.核心业务

	用户可在小程序端选择需要的服务及数量,如果有优惠券可以使用,然后点击提交订单。

服务端就会完成整个创建订单的过程。

​	1.通过OpenFeign远程调用获取下单用户的基本信息和服务信息。

​	2.填充订单数据。

​	3.判断是否使用了优惠券,是就要计算优惠金额和实付金额。

​	4.创建订单,假如选择优惠券同时需要远程核销优惠券

​	5.返回订单ID。

2.优化订单

1.远程调用:采用了服务保护策略,避免服务雪崩。通过@sentinelResource注解实现了客户端的服务保护,可以使用对应的属性去指定降级和熔断的方法,如果远程调用不可用,直接返回对应的信息,再通过业务判断,抛出异常,保护订单服务。

2.订单ID:采用的是【订单类型+yyMMdd+1位Redis的自增ID】来生成订单ID。

3.订单字段:订单表设计一个sort_by字段【服务开始时间+订单号后六位】方便后期查询时使用。

4.防止订单重复提交【接口防抖】:使用【自定义注解+AOP+分布式锁】实现防止订单重复提交的功能。锁:前缀;用户ID:服务项ID:服务开始时间,锁过期时间10S。

5.分布式事务:使用优惠券,需要选择调用优惠券核销接口,会有分布式事务问题。使用seata保证分布式事务的处理。

6.事务方法效率提升:为创建订单的代码单独抽取一方法,避免远程调用带来的性能开销,提高效率。同时把其他抽到另一个事务类作为单独方法实现调用,避免事务同一个业务类的事务方法调用; 另一个事务方法导致事务失效的问题。

4.订单状态管理

1.订单状态及流转

订单状态7种

​ 用户刚下单【待支付】

​ 用户支付完成【派单中】

​ 服务人员或者服务机构抢单或接单成功【服务人员:待服务,机构:待分配】

​ 服务人员上门服务【服务中】

​ 服务人员服务完成【已完成】

​ 用户下单完成并取消【待支付---> 已取消】

​ 用户支付完成,服务人员还没有上门服务,用户取消订单【派单中---> 已取消】

​ 其他状态下,用户无法取消订单,服务人员或者机构平台可以再相应的情况下取消订单【其他状态---> 已关闭】

​ 未支付取消订单,直接修改订单状态就行,支付完成后取消订单,修改订单状态后,还需要完成退款操作。

状态机

posted @ 2025-04-17 08:43  你的那个谁  阅读(55)  评论(0)    收藏  举报