From 3084afc6a7f7484bdad2e8b21c56c01702551648 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Mon, 19 Jan 2026 20:28:36 +0800 Subject: [PATCH] =?UTF-8?q?fix(pricing):=20=E4=BF=AE=E5=A4=8D=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E6=A3=80=E6=9F=A5=E4=B8=AD=E7=9A=84=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E9=87=91=E9=A2=9D=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 resolvePaidAmount 方法中对 purchasedDetails 的依赖 - 添加支付金额为空时的异常抛出机制 - 在升单结果中添加补差价金额的判断逻辑 - 更新文档中标注支付金额为必填字段 - 优化打包优惠计算中的补差价处理流程 --- .../java/com/ycwl/basic/pricing/CLAUDE.md | 4 ++-- .../impl/PriceCalculationServiceImpl.java | 21 +++++++++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/ycwl/basic/pricing/CLAUDE.md b/src/main/java/com/ycwl/basic/pricing/CLAUDE.md index fe681fe7..3c087048 100644 --- a/src/main/java/com/ycwl/basic/pricing/CLAUDE.md +++ b/src/main/java/com/ycwl/basic/pricing/CLAUDE.md @@ -616,14 +616,14 @@ UpgradeCheckResult checkUpgrade(UpgradeCheckRequest request); - `scenicId`: 景区ID - `purchasedProducts`: 已购商品列表 - `intendingProducts`: 待购商品列表 -- `paidAmount`: 已支付金额(内部代码传入,前端不必传) +- `paidAmount`: 已支付金额(内部代码传入,前端不必传;**必填**,为空直接报错) #### 检测流程 1. **商品规范化**: 对已购和待购商品进行规范化处理 2. **价格汇总**: 分别计算已购和待购商品的总价格,并合并已支付金额 3. **一口价评估**: 判断合并商品是否满足一口价条件 4. **打包优惠评估**: 检测是否满足打包购买优惠条件 -5. **结果汇总**: 生成升单检测结果和建议 +5. **结果汇总**: 生成升单检测结果和建议(补差价 <= 0 视为不可升单) #### 响应结果 (UpgradeCheckResult) - `summary`: 价格汇总信息(包含已支付金额) diff --git a/src/main/java/com/ycwl/basic/pricing/service/impl/PriceCalculationServiceImpl.java b/src/main/java/com/ycwl/basic/pricing/service/impl/PriceCalculationServiceImpl.java index baa6c72a..4789826c 100644 --- a/src/main/java/com/ycwl/basic/pricing/service/impl/PriceCalculationServiceImpl.java +++ b/src/main/java/com/ycwl/basic/pricing/service/impl/PriceCalculationServiceImpl.java @@ -193,7 +193,7 @@ public class PriceCalculationServiceImpl implements IPriceCalculationService { combinedProducts.addAll(intendingProducts); PriceDetails combinedDetails = calculateProductsPriceWithOriginal(combinedProducts, scenicId); - BigDecimal paidAmount = resolvePaidAmount(request, purchasedDetails); + BigDecimal paidAmount = resolvePaidAmount(request); BigDecimal currentTotalAmount = calculateCurrentTotalAmount(paidAmount, intendingDetails); UpgradePriceSummary priceSummary = buildPriceSummary(purchasedDetails, intendingDetails, combinedDetails, paidAmount); @@ -480,6 +480,10 @@ public class PriceCalculationServiceImpl implements IPriceCalculationService { } BigDecimal discountAmount = normalizedCurrentTotal.subtract(normalizedBundlePrice); + BigDecimal supplementAmount = calculateSupplementAmount(normalizedBundlePrice, normalizedPaidAmount); + if (supplementAmount.compareTo(BigDecimal.ZERO) <= 0) { + return result; + } result.setApplicable(true); result.setBundleConfigId(bundleConfig.getId()); @@ -488,7 +492,7 @@ public class PriceCalculationServiceImpl implements IPriceCalculationService { result.setScenicId(bundleConfig.getScenicId()); result.setBundlePrice(normalizedBundlePrice); result.setDiscountAmount(discountAmount); - result.setEstimatedFinalAmount(calculateSupplementAmount(normalizedBundlePrice, normalizedPaidAmount)); + result.setEstimatedFinalAmount(supplementAmount); return result; } @@ -525,6 +529,11 @@ public class PriceCalculationServiceImpl implements IPriceCalculationService { return result; } + BigDecimal supplementAmount = calculateSupplementAmount(targetTotal, normalizedPaidAmount); + if (supplementAmount.compareTo(BigDecimal.ZERO) <= 0) { + return result; + } + result.setApplicable(true); result.setBundleConfigId(bestDiscount.getBundleConfigId()); result.setBundleName(bestDiscount.getBundleName()); @@ -534,7 +543,7 @@ public class PriceCalculationServiceImpl implements IPriceCalculationService { result.setDiscountAmount(normalizedDiscount); result.setMinQuantity(bestDiscount.getMinQuantity()); result.setMinAmount(bestDiscount.getMinAmount()); - result.setEstimatedFinalAmount(calculateSupplementAmount(targetTotal, normalizedPaidAmount)); + result.setEstimatedFinalAmount(supplementAmount); return result; } @@ -592,10 +601,10 @@ public class PriceCalculationServiceImpl implements IPriceCalculationService { return configScenicId.equals(String.valueOf(scenicId)); } - private BigDecimal resolvePaidAmount(UpgradeCheckRequest request, PriceDetails purchasedDetails) { + private BigDecimal resolvePaidAmount(UpgradeCheckRequest request) { BigDecimal paidAmount = request != null ? request.getPaidAmount() : null; - if (paidAmount == null && purchasedDetails != null) { - paidAmount = purchasedDetails.getTotalAmount(); + if (paidAmount == null) { + throw new PriceCalculationException("已支付金额不能为空"); } return normalizeAmount(paidAmount); }