mirror of
http://192.168.1.205:9980/cf_devdept2/cf_imes_server.git
synced 2026-08-12 21:02:08 +08:00
带延期记录的支付有效结束时间错误修复
This commit is contained in:
+26
-23
@@ -232,40 +232,33 @@ public class PayProductProcessorNew {
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算结束时间
|
||||
* 计算订购后的结束时间
|
||||
*
|
||||
* @param duration
|
||||
* @param durationUnit
|
||||
* @return
|
||||
* 规则:
|
||||
* 1、已过期:从今天开始计算
|
||||
* 2、未过期:从当前结束时间开始叠加
|
||||
* 3、扣减已经消耗的延期天数(未来延期不扣)
|
||||
* 4、叠加优惠活动赠送时长
|
||||
*/
|
||||
private LocalDate calculateEndTime(Integer duration, Integer durationUnit) {
|
||||
LocalDate today = LocalDate.now();
|
||||
// 1、 计算延期后的实际有效期
|
||||
LocalDate maxDelayEnd = endTime;
|
||||
if (CollUtil.isNotEmpty(delayRespVOList)) {
|
||||
// 找到延期记录中最大的 delayTime 作为最终有效期
|
||||
maxDelayEnd = delayRespVOList.stream()
|
||||
.map(ProductDelayRespVO::getDelayTime)
|
||||
.max(LocalDate::compareTo)
|
||||
.orElse(endTime);
|
||||
}
|
||||
|
||||
// 2、 计算有效期叠加的起点
|
||||
// 1、计算续费起点
|
||||
LocalDate purchaseStart;
|
||||
if (today.isAfter(maxDelayEnd)) {
|
||||
// 已过期 → 从今天开始累加
|
||||
if (today.isAfter(endTime)) {
|
||||
// 已过期,从今天开始
|
||||
purchaseStart = today;
|
||||
} else {
|
||||
// 未过期 → 从 maxDelayEnd 的下一天开始累加
|
||||
purchaseStart = maxDelayEnd;
|
||||
// 未过期,从当前结束时间开始
|
||||
purchaseStart = endTime;
|
||||
}
|
||||
|
||||
// 3、加正常时间
|
||||
// 2、增加购买时长
|
||||
if (ObjectUtil.isNotNull(duration) && durationUnit != null) {
|
||||
endTime = addTime(purchaseStart, duration, durationUnit);
|
||||
}
|
||||
|
||||
// 4、扣掉延期天数
|
||||
// 3、扣除已经消耗的延期天数
|
||||
long delayDays = 0L;
|
||||
if (CollUtil.isNotEmpty(delayRespVOList)) {
|
||||
delayDays = calculateDelayDays(startTime, delayRespVOList);
|
||||
@@ -275,11 +268,12 @@ public class PayProductProcessorNew {
|
||||
endTime = endTime.minusDays(delayDays);
|
||||
}
|
||||
|
||||
// 5、累加优惠活动的赠送时间
|
||||
// 4、累加活动赠送时间
|
||||
if (CollUtil.isNotEmpty(availableProductPromotionList)) {
|
||||
calculateGiftDuration(duration, durationUnit);
|
||||
}
|
||||
|
||||
// 校验扣减完毕后是不是还是过期了,那么就是订购时间无法覆盖延期扣减
|
||||
if (endTime.isBefore(today)) {
|
||||
throw new ServiceException(PRODUCT_PURCHASE_ENDTIME_BEFORE_DELAYTIME_ERROR, LocalDateTimeUtil.format(endTime, DatePattern.NORM_DATE_PATTERN));
|
||||
}
|
||||
@@ -332,16 +326,25 @@ public class PayProductProcessorNew {
|
||||
List<DateIntervalDTO> intervals = new ArrayList<>();
|
||||
|
||||
for (ProductDelayRespVO record : delayRecords) {
|
||||
// 延期开始日期(原结束日期的下一天)
|
||||
LocalDate delayStart = record.getEndTime().plusDays(1);
|
||||
// 延期结束日期
|
||||
LocalDate delayEnd = record.getDelayTime();
|
||||
|
||||
// 异常数据
|
||||
if (delayEnd.isBefore(delayStart)) {
|
||||
record.setRemark("无扣减");
|
||||
continue; // 异常数据,忽略
|
||||
continue;
|
||||
}
|
||||
|
||||
// 延期尚未开始
|
||||
if (startTime.isBefore(delayStart)) {
|
||||
record.setRemark("无扣减");
|
||||
continue;
|
||||
}
|
||||
|
||||
LocalDate intervalEnd;
|
||||
if (!delayEnd.isAfter(startTime)) {
|
||||
if (startTime.isAfter(delayEnd)) {
|
||||
// 情况1:延期结束在计算结束之前 → 整段都扣
|
||||
intervalEnd = delayEnd;
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user