feat(voucher): 支持券码重复使用

- 新增VoucherBatchCreateReqV2 请求对象,用于创建支持重复使用的券码批次
- 添加 VoucherUsageController 控制器,实现券码使用记录和统计功能
- 在VoucherInfo 对象中增加与重复使用相关的字段
- 修改 PriceVoucherBatchConfig 和 PriceVoucherCode 实体,支持重复使用相关属性
- 更新 VoucherBatchServiceImpl 和 VoucherServiceImpl,增加处理重复使用逻辑的方法
This commit is contained in:
2025-09-16 01:08:54 +08:00
parent 5531c576e0
commit ce3f7aae1e
17 changed files with 1167 additions and 21 deletions

View File

@@ -0,0 +1,121 @@
package com.ycwl.basic.pricing.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ycwl.basic.pricing.entity.PriceVoucherUsageRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.Date;
import java.util.List;
/**
* 券码使用记录Mapper
*/
@Mapper
public interface PriceVoucherUsageRecordMapper extends BaseMapper<PriceVoucherUsageRecord> {
/**
* 根据券码ID查询使用记录
*
* @param voucherCodeId 券码ID
* @return 使用记录列表
*/
@Select("SELECT * FROM price_voucher_usage_record WHERE voucher_code_id = #{voucherCodeId} AND deleted = 0 ORDER BY use_time DESC")
List<PriceVoucherUsageRecord> selectByVoucherCodeId(@Param("voucherCodeId") Long voucherCodeId);
/**
* 根据券码查询使用记录
*
* @param voucherCode 券码
* @return 使用记录列表
*/
@Select("SELECT * FROM price_voucher_usage_record WHERE voucher_code = #{voucherCode} AND deleted = 0 ORDER BY use_time DESC")
List<PriceVoucherUsageRecord> selectByVoucherCode(@Param("voucherCode") String voucherCode);
/**
* 根据用户和景区查询使用记录
*
* @param faceId 用户faceId
* @param scenicId 景区ID
* @return 使用记录列表
*/
@Select("SELECT * FROM price_voucher_usage_record WHERE face_id = #{faceId} AND scenic_id = #{scenicId} AND deleted = 0 ORDER BY use_time DESC")
List<PriceVoucherUsageRecord> selectByFaceIdAndScenicId(@Param("faceId") Long faceId, @Param("scenicId") Long scenicId);
/**
* 统计用户在指定券码上的使用次数
*
* @param faceId 用户faceId
* @param voucherCodeId 券码ID
* @return 使用次数
*/
@Select("SELECT COUNT(*) FROM price_voucher_usage_record WHERE face_id = #{faceId} AND voucher_code_id = #{voucherCodeId} AND deleted = 0")
Integer countByFaceIdAndVoucherCodeId(@Param("faceId") Long faceId, @Param("voucherCodeId") Long voucherCodeId);
/**
* 统计指定时间段内用户的使用次数
*
* @param faceId 用户faceId
* @param voucherCodeId 券码ID
* @param startTime 开始时间
* @param endTime 结束时间
* @return 使用次数
*/
@Select("SELECT COUNT(*) FROM price_voucher_usage_record WHERE face_id = #{faceId} AND voucher_code_id = #{voucherCodeId} " +
"AND use_time BETWEEN #{startTime} AND #{endTime} AND deleted = 0")
Integer countByFaceIdAndVoucherCodeIdAndTimeRange(@Param("faceId") Long faceId,
@Param("voucherCodeId") Long voucherCodeId,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime);
/**
* 获取用户最后一次使用该券码的时间
*
* @param faceId 用户faceId
* @param voucherCodeId 券码ID
* @return 最后使用时间
*/
@Select("SELECT MAX(use_time) FROM price_voucher_usage_record WHERE face_id = #{faceId} AND voucher_code_id = #{voucherCodeId} AND deleted = 0")
Date getLastUseTimeByFaceIdAndVoucherCodeId(@Param("faceId") Long faceId, @Param("voucherCodeId") Long voucherCodeId);
/**
* 根据批次ID统计使用记录数量
*
* @param batchId 批次ID
* @return 使用记录数量
*/
@Select("SELECT COUNT(*) FROM price_voucher_usage_record WHERE batch_id = #{batchId} AND deleted = 0")
Integer countByBatchId(@Param("batchId") Long batchId);
/**
* 分页查询券码使用记录
*
* @param page 分页参数
* @param batchId 批次ID(可选)
* @param voucherCode 券码(可选)
* @param faceId 用户faceId(可选)
* @param scenicId 景区ID(可选)
* @param startTime 开始时间(可选)
* @param endTime 结束时间(可选)
* @return 分页结果
*/
@Select("<script>" +
"SELECT * FROM price_voucher_usage_record WHERE deleted = 0 " +
"<if test='batchId != null'>AND batch_id = #{batchId}</if> " +
"<if test='voucherCode != null and voucherCode != \"\"'>AND voucher_code LIKE CONCAT('%', #{voucherCode}, '%')</if> " +
"<if test='faceId != null'>AND face_id = #{faceId}</if> " +
"<if test='scenicId != null'>AND scenic_id = #{scenicId}</if> " +
"<if test='startTime != null'>AND use_time >= #{startTime}</if> " +
"<if test='endTime != null'>AND use_time <= #{endTime}</if> " +
"ORDER BY use_time DESC" +
"</script>")
Page<PriceVoucherUsageRecord> selectPageWithConditions(Page<PriceVoucherUsageRecord> page,
@Param("batchId") Long batchId,
@Param("voucherCode") String voucherCode,
@Param("faceId") Long faceId,
@Param("scenicId") Long scenicId,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime);
}