当前位置: 首页 > news >正文

订单服务:订单流程

订单流程

订单流程是指从订单产生到完成整个流转的过程,从而行程了一套标准流程规则。而不同的产品类型或业务类型在系统中的流程会千差万别,比如上面提到的线上实物订单和虚拟订单的流程,线上实物订单与 O2O 订单等,所以需要根据不同的类型进行构建订单流程。不管类型如何订单都包括正向流程和逆向流程,对应的场景就是购买商品和退换货流程,正向流程就是一个正常的网购步骤:

订单生成–>支付订单–>卖家发货–>确认收货–>交易成功。而每个步骤的背后,订单是如何在多系统之间交互流转的,可概括如下图

1、订单创建与支付

(1) 、订单创建前需要预览订单,选择收货信息等

(2) 、订单创建需要锁定库存,库存有才可创建,否则不能创建

(3) 、订单创建后超时未支付需要解锁库存

(4) 、支付成功后,需要进行拆单,根据商品打包方式,所在仓库,物流等进行拆单

(5) 、支付的每笔流水都需要记录,以待查账

(6) 、订单创建,支付成功等状态都需要给 MQ 发送消息,方便其他系统感知订阅

2、逆向流程

(1) 、修改订单,用户没有提交订单,可以对订单一些信息进行修改,比如配送信息, 优惠信息,及其他一些订单可修改范围的内容,此时只需对数据进行变更即可。

(2) 、订单取消,用户主动取消订单和用户超时未支付,两种情况下订单都会取消订

单,而超时情况是系统自动关闭订单,所以在订单支付的响应机制上面要做支付的限时处理,尤其是在前面说的下单减库存的情形下面,可以保证快速的释放库存。 另外需要需要处理的是促销优惠中使用的优惠券,权益等视平台规则,进行相应补 回给用户。

(3) 、退款,在待发货订单状态下取消订单时,分为缺货退款和用户申请退款。如果是 全部退款则订单更新为关闭状态,若只是做部分退款则订单仍需进行进行,同时生 成一条退款的售后订单,走退款流程。退款金额需原路返回用户的账户。

(4) 、发货后的退款,发生在仓储货物配送,在配送过程中商品遗失,用户拒收,用户收货后对商品不满意,这样情况下用户发起退款的售后诉求后,需要商户进行退款的审核,双方达成一致后,系统更新退款状态,对订单进行退款操作,金额原路返回用户的账户,同时关闭原订单数据。仅退款情况下暂不考虑仓库系统变化。如果发生双方协调不一致情况下,可以申请平台客服介入。在退款订单商户不处理的情况下,系统需要做限期判断,比如 5 天商户不处理,退款单自动变更同意退款。

OrderWebConfiguration

@Configuration
public class OrderWebConfiguration implements WebMvcConfigurer {@AutowiredLoginUserInterceptor loginUserInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginUserInterceptor).addPathPatterns("/***");}
}

GuliFeignConfig

public class GuliFeignConfig {@Beanpublic RequestInterceptor requestInterceptor(){return  new RequestInterceptor() {@Overridepublic void apply(RequestTemplate template) {ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();//同步请求头数据String cookie = request.getHeader("Cookie");template.header("Cookie",cookie);System.out.println("feign运程之前先进行构造");}};}
}

LoginUserInterceptor

 

@Component
public class LoginUserInterceptor implements HandlerInterceptor {public static  ThreadLocal<MemberResponseVo> loginUser=new ThreadLocal<>();@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {MemberResponseVo attribute = (MemberResponseVo) request.getSession().getAttribute(AuthServerConstant.LOGIN_USER);if(attribute!=null){loginUser.set(attribute);return  true;}else{request.getSession().setAttribute("msg","请先进行登录");response.sendRedirect("http://auth.gulimall.com/login.html");return false;}}
}

OrderConfirmVo

public class OrderConfirmVo {@Setter @GetterList<MemberAddressVo> address;@Setter @GetterList<OrderItemVo> items;@Setter @GetterInteger integration;public Integer getCount(){Integer i=0;if(items!=null){for (OrderItemVo item : items) {i+=item.getCount();}}return i;}//防重令牌@Setter @GetterString orderToken;@Setter @GetterMap<Long,Boolean> stocks;BigDecimal total;public BigDecimal getTotal() {BigDecimal sum = new BigDecimal("0");if(items!=null){for (OrderItemVo item : items) {BigDecimal multiply = item.getPrice().multiply(new BigDecimal(item.getCount().toString()));sum= sum.add(multiply) ;}}total=sum;return sum;}BigDecimal payPrice;public BigDecimal getPayPrice() {payPrice= getTotal();return getTotal();}
}

 

confirmOrder()

    @Overridepublic OrderConfirmVo confirmOrder() {RequestAttributes attributes = RequestContextHolder.getRequestAttributes();OrderConfirmVo confirmVo = new OrderConfirmVo();MemberResponseVo memberResponseVo = LoginUserInterceptor.loginUser.get();CompletableFuture<Void> getAddressFuture = CompletableFuture.runAsync(() -> {//1.运程查询所有的收货地址RequestContextHolder.setRequestAttributes(attributes);List<MemberAddressVo> address = memberFeignService.getAddress(memberResponseVo.getId());confirmVo.setAddress(address);}, executor);CompletableFuture<Void> cartFuture = CompletableFuture.runAsync(() -> {//2.运程查询购物车所有选中的购物项RequestContextHolder.setRequestAttributes(attributes);List<OrderItemVo> items = cartFeignService.getCurrentUserCartItems();confirmVo.setItems(items);}, executor).thenRunAsync(()->{List<OrderItemVo> items = confirmVo.getItems();List<Long> collect = items.stream().map(item -> item.getSkuId()).collect(Collectors.toList());R hashStock = wmsFeignService.getSkuHashStock(collect);List<SkuStockVo> data = hashStock.getData(new TypeReference<List<SkuStockVo>>() {});if(data!=null){Map<Long, Boolean> map = data.stream().collect(Collectors.toMap(SkuStockVo::getSkuId, SkuStockVo::getHasStock));confirmVo.setStocks(map);}},executor);//3.查询用户积分Integer integration = memberResponseVo.getIntegration();confirmVo.setIntegration(integration);//其他数据自动调用//todo 防重令牌try {CompletableFuture.allOf(cartFuture,getAddressFuture).get();} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}return confirmVo;}

 

 

相关文章:

订单服务:订单流程

订单流程 订单流程是指从订单产生到完成整个流转的过程&#xff0c;从而行程了一套标准流程规则。而不同的产品类型或业务类型在系统中的流程会千差万别&#xff0c;比如上面提到的线上实物订单和虚拟订单的流程&#xff0c;线上实物订单与 O2O 订单等&#xff0c;所以需要根据…...

Python的有用知识,一共十三个代码片段,确定不来看看吗

前言 之前发过22个小技巧&#xff0c;今天就来分享分享13个非常有用的代码片段 赶紧码住&#xff0c;看看你都了解吗 1.将两个列表合并成一个字典 假设我们在 Python 中有两个列表&#xff0c;我们希望将它们合并为字典形式&#xff0c;其中一个列表的项作为字典的键&#…...

数据结构与算法-数组

前言&#xff1a;几乎所有的编程语言都原生支持数组类型。因为数组是最简单的内存数据结构。创建一个数组&#xff1a;let arr new Array()或let arr new Array(5) // 指定长度或let arr new Array(1,2,3,4,5) // 将数组元素作为参数传给构造函数或let arr [1,2,3,4,5] // …...

PMP证书在哪个行业比较有用?

PMP 各个行业都能用&#xff0c;PMP 的知识体系是通用的&#xff0c;管理层的考试也有借鉴PMP知识的地方。历年考生考的最多的是IT 行业&#xff0c;其他行业也都有分布。PMP认证从国外引进大陆这么多年了&#xff0c;其火热程度依然不减&#xff0c;我个人认为是取决于市场的运…...

Wine零知识学习4 —— Wine编译进阶详解

本系列第3篇文章Wine零知识学习3 —— Winetricks介绍及下载和运行讲述了Wentricks的下载及使用。在Winetricks的使用过程中会发现很多应用下载会出现问题&#xff0c;会提示32位程序无法运行在64位系统上。为什么会出现这个问题&#xff1f;又如何解决此问题&#xff1f;这就是…...

win10-右键打开windows terminal

文章目录windows terminal设置右键打开打开注册表添加一个右键选项新建一个项添加右键的名称和图标右键选项执行的命令测试windows terminal windows 新一代命命令行 设置右键打开 打开注册表 WinR 输入&#xff1a; regedit 定位&#xff1a; 计算机\HKEY_CLASSES_ROOT\Di…...

关于使用CMT2300A FIFO缓存区间设置为64Byte的问题

首先请看&#xff0c;CMT2300A 是什么产品&#xff0c;或者说是 模组吗&#xff1f; 请看介绍&#xff1a; https://blog.csdn.net/sishuihuahua/article/details/105095994 以及RFPDK 的使用: 这博客&#xff0c;记录了 RFPDK 的使用,以及遇到的一些问题 我说一下&#…...

网页概念、常用浏览器及内核、Web标准

网页、常用浏览器及内核、Web标准一、网页1.1、什么是网页&#xff1f;1.2、什么是HTML?&#xff08;重点&#xff09;1.3、网页的形成&#xff1f;二、常用浏览器三、浏览器内核四、Web标准&#xff08;重点&#xff09;4.1 为什么需要Web标准&#xff1f;4.2 Web标准的构成一…...

【刷题笔记】--搜索二维矩阵 II

题目&#xff1a; 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16…...

uni-app实战教程

一、准备 下载HBuilderX编辑器&#xff0c;前往下载注册百度AI账号&#xff0c;创建应用获得Appid和Secret 前往注册百度AI通用物体识别文档 前往查阅Uni-App文档 前往查阅HTML5 文档 前往查阅HTML5文档 前往查阅 二、介绍 开发工具&#xff1a;HBuilderX跨段框架&#xff0…...

SpringCloud: sentinel降级配置、热点参数、系统规则 配置到nacos

一、application.yml spring.cloud.sentinel cloud:nacos:discovery:# 服务注册地址server-addr: xxx.xxx.xxx.xxx:8848sentinel:eager: truetransport:# 控制台地址dashboard: localhost:9999# nacos配置持久化datasource:ds2:nacos:server-addr: xxx.xxx.xxx.xxx:8848dataId…...

交换机之配置netsflow

网络监测技术Sflow——提供完整的第二层到第四层信息&#xff0c;可以适应超大网络流量环境下的流量分析&#xff0c;让用户详细、实时地分析网络传输流的性能、趋势和存在的问题。 &#xff08;1&#xff09;特性&#xff1a; 支持在千兆戒更高速的网络上精确地监控网络流量…...

非科班出身学习软件测试可以么

IT行业里对小白最友好的非软件测试莫属了&#xff0c;但是也要看你个人在学习软件测试这件事上面花费了多少的时间和努力了~ 每年毕业季&#xff0c;IT行业依然是比较热门且收入是最高的行业。对于应届毕业生来说想要进入IT行业&#xff0c;除了前后端开发&#xff0c;软件测试…...

面试已上岸,成功拿到阿里和腾讯的入职offer,Java程序员面经全在这了,希望能帮到你!

前言 一开始的时候简历海投大多数都被拒绝了&#xff0c;后来自己找在腾讯上班的朋友帮忙改了一下简历&#xff0c;果然不一样了大多都能拿到面试机会&#xff0c;当然拿到后也没有那么顺利&#xff0c;面了差不多有十几家公司的样子&#xff0c;大大小小的都有&#xff0c;其中…...

Redisson分布式锁

目录一&#xff0c;场景说明二&#xff0c;Redisson分布式锁1&#xff0c;引入依赖2&#xff0c;生成RedissonClient对象3&#xff0c;测试三&#xff0c;说明一&#xff0c;场景说明 为什么需要分布式锁呢&#xff1f; 如果是单机服务&#xff0c;即只有一台服务器&#xff…...

LOF(Local Outlier Factor)原理

文章目录1定义2 k近邻距离&#xff08;k-distance of an object p&#xff09;3 k近邻4 可达距离5 局部可达密度6 lof参考&#xff1a;1定义 LOF&#xff08;Local Outlier Factor&#xff09;是一种描述异常值的方法。 2 k近邻距离&#xff08;k-distance of an object p&am…...

[ vulhub漏洞复现篇 ] Drupal<7.32 Drupalgeddon SQL注入漏洞(CVE-2014-3704)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…...

Part 4 描述性统计分析(占比 10%)——下

文章目录【后续会持续更新CDA Level I&II备考相关内容&#xff0c;敬请期待】【考试大纲】【考试内容】【备考资料】【扩展知识】4、相关分析4.1、相关分析的描述——散点图4.2、相关分析的类型4.3、相关分析的度量4.3.1、协方差4.3.2、相关系数【后续会持续更新CDA Level …...

【一般人不会告诉你】比肩chatgtp的5款AI网站

话不多说&#xff0c;直接上连接 1. Dall-E: https://labs.openai.com/ 2. Codeformer: https://shangchenzhou.com/projects/Co... 3. Playground AI: https://playgroundai.com/ 4. Clip Drop: https://clipdrop.co/relight 5. Astria: https://www.strmr.com/examples …...

LA@相似方阵和对角化

文章目录相似方阵相似矩阵和特征值小结方阵相似对角化结论推论对角化方法归纳例方阵高次幂相似方阵 对角阵是矩阵中最简单的一类矩阵 对角阵相关的乘法运算是很高效的相似方阵是和对角阵相关的概念 设A和B是n阶方阵,如果存在n阶可逆方阵P,使得P−1APBP^{-1}APBP−1APB,则称方阵…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...