小熊家务帮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

相关文章

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

Python sys模块的使用及说明

《Pythonsys模块的使用及说明》Pythonsys模块是核心工具,用于解释器交互与运行时控制,涵盖命令行参数处理、路径修改、强制退出、I/O重定向、系统信息获取等功能,适用于脚本开发与调试,需... 目录python sys 模块详解常用功能与代码示例获取命令行参数修改模块搜索路径强制退出程序标准输入

Python pickle模块的使用指南

《Pythonpickle模块的使用指南》Pythonpickle模块用于对象序列化与反序列化,支持dump/load方法及自定义类,需注意安全风险,建议在受控环境中使用,适用于模型持久化、缓存及跨... 目录python pickle 模块详解基本序列化与反序列化直接序列化为字节流自定义对象的序列化安全注

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

C#实现高性能拍照与水印添加功能完整方案

《C#实现高性能拍照与水印添加功能完整方案》在工业检测、质量追溯等应用场景中,经常需要对产品进行拍照并添加相关信息水印,本文将详细介绍如何使用C#实现一个高性能的拍照和水印添加功能,包含完整的代码实现... 目录1. 概述2. 功能架构设计3. 核心代码实现python3.1 主拍照方法3.2 安全HBIT

python pymodbus模块的具体使用

《pythonpymodbus模块的具体使用》pymodbus是一个Python实现的Modbus协议库,支持TCP和RTU通信模式,支持读写线圈、离散输入、保持寄存器等数据类型,具有一定的参考价值... 目录一、详解1、 基础概念2、核心功能3、安装与设置4、使用示例5、 高级特性6、注意事项二、代码示例

录音功能在哪里? 电脑手机等设备打开录音功能的技巧

《录音功能在哪里?电脑手机等设备打开录音功能的技巧》很多时候我们需要使用录音功能,电脑和手机这些常用设备怎么使用录音功能呢?下面我们就来看看详细的教程... 我们在会议讨论、采访记录、课堂学习、灵感创作、法律取证、重要对话时,都可能有录音需求,便于留存关键信息。下面分享一下如何在电脑端和手机端上找到录音功能

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法