刘帅
2026-09-29 dcb96821f905f3fd93c059d8703517bdcac4d336
cloud-server-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java
@@ -12,6 +12,8 @@
import com.alipay.api.response.AlipayTradeOrderSettleResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeRoyaltyRelationBindResponse;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -1277,6 +1279,12 @@
            }
        }
        if (request.getRank() == null && goods.size() > 0) {
            goods = goods.stream()
                    .sorted(Comparator.comparing(Goods::getGoodId, Comparator.reverseOrder()))
                    .collect(Collectors.toList());
        }
        //当前第几页
        int pageNo = request.getPageNum();
        //一页五条
@@ -1479,6 +1487,10 @@
    @Override
    @Transactional
    public synchronized ResultUtil productRedemptionOperation(Integer userIdFormRedis, GoodsExchangeVo exchangeType) {
        // 兼容前端历史参数 chooseCouponId,内部统一使用 couponId。
        if (exchangeType.getCouponId() == null && exchangeType.getChooseCouponId() != null) {
            exchangeType.setCouponId(exchangeType.getChooseCouponId());
        }
        ReturnModel returnModel = new ReturnModel();
        Long returnId = null;
        //如果是兑换优惠卷
@@ -1572,6 +1584,51 @@
                return ResultUtil.error("商品不存在");
            }
            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) {
                    return ResultUtil.error("积分兑换不能使用优惠券");
                }
                usedCoupon = userConponClient.queryUserCouponById(
                        new QueryUserCouponByIdAndUserId(exchangeType.getCouponId(), userIdFormRedis));
                if (usedCoupon == null || !Integer.valueOf(1).equals(usedCoupon.getStatus())) {
                    return ResultUtil.error("优惠券不可用");
                }
                Coupon coupon = userConponClient.queryCouponById(usedCoupon.getCouponId());
                if (coupon == null || coupon.getEndTime() == null || !coupon.getEndTime().after(new Date())) {
                    return ResultUtil.error("优惠券已过期");
                }
                if (Integer.valueOf(3).equals(coupon.getUseScope())
                        && (exchangeType.getStoreId() == null || !userConponClient.getCouponStoreIds(coupon.getId()).contains(exchangeType.getStoreId()))) {
                    return ResultUtil.error("该优惠券不适用于所选门店");
                }
                BigDecimal orderCash = cashAmount.multiply(BigDecimal.valueOf(exchangeType.getNums() == null ? 1 : exchangeType.getNums()));
                JSONObject rule = JSON.parseObject(coupon.getContent());
                if (Integer.valueOf(1).equals(coupon.getType())) {
                    BigDecimal condition = rule.getBigDecimal("conditionalAmount");
                    BigDecimal deduction = rule.getBigDecimal("deductionAmount");
                    if (condition == null || deduction == null || orderCash.compareTo(condition) < 0) {
                        return ResultUtil.error("该优惠券无法使用");
                    }
                    cashAmount = orderCash.subtract(deduction).max(BigDecimal.ZERO)
                            .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 || deduction.compareTo(BigDecimal.ZERO) <= 0) {
                        return ResultUtil.error("该优惠券无法使用");
                    }
                    // 代金券可覆盖全部订单金额,超出订单金额的部分不找零。
                    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("该优惠券不支持购买门票");
                }
            }
            TAppUser tAppUser = this.baseMapper.selectById(userIdFormRedis);
            if (merchandise.getUserPopulation() == 2) {
@@ -1596,6 +1653,9 @@
            } else {
                goodsNums = exchangeType.getNums();
            }
            BigDecimal cashPaymentAmount = ticketPayableCashAmount == null
                    ? cashAmount.multiply(BigDecimal.valueOf(goodsNums))
                    : ticketPayableCashAmount;
            TAppUser user = appUserService.getById(userIdFormRedis);
            if (merchandise.getIntegral() != null) {
@@ -1632,6 +1692,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);
            }
@@ -1646,26 +1710,37 @@
            pointsMerchandise.setCode(code);
            pointsMerchandise.setInsertTime(new Date());
            pointsMerchandise.setPayType(exchangeType.getExchangeType());
            pointsMerchandise.setUserCouponId(exchangeType.getGoodsType() == 3 ? exchangeType.getCouponId() : null);
            if (null != merchandise.getIntegral()) {
                pointsMerchandise.setIntegral(merchandise.getIntegral() * goodsNums);
            }
            if (exchangeType.getExchangeType() == 2 || exchangeType.getExchangeType() == 3) {
                pointsMerchandise.setCash(merchandise.getCash());
                pointsMerchandise.setCash(exchangeType.getGoodsType() == 3 ? cashPaymentAmount : cashAmount);
                pointsMerchandise.setCashPayType(exchangeType.getPayType());
            }
            Double m = new BigDecimal((merchandise.getIntegral() == null ? 0 : merchandise.getIntegral())).add((merchandise.getCash() == null ? BigDecimal.ZERO : merchandise.getCash())).doubleValue();
            Double m = new BigDecimal((merchandise.getIntegral() == null ? 0 : merchandise.getIntegral())).add(cashAmount).doubleValue();
            if ((m * goodsNums) == 0) {
                pointsMerchandise.setPayStatus(2);
                pointsMerchandise.setPaymentTime(new Date());
            }
            returnId = mcClient.saveDetailsUserPointMercase(pointsMerchandise);
            if (usedCoupon != null) {
                usedCoupon.setStatus(2);
                userConponClient.updateUserCoupon(usedCoupon);
            }
            if(goodsNums>1){
                System.err.println("购买商品数量"+goodsNums);
                List<UserPointsMerchandise> userPointsMerchandises = new ArrayList<>();
                for (int i = 1; i < goodsNums; i++) {
                    UserPointsMerchandise userPointsMerchandise = new UserPointsMerchandise();
                    BeanUtils.copyProperties(pointsMerchandise, userPointsMerchandise);
                    // 一笔订单只能关联一次优惠券,避免拆分门票后重复计入优惠金额。
                    userPointsMerchandise.setUserCouponId(null);
                    if (exchangeType.getGoodsType() == 3) {
                        // 门票拆单后仅首条保留订单总实付金额,避免支付/收入统计重复累加。
                        userPointsMerchandise.setCash(BigDecimal.ZERO);
                    }
                    userPointsMerchandises.add(userPointsMerchandise);
                }
                System.err.println("新增额外购买记录"+userPointsMerchandises);
@@ -1677,8 +1752,16 @@
                }
            }
            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);
                returnModel.setPaySuccess(true);
                return ResultUtil.success(returnModel);
            }
@@ -1766,7 +1849,7 @@
                                            break;
                                        }
                                    }
                                    coursePackageOrder.setCashPayment(merchandise.getCash().multiply(new BigDecimal(exchangeType.getStuIds().size())));
                                    coursePackageOrder.setCashPayment(cashAmount.multiply(new BigDecimal(exchangeType.getStuIds().size())));
                                    coursePackageOrder.setPlayPaiCoin(merchandise.getIntegral() * exchangeType.getStuIds().size());
                                    coursePackageOrder.setPayUserType(1);
                                    coursePackageOrder.setPayStatus(1);
@@ -1776,20 +1859,22 @@
                                    coursePackageOrder.setInsertTime(new Date());
                                    coursePackageOrder.setOrderType(2);
                                    paymentClient.savePaymentCoursePackage(coursePackageOrder);
                                    return WechatPayment(merchandise.getType(), merchandise.getCash().multiply(new BigDecimal(exchangeType.getStuIds().size())), code, merchandise.getId());
                                    return WechatPayment(merchandise.getType(), cashAmount.multiply(new BigDecimal(exchangeType.getStuIds().size())), code, merchandise.getId());
                                } else if (merchandise.getType() == 1) {
                                    return WechatPayment(merchandise.getType(), merchandise.getCash().multiply(new BigDecimal(goodsNums)), code, merchandise.getId());
                                    return WechatPayment(merchandise.getType(), cashAmount.multiply(new BigDecimal(goodsNums)), code, merchandise.getId());
                                } else if (merchandise.getType() == 3) {
                                    return WechatPayment(merchandise.getType(), merchandise.getCash().multiply(new BigDecimal(goodsNums)), code, merchandise.getId());
                                    return WechatPayment(merchandise.getType(), cashPaymentAmount, code, merchandise.getId());
                                }
                            } catch (Exception e) {
                                return ResultUtil.runErr();
                            }
                        case 2:
                            if (merchandise.getType() == 2) {
                                return AlipayPayment(merchandise.getType(), merchandise.getCash().multiply(new BigDecimal(exchangeType.getStuIds().size())), code, merchandise.getId());
                                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(), merchandise.getCash().multiply(new BigDecimal(goodsNums)), code, merchandise.getId());
                                return AlipayPayment(merchandise.getType(), cashAmount.multiply(new BigDecimal(goodsNums)), code, merchandise.getId());
                            }
                        default:
                            break;
@@ -1800,18 +1885,22 @@
                        case 1:
                            try {
                                if (merchandise.getType() == 2) {
                                    return WechatPayment(merchandise.getType(), merchandise.getCash().multiply(new BigDecimal(exchangeType.getStuIds().size())), code, merchandise.getId());
                                    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(), merchandise.getCash().multiply(new BigDecimal(goodsNums)), code, merchandise.getId());
                                    return WechatPayment(merchandise.getType(), cashAmount.multiply(new BigDecimal(goodsNums)), code, merchandise.getId());
                                }
                            } catch (Exception e) {
                                return ResultUtil.runErr();
                            }
                        case 2:
                            if (merchandise.getType() == 2) {
                                return AlipayPayment(merchandise.getType(), merchandise.getCash().multiply(new BigDecimal(exchangeType.getStuIds().size())), code, merchandise.getId());
                                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(), merchandise.getCash().multiply(new BigDecimal(goodsNums)), code, merchandise.getId());
                                return AlipayPayment(merchandise.getType(), cashAmount.multiply(new BigDecimal(goodsNums)), code, merchandise.getId());
                            }
                        default:
                            break;
@@ -1822,6 +1911,7 @@
            }
            returnModel.setReturnId(returnId);
            returnModel.setPaySuccess(pointsMerchandise.getPayStatus() == 2);
            return ResultUtil.success(returnModel);
        } catch (Exception e) {
            e.printStackTrace();
@@ -2176,7 +2266,20 @@
                }
            }).start();
        }
        return alipay;
        return appendPaySuccess(alipay);
    }
    /**
     * 支付宝、微信的成功响应仅表示已生成支付单,客户端仍需拉起第三方支付。
     */
    private ResultUtil appendPaySuccess(ResultUtil paymentResult) {
        JSONObject data = paymentResult.getData() == null ? new JSONObject()
                : JSON.parseObject(JSON.toJSONString(paymentResult.getData()));
        if (data == null) {
            data = new JSONObject();
        }
        data.put("paySuccess", false);
        return ResultUtil.getResult(paymentResult.getCode(), paymentResult.getMsg(), data);
    }
@@ -2198,7 +2301,7 @@
                        // 平台门票
                        ResultUtil weixinpay = payMoneyUtil.weixinpay(name, "", code, cash.toString(),
                                "/base/pointMer/exchangeGoodPaymentWeChatCallback", "APP", "");
                        return weixinpay;
                        return appendPaySuccess(weixinpay);
                    } else {
                        String s2 = storeClient.getmerchantNumberByOperatorId(store1.getOperatorId());
                        System.err.println("微信商户号" + s2);
@@ -2209,7 +2312,7 @@
                        ResultUtil weixinpay = payMoneyUtil.weixinpayV3(s2, name, code,
                                "/base/pointMer/exchangeGoodPaymentWeChatCallback1",
                                cash.toString());
                        return weixinpay;
                        return appendPaySuccess(weixinpay);
                    }
                }
                break;
@@ -2221,7 +2324,7 @@
                    // 平台课包
                    ResultUtil weixinpay = payMoneyUtil.weixinpay(name, "", code, cash.toString(),
                            "/base/pointMer/exchangeGoodPaymentWeChatCallback", "APP", "");
                    return weixinpay;
                    return appendPaySuccess(weixinpay);
                } else {
                    String s2 = storeClient.getmerchantNumberByOperatorId(store.getOperatorId());
                    System.err.println("微信商户号" + s2);
@@ -2232,7 +2335,7 @@
                    ResultUtil weixinpay = payMoneyUtil.weixinpayV3(s2, name, code,
                            "/base/pointMer/exchangeGoodPaymentWeChatCallback1",
                            cash.toString());
                    return weixinpay;
                    return appendPaySuccess(weixinpay);
                }
            case 3:
                if (!integers.isEmpty()) {
@@ -2241,7 +2344,7 @@
                        // 平台门票
                        ResultUtil weixinpay = payMoneyUtil.weixinpay(name, "", code, cash.toString(),
                                "/base/pointMer/exchangeGoodPaymentWeChatCallback", "APP", "");
                        return weixinpay;
                        return appendPaySuccess(weixinpay);
                    } else {
                        String s2 = storeClient.getmerchantNumberByOperatorId(store1.getOperatorId());
                        System.err.println("微信商户号" + s2);
@@ -2252,13 +2355,13 @@
                        ResultUtil weixinpay = payMoneyUtil.weixinpayV3(s2, name, code,
                                "/base/pointMer/exchangeGoodPaymentWeChatCallback1",
                                cash.toString());
                        return weixinpay;
                        return appendPaySuccess(weixinpay);
                    }
                } else {
                    // 平台门票
                    ResultUtil weixinpay = payMoneyUtil.weixinpay(name, "", code, cash.toString(),
                            "/base/pointMer/exchangeGoodPaymentWeChatCallback", "APP", "");
                    return weixinpay;
                    return appendPaySuccess(weixinpay);
                }
        }