feat(coupon): 添加优惠券领取后有效期功能

- 在 PriceCouponClaimRecord 实体中添加过期时间字段
- 在 PriceCouponConfig 实体中添加领取后有效天数配置
- 更新查询可用优惠券的 SQL 条件以过滤过期券
- 修改插入领用记录的 SQL 语句以包含过期时间
- 实现领取时根据配置计算过期时间的逻辑
This commit is contained in:
2026-01-22 14:03:28 +08:00
parent 80f8a6b56b
commit 68a674ba51
4 changed files with 26 additions and 5 deletions

View File

@@ -33,7 +33,13 @@ public class PriceCouponClaimRecord {
* 领取时间 * 领取时间
*/ */
private Date claimTime; private Date claimTime;
/**
* 过期时间(根据领取时间+领取后有效期计算)
*/
@TableField("expire_time")
private Date expireTime;
/** /**
* 使用时间 * 使用时间
*/ */

View File

@@ -85,7 +85,12 @@ public class PriceCouponConfig {
* 失效时间 * 失效时间
*/ */
private Date validUntil; private Date validUntil;
/**
* 领取后有效天数(NULL表示不限制,仅使用全局有效期)
*/
private Integer validDaysAfterClaim;
/** /**
* 是否启用 * 是否启用
*/ */

View File

@@ -25,7 +25,8 @@ public interface PriceCouponClaimRecordMapper extends BaseMapper<PriceCouponClai
"FROM price_coupon_claim_record r " + "FROM price_coupon_claim_record r " +
"JOIN price_coupon_config c ON r.coupon_id = c.id " + "JOIN price_coupon_config c ON r.coupon_id = c.id " +
"WHERE r.user_id = #{userId} AND r.status = 'CLAIMED' " + "WHERE r.user_id = #{userId} AND r.status = 'CLAIMED' " +
"AND c.is_active = 1 AND c.valid_from <= NOW() AND c.valid_until > NOW()") "AND c.is_active = 1 AND c.valid_from <= NOW() AND c.valid_until > NOW() " +
"AND (r.expire_time IS NULL OR r.expire_time > NOW())")
List<PriceCouponClaimRecord> selectUserAvailableCoupons(Long userId); List<PriceCouponClaimRecord> selectUserAvailableCoupons(Long userId);
/** /**
@@ -58,8 +59,8 @@ public interface PriceCouponClaimRecordMapper extends BaseMapper<PriceCouponClai
/** /**
* 插入优惠券领用记录 * 插入优惠券领用记录
*/ */
@Insert("INSERT INTO price_coupon_claim_record (coupon_id, user_id, claim_time, status, scenic_id, create_time, update_time) " + @Insert("INSERT INTO price_coupon_claim_record (coupon_id, user_id, claim_time, expire_time, status, scenic_id, create_time, update_time) " +
"VALUES (#{couponId}, #{userId}, NOW(), #{status}, #{scenicId}, NOW(), NOW())") "VALUES (#{couponId}, #{userId}, NOW(), #{expireTime}, #{status}, #{scenicId}, NOW(), NOW())")
int insertClaimRecord(PriceCouponClaimRecord record); int insertClaimRecord(PriceCouponClaimRecord record);
/** /**

View File

@@ -358,6 +358,15 @@ public class CouponServiceImpl implements ICouponService {
claimRecord.setCouponId(request.getCouponId()); claimRecord.setCouponId(request.getCouponId());
claimRecord.setUserId(request.getUserId()); claimRecord.setUserId(request.getUserId());
claimRecord.setClaimTime(claimTime); claimRecord.setClaimTime(claimTime);
// 如果配置了领取后有效天数,计算过期时间
if (coupon.getValidDaysAfterClaim() != null && coupon.getValidDaysAfterClaim() > 0) {
java.util.Calendar calendar = java.util.Calendar.getInstance();
calendar.setTime(claimTime);
calendar.add(java.util.Calendar.DAY_OF_MONTH, coupon.getValidDaysAfterClaim());
claimRecord.setExpireTime(calendar.getTime());
}
claimRecord.setStatus(CouponStatus.CLAIMED); claimRecord.setStatus(CouponStatus.CLAIMED);
claimRecord.setScenicId(request.getScenicId()); claimRecord.setScenicId(request.getScenicId());
claimRecord.setCreateTime(claimTime); claimRecord.setCreateTime(claimTime);