From 6006fe460ce9cbb62f9a20e2cb9b8861c9c8688f Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Tue, 16 Sep 2025 23:49:39 +0800 Subject: [PATCH] =?UTF-8?q?feat(pricing):=20=E4=BC=98=E6=83=A0=E5=88=B8?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9C=89=E6=95=88=E6=9C=9F=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E8=8C=83=E5=9B=B4=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在VoucherBatchCreateReqV2、VoucherBatchResp、VoucherInfo 和 PriceVoucherBatchConfig 类中添加有效期开始时间和结束时间字段 - 实现有效期时间范围的验证和检查逻辑 - 更新 VoucherBatchServiceImpl 和 VoucherServiceImpl 以支持有效期时间范围功能 --- .../ycwl/basic/pricing/dto/VoucherInfo.java | 41 ++++++++++++++++++ .../dto/req/VoucherBatchCreateReqV2.java | 11 +++++ .../pricing/dto/resp/VoucherBatchResp.java | 10 +++++ .../entity/PriceVoucherBatchConfig.java | 43 +++++++++++++++++++ .../service/impl/VoucherBatchServiceImpl.java | 7 +++ .../service/impl/VoucherServiceImpl.java | 22 +++++++++- 6 files changed, 132 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ycwl/basic/pricing/dto/VoucherInfo.java b/src/main/java/com/ycwl/basic/pricing/dto/VoucherInfo.java index b69a69d2..3fc10e6d 100644 --- a/src/main/java/com/ycwl/basic/pricing/dto/VoucherInfo.java +++ b/src/main/java/com/ycwl/basic/pricing/dto/VoucherInfo.java @@ -123,4 +123,45 @@ public class VoucherInfo { * 最后使用时间 */ private Date lastUsedTime; + + /** + * 有效期开始时间 + */ + private Date validStartTime; + + /** + * 有效期结束时间 + */ + private Date validEndTime; + + /** + * 检查指定时间是否在有效期内 + * @param checkTime 待检查的时间 + * @return true-在有效期内,false-不在有效期内 + */ + public boolean isWithinValidTimeRange(Date checkTime) { + if (checkTime == null) { + return false; + } + + // 检查开始时间 + if (validStartTime != null && checkTime.before(validStartTime)) { + return false; + } + + // 检查结束时间 + if (validEndTime != null && checkTime.after(validEndTime)) { + return false; + } + + return true; + } + + /** + * 检查当前时间是否在有效期内 + * @return true-在有效期内,false-不在有效期内 + */ + public boolean isWithinValidTimeRange() { + return isWithinValidTimeRange(new Date()); + } } \ No newline at end of file diff --git a/src/main/java/com/ycwl/basic/pricing/dto/req/VoucherBatchCreateReqV2.java b/src/main/java/com/ycwl/basic/pricing/dto/req/VoucherBatchCreateReqV2.java index 42a05fe6..159adb1e 100644 --- a/src/main/java/com/ycwl/basic/pricing/dto/req/VoucherBatchCreateReqV2.java +++ b/src/main/java/com/ycwl/basic/pricing/dto/req/VoucherBatchCreateReqV2.java @@ -7,6 +7,7 @@ import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import java.math.BigDecimal; +import java.util.Date; import java.util.List; /** @@ -70,4 +71,14 @@ public class VoucherBatchCreateReqV2 { * 两次使用间隔小时数(NULL表示无间隔限制) */ private Integer useIntervalHours; + + /** + * 有效期开始时间(NULL表示无开始时间限制) + */ + private Date validStartTime; + + /** + * 有效期结束时间(NULL表示无结束时间限制) + */ + private Date validEndTime; } \ No newline at end of file diff --git a/src/main/java/com/ycwl/basic/pricing/dto/resp/VoucherBatchResp.java b/src/main/java/com/ycwl/basic/pricing/dto/resp/VoucherBatchResp.java index 684d31e8..06059a0b 100644 --- a/src/main/java/com/ycwl/basic/pricing/dto/resp/VoucherBatchResp.java +++ b/src/main/java/com/ycwl/basic/pricing/dto/resp/VoucherBatchResp.java @@ -30,4 +30,14 @@ public class VoucherBatchResp { * null表示适用所有商品类型 */ private List applicableProducts; + + /** + * 有效期开始时间 + */ + private Date validStartTime; + + /** + * 有效期结束时间 + */ + private Date validEndTime; } \ No newline at end of file diff --git a/src/main/java/com/ycwl/basic/pricing/entity/PriceVoucherBatchConfig.java b/src/main/java/com/ycwl/basic/pricing/entity/PriceVoucherBatchConfig.java index 99c74f47..93256ab5 100644 --- a/src/main/java/com/ycwl/basic/pricing/entity/PriceVoucherBatchConfig.java +++ b/src/main/java/com/ycwl/basic/pricing/entity/PriceVoucherBatchConfig.java @@ -115,6 +115,49 @@ public class PriceVoucherBatchConfig { private Date deletedAt; + /** + * 有效期开始时间(NULL表示无开始时间限制) + */ + @TableField("valid_start_time") + private Date validStartTime; + + /** + * 有效期结束时间(NULL表示无结束时间限制) + */ + @TableField("valid_end_time") + private Date validEndTime; + + /** + * 检查当前时间是否在有效期内 + * @return true-在有效期内,false-不在有效期内 + */ + public boolean isWithinValidTimeRange() { + return isWithinValidTimeRange(new Date()); + } + + /** + * 检查指定时间是否在有效期内 + * @param checkTime 待检查的时间 + * @return true-在有效期内,false-不在有效期内 + */ + public boolean isWithinValidTimeRange(Date checkTime) { + if (checkTime == null) { + return false; + } + + // 检查开始时间 + if (validStartTime != null && checkTime.before(validStartTime)) { + return false; + } + + // 检查结束时间 + if (validEndTime != null && checkTime.after(validEndTime)) { + return false; + } + + return true; + } + /** * 获取适用商品类型列表 */ diff --git a/src/main/java/com/ycwl/basic/pricing/service/impl/VoucherBatchServiceImpl.java b/src/main/java/com/ycwl/basic/pricing/service/impl/VoucherBatchServiceImpl.java index 383dc2c8..8cc1ca7d 100644 --- a/src/main/java/com/ycwl/basic/pricing/service/impl/VoucherBatchServiceImpl.java +++ b/src/main/java/com/ycwl/basic/pricing/service/impl/VoucherBatchServiceImpl.java @@ -118,6 +118,13 @@ public class VoucherBatchServiceImpl implements VoucherBatchService { throw new BizException(400, "使用间隔小时数不能为负数"); } + // 验证时间范围参数 + if (req.getValidStartTime() != null && req.getValidEndTime() != null) { + if (req.getValidStartTime().after(req.getValidEndTime())) { + throw new BizException(400, "有效期开始时间不能晚于结束时间"); + } + } + PriceVoucherBatchConfig batch = new PriceVoucherBatchConfig(); BeanUtils.copyProperties(req, batch); diff --git a/src/main/java/com/ycwl/basic/pricing/service/impl/VoucherServiceImpl.java b/src/main/java/com/ycwl/basic/pricing/service/impl/VoucherServiceImpl.java index 70d796f8..c83f7996 100644 --- a/src/main/java/com/ycwl/basic/pricing/service/impl/VoucherServiceImpl.java +++ b/src/main/java/com/ycwl/basic/pricing/service/impl/VoucherServiceImpl.java @@ -85,13 +85,27 @@ public class VoucherServiceImpl implements IVoucherService { return null; } + VoucherInfo voucherInfo = buildVoucherInfo(voucherCodeEntity, batchConfig); + + // 检查券码批次的时间范围,提供详细的时间范围信息 + if (!batchConfig.isWithinValidTimeRange()) { + voucherInfo.setAvailable(false); + Date now = new Date(); + if (batchConfig.getValidStartTime() != null && now.before(batchConfig.getValidStartTime())) { + voucherInfo.setUnavailableReason("券码尚未生效"); + } else if (batchConfig.getValidEndTime() != null && now.after(batchConfig.getValidEndTime())) { + voucherInfo.setUnavailableReason("券码已过期"); + } else { + voucherInfo.setUnavailableReason("券码不在有效期内"); + } + return voucherInfo; + } + // 验证景区匹配 if (scenicId != null && !scenicId.equals(voucherCodeEntity.getScenicId())) { return null; } - VoucherInfo voucherInfo = buildVoucherInfo(voucherCodeEntity, batchConfig); - // 检查券码状态和可用性,包含完整的重复使用权限验证 if (VoucherCodeStatus.UNCLAIMED.getCode().equals(voucherCodeEntity.getStatus())) { // 未领取状态,也需要检查用户的重复使用权限 @@ -718,6 +732,10 @@ public void markVoucherAsUsed(String voucherCode, String remark, String orderId, voucherInfo.setUseIntervalHours(batchConfig.getUseIntervalHours()); voucherInfo.setLastUsedTime(voucherCode.getLastUsedTime()); + // 设置时间范围信息 + voucherInfo.setValidStartTime(batchConfig.getValidStartTime()); + voucherInfo.setValidEndTime(batchConfig.getValidEndTime()); + // 计算剩余可使用次数 if (batchConfig.getMaxUseCount() != null) { int remaining = batchConfig.getMaxUseCount() - currentUseCount;