You've already forked FrameTour-BE
fix(pricing): 修复升级检查中的支付金额处理逻辑
- 移除 resolvePaidAmount 方法中对 purchasedDetails 的依赖 - 添加支付金额为空时的异常抛出机制 - 在升单结果中添加补差价金额的判断逻辑 - 更新文档中标注支付金额为必填字段 - 优化打包优惠计算中的补差价处理流程
This commit is contained in:
@@ -616,14 +616,14 @@ UpgradeCheckResult checkUpgrade(UpgradeCheckRequest request);
|
|||||||
- `scenicId`: 景区ID
|
- `scenicId`: 景区ID
|
||||||
- `purchasedProducts`: 已购商品列表
|
- `purchasedProducts`: 已购商品列表
|
||||||
- `intendingProducts`: 待购商品列表
|
- `intendingProducts`: 待购商品列表
|
||||||
- `paidAmount`: 已支付金额(内部代码传入,前端不必传)
|
- `paidAmount`: 已支付金额(内部代码传入,前端不必传;**必填**,为空直接报错)
|
||||||
|
|
||||||
#### 检测流程
|
#### 检测流程
|
||||||
1. **商品规范化**: 对已购和待购商品进行规范化处理
|
1. **商品规范化**: 对已购和待购商品进行规范化处理
|
||||||
2. **价格汇总**: 分别计算已购和待购商品的总价格,并合并已支付金额
|
2. **价格汇总**: 分别计算已购和待购商品的总价格,并合并已支付金额
|
||||||
3. **一口价评估**: 判断合并商品是否满足一口价条件
|
3. **一口价评估**: 判断合并商品是否满足一口价条件
|
||||||
4. **打包优惠评估**: 检测是否满足打包购买优惠条件
|
4. **打包优惠评估**: 检测是否满足打包购买优惠条件
|
||||||
5. **结果汇总**: 生成升单检测结果和建议
|
5. **结果汇总**: 生成升单检测结果和建议(补差价 <= 0 视为不可升单)
|
||||||
|
|
||||||
#### 响应结果 (UpgradeCheckResult)
|
#### 响应结果 (UpgradeCheckResult)
|
||||||
- `summary`: 价格汇总信息(包含已支付金额)
|
- `summary`: 价格汇总信息(包含已支付金额)
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ public class PriceCalculationServiceImpl implements IPriceCalculationService {
|
|||||||
combinedProducts.addAll(intendingProducts);
|
combinedProducts.addAll(intendingProducts);
|
||||||
PriceDetails combinedDetails = calculateProductsPriceWithOriginal(combinedProducts, scenicId);
|
PriceDetails combinedDetails = calculateProductsPriceWithOriginal(combinedProducts, scenicId);
|
||||||
|
|
||||||
BigDecimal paidAmount = resolvePaidAmount(request, purchasedDetails);
|
BigDecimal paidAmount = resolvePaidAmount(request);
|
||||||
BigDecimal currentTotalAmount = calculateCurrentTotalAmount(paidAmount, intendingDetails);
|
BigDecimal currentTotalAmount = calculateCurrentTotalAmount(paidAmount, intendingDetails);
|
||||||
|
|
||||||
UpgradePriceSummary priceSummary = buildPriceSummary(purchasedDetails, intendingDetails, combinedDetails, paidAmount);
|
UpgradePriceSummary priceSummary = buildPriceSummary(purchasedDetails, intendingDetails, combinedDetails, paidAmount);
|
||||||
@@ -480,6 +480,10 @@ public class PriceCalculationServiceImpl implements IPriceCalculationService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BigDecimal discountAmount = normalizedCurrentTotal.subtract(normalizedBundlePrice);
|
BigDecimal discountAmount = normalizedCurrentTotal.subtract(normalizedBundlePrice);
|
||||||
|
BigDecimal supplementAmount = calculateSupplementAmount(normalizedBundlePrice, normalizedPaidAmount);
|
||||||
|
if (supplementAmount.compareTo(BigDecimal.ZERO) <= 0) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
result.setApplicable(true);
|
result.setApplicable(true);
|
||||||
result.setBundleConfigId(bundleConfig.getId());
|
result.setBundleConfigId(bundleConfig.getId());
|
||||||
@@ -488,7 +492,7 @@ public class PriceCalculationServiceImpl implements IPriceCalculationService {
|
|||||||
result.setScenicId(bundleConfig.getScenicId());
|
result.setScenicId(bundleConfig.getScenicId());
|
||||||
result.setBundlePrice(normalizedBundlePrice);
|
result.setBundlePrice(normalizedBundlePrice);
|
||||||
result.setDiscountAmount(discountAmount);
|
result.setDiscountAmount(discountAmount);
|
||||||
result.setEstimatedFinalAmount(calculateSupplementAmount(normalizedBundlePrice, normalizedPaidAmount));
|
result.setEstimatedFinalAmount(supplementAmount);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -525,6 +529,11 @@ public class PriceCalculationServiceImpl implements IPriceCalculationService {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BigDecimal supplementAmount = calculateSupplementAmount(targetTotal, normalizedPaidAmount);
|
||||||
|
if (supplementAmount.compareTo(BigDecimal.ZERO) <= 0) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
result.setApplicable(true);
|
result.setApplicable(true);
|
||||||
result.setBundleConfigId(bestDiscount.getBundleConfigId());
|
result.setBundleConfigId(bestDiscount.getBundleConfigId());
|
||||||
result.setBundleName(bestDiscount.getBundleName());
|
result.setBundleName(bestDiscount.getBundleName());
|
||||||
@@ -534,7 +543,7 @@ public class PriceCalculationServiceImpl implements IPriceCalculationService {
|
|||||||
result.setDiscountAmount(normalizedDiscount);
|
result.setDiscountAmount(normalizedDiscount);
|
||||||
result.setMinQuantity(bestDiscount.getMinQuantity());
|
result.setMinQuantity(bestDiscount.getMinQuantity());
|
||||||
result.setMinAmount(bestDiscount.getMinAmount());
|
result.setMinAmount(bestDiscount.getMinAmount());
|
||||||
result.setEstimatedFinalAmount(calculateSupplementAmount(targetTotal, normalizedPaidAmount));
|
result.setEstimatedFinalAmount(supplementAmount);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -592,10 +601,10 @@ public class PriceCalculationServiceImpl implements IPriceCalculationService {
|
|||||||
return configScenicId.equals(String.valueOf(scenicId));
|
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;
|
BigDecimal paidAmount = request != null ? request.getPaidAmount() : null;
|
||||||
if (paidAmount == null && purchasedDetails != null) {
|
if (paidAmount == null) {
|
||||||
paidAmount = purchasedDetails.getTotalAmount();
|
throw new PriceCalculationException("已支付金额不能为空");
|
||||||
}
|
}
|
||||||
return normalizeAmount(paidAmount);
|
return normalizeAmount(paidAmount);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user