fix(pricing): 修复升级检查中的支付金额处理逻辑

- 移除 resolvePaidAmount 方法中对 purchasedDetails 的依赖
- 添加支付金额为空时的异常抛出机制
- 在升单结果中添加补差价金额的判断逻辑
- 更新文档中标注支付金额为必填字段
- 优化打包优惠计算中的补差价处理流程
This commit is contained in:
2026-01-19 20:28:36 +08:00
parent 91626626f4
commit 3084afc6a7
2 changed files with 17 additions and 8 deletions

View File

@@ -616,14 +616,14 @@ UpgradeCheckResult checkUpgrade(UpgradeCheckRequest request);
- `scenicId`: 景区ID
- `purchasedProducts`: 已购商品列表
- `intendingProducts`: 待购商品列表
- `paidAmount`: 已支付金额(内部代码传入,前端不必传)
- `paidAmount`: 已支付金额(内部代码传入,前端不必传;**必填**,为空直接报错
#### 检测流程
1. **商品规范化**: 对已购和待购商品进行规范化处理
2. **价格汇总**: 分别计算已购和待购商品的总价格,并合并已支付金额
3. **一口价评估**: 判断合并商品是否满足一口价条件
4. **打包优惠评估**: 检测是否满足打包购买优惠条件
5. **结果汇总**: 生成升单检测结果和建议
5. **结果汇总**: 生成升单检测结果和建议(补差价 <= 0 视为不可升单)
#### 响应结果 (UpgradeCheckResult)
- `summary`: 价格汇总信息(包含已支付金额)

View File

@@ -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);
}