From 53a36b80468d7288b4e22a202775c17ab5e1c541 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Tue, 16 Jun 2026 10:21:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B8=A6=E5=BB=B6=E6=9C=9F=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E7=9A=84=E6=94=AF=E4=BB=98=E6=9C=89=E6=95=88=E7=BB=93=E6=9D=9F?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E9=94=99=E8=AF=AF=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/pay/PayProductProcessorNew.java | 49 ++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/PayProductProcessorNew.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/PayProductProcessorNew.java index 5ec2f7773..23f278589 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/PayProductProcessorNew.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/PayProductProcessorNew.java @@ -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 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 {