You've already forked FrameTour-BE
feat(voucher): 支持券码重复使用
- 新增VoucherBatchCreateReqV2 请求对象,用于创建支持重复使用的券码批次 - 添加 VoucherUsageController 控制器,实现券码使用记录和统计功能 - 在VoucherInfo 对象中增加与重复使用相关的字段 - 修改 PriceVoucherBatchConfig 和 PriceVoucherCode 实体,支持重复使用相关属性 - 更新 VoucherBatchServiceImpl 和 VoucherServiceImpl,增加处理重复使用逻辑的方法
This commit is contained in:
@@ -89,4 +89,34 @@ public class VoucherInfo {
|
||||
* null表示适用所有商品类型
|
||||
*/
|
||||
private List<ProductType> applicableProducts;
|
||||
|
||||
/**
|
||||
* 当前使用次数
|
||||
*/
|
||||
private Integer currentUseCount;
|
||||
|
||||
/**
|
||||
* 最大使用次数
|
||||
*/
|
||||
private Integer maxUseCount;
|
||||
|
||||
/**
|
||||
* 每个用户最大使用次数
|
||||
*/
|
||||
private Integer maxUsePerUser;
|
||||
|
||||
/**
|
||||
* 使用间隔小时数
|
||||
*/
|
||||
private Integer useIntervalHours;
|
||||
|
||||
/**
|
||||
* 剩余可使用次数
|
||||
*/
|
||||
private Integer remainingUseCount;
|
||||
|
||||
/**
|
||||
* 最后使用时间
|
||||
*/
|
||||
private Date lastUsedTime;
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
package com.ycwl.basic.pricing.dto.req;
|
||||
|
||||
import com.ycwl.basic.pricing.enums.ProductType;
|
||||
import lombok.Data;
|
||||
|
||||
import jakarta.validation.constraints.Min;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 券码批次创建请求(支持可重复使用)
|
||||
*/
|
||||
@Data
|
||||
public class VoucherBatchCreateReqV2 {
|
||||
|
||||
/**
|
||||
* 券码批次名称
|
||||
*/
|
||||
@NotBlank(message = "券码批次名称不能为空")
|
||||
private String batchName;
|
||||
|
||||
/**
|
||||
* 景区ID
|
||||
*/
|
||||
@NotNull(message = "景区ID不能为空")
|
||||
private Long scenicId;
|
||||
|
||||
/**
|
||||
* 推客ID
|
||||
*/
|
||||
@NotNull(message = "推客ID不能为空")
|
||||
private Long brokerId;
|
||||
|
||||
/**
|
||||
* 优惠类型:0=全场免费,1=商品降价,2=商品打折
|
||||
*/
|
||||
@NotNull(message = "优惠类型不能为空")
|
||||
private Integer discountType;
|
||||
|
||||
/**
|
||||
* 优惠值(降价金额或折扣百分比)
|
||||
*/
|
||||
private BigDecimal discountValue;
|
||||
|
||||
/**
|
||||
* 适用商品类型列表
|
||||
*/
|
||||
private List<ProductType> applicableProducts;
|
||||
|
||||
/**
|
||||
* 券码总数量
|
||||
*/
|
||||
@NotNull(message = "券码数量不能为空")
|
||||
@Min(value = 1, message = "券码数量必须大于0")
|
||||
private Integer totalCount;
|
||||
|
||||
/**
|
||||
* 每个券码最大使用次数(NULL表示无限次,1表示单次使用)
|
||||
*/
|
||||
private Integer maxUseCount;
|
||||
|
||||
/**
|
||||
* 每个用户最大使用次数(NULL表示无限次)
|
||||
*/
|
||||
private Integer maxUsePerUser;
|
||||
|
||||
/**
|
||||
* 两次使用间隔小时数(NULL表示无间隔限制)
|
||||
*/
|
||||
private Integer useIntervalHours;
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package com.ycwl.basic.pricing.dto.req;
|
||||
|
||||
import lombok.Data;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 券码使用历史查询请求
|
||||
*/
|
||||
@Data
|
||||
public class VoucherUsageHistoryReq {
|
||||
|
||||
/**
|
||||
* 券码
|
||||
*/
|
||||
private String voucherCode;
|
||||
|
||||
/**
|
||||
* 用户faceId
|
||||
*/
|
||||
private Long faceId;
|
||||
|
||||
/**
|
||||
* 景区ID
|
||||
*/
|
||||
private Long scenicId;
|
||||
|
||||
/**
|
||||
* 批次ID
|
||||
*/
|
||||
private Long batchId;
|
||||
|
||||
/**
|
||||
* 开始时间
|
||||
*/
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date startTime;
|
||||
|
||||
/**
|
||||
* 结束时间
|
||||
*/
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date endTime;
|
||||
|
||||
/**
|
||||
* 页码
|
||||
*/
|
||||
private Integer pageNum = 1;
|
||||
|
||||
/**
|
||||
* 页面大小
|
||||
*/
|
||||
private Integer pageSize = 10;
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
package com.ycwl.basic.pricing.dto.resp;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 券码使用记录响应
|
||||
*/
|
||||
@Data
|
||||
public class VoucherUsageRecordResp {
|
||||
|
||||
/**
|
||||
* 记录ID
|
||||
*/
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 券码ID
|
||||
*/
|
||||
private Long voucherCodeId;
|
||||
|
||||
/**
|
||||
* 券码
|
||||
*/
|
||||
private String voucherCode;
|
||||
|
||||
/**
|
||||
* 使用用户faceId
|
||||
*/
|
||||
private Long faceId;
|
||||
|
||||
/**
|
||||
* 景区ID
|
||||
*/
|
||||
private Long scenicId;
|
||||
|
||||
/**
|
||||
* 批次ID
|
||||
*/
|
||||
private Long batchId;
|
||||
|
||||
/**
|
||||
* 批次名称
|
||||
*/
|
||||
private String batchName;
|
||||
|
||||
/**
|
||||
* 使用时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private Date useTime;
|
||||
|
||||
/**
|
||||
* 关联订单ID
|
||||
*/
|
||||
private String orderId;
|
||||
|
||||
/**
|
||||
* 优惠金额
|
||||
*/
|
||||
private BigDecimal discountAmount;
|
||||
|
||||
/**
|
||||
* 使用备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private Date createTime;
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
package com.ycwl.basic.pricing.dto.resp;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 券码使用统计响应
|
||||
*/
|
||||
@Data
|
||||
public class VoucherUsageStatsResp {
|
||||
|
||||
/**
|
||||
* 券码ID
|
||||
*/
|
||||
private Long voucherCodeId;
|
||||
|
||||
/**
|
||||
* 券码
|
||||
*/
|
||||
private String voucherCode;
|
||||
|
||||
/**
|
||||
* 批次ID
|
||||
*/
|
||||
private Long batchId;
|
||||
|
||||
/**
|
||||
* 批次名称
|
||||
*/
|
||||
private String batchName;
|
||||
|
||||
/**
|
||||
* 景区ID
|
||||
*/
|
||||
private Long scenicId;
|
||||
|
||||
/**
|
||||
* 券码状态
|
||||
*/
|
||||
private Integer status;
|
||||
|
||||
/**
|
||||
* 状态名称
|
||||
*/
|
||||
private String statusName;
|
||||
|
||||
/**
|
||||
* 当前使用次数
|
||||
*/
|
||||
private Integer currentUseCount;
|
||||
|
||||
/**
|
||||
* 最大使用次数
|
||||
*/
|
||||
private Integer maxUseCount;
|
||||
|
||||
/**
|
||||
* 每个用户最大使用次数
|
||||
*/
|
||||
private Integer maxUsePerUser;
|
||||
|
||||
/**
|
||||
* 使用间隔小时数
|
||||
*/
|
||||
private Integer useIntervalHours;
|
||||
|
||||
/**
|
||||
* 是否还可以使用
|
||||
*/
|
||||
private Boolean canUseMore;
|
||||
|
||||
/**
|
||||
* 剩余可使用次数
|
||||
*/
|
||||
private Integer remainingUseCount;
|
||||
|
||||
/**
|
||||
* 总使用记录数
|
||||
*/
|
||||
private Integer totalUsageRecords;
|
||||
|
||||
/**
|
||||
* 最后使用时间
|
||||
*/
|
||||
private String lastUsedTime;
|
||||
}
|
||||
Reference in New Issue
Block a user