刘帅
2026-09-21 aec7121b4010eef3957fcb215c76b91654dbb5ce
bug:优惠券使用后支付问题
1个文件已修改
37 ■■■■■ 已修改文件
cloud-server-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java
@@ -1575,6 +1575,8 @@
            }
            BigDecimal cashAmount = merchandise.getCash() == null ? BigDecimal.ZERO : merchandise.getCash();
            // 门票优惠后的订单现金应付总额;支付参数必须使用该金额,不能再使用商品原价。
            BigDecimal ticketPayableCashAmount = null;
            UserCoupon usedCoupon = null;
            if (exchangeType.getGoodsType() == 3 && exchangeType.getCouponId() != null && exchangeType.getCouponId() != 0) {
                if (exchangeType.getExchangeType() == 1) {
@@ -1605,10 +1607,11 @@
                            .divide(BigDecimal.valueOf(exchangeType.getNums() == null ? 1 : exchangeType.getNums()), 2, java.math.RoundingMode.HALF_UP);
                } else if (Integer.valueOf(2).equals(coupon.getType())) {
                    BigDecimal deduction = rule.getBigDecimal("conditionalAmount");
                    if (deduction == null) {
                    if (deduction == null || orderCash.compareTo(deduction) < 0) {
                        return ResultUtil.error("该优惠券无法使用");
                    }
                    cashAmount = orderCash.subtract(deduction).max(BigDecimal.ZERO)
                    ticketPayableCashAmount = orderCash.subtract(deduction).max(BigDecimal.ZERO);
                    cashAmount = ticketPayableCashAmount
                            .divide(BigDecimal.valueOf(exchangeType.getNums() == null ? 1 : exchangeType.getNums()), 2, java.math.RoundingMode.HALF_UP);
                } else {
                    return ResultUtil.error("该优惠券不支持购买门票");
@@ -1639,6 +1642,9 @@
            } else {
                goodsNums = exchangeType.getNums();
            }
            BigDecimal cashPaymentAmount = ticketPayableCashAmount == null
                    ? cashAmount.multiply(BigDecimal.valueOf(goodsNums))
                    : ticketPayableCashAmount;
            TAppUser user = appUserService.getById(userIdFormRedis);
            if (merchandise.getIntegral() != null) {
@@ -1675,6 +1681,10 @@
            if (exchangeType.getExchangeType() == 1) {
                pointsMerchandise.setPayStatus(2);
                pointsMerchandise.setPaymentTime(new Date());
            } else if (cashPaymentAmount.compareTo(BigDecimal.ZERO) == 0) {
                // 优惠券将现金部分完全抵扣时,不能向第三方支付发起 0 元或原价支付。
                pointsMerchandise.setPayStatus(2);
                pointsMerchandise.setPaymentTime(new Date());
            } else {
                pointsMerchandise.setPayStatus(1);
            }
@@ -1694,7 +1704,7 @@
                pointsMerchandise.setIntegral(merchandise.getIntegral() * goodsNums);
            }
            if (exchangeType.getExchangeType() == 2 || exchangeType.getExchangeType() == 3) {
                pointsMerchandise.setCash(cashAmount);
                pointsMerchandise.setCash(exchangeType.getGoodsType() == 3 ? cashPaymentAmount : cashAmount);
                pointsMerchandise.setCashPayType(exchangeType.getPayType());
            }
@@ -1716,6 +1726,10 @@
                    BeanUtils.copyProperties(pointsMerchandise, userPointsMerchandise);
                    // 一笔订单只能关联一次优惠券,避免拆分门票后重复计入优惠金额。
                    userPointsMerchandise.setUserCouponId(null);
                    if (exchangeType.getGoodsType() == 3) {
                        // 门票拆单后仅首条保留订单总实付金额,避免支付/收入统计重复累加。
                        userPointsMerchandise.setCash(BigDecimal.ZERO);
                    }
                    userPointsMerchandises.add(userPointsMerchandise);
                }
                System.err.println("新增额外购买记录"+userPointsMerchandises);
@@ -1727,7 +1741,14 @@
                }
            }
            if ((m * goodsNums) == 0 && pointsMerchandise.getPayStatus() == 2) {
            if (pointsMerchandise.getPayStatus() == 2 && exchangeType.getExchangeType() != 1
                    && cashPaymentAmount.compareTo(BigDecimal.ZERO) == 0) {
                // 积分+现金商品被优惠券抵扣为零元时,仍需扣除积分;不等待支付回调。
                if (exchangeType.getExchangeType() == 2 && merchandise.getIntegral() != null
                        && merchandise.getIntegral() > 0
                        && !dealAppUserIntegral(userIdFormRedis, tAppUser, merchandise.getIntegral() * goodsNums)) {
                    return ResultUtil.error("用户积分不足!");
                }
                returnModel.setReturnId(returnId);
                return ResultUtil.success(returnModel);
            }
@@ -1830,7 +1851,7 @@
                                } else if (merchandise.getType() == 1) {
                                    return WechatPayment(merchandise.getType(), cashAmount.multiply(new BigDecimal(goodsNums)), code, merchandise.getId());
                                } else if (merchandise.getType() == 3) {
                                    return WechatPayment(merchandise.getType(), cashAmount.multiply(new BigDecimal(goodsNums)), code, merchandise.getId());
                                    return WechatPayment(merchandise.getType(), cashPaymentAmount, code, merchandise.getId());
                                }
                            } catch (Exception e) {
                                return ResultUtil.runErr();
@@ -1838,6 +1859,8 @@
                        case 2:
                            if (merchandise.getType() == 2) {
                                return AlipayPayment(merchandise.getType(), cashAmount.multiply(new BigDecimal(exchangeType.getStuIds().size())), code, merchandise.getId());
                            } else if (merchandise.getType() == 3) {
                                return AlipayPayment(merchandise.getType(), cashPaymentAmount, code, merchandise.getId());
                            } else {
                                return AlipayPayment(merchandise.getType(), cashAmount.multiply(new BigDecimal(goodsNums)), code, merchandise.getId());
                            }
@@ -1851,6 +1874,8 @@
                            try {
                                if (merchandise.getType() == 2) {
                                    return WechatPayment(merchandise.getType(), cashAmount.multiply(new BigDecimal(exchangeType.getStuIds().size())), code, merchandise.getId());
                                } else if (merchandise.getType() == 3) {
                                    return WechatPayment(merchandise.getType(), cashPaymentAmount, code, merchandise.getId());
                                } else {
                                    return WechatPayment(merchandise.getType(), cashAmount.multiply(new BigDecimal(goodsNums)), code, merchandise.getId());
                                }
@@ -1860,6 +1885,8 @@
                        case 2:
                            if (merchandise.getType() == 2) {
                                return AlipayPayment(merchandise.getType(), cashAmount.multiply(new BigDecimal(exchangeType.getStuIds().size())), code, merchandise.getId());
                            } else if (merchandise.getType() == 3) {
                                return AlipayPayment(merchandise.getType(), cashPaymentAmount, code, merchandise.getId());
                            } else {
                                return AlipayPayment(merchandise.getType(), cashAmount.multiply(new BigDecimal(goodsNums)), code, merchandise.getId());
                            }