peng
昨天 5041554e7bf313340dcb465a3149df4fba0e4119
店铺扫码抽奖功能
28个文件已添加
1617 ■■■■■ 已修改文件
framework/src/main/java/cn/lili/modules/lmk/domain/entity/PrizeClaimRecord.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/entity/ScanPrize.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/entity/StorePrizeProof.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/form/PrizeClaimRecordForm.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/form/ScanPrizeForm.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/form/StorePrizeProofForm.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/query/PrizeClaimRecordQuery.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/query/ScanPrizeQuery.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/query/StorePrizeProofQuery.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/vo/PrizeClaimRecordVO.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/vo/ScanPrizeVO.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/vo/StorePrizeProofVO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/enums/general/GenerateStorePrizeStausEnum.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/enums/general/MaterialStatusEnum.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/enums/general/StoreScanPrizeStausEnum.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/mapper/PrizeClaimRecordMapper.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/mapper/ScanPrizeMapper.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/mapper/StorePrizeProofMapper.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/PrizeClaimRecordService.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/ScanPrizeService.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/StorePrizeProofService.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeClaimRecordServiceImpl.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/impl/ScanPrizeServiceImpl.java 218 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/impl/StorePrizeProofServiceImpl.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/resources/mapper/lmk/PrizeClaimRecordMapper.xml 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/resources/mapper/lmk/ScanPrizeMapper.xml 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/resources/mapper/lmk/StorePrizeProofMapper.xml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manager-api/src/main/java/cn/lili/controller/lmk/ScanPrizeController.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/entity/PrizeClaimRecord.java
New file
@@ -0,0 +1,66 @@
package cn.lili.modules.lmk.domain.entity;
import cn.lili.modules.lmk.enums.general.MaterialStatusEnum;
import cn.lili.mybatis.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;
/**
 * 店铺抽奖活动领取表
 *
 * @author peng
 * @since 2025-09-30
 */
@Data
@TableName("lmk_prize_claim_record")
public class PrizeClaimRecord extends BaseEntity {
    private static final long serialVersionUID = 1L;
    @TableField("no")
    /** 编号 */
    private String no;
    @TableField("store_id")
    /** 店铺id */
    private String storeId;
    @TableField("store_prize_id")
    /** 店铺抽奖活动id */
    private String storePrizeId;
    @TableField("store_name")
    /** 店铺名称 */
    private String storeName;
    @TableField("prize_activity_id")
    /** 抽奖活动id */
    private String prizeActivityId;
    @TableField("prize_activity_name")
    /** 抽奖活动名称 */
    private String prizeActivityName;
    @TableField("user_id")
    /** 用户id */
    private String userId;
    @TableField("nick_name")
    /** 用户昵称 */
    private String nickName;
    @TableField("claim_status")
    /** 领取状态 */
    private String claimStatus;
    @TableField("material")
    /** 材料状态
     *
     * @see MaterialStatusEnum
     * */
    private String material;
}
framework/src/main/java/cn/lili/modules/lmk/domain/entity/ScanPrize.java
New file
@@ -0,0 +1,60 @@
package cn.lili.modules.lmk.domain.entity;
import cn.lili.modules.lmk.enums.general.GenerateStorePrizeStausEnum;
import cn.lili.modules.lmk.enums.general.StoreScanPrizeStausEnum;
import cn.lili.mybatis.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;
/**
 * 店铺活动关联
 *
 * @author peng
 * @since 2025-09-30
 */
@Data
@TableName("lmk_scan_prize")
public class ScanPrize extends BaseEntity {
    private static final long serialVersionUID = 1L;
    @TableField("store_id")
    /** 店铺id */
    private String storeId;
    @TableField("store_name")
    /** 店铺名称 */
    private String storeName;
    @TableField("prize_activity_id")
    /** 抽奖活动id */
    private String prizeActivityId;
    @TableField("prize_activity_nmae")
    /** 抽奖活动名称名称 */
    private String prizeActivityNmae;
    @TableField("generate_status")
    /** 生成状态
     * @see GenerateStorePrizeStausEnum
     * */
    private String generateStatus;
    @TableField("generate_num")
    /** 生成数量 */
    private Integer generateNum;
    @TableField("claim_num")
    /** 领取数量 */
    private Integer claimNum;
    @TableField("status")
    /** 是否启用
     * @see StoreScanPrizeStausEnum
     * */
    private String status;
}
framework/src/main/java/cn/lili/modules/lmk/domain/entity/StorePrizeProof.java
New file
@@ -0,0 +1,30 @@
package cn.lili.modules.lmk.domain.entity;
import cn.lili.mybatis.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;
/**
 * 抽奖活动补录证明
 *
 * @author peng
 * @since 2025-09-30
 */
@Data
@TableName("lmk_store_prize_proof")
public class StorePrizeProof extends BaseEntity {
    private static final long serialVersionUID = 1L;
    @TableField("store_prize_claim_id")
    /** 抽奖活动领取表id */
    private String storePrizeClaimId;
    @TableField("url_path")
    /** 附件地址 */
    private String urlPath;
}
framework/src/main/java/cn/lili/modules/lmk/domain/form/PrizeClaimRecordForm.java
New file
@@ -0,0 +1,66 @@
package cn.lili.modules.lmk.domain.form;
import cn.lili.group.Update;
import cn.lili.group.Add;
import cn.lili.base.AbsForm;
import cn.lili.modules.lmk.domain.entity.PrizeClaimRecord;
import org.springframework.beans.BeanUtils;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import org.springframework.lang.NonNull;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * 店铺抽奖活动领取表表单
 *
 * @author peng
 * @since 2025-09-30
 */
@Data
@ApiModel(value = "PrizeClaimRecord表单", description = "店铺抽奖活动领取表表单")
public class PrizeClaimRecordForm extends AbsForm {
    @NotBlank(message = "编号不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("编号")
    private String no;
    @NotNull(message = "店铺id不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("店铺id")
    private Long storeId;
    @NotBlank(message = "店铺名称不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("店铺名称")
    private String storeName;
    @NotNull(message = "抽奖活动id不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("抽奖活动id")
    private Long prizeActivityId;
    @NotBlank(message = "抽奖活动名称不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("抽奖活动名称")
    private String prizeActivityName;
    @NotNull(message = "用户id不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("用户id")
    private Long userId;
    @NotBlank(message = "用户昵称不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("用户昵称")
    private String nickName;
    @NotBlank(message = "领取状态不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("领取状态")
    private String claimStatus;
    public static PrizeClaimRecord getEntityByForm(@NonNull PrizeClaimRecordForm form, PrizeClaimRecord entity) {
        if(entity == null) {
          entity = new PrizeClaimRecord();
        }
        BeanUtils.copyProperties(form, entity);
        return entity;
    }
}
framework/src/main/java/cn/lili/modules/lmk/domain/form/ScanPrizeForm.java
New file
@@ -0,0 +1,69 @@
package cn.lili.modules.lmk.domain.form;
import cn.lili.group.Update;
import cn.lili.group.Add;
import cn.lili.base.AbsForm;
import cn.lili.modules.lmk.domain.entity.ScanPrize;
import cn.lili.modules.lmk.enums.general.GenerateStorePrizeStausEnum;
import cn.lili.modules.lmk.enums.general.StoreScanPrizeStausEnum;
import org.springframework.beans.BeanUtils;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import org.springframework.lang.NonNull;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * 店铺活动关联表单
 *
 * @author peng
 * @since 2025-09-30
 */
@Data
@ApiModel(value = "ScanPrize表单", description = "店铺活动关联表单")
public class ScanPrizeForm extends AbsForm {
    @NotNull(message = "店铺id不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("店铺id")
    private Long storeId;
    @NotNull(message = "店铺名称不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("店铺名称")
    private Long storeName;
    @NotNull(message = "抽奖活动id不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("抽奖活动id")
    private Long prizeActivityId;
    @NotBlank(message = "抽奖活动名称名称不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("抽奖活动名称名称")
    private String prizeActivityNmae;
    /**
     * @see GenerateStorePrizeStausEnum
     */
    @ApiModelProperty("生成状态")
    private String generateStatus;
    @NotNull(message = "生成数量不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("生成数量")
    private Integer generateNum;
    @ApiModelProperty("领取数量")
    private Integer claimNum;
    /**
     * @see StoreScanPrizeStausEnum
     */
    @ApiModelProperty("是否启用")
    private String status;
    public static ScanPrize getEntityByForm(@NonNull ScanPrizeForm form, ScanPrize entity) {
        if(entity == null) {
          entity = new ScanPrize();
        }
        BeanUtils.copyProperties(form, entity);
        return entity;
    }
}
framework/src/main/java/cn/lili/modules/lmk/domain/form/StorePrizeProofForm.java
New file
@@ -0,0 +1,42 @@
package cn.lili.modules.lmk.domain.form;
import cn.lili.group.Update;
import cn.lili.group.Add;
import cn.lili.base.AbsForm;
import cn.lili.modules.lmk.domain.entity.StorePrizeProof;
import org.springframework.beans.BeanUtils;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import org.springframework.lang.NonNull;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * 抽奖活动补录证明表单
 *
 * @author peng
 * @since 2025-09-30
 */
@Data
@ApiModel(value = "StorePrizeProof表单", description = "抽奖活动补录证明表单")
public class StorePrizeProofForm extends AbsForm {
    @NotBlank(message = "抽奖活动领取表id不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("抽奖活动领取表id")
    private String storePrizeClaimId;
    @NotBlank(message = "附件地址不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("附件地址")
    private String urlPath;
    public static StorePrizeProof getEntityByForm(@NonNull StorePrizeProofForm form, StorePrizeProof entity) {
        if(entity == null) {
          entity = new StorePrizeProof();
        }
        BeanUtils.copyProperties(form, entity);
        return entity;
    }
}
framework/src/main/java/cn/lili/modules/lmk/domain/query/PrizeClaimRecordQuery.java
New file
@@ -0,0 +1,22 @@
package cn.lili.modules.lmk.domain.query;
import cn.lili.base.AbsQuery;
import java.util.List;
import org.springframework.lang.NonNull;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * 店铺抽奖活动领取表查询
 *
 * @author peng
 * @since 2025-09-30
 */
@Data
@ApiModel(value = "PrizeClaimRecord查询参数", description = "店铺抽奖活动领取表查询参数")
public class PrizeClaimRecordQuery extends AbsQuery {
}
framework/src/main/java/cn/lili/modules/lmk/domain/query/ScanPrizeQuery.java
New file
@@ -0,0 +1,22 @@
package cn.lili.modules.lmk.domain.query;
import cn.lili.base.AbsQuery;
import java.util.List;
import org.springframework.lang.NonNull;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * 店铺活动关联查询
 *
 * @author peng
 * @since 2025-09-30
 */
@Data
@ApiModel(value = "ScanPrize查询参数", description = "店铺活动关联查询参数")
public class ScanPrizeQuery extends AbsQuery {
}
framework/src/main/java/cn/lili/modules/lmk/domain/query/StorePrizeProofQuery.java
New file
@@ -0,0 +1,22 @@
package cn.lili.modules.lmk.domain.query;
import cn.lili.base.AbsQuery;
import java.util.List;
import org.springframework.lang.NonNull;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * 抽奖活动补录证明查询
 *
 * @author peng
 * @since 2025-09-30
 */
@Data
@ApiModel(value = "StorePrizeProof查询参数", description = "抽奖活动补录证明查询参数")
public class StorePrizeProofQuery extends AbsQuery {
}
framework/src/main/java/cn/lili/modules/lmk/domain/vo/PrizeClaimRecordVO.java
New file
@@ -0,0 +1,63 @@
package cn.lili.modules.lmk.domain.vo;
import cn.lili.base.AbsVo;
import cn.lili.modules.lmk.domain.entity.PrizeClaimRecord;
import java.util.List;
import org.springframework.lang.NonNull;
import org.springframework.beans.BeanUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * 店铺抽奖活动领取表展示
 *
 * @author peng
 * @since 2025-09-30
 */
@Data
@ApiModel(value = "店铺抽奖活动领取表响应数据", description = "店铺抽奖活动领取表响应数据")
public class PrizeClaimRecordVO extends AbsVo {
    /** 编号 */
    @ApiModelProperty("编号")
    private String no;
    /** 店铺id */
    @ApiModelProperty("店铺id")
    private Long storeId;
    /** 店铺名称 */
    @ApiModelProperty("店铺名称")
    private String storeName;
    /** 抽奖活动id */
    @ApiModelProperty("抽奖活动id")
    private Long prizeActivityId;
    /** 抽奖活动名称 */
    @ApiModelProperty("抽奖活动名称")
    private String prizeActivityName;
    /** 用户id */
    @ApiModelProperty("用户id")
    private Long userId;
    /** 用户昵称 */
    @ApiModelProperty("用户昵称")
    private String nickName;
    /** 领取状态 */
    @ApiModelProperty("领取状态")
    private String claimStatus;
    public static PrizeClaimRecordVO getVoByEntity(@NonNull PrizeClaimRecord entity, PrizeClaimRecordVO vo) {
        if(vo == null) {
            vo = new PrizeClaimRecordVO();
        }
        BeanUtils.copyProperties(entity, vo);
        return vo;
    }
}
framework/src/main/java/cn/lili/modules/lmk/domain/vo/ScanPrizeVO.java
New file
@@ -0,0 +1,63 @@
package cn.lili.modules.lmk.domain.vo;
import cn.lili.base.AbsVo;
import cn.lili.modules.lmk.domain.entity.ScanPrize;
import java.util.List;
import org.springframework.lang.NonNull;
import org.springframework.beans.BeanUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * 店铺活动关联展示
 *
 * @author peng
 * @since 2025-09-30
 */
@Data
@ApiModel(value = "店铺活动关联响应数据", description = "店铺活动关联响应数据")
public class ScanPrizeVO extends AbsVo {
    /** 店铺id */
    @ApiModelProperty("店铺id")
    private Long storeId;
    /** 店铺名称 */
    @ApiModelProperty("店铺名称")
    private Long storeName;
    /** 抽奖活动id */
    @ApiModelProperty("抽奖活动id")
    private Long prizeActivityId;
    /** 抽奖活动名称名称 */
    @ApiModelProperty("抽奖活动名称名称")
    private String prizeActivityNmae;
    /** 生成状态 */
    @ApiModelProperty("生成状态")
    private String generateStatus;
    /** 生成数量 */
    @ApiModelProperty("生成数量")
    private Integer generateNum;
    /** 领取数量 */
    @ApiModelProperty("领取数量")
    private Integer claimNum;
    /** 是否启用 */
    @ApiModelProperty("是否启用")
    private String status;
    public static ScanPrizeVO getVoByEntity(@NonNull ScanPrize entity, ScanPrizeVO vo) {
        if(vo == null) {
            vo = new ScanPrizeVO();
        }
        BeanUtils.copyProperties(entity, vo);
        return vo;
    }
}
framework/src/main/java/cn/lili/modules/lmk/domain/vo/StorePrizeProofVO.java
New file
@@ -0,0 +1,39 @@
package cn.lili.modules.lmk.domain.vo;
import cn.lili.base.AbsVo;
import cn.lili.modules.lmk.domain.entity.StorePrizeProof;
import java.util.List;
import org.springframework.lang.NonNull;
import org.springframework.beans.BeanUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * 抽奖活动补录证明展示
 *
 * @author peng
 * @since 2025-09-30
 */
@Data
@ApiModel(value = "抽奖活动补录证明响应数据", description = "抽奖活动补录证明响应数据")
public class StorePrizeProofVO extends AbsVo {
    /** 抽奖活动领取表id */
    @ApiModelProperty("抽奖活动领取表id")
    private String storePrizeClaimId;
    /** 附件地址 */
    @ApiModelProperty("附件地址")
    private String urlPath;
    public static StorePrizeProofVO getVoByEntity(@NonNull StorePrizeProof entity, StorePrizeProofVO vo) {
        if(vo == null) {
            vo = new StorePrizeProofVO();
        }
        BeanUtils.copyProperties(entity, vo);
        return vo;
    }
}
framework/src/main/java/cn/lili/modules/lmk/enums/general/GenerateStorePrizeStausEnum.java
New file
@@ -0,0 +1,13 @@
package cn.lili.modules.lmk.enums.general;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public enum GenerateStorePrizeStausEnum {
    NOT_GENERATE("没有生成"),
    GENERATE("生成");
    private String des;
}
framework/src/main/java/cn/lili/modules/lmk/enums/general/MaterialStatusEnum.java
New file
@@ -0,0 +1,13 @@
package cn.lili.modules.lmk.enums.general;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public enum MaterialStatusEnum {
    NOT_GENERATE("没有生成"),
    GENERATE("生成");
    private String des;
}
framework/src/main/java/cn/lili/modules/lmk/enums/general/StoreScanPrizeStausEnum.java
New file
@@ -0,0 +1,13 @@
package cn.lili.modules.lmk.enums.general;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public enum StoreScanPrizeStausEnum {
    ENABLE("启用"),
    DISABLE("禁用");
    private String des;
}
framework/src/main/java/cn/lili/modules/lmk/mapper/PrizeClaimRecordMapper.java
New file
@@ -0,0 +1,34 @@
package cn.lili.modules.lmk.mapper;
import cn.lili.modules.lmk.domain.entity.PrizeClaimRecord;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import cn.lili.modules.lmk.domain.vo.PrizeClaimRecordVO;
import cn.lili.modules.lmk.domain.form.PrizeClaimRecordForm;
import cn.lili.modules.lmk.domain.query.PrizeClaimRecordQuery;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * 店铺抽奖活动领取表 Mapper 接口
 *
 * @author peng
 * @since 2025-09-30
 */
@Mapper
public interface PrizeClaimRecordMapper extends BaseMapper<PrizeClaimRecord> {
    /**
     * id查找店铺抽奖活动领取表
     * @param id
     * @return
     */
    PrizeClaimRecordVO getById(String id);
    /**
    *  分页
    */
    IPage getPage(IPage page, @Param("query") PrizeClaimRecordQuery query);
}
framework/src/main/java/cn/lili/modules/lmk/mapper/ScanPrizeMapper.java
New file
@@ -0,0 +1,34 @@
package cn.lili.modules.lmk.mapper;
import cn.lili.modules.lmk.domain.entity.ScanPrize;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import cn.lili.modules.lmk.domain.vo.ScanPrizeVO;
import cn.lili.modules.lmk.domain.form.ScanPrizeForm;
import cn.lili.modules.lmk.domain.query.ScanPrizeQuery;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * 店铺活动关联 Mapper 接口
 *
 * @author peng
 * @since 2025-09-30
 */
@Mapper
public interface ScanPrizeMapper extends BaseMapper<ScanPrize> {
    /**
     * id查找店铺活动关联
     * @param id
     * @return
     */
    ScanPrizeVO getById(String id);
    /**
    *  分页
    */
    IPage getPage(IPage page, @Param("query") ScanPrizeQuery query);
}
framework/src/main/java/cn/lili/modules/lmk/mapper/StorePrizeProofMapper.java
New file
@@ -0,0 +1,34 @@
package cn.lili.modules.lmk.mapper;
import cn.lili.modules.lmk.domain.entity.StorePrizeProof;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import cn.lili.modules.lmk.domain.vo.StorePrizeProofVO;
import cn.lili.modules.lmk.domain.form.StorePrizeProofForm;
import cn.lili.modules.lmk.domain.query.StorePrizeProofQuery;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * 抽奖活动补录证明 Mapper 接口
 *
 * @author peng
 * @since 2025-09-30
 */
@Mapper
public interface StorePrizeProofMapper extends BaseMapper<StorePrizeProof> {
    /**
     * id查找抽奖活动补录证明
     * @param id
     * @return
     */
    StorePrizeProofVO getById(String id);
    /**
    *  分页
    */
    IPage getPage(IPage page, @Param("query") StorePrizeProofQuery query);
}
framework/src/main/java/cn/lili/modules/lmk/service/PrizeClaimRecordService.java
New file
@@ -0,0 +1,65 @@
package cn.lili.modules.lmk.service;
import cn.lili.modules.lmk.domain.entity.PrizeClaimRecord;
import com.baomidou.mybatisplus.extension.service.IService;
import cn.lili.base.Result;
import cn.lili.modules.lmk.domain.form.PrizeClaimRecordForm;
import cn.lili.modules.lmk.domain.query.PrizeClaimRecordQuery;
import java.util.List;
/**
 * 店铺抽奖活动领取表 服务类
 *
 * @author peng
 * @since 2025-09-30
 */
public interface PrizeClaimRecordService extends IService<PrizeClaimRecord> {
    /**
     * 添加
     * @param form
     * @return
     */
    Result add(PrizeClaimRecordForm form);
    /**
     * 修改
     * @param form
     * @return
     */
    Result update(PrizeClaimRecordForm form);
    /**
     * 批量删除
     * @param ids
     * @return
     */
    Result remove(List<String> ids);
    /**
     * id删除
     * @param id
     * @return
     */
    Result removeById(String id);
    /**
     * 分页查询
     * @param query
     * @return
     */
    Result page(PrizeClaimRecordQuery query);
    /**
     * 根据id查找
     * @param id
     * @return
     */
    Result detail(String id);
    /**
     * 列表
     * @return
     */
    Result all();
}
framework/src/main/java/cn/lili/modules/lmk/service/ScanPrizeService.java
New file
@@ -0,0 +1,69 @@
package cn.lili.modules.lmk.service;
import cn.lili.modules.lmk.domain.entity.ScanPrize;
import com.baomidou.mybatisplus.extension.service.IService;
import cn.lili.base.Result;
import cn.lili.modules.lmk.domain.form.ScanPrizeForm;
import cn.lili.modules.lmk.domain.query.ScanPrizeQuery;
import java.util.List;
/**
 * 店铺活动关联 服务类
 *
 * @author peng
 * @since 2025-09-30
 */
public interface ScanPrizeService extends IService<ScanPrize> {
    /**
     * 添加
     * @param form
     * @return
     */
    Result add(ScanPrizeForm form);
    /**
     * 修改
     * @param form
     * @return
     */
    Result update(ScanPrizeForm form);
    /**
     * 批量删除
     * @param ids
     * @return
     */
    Result remove(List<String> ids);
    /**
     * id删除
     * @param id
     * @return
     */
    Result removeById(String id);
    /**
     * 分页查询
     * @param query
     * @return
     */
    Result page(ScanPrizeQuery query);
    /**
     * 根据id查找
     * @param id
     * @return
     */
    Result detail(String id);
    /**
     * 列表
     * @return
     */
    Result all();
    Result changeStatus(String id);
    Result generateStorePrize(String id);
}
framework/src/main/java/cn/lili/modules/lmk/service/StorePrizeProofService.java
New file
@@ -0,0 +1,65 @@
package cn.lili.modules.lmk.service;
import cn.lili.modules.lmk.domain.entity.StorePrizeProof;
import com.baomidou.mybatisplus.extension.service.IService;
import cn.lili.base.Result;
import cn.lili.modules.lmk.domain.form.StorePrizeProofForm;
import cn.lili.modules.lmk.domain.query.StorePrizeProofQuery;
import java.util.List;
/**
 * 抽奖活动补录证明 服务类
 *
 * @author peng
 * @since 2025-09-30
 */
public interface StorePrizeProofService extends IService<StorePrizeProof> {
    /**
     * 添加
     * @param form
     * @return
     */
    Result add(StorePrizeProofForm form);
    /**
     * 修改
     * @param form
     * @return
     */
    Result update(StorePrizeProofForm form);
    /**
     * 批量删除
     * @param ids
     * @return
     */
    Result remove(List<String> ids);
    /**
     * id删除
     * @param id
     * @return
     */
    Result removeById(String id);
    /**
     * 分页查询
     * @param query
     * @return
     */
    Result page(StorePrizeProofQuery query);
    /**
     * 根据id查找
     * @param id
     * @return
     */
    Result detail(String id);
    /**
     * 列表
     * @return
     */
    Result all();
}
framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeClaimRecordServiceImpl.java
New file
@@ -0,0 +1,119 @@
package cn.lili.modules.lmk.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import cn.lili.modules.lmk.domain.entity.PrizeClaimRecord;
import cn.lili.modules.lmk.mapper.PrizeClaimRecordMapper;
import cn.lili.modules.lmk.service.PrizeClaimRecordService;
import cn.lili.base.Result;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.lili.modules.lmk.domain.form.PrizeClaimRecordForm;
import cn.lili.modules.lmk.domain.vo.PrizeClaimRecordVO;
import cn.lili.modules.lmk.domain.query.PrizeClaimRecordQuery;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import cn.lili.utils.PageUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.util.Assert;
import java.util.List;
import java.util.stream.Collectors;
/**
 * 店铺抽奖活动领取表 服务实现类
 *
 * @author peng
 * @since 2025-09-30
 */
@Service
@RequiredArgsConstructor
public class PrizeClaimRecordServiceImpl extends ServiceImpl<PrizeClaimRecordMapper, PrizeClaimRecord> implements PrizeClaimRecordService {
    private final PrizeClaimRecordMapper prizeClaimRecordMapper;
    /**
     * 添加
     * @param form
     * @return
     */
    @Override
    public Result add(PrizeClaimRecordForm form) {
        PrizeClaimRecord entity = PrizeClaimRecordForm.getEntityByForm(form, null);
        baseMapper.insert(entity);
        return Result.ok("添加成功");
    }
    /**
     * 修改
     * @param form
     * @return
     */
    @Override
    public Result update(PrizeClaimRecordForm form) {
        PrizeClaimRecord entity = baseMapper.selectById(form.getId());
        // 为空抛IllegalArgumentException,做全局异常处理
        Assert.notNull(entity, "记录不存在");
        BeanUtils.copyProperties(form, entity);
        baseMapper.updateById(entity);
        return Result.ok("修改成功");
    }
    /**
     * 批量删除
     * @param ids
     * @return
     */
    @Override
    public Result remove(List<String> ids) {
        baseMapper.deleteBatchIds(ids);
        return Result.ok("删除成功");
    }
    /**
     * id删除
     * @param id
     * @return
     */
    @Override
    public Result removeById(String id) {
        baseMapper.deleteById(id);
        return Result.ok("删除成功");
    }
    /**
     * 分页查询
     * @param query
     * @return
     */
    @Override
    public Result page(PrizeClaimRecordQuery query) {
        IPage<PrizeClaimRecordVO> page = PageUtil.getPage(query, PrizeClaimRecordVO.class);
        baseMapper.getPage(page, query);
        return Result.ok().data(page.getRecords()).total(page.getTotal());
    }
    /**
     * 根据id查找
     * @param id
     * @return
     */
    @Override
    public Result detail(String id) {
        PrizeClaimRecordVO vo = baseMapper.getById(id);
        Assert.notNull(vo, "记录不存在");
        return Result.ok().data(vo);
    }
    /**
     * 列表
     * @return
     */
    @Override
    public Result all() {
        List<PrizeClaimRecord> entities = baseMapper.selectList(null);
        List<PrizeClaimRecordVO> vos = entities.stream()
                .map(entity -> PrizeClaimRecordVO.getVoByEntity(entity, null))
                .collect(Collectors.toList());
        return Result.ok().data(vos);
    }
}
framework/src/main/java/cn/lili/modules/lmk/service/impl/ScanPrizeServiceImpl.java
New file
@@ -0,0 +1,218 @@
package cn.lili.modules.lmk.service.impl;
import cn.lili.common.exception.ServiceException;
import cn.lili.modules.lmk.domain.entity.PrizeClaimRecord;
import cn.lili.modules.lmk.domain.entity.StoreCoupon;
import cn.lili.modules.lmk.domain.entity.StoreCouponSingle;
import cn.lili.modules.lmk.enums.general.*;
import cn.lili.modules.lmk.service.PrizeClaimRecordService;
import cn.lili.modules.order.order.entity.enums.ClaimStatusEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import cn.lili.modules.lmk.domain.entity.ScanPrize;
import cn.lili.modules.lmk.mapper.ScanPrizeMapper;
import cn.lili.modules.lmk.service.ScanPrizeService;
import cn.lili.base.Result;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.lili.modules.lmk.domain.form.ScanPrizeForm;
import cn.lili.modules.lmk.domain.vo.ScanPrizeVO;
import cn.lili.modules.lmk.domain.query.ScanPrizeQuery;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import cn.lili.utils.PageUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.util.Assert;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
 * 店铺活动关联 服务实现类
 *
 * @author peng
 * @since 2025-09-30
 */
@Service
@RequiredArgsConstructor
public class ScanPrizeServiceImpl extends ServiceImpl<ScanPrizeMapper, ScanPrize> implements ScanPrizeService {
    private final ScanPrizeMapper scanPrizeMapper;
    private final RedissonClient redissonClient;
    private static final String STORE_PRIZE_GENERATE = "store_prize_generate:";
    private final PrizeClaimRecordService prizeClaimRecordService;
    /**
     * 添加
     * @param form
     * @return
     */
    @Override
    public Result add(ScanPrizeForm form) {
        ScanPrize entity = ScanPrizeForm.getEntityByForm(form, null);
        entity.setStatus(StoreScanPrizeStausEnum.ENABLE.name());
        entity.setGenerateStatus(GenerateStorePrizeStausEnum.NOT_GENERATE.name());
        entity.setClaimNum(0);
        baseMapper.insert(entity);
        return Result.ok("添加成功");
    }
    /**
     * 修改
     * @param form
     * @return
     */
    @Override
    public Result update(ScanPrizeForm form) {
        ScanPrize entity = baseMapper.selectById(form.getId());
        // 为空抛IllegalArgumentException,做全局异常处理
        Assert.notNull(entity, "记录不存在");
        BeanUtils.copyProperties(form, entity);
        baseMapper.updateById(entity);
        return Result.ok("修改成功");
    }
    /**
     * 批量删除
     * @param ids
     * @return
     */
    @Override
    public Result remove(List<String> ids) {
        baseMapper.deleteBatchIds(ids);
        return Result.ok("删除成功");
    }
    /**
     * id删除
     * @param id
     * @return
     */
    @Override
    public Result removeById(String id) {
        baseMapper.deleteById(id);
        return Result.ok("删除成功");
    }
    /**
     * 分页查询
     * @param query
     * @return
     */
    @Override
    public Result page(ScanPrizeQuery query) {
        IPage<ScanPrizeVO> page = PageUtil.getPage(query, ScanPrizeVO.class);
        baseMapper.getPage(page, query);
        return Result.ok().data(page.getRecords()).total(page.getTotal());
    }
    /**
     * 根据id查找
     * @param id
     * @return
     */
    @Override
    public Result detail(String id) {
        ScanPrizeVO vo = baseMapper.getById(id);
        Assert.notNull(vo, "记录不存在");
        return Result.ok().data(vo);
    }
    /**
     * 列表
     * @return
     */
    @Override
    public Result all() {
        List<ScanPrize> entities = baseMapper.selectList(null);
        List<ScanPrizeVO> vos = entities.stream()
                .map(entity -> ScanPrizeVO.getVoByEntity(entity, null))
                .collect(Collectors.toList());
        return Result.ok().data(vos);
    }
    @Override
    public Result changeStatus(String id) {
        ScanPrize scanPrize = this.getById(id);
        if (scanPrize == null) {
            throw new ServiceException("当前店铺抽奖机会不存在");
        }
        String status = scanPrize.getStatus();
        if (StoreCouponStausEnum.ENABLE.name().equals(status)) {
            scanPrize.setStatus(StoreCouponStausEnum.DISABLE.name());
        }else if (StoreCouponStausEnum.DISABLE.name().equals(status)) {
            scanPrize.setStatus(StoreCouponStausEnum.ENABLE.name());
        }else {
            throw new ServiceException("当前店铺抽奖机会状态异常无法修改");
        }
        this.updateById(scanPrize);
        return Result.ok();
    }
    @Override
    public Result generateStorePrize(String id) {
        RLock redissonLock = redissonClient.getLock(STORE_PRIZE_GENERATE + id);
        try {
            redissonLock.lock();
            LambdaQueryWrapper<ScanPrize> forUpdate = Wrappers.<ScanPrize>lambdaQuery().eq(ScanPrize::getId, id).last("FOR UPDATE");
            ScanPrize scanPrize = this.getOne(forUpdate);
            if (scanPrize == null) {
                throw new ServiceException("当前店铺抽奖机会不存在无法生成");
            }
            if (!GenerateCouponStausEnum.NOT_GENERATE.name().equals( scanPrize.getGenerateStatus())) {
                throw new ServiceException("当前店铺抽奖机会状态异常无法生成");
            }
            //生成优惠卷
            Integer generateNum = scanPrize.getGenerateNum();
            if (generateNum == null) {
                throw new ServiceException("发行数量为空不能生成");
            }
            List<PrizeClaimRecord> prizeClaimRecords = new ArrayList<>();
            for (int i = 1; i <= generateNum; i++) {
                PrizeClaimRecord prizeClaimRecord = getStoreCouponSingle(scanPrize, i);
                prizeClaimRecords.add(prizeClaimRecord);
            }
            if (!prizeClaimRecords.isEmpty()) {
                prizeClaimRecordService.saveBatch(prizeClaimRecords);
            }
            //更新状态生成状态
            scanPrize.setGenerateStatus(GenerateCouponStausEnum.GENERATE.name());
            this.updateById(scanPrize);
            return Result.ok();
        }finally {
            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
                @Override
                public void afterCommit() {
                    if (redissonLock.isHeldByCurrentThread()) {
                        redissonLock.unlock();
                    }
                }
                @Override
                public void afterCompletion(int status) {
                    if (redissonLock.isHeldByCurrentThread()) {
                        redissonLock.unlock();
                    }
                }
            });
        }
    }
    private static PrizeClaimRecord getStoreCouponSingle(ScanPrize scanPrize, int i) {
        PrizeClaimRecord prizeClaimRecord = new PrizeClaimRecord();
        prizeClaimRecord.setStorePrizeId(scanPrize.getId());
        prizeClaimRecord.setStoreId(scanPrize.getStoreId());
        prizeClaimRecord.setStoreName(scanPrize.getStoreName());
        prizeClaimRecord.setPrizeActivityId(scanPrize.getPrizeActivityId());
        prizeClaimRecord.setPrizeActivityName(scanPrize.getPrizeActivityNmae());
        prizeClaimRecord.setClaimStatus(ClaimStatusEnum.NOT_CLAIM.name());
        prizeClaimRecord.setNo(String.format("%08d", i));
        prizeClaimRecord.setMaterial(MaterialStatusEnum.NOT_GENERATE.name());
        return prizeClaimRecord;
    }
}
framework/src/main/java/cn/lili/modules/lmk/service/impl/StorePrizeProofServiceImpl.java
New file
@@ -0,0 +1,119 @@
package cn.lili.modules.lmk.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import cn.lili.modules.lmk.domain.entity.StorePrizeProof;
import cn.lili.modules.lmk.mapper.StorePrizeProofMapper;
import cn.lili.modules.lmk.service.StorePrizeProofService;
import cn.lili.base.Result;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.lili.modules.lmk.domain.form.StorePrizeProofForm;
import cn.lili.modules.lmk.domain.vo.StorePrizeProofVO;
import cn.lili.modules.lmk.domain.query.StorePrizeProofQuery;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import cn.lili.utils.PageUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.util.Assert;
import java.util.List;
import java.util.stream.Collectors;
/**
 * 抽奖活动补录证明 服务实现类
 *
 * @author peng
 * @since 2025-09-30
 */
@Service
@RequiredArgsConstructor
public class StorePrizeProofServiceImpl extends ServiceImpl<StorePrizeProofMapper, StorePrizeProof> implements StorePrizeProofService {
    private final StorePrizeProofMapper storePrizeProofMapper;
    /**
     * 添加
     * @param form
     * @return
     */
    @Override
    public Result add(StorePrizeProofForm form) {
        StorePrizeProof entity = StorePrizeProofForm.getEntityByForm(form, null);
        baseMapper.insert(entity);
        return Result.ok("添加成功");
    }
    /**
     * 修改
     * @param form
     * @return
     */
    @Override
    public Result update(StorePrizeProofForm form) {
        StorePrizeProof entity = baseMapper.selectById(form.getId());
        // 为空抛IllegalArgumentException,做全局异常处理
        Assert.notNull(entity, "记录不存在");
        BeanUtils.copyProperties(form, entity);
        baseMapper.updateById(entity);
        return Result.ok("修改成功");
    }
    /**
     * 批量删除
     * @param ids
     * @return
     */
    @Override
    public Result remove(List<String> ids) {
        baseMapper.deleteBatchIds(ids);
        return Result.ok("删除成功");
    }
    /**
     * id删除
     * @param id
     * @return
     */
    @Override
    public Result removeById(String id) {
        baseMapper.deleteById(id);
        return Result.ok("删除成功");
    }
    /**
     * 分页查询
     * @param query
     * @return
     */
    @Override
    public Result page(StorePrizeProofQuery query) {
        IPage<StorePrizeProofVO> page = PageUtil.getPage(query, StorePrizeProofVO.class);
        baseMapper.getPage(page, query);
        return Result.ok().data(page.getRecords()).total(page.getTotal());
    }
    /**
     * 根据id查找
     * @param id
     * @return
     */
    @Override
    public Result detail(String id) {
        StorePrizeProofVO vo = baseMapper.getById(id);
        Assert.notNull(vo, "记录不存在");
        return Result.ok().data(vo);
    }
    /**
     * 列表
     * @return
     */
    @Override
    public Result all() {
        List<StorePrizeProof> entities = baseMapper.selectList(null);
        List<StorePrizeProofVO> vos = entities.stream()
                .map(entity -> StorePrizeProofVO.getVoByEntity(entity, null))
                .collect(Collectors.toList());
        return Result.ok().data(vos);
    }
}
framework/src/main/resources/mapper/lmk/PrizeClaimRecordMapper.xml
New file
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.lili.modules.lmk.mapper.PrizeClaimRecordMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="cn.lili.modules.lmk.domain.vo.PrizeClaimRecordVO">
        <id column="id" property="id"/>
        <result column="no" property="no" />
        <result column="store_id" property="storeId" />
        <result column="store_name" property="storeName" />
        <result column="prize_activity_id" property="prizeActivityId" />
        <result column="prize_activity_name" property="prizeActivityName" />
        <result column="user_id" property="userId" />
        <result column="nick_name" property="nickName" />
        <result column="claim_status" property="claimStatus" />
    </resultMap>
    <select id="getById" resultMap="BaseResultMap">
        SELECT
            LPCR.no,
            LPCR.store_id,
            LPCR.store_name,
            LPCR.prize_activity_id,
            LPCR.prize_activity_name,
            LPCR.user_id,
            LPCR.nick_name,
            LPCR.claim_status,
            LPCR.id
        FROM
            lmk_prize_claim_record LPCR
        WHERE
            LPCR.id = #{id} AND LPCR.delete_flag = 0
    </select>
    <select id="getPage" resultMap="BaseResultMap">
        SELECT
            LPCR.no,
            LPCR.store_id,
            LPCR.store_name,
            LPCR.prize_activity_id,
            LPCR.prize_activity_name,
            LPCR.user_id,
            LPCR.nick_name,
            LPCR.claim_status,
            LPCR.id
        FROM
            lmk_prize_claim_record LPCR
        WHERE
            LPCR.delete_flag = 0
    </select>
</mapper>
framework/src/main/resources/mapper/lmk/ScanPrizeMapper.xml
New file
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.lili.modules.lmk.mapper.ScanPrizeMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="cn.lili.modules.lmk.domain.vo.ScanPrizeVO">
        <id column="id" property="id"/>
        <result column="store_id" property="storeId" />
        <result column="store_name" property="storeName" />
        <result column="prize_activity_id" property="prizeActivityId" />
        <result column="prize_activity_nmae" property="prizeActivityNmae" />
        <result column="generate_status" property="generateStatus" />
        <result column="generate_num" property="generateNum" />
        <result column="claim_num" property="claimNum" />
        <result column="status" property="status" />
    </resultMap>
    <select id="getById" resultMap="BaseResultMap">
        SELECT
            LSP.store_id,
            LSP.store_name,
            LSP.prize_activity_id,
            LSP.prize_activity_nmae,
            LSP.generate_status,
            LSP.generate_num,
            LSP.claim_num,
            LSP.status,
            LSP.id
        FROM
            lmk_scan_prize LSP
        WHERE
            LSP.id = #{id} AND LSP.delete_flag = 0
    </select>
    <select id="getPage" resultMap="BaseResultMap">
        SELECT
            LSP.store_id,
            LSP.store_name,
            LSP.prize_activity_id,
            LSP.prize_activity_nmae,
            LSP.generate_status,
            LSP.generate_num,
            LSP.claim_num,
            LSP.status,
            LSP.id
        FROM
            lmk_scan_prize LSP
        WHERE
            LSP.delete_flag = 0
    </select>
</mapper>
framework/src/main/resources/mapper/lmk/StorePrizeProofMapper.xml
New file
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.lili.modules.lmk.mapper.StorePrizeProofMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="cn.lili.modules.lmk.domain.vo.StorePrizeProofVO">
        <id column="id" property="id"/>
        <result column="store_prize_claim_id" property="storePrizeClaimId" />
        <result column="url_path" property="urlPath" />
    </resultMap>
    <select id="getById" resultMap="BaseResultMap">
        SELECT
            LSPP.store_prize_claim_id,
            LSPP.url_path,
            LSPP.id
        FROM
            lmk_store_prize_proof LSPP
        WHERE
            LSPP.id = #{id} AND LSPP.delete_flag = 0
    </select>
    <select id="getPage" resultMap="BaseResultMap">
        SELECT
            LSPP.store_prize_claim_id,
            LSPP.url_path,
            LSPP.id
        FROM
            lmk_store_prize_proof LSPP
        WHERE
            LSPP.delete_flag = 0
    </select>
</mapper>
manager-api/src/main/java/cn/lili/controller/lmk/ScanPrizeController.java
New file
@@ -0,0 +1,98 @@
package cn.lili.controller.lmk;
import cn.lili.group.Update;
import cn.lili.group.Add;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import lombok.RequiredArgsConstructor;
import java.util.List;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotEmpty;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import cn.lili.modules.lmk.service.ScanPrizeService;
import cn.lili.base.Result;
import cn.lili.modules.lmk.domain.form.ScanPrizeForm;
import cn.lili.modules.lmk.domain.query.ScanPrizeQuery;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
/**
 * 店铺活动关联 前端控制器
 *
 * @author peng
 * @since 2025-09-30
 */
@Validated
@RequiredArgsConstructor
@Api(value = "店铺活动关联", tags = "店铺活动关联管理")
@RestController
@RequestMapping("/manager/lmk/scan-prize")
public class ScanPrizeController {
    private final ScanPrizeService scanPrizeService;
    @PutMapping
    @ApiOperation(value = "修改", notes = "修改")
    public Result update(@RequestBody @Validated(Update.class) ScanPrizeForm form) {
        return scanPrizeService.update(form);
    }
    @DeleteMapping("/{id}")
    @ApiOperation(value = "ID删除", notes = "ID删除")
    public Result removeById(@PathVariable("id") String id) {
        return scanPrizeService.removeById(id);
    }
    @DeleteMapping("/batch")
    @ApiOperation(value = "批量删除", notes = "批量删除")
    public Result remove(@RequestBody @NotEmpty(message = "请选择数据") List<String> ids) {
        return scanPrizeService.remove(ids);
    }
    @GetMapping("/page")
    @ApiOperation(value = "分页", notes = "分页")
    public Result page(ScanPrizeQuery query) {
        return scanPrizeService.page(query);
    }
    @GetMapping("/{id}")
    @ApiOperation(value = "详情", notes = "详情")
    public Result detail(@PathVariable("id") String id) {
        return scanPrizeService.detail(id);
    }
    @GetMapping("/list")
    @ApiOperation(value = "列表", notes = "列表")
    public Result list() {
        return scanPrizeService.all();
    }
    @PostMapping
    @ApiOperation(value = "添加", notes = "添加")
    public Result add(@RequestBody @Validated(Add.class) ScanPrizeForm form) {
        return scanPrizeService.add(form);
    }
    /**
     * 修改订单店铺抽奖机会状态
     * @param id
     * @return
     */
    @PostMapping("/changeStatus/{id}")
    public Result changeStatus(@PathVariable String id){
        return  scanPrizeService.changeStatus(id);
    }
    /**
     * 根据店铺关联关系生成单品
     * @param id
     * @return
     */
    @PostMapping("/generateStorePrize/{id}")
    public Result generateStorePrize(@PathVariable String id){
        return  scanPrizeService.generateStorePrize(id);
    }
}