小熊家务帮day19-day21 订单模块2(取消订单,退款功能等)

2024-06-11 10:36

本文主要是介绍小熊家务帮day19-day21 订单模块2(取消订单,退款功能等),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1 订单退款功能
  • 1.1 需求分析
    • 1.2 接口分析
    • 1.3 退款流程分析
    • 1.4 表结构设计
    • 1.5 取消未支付订单实现
      • 1.5.1 接口开发
        • Controller层开发
        • Service层开发
      • 1.5.2 接口测试
    • 1.5 取消已支付订单实现

1 订单退款功能

1.1 需求分析

用户下单成功可以取消订单,在订单的不同状态下去取消订单其执行的逻辑是不同的:

  • 待支付状态下取消订单: 更改订单的状态为已取消。
    -订单已支付,状态为待派单时取消订单: 更改订单的状态为已关闭,请求支付服务自动退款。

用户在订单列表点击订单信息进入订单详情页面,点击“取消订单”
在这里插入图片描述
进入取消订单界面:
在这里插入图片描述
选择取消原因,点击“提交”。

1.2 接口分析

前端传入的参数:订单id、取消原因。
响应参数:无,前端根据状态码判断是否成功。
接口名称:取消订单
接口路径:PUT /orders-manager/consumer/orders/cancel
在这里插入图片描述
在这里插入图片描述

1.3 退款流程分析

根据需求分析,当订单已支付状态为派单中时取消订单后进行自动退款,此时需要调用支付服务的申请退款接口。
流程如下:
在这里插入图片描述
取消订单执行如下操作:
1、更新订单状态
待支付状态下取消订单后更新订单状态为“已取消”
派单中状态下取消订单后更新订单状态为“已关闭”
2、保存取消订单记录,记录取消的原因等信息。
3、远程调用支付服务的退款接口申请退款。

取消派单中的订单存在如下问题:
远程调用退款接口操作不放在事务方法中,避免影响数据库性能。
如果远程调用退款接口失败了将无法退款,这个怎么处理?
以上问题采用异步退款的方式来解决:
如下图:
在这里插入图片描述

1、使用数据库事务控制,保存以下数据
更新订单状态。
保存取消订单记录表,记录取消的原因等信息。
保存退款记录表。
2、事务提交后先启动一个线程请求支付服务的退款接口(为了及时退款)
3、定时任务扫描退款记录表,对未退款的记录请求支付服务进行退款,退款成功更新订单的退款状态,并删除退款记录。
说明:
第2步的作用为了第一时间申请退款,因为定时任务会有一定的延迟。
第3步的作用是由定时任务去更新退款的状态,因为调用了退款接口只是申请退款了,退款结果可能还没有拿到,通过定时任务再次请求支付服务的退款接口,拿到退款结果。

1.4 表结构设计

订单取消记录表:

create table `jzo2o-orders`.orders_canceled
(id             bigint                             not null comment '订单id'constraint `PRIMARY`primary key,canceller_id   bigint                             null comment '取消人',canceler_name  varchar(50)                        null comment '取消人名称',canceller_type int                                null comment '取消人类型,1:普通用户,4:运营人员',cancel_reason  varchar(50)                        null comment '取消原因',cancel_time    datetime                           null comment '取消时间',create_time    datetime default CURRENT_TIMESTAMP not null comment '创建时间',update_time    datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间'
)

订单退款记录表:存储 待退款的记录

create table `jzo2o-orders`.orders_refund
(id               bigint                             not null comment '订单id'constraint `PRIMARY`primary key,trading_order_no bigint                             null comment '支付服务交易单号',real_pay_amount  decimal(10, 2)                     null comment '实付金额',create_time      datetime default CURRENT_TIMESTAMP null comment '创建时间'
)

1.5 取消未支付订单实现

根据需求,取消订单需要实现两部分功能:
针对未支付订单的取消操作:

  • 修改订单的状态为已取消。
  • 保存取消订单的记录。

1.5.1 接口开发

Controller层开发
@RestController("operationOrdersController")
@Api(tags = "运营端-订单相关接口")
@RequestMapping("/operation/orders")
public class OperationOrdersController {@Autowiredprivate IOrdersManagerService ordersManagerService;@PutMapping("/cancel")@ApiOperation("取消订单")public void cancel(@RequestBody OrderCancelReqDTO orderCancelReqDTO) {//填充数据OrderCancelDTO orderCancelDTO = BeanUtil.toBean(orderCancelReqDTO, OrderCancelDTO.class);CurrentUserInfo currentUserInfo = UserContext.currentUser();orderCancelDTO.setCurrentUserId(currentUserInfo.getId());orderCancelDTO.setCurrentUserName(currentUserInfo.getName());orderCancelDTO.setCurrentUserType(currentUserInfo.getUserType());ordersManagerService.cancel(orderCancelDTO);}
}
Service层开发
    /*** 取消订单* @param orderCancelDTO 取消订单模型*/@Overridepublic void cancel(OrderCancelDTO orderCancelDTO) {//判断订单是否存在if(ObjectUtils.isNull(this.getById(orderCancelDTO.getId()))){throw new CommonException("要取消的订单不存在");}Integer ordersStatus = this.getById(orderCancelDTO.getId()).getOrdersStatus();if(ordersStatus.equals(OrderStatusEnum.NO_PAY.getStatus())){//对未支付订单进行取消owner.cancelByNoPay(orderCancelDTO);}else if(ordersStatus.equals(OrderStatusEnum.DISPATCHING.getStatus())){//对已支付(派单中)订单进行取消}else{throw new CommonException("当前订单状态不支持取消");}}/*** 未支付状态取消订单*/@Transactional(rollbackFor = Exception.class)public void cancelByNoPay(OrderCancelDTO orderCancelDTO){//添加订单取消记录OrdersCanceled ordersCanceled = BeanUtils.toBean(orderCancelDTO,OrdersCanceled.class);ordersCanceled.setCancellerId(orderCancelDTO.getCurrentUserId());ordersCanceled.setCancelerName(orderCancelDTO.getCurrentUserName());ordersCanceled.setCancellerType(orderCancelDTO.getCurrentUserType());ordersCanceled.setCancelTime(LocalDateTime.now());canceledService.save(ordersCanceled);//修改订单状态为已取消OrderUpdateStatusDTO orderUpdateStatusDTO = new OrderUpdateStatusDTO();//需要传入 id 原始状态 更新状态orderUpdateStatusDTO.setId(orderCancelDTO.getId());orderUpdateStatusDTO.setOriginStatus(OrderStatusEnum.NO_PAY.getStatus());orderUpdateStatusDTO.setTargetStatus(OrderStatusEnum.CANCELED.getStatus());Integer res = commonService.updateStatus(orderUpdateStatusDTO);if(res <= 0){throw new CommonException("取消订单失败");}}

1.5.2 接口测试

先弄个没支付的订单:
在这里插入图片描述
点击取消支付:
在这里插入图片描述
功能测试完成

1.5 取消已支付订单实现

这篇关于小熊家务帮day19-day21 订单模块2(取消订单,退款功能等)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置