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); } }