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

聊城网站建设工作室安装网站到服务器

聊城网站建设工作室,安装网站到服务器,印刷网站源码,模板网站如何建站文章目录 订单创建流程1. 商品查询与订单数据初始化2. 总价计算与订单保存3. 扣减库存与购物车清理4. 延迟消息与支付状态检测 订单延迟消息监听器支付成功与订单取消1. 订单支付成功2. 订单取消与库存恢复 总结 在现代电商系统中#xff0c;订单处理是一个复杂且关键的环节。… 文章目录 订单创建流程1. 商品查询与订单数据初始化2. 总价计算与订单保存3. 扣减库存与购物车清理4. 延迟消息与支付状态检测 订单延迟消息监听器支付成功与订单取消1. 订单支付成功2. 订单取消与库存恢复 总结 在现代电商系统中订单处理是一个复杂且关键的环节。从商品查询到库存扣减、订单生成、支付确认等多个步骤任何一个环节出现问题都可能导致用户体验下降甚至订单失败。今天我们将通过一个典型的 Java Spring Boot 订单处理流程结合 RabbitMQ 延迟消息 和全局事务管理确保每一步都能顺利执行。 订单创建流程 在这个系统中我们主要关注的功能是 createOrder 方法它实现了从订单创建到支付确认的全过程。让我们一起来看看代码背后都发生了什么。 Override GlobalTransactional public Long createOrder(OrderFormDTO orderFormDTO) {// 1.订单数据Order order new Order();// 1.1.查询商品ListOrderDetailDTO detailDTOS orderFormDTO.getDetails();// 1.2.获取商品id和数量的MapMapLong, Integer itemNumMap detailDTOS.stream().collect(Collectors.toMap(OrderDetailDTO::getItemId, OrderDetailDTO::getNum));SetLong itemIds itemNumMap.keySet();// 1.3.查询商品ListItemDTO items itemClient.queryItemByIds(itemIds);if (items null || items.size() itemIds.size()) {throw new BadRequestException(商品不存在);}// 1.4.基于商品价格、购买数量计算商品总价totalFeeint total 0;for (ItemDTO item : items) {total item.getPrice() * itemNumMap.get(item.getId());}order.setTotalFee(total);// 1.5.其它属性order.setPaymentType(orderFormDTO.getPaymentType());order.setUserId(UserContext.getUser());order.setStatus(1);// 1.6.将Order写入数据库order表中save(order);// 2.保存订单详情ListOrderDetail details buildDetails(order.getId(), items, itemNumMap);detailService.saveBatch(details);// 3.扣减库存try {itemClient.deductStock(detailDTOS);} catch (Exception e) {throw new RuntimeException(库存不足);}// 4.清理购物车商品cartClient.deleteCartItemByIds(itemIds);// 5.发送延迟消息检测订单支付状态rabbitTemplate.convertAndSend(MQConstants.DELAY_EXCHANGE_NAME, MQConstants.DELAY_ORDER_KEY, order.getId(),message - {message.getMessageProperties().setDelay(15 * 60 * 1000); // 15分钟延迟return message;});return order.getId(); }1. 商品查询与订单数据初始化 首先我们从用户提交的订单数据中提取商品 ID 和数量并通过 itemClient.queryItemByIds 方法批量查询商品信息。如果查询结果中商品数量与请求的商品数量不符则抛出异常提示“商品不存在”。 2. 总价计算与订单保存 接下来系统根据商品单价与购买数量计算总价并将相关信息写入数据库。在这一过程中我们利用 Java 的流处理特性对商品列表进行遍历与总价计算。 3. 扣减库存与购物车清理 订单数据保存成功后系统会尝试扣减相应库存并清理用户购物车中的相关商品。如果库存不足系统会抛出异常并回滚整个事务。 4. 延迟消息与支付状态检测 最后系统通过 RabbitMQ 发送一个延迟消息以便在未来某个时间点检查订单支付状态。这一步保证了即便用户在支付过程中遇到问题系统也能够及时响应并处理未支付的订单。这里我们将延迟消息的时间设置为 15 分钟。 订单延迟消息监听器 接下来我们来看看如何利用消息队列处理订单支付状态的异步检测。 Component RequiredArgsConstructor public class OrderDelayMessageListener {private final IOrderService orderService;private final PayClient payClient;RabbitListener(bindings QueueBinding(value Queue(MQConstants.DELAY_ORDER_QUEUE_NAME),exchange Exchange(name MQConstants.DELAY_EXCHANGE_NAME,delayed true), key MQConstants.DELAY_ORDER_KEY))public void listenOrderDelayMessage(Long orderId) {// 1.查询订单Order order orderService.getById(orderId);// 2.判断订单状态是否已支付if (order null || order.getStatus() ! 1) {// 不做处理return;}// 3.未支付需要查询支付流水状态PayOrderDTO payOrder payClient.queryPayOrderByBizOrderNo(orderId);// 4.判断是否支付if (payOrder ! null payOrder.getStatus() 3) {// 4.1.已经支付标记订单状态为已支付orderService.markOrderPaySuccess(orderId);} else {// 4.2.未支付取消订单回复库存orderService.cancelOrder(orderId);}} }在上述代码中我们利用了 RabbitMQ 的延迟队列特性。当订单延迟消息被监听器捕获后系统会根据订单当前状态和支付流水状态决定接下来的处理步骤。如果支付成功订单状态将被更新为已支付否则订单将被取消并恢复相应库存。 支付成功与订单取消 Override public void markOrderPaySuccess(Long orderId) {Order order new Order();order.setId(orderId);order.setStatus(2);order.setPayTime(LocalDateTime.now());updateById(order); }Override GlobalTransactional public void cancelOrder(Long orderId) {// 标记订单为已关闭Order order getById(orderId);if (order ! null order.getStatus() ! 5) {order.setStatus(5);updateById(order);}// 恢复库存ListOrderDetail details detailService.lambdaQuery().eq(OrderDetail::getOrderId, orderId).list();ListOrderDetailDTO orderDetailDTOS BeanUtils.copyList(details, OrderDetailDTO.class);itemClient.restoreStock(orderDetailDTOS); }1. 订单支付成功 在 markOrderPaySuccess 方法中系统将订单状态更新为已支付并记录支付时间。这一操作确保用户和系统对订单状态有准确的认知。 2. 订单取消与库存恢复 如果订单在延迟消息检测中被认定为未支付则调用 cancelOrder 方法取消订单并通过 itemClient.restoreStock 恢复相应库存。由于这些操作可能涉及多个服务因此通过 GlobalTransactional 注解确保其在全局事务中执行。 总结 在本篇博客中我们深入探讨了一个完整的订单处理流程。从商品查询到库存管理再到支付状态检测每一步都经过精心设计与实现。通过 Spring Boot 的全局事务管理和 RabbitMQ 延迟消息我们确保了整个流程的原子性和可靠性。
http://www.sczhlp.com/news/270955/

相关文章:

  • 自适应响应式网站源码apache网站部署
  • 福州网站制作费用企业网页策划案
  • 怎样做网站收广告费lnmp利用wordpress
  • 房产中介网站网站的总规划书
  • 衣联网和一起做网站。哪家强网站建设界面ppt演示
  • seo网站排名优化教程镇雄县城乡建设局网站
  • 长沙响应式网站建设羽毛球赛事2022
  • 网站备案号密码找回网页制作流程图片
  • 服装公司网站模板公司做网络推广怎么做
  • 国外网站注册网站建设哪家好 万维科技
  • 做网站 过程个人建设网站盈利需要什么材料
  • 石家庄网站建设外包公司wordpress计费搜索
  • ftp 网站管理深汕特别合作区房价最新消息
  • 简要描述网站建设的基本步骤网站开发分几种类型
  • 织梦小说网站模板下载地址原阳网站建设
  • 1.2.3.4.5.6.7.8.9.10.
  • linux分区扩容
  • 潍坊淘宝网站建设深圳seo网站推广公司
  • 外贸公司的网站网站建设成本计划
  • 中国商检局做备案网站有哪些做废品的网站
  • 网站开发公司多少钱在哪里可以兼职
  • 网站建设 定制商城 小程序开发wordpress优化seo
  • 建设银行网站显示404鼎湖网站建设
  • 做海报素材网站推荐申请完域名怎么做网站
  • 电子商务网站 功能微信公众号编辑 导入wordpress
  • 电子商务网站建设 教材网站的流量有什么用
  • 邮箱发网站建设主题怎么写一般小程序开发多少钱
  • 莱芜网站网站建设深圳网站制作建站
  • 怎么看别人的网站有没有做301营销策划网站
  • 做网站用什么程序比较好网站建设公司哪个好呀金融网站建设