Files
mp-java/docs/支付回调代码修复说明.md
赵忠林 cccc13df79 feat(shop): 实现商品销量累加和跨租户查询功能
- 添加商品销量累加功能,确保支付成功后更新销量- 实现跨租户查询用户和订单商品的功能
- 修复支付回调中的错误代码
-优化日志记录和异常处理
2025-08-23 03:43:21 +08:00

5.6 KiB
Raw Blame History

支付回调代码修复说明

🔍 问题描述

在支付回调处理代码中发现了一行红色的错误代码:

shopOrderGoodsService.addSaleCount(order.getOrderGoods());

问题原因

  1. 方法不存在ShopOrderGoodsService中没有addSaleCount方法
  2. 参数类型错误order.getOrderGoods()返回的可能是订单商品列表,不是单个商品
  3. 重复处理:销量累加逻辑已经在ShopOrderServiceImpl.updateByOutTradeNo中处理了

修复方案

删除多余代码

修复前

shopOrderService.updateByOutTradeNo(order);
// 6. TODO 累加商品销售数量
shopOrderGoodsService.addSaleCount(order.getOrderGoods());
return "SUCCESS";

修复后

// 更新订单状态并处理支付成功后的业务逻辑(包括累加商品销量)
shopOrderService.updateByOutTradeNo(order);
return "SUCCESS";

🔄 正确的销量累加流程

销量累加已经在ShopOrderServiceImpl中正确实现:

支付回调成功
    ↓
shopOrderService.updateByOutTradeNo(order)
    ↓
handlePaymentSuccess(order)
    ↓
updateGoodsSales(order)
    ↓
获取订单商品列表shopOrderGoodsService.list(orderId)
    ↓
遍历每个商品updateSingleGoodsSales(orderGoods)
    ↓
累加销量shopGoodsService.addSaleCount(goodsId, saleCount)
    ↓
数据库更新:@InterceptorIgnore 忽略租户隔离

📋 核心实现代码

1. ShopOrderServiceImpl.updateByOutTradeNo

@Override
public void updateByOutTradeNo(ShopOrder order) {
    baseMapper.updateByOutTradeNo(order);
    
    // 处理支付成功后的业务逻辑
    handlePaymentSuccess(order);
    
    if (order.getTenantId().equals(10550)) {
        shopOrderUpdate10550Service.update(order);
    }
}

2. handlePaymentSuccess

private void handlePaymentSuccess(ShopOrder order) {
    try {
        // 1. 使用优惠券
        if (order.getCouponId() != null && order.getCouponId() > 0) {
            markCouponAsUsed(order);
        }

        // 2. 累计商品销量
        updateGoodsSales(order);

        log.info("支付成功后业务逻辑处理完成 - 订单号:{}", order.getOrderNo());
    } catch (Exception e) {
        log.error("处理支付成功后业务逻辑失败 - 订单号:{}", order.getOrderNo(), e);
    }
}

3. updateGoodsSales

private void updateGoodsSales(ShopOrder order) {
    try {
        // 获取订单商品列表
        List<ShopOrderGoods> orderGoodsList = shopOrderGoodsService.list(
            new LambdaQueryWrapper<ShopOrderGoods>()
                .eq(ShopOrderGoods::getOrderId, order.getOrderId())
        );

        if (orderGoodsList == null || orderGoodsList.isEmpty()) {
            log.warn("订单商品列表为空,无法累计销量 - 订单号:{}", order.getOrderNo());
            return;
        }

        // 累计每个商品的销量
        for (ShopOrderGoods orderGoods : orderGoodsList) {
            updateSingleGoodsSales(orderGoods);
        }

        log.info("商品销量累计完成 - 订单号:{},商品数量:{}", order.getOrderNo(), orderGoodsList.size());
    } catch (Exception e) {
        log.error("累计商品销量失败 - 订单号:{}", order.getOrderNo(), e);
    }
}

4. updateSingleGoodsSales

private void updateSingleGoodsSales(ShopOrderGoods orderGoods) {
    try {
        if (orderGoods.getGoodsId() == null || orderGoods.getTotalNum() == null || orderGoods.getTotalNum() <= 0) {
            log.warn("商品销量累计参数无效 - 商品ID{},购买数量:{}", 
                orderGoods.getGoodsId(), orderGoods.getTotalNum());
            return;
        }

        // 使用新的addSaleCount方法忽略租户隔离
        boolean updated = shopGoodsService.addSaleCount(orderGoods.getGoodsId(), orderGoods.getTotalNum());
        
        if (updated) {
            log.info("商品销量累计成功 - 商品ID{},商品名称:{},购买数量:{}",
                orderGoods.getGoodsId(), orderGoods.getGoodsName(), orderGoods.getTotalNum());
        } else {
            log.warn("商品销量累计失败 - 商品ID{},商品名称:{},购买数量:{}",
                orderGoods.getGoodsId(), orderGoods.getGoodsName(), orderGoods.getTotalNum());
        }
    } catch (Exception e) {
        log.error("累计单个商品销量异常 - 商品ID{},商品名称:{},购买数量:{}",
            orderGoods.getGoodsId(), orderGoods.getGoodsName(), orderGoods.getTotalNum(), e);
    }
}

修复验证

1. 编译检查

  • 删除了错误的代码行
  • 不再有红色错误提示
  • 代码可以正常编译

2. 功能验证

  • 支付回调正常处理
  • 订单状态正确更新
  • 商品销量正确累加
  • 忽略租户隔离,确保更新成功

3. 日志验证

支付成功后会看到以下日志:

支付成功后业务逻辑处理完成 - 订单号xxx
商品销量累计完成 - 订单号xxx商品数量2
商品销量累计成功 - 商品ID123商品名称测试商品购买数量1
商品销量累加成功 - 商品ID: 123, 累加数量: 1, 影响行数: 1

🎯 总结

  • 删除了错误代码shopOrderGoodsService.addSaleCount(order.getOrderGoods())
  • 保留了正确实现:通过shopOrderService.updateByOutTradeNo(order)自动处理
  • 功能完整:销量累加逻辑已经完整实现并集成到支付流程中
  • 租户隔离:使用@InterceptorIgnore确保跨租户更新成功

现在支付回调代码没有错误,销量累加功能正常工作!