From 5041554e7bf313340dcb465a3149df4fba0e4119 Mon Sep 17 00:00:00 2001 From: peng <peng.com> Date: 星期二, 30 九月 2025 14:29:10 +0800 Subject: [PATCH] 店铺扫码抽奖功能 --- framework/src/main/java/cn/lili/modules/lmk/mapper/ScanPrizeMapper.java | 34 + framework/src/main/java/cn/lili/modules/lmk/domain/form/PrizeClaimRecordForm.java | 66 ++ framework/src/main/resources/mapper/lmk/StorePrizeProofMapper.xml | 41 + framework/src/main/java/cn/lili/modules/lmk/domain/form/ScanPrizeForm.java | 69 ++ framework/src/main/java/cn/lili/modules/lmk/enums/general/MaterialStatusEnum.java | 13 framework/src/main/java/cn/lili/modules/lmk/enums/general/GenerateStorePrizeStausEnum.java | 13 framework/src/main/java/cn/lili/modules/lmk/mapper/StorePrizeProofMapper.java | 34 + framework/src/main/java/cn/lili/modules/lmk/service/PrizeClaimRecordService.java | 65 ++ framework/src/main/java/cn/lili/modules/lmk/service/ScanPrizeService.java | 69 ++ framework/src/main/java/cn/lili/modules/lmk/domain/form/StorePrizeProofForm.java | 42 + framework/src/main/java/cn/lili/modules/lmk/enums/general/StoreScanPrizeStausEnum.java | 13 framework/src/main/java/cn/lili/modules/lmk/domain/entity/ScanPrize.java | 60 ++ framework/src/main/java/cn/lili/modules/lmk/service/StorePrizeProofService.java | 65 ++ framework/src/main/java/cn/lili/modules/lmk/domain/vo/ScanPrizeVO.java | 63 ++ framework/src/main/java/cn/lili/modules/lmk/domain/query/PrizeClaimRecordQuery.java | 22 manager-api/src/main/java/cn/lili/controller/lmk/ScanPrizeController.java | 98 +++ framework/src/main/resources/mapper/lmk/ScanPrizeMapper.xml | 59 ++ framework/src/main/java/cn/lili/modules/lmk/domain/entity/PrizeClaimRecord.java | 66 ++ framework/src/main/java/cn/lili/modules/lmk/mapper/PrizeClaimRecordMapper.java | 34 + framework/src/main/resources/mapper/lmk/PrizeClaimRecordMapper.xml | 59 ++ framework/src/main/java/cn/lili/modules/lmk/domain/query/StorePrizeProofQuery.java | 22 framework/src/main/java/cn/lili/modules/lmk/service/impl/ScanPrizeServiceImpl.java | 218 ++++++++ framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeClaimRecordServiceImpl.java | 119 ++++ framework/src/main/java/cn/lili/modules/lmk/domain/vo/StorePrizeProofVO.java | 39 + framework/src/main/java/cn/lili/modules/lmk/service/impl/StorePrizeProofServiceImpl.java | 119 ++++ framework/src/main/java/cn/lili/modules/lmk/domain/vo/PrizeClaimRecordVO.java | 63 ++ framework/src/main/java/cn/lili/modules/lmk/domain/query/ScanPrizeQuery.java | 22 framework/src/main/java/cn/lili/modules/lmk/domain/entity/StorePrizeProof.java | 30 + 28 files changed, 1,617 insertions(+), 0 deletions(-) diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/entity/PrizeClaimRecord.java b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/PrizeClaimRecord.java new file mode 100644 index 0000000..83b2e1e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/PrizeClaimRecord.java @@ -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; + + +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/entity/ScanPrize.java b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/ScanPrize.java new file mode 100644 index 0000000..2b88656 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/ScanPrize.java @@ -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; + + +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StorePrizeProof.java b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StorePrizeProof.java new file mode 100644 index 0000000..891752b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StorePrizeProof.java @@ -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") + /** 鎶藉娲诲姩棰嗗彇琛╥d */ + private String storePrizeClaimId; + + @TableField("url_path") + /** 闄勪欢鍦板潃 */ + private String urlPath; + + +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/form/PrizeClaimRecordForm.java b/framework/src/main/java/cn/lili/modules/lmk/domain/form/PrizeClaimRecordForm.java new file mode 100644 index 0000000..720c822 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/domain/form/PrizeClaimRecordForm.java @@ -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; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/form/ScanPrizeForm.java b/framework/src/main/java/cn/lili/modules/lmk/domain/form/ScanPrizeForm.java new file mode 100644 index 0000000..87e1a47 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/domain/form/ScanPrizeForm.java @@ -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; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/form/StorePrizeProofForm.java b/framework/src/main/java/cn/lili/modules/lmk/domain/form/StorePrizeProofForm.java new file mode 100644 index 0000000..95aa13e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/domain/form/StorePrizeProofForm.java @@ -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 = "鎶藉娲诲姩棰嗗彇琛╥d涓嶈兘涓虹┖", groups = {Add.class, Update.class}) + @ApiModelProperty("鎶藉娲诲姩棰嗗彇琛╥d") + 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; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/query/PrizeClaimRecordQuery.java b/framework/src/main/java/cn/lili/modules/lmk/domain/query/PrizeClaimRecordQuery.java new file mode 100644 index 0000000..330b3bc --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/domain/query/PrizeClaimRecordQuery.java @@ -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 { +} + diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/query/ScanPrizeQuery.java b/framework/src/main/java/cn/lili/modules/lmk/domain/query/ScanPrizeQuery.java new file mode 100644 index 0000000..8daa571 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/domain/query/ScanPrizeQuery.java @@ -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 { +} + diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/query/StorePrizeProofQuery.java b/framework/src/main/java/cn/lili/modules/lmk/domain/query/StorePrizeProofQuery.java new file mode 100644 index 0000000..e4911b6 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/domain/query/StorePrizeProofQuery.java @@ -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 { +} + diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/vo/PrizeClaimRecordVO.java b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/PrizeClaimRecordVO.java new file mode 100644 index 0000000..0cb71c7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/PrizeClaimRecordVO.java @@ -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; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/vo/ScanPrizeVO.java b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/ScanPrizeVO.java new file mode 100644 index 0000000..d9570bf --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/ScanPrizeVO.java @@ -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; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/vo/StorePrizeProofVO.java b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/StorePrizeProofVO.java new file mode 100644 index 0000000..b319fe7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/StorePrizeProofVO.java @@ -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 { + + /** 鎶藉娲诲姩棰嗗彇琛╥d */ + @ApiModelProperty("鎶藉娲诲姩棰嗗彇琛╥d") + 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; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/enums/general/GenerateStorePrizeStausEnum.java b/framework/src/main/java/cn/lili/modules/lmk/enums/general/GenerateStorePrizeStausEnum.java new file mode 100644 index 0000000..18d7756 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/enums/general/GenerateStorePrizeStausEnum.java @@ -0,0 +1,13 @@ +package cn.lili.modules.lmk.enums.general; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public enum GenerateStorePrizeStausEnum { + NOT_GENERATE("娌℃湁鐢熸垚"), + GENERATE("鐢熸垚"); + + private String des; + + +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/enums/general/MaterialStatusEnum.java b/framework/src/main/java/cn/lili/modules/lmk/enums/general/MaterialStatusEnum.java new file mode 100644 index 0000000..be48e56 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/enums/general/MaterialStatusEnum.java @@ -0,0 +1,13 @@ +package cn.lili.modules.lmk.enums.general; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public enum MaterialStatusEnum { + NOT_GENERATE("娌℃湁鐢熸垚"), + GENERATE("鐢熸垚"); + + private String des; + + +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/enums/general/StoreScanPrizeStausEnum.java b/framework/src/main/java/cn/lili/modules/lmk/enums/general/StoreScanPrizeStausEnum.java new file mode 100644 index 0000000..1ee2e0e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/enums/general/StoreScanPrizeStausEnum.java @@ -0,0 +1,13 @@ +package cn.lili.modules.lmk.enums.general; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public enum StoreScanPrizeStausEnum { + ENABLE("鍚敤"), + DISABLE("绂佺敤"); + + private String des; + + +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/mapper/PrizeClaimRecordMapper.java b/framework/src/main/java/cn/lili/modules/lmk/mapper/PrizeClaimRecordMapper.java new file mode 100644 index 0000000..0b79874 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/mapper/PrizeClaimRecordMapper.java @@ -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); + +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/mapper/ScanPrizeMapper.java b/framework/src/main/java/cn/lili/modules/lmk/mapper/ScanPrizeMapper.java new file mode 100644 index 0000000..e4e4169 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/mapper/ScanPrizeMapper.java @@ -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); + +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/mapper/StorePrizeProofMapper.java b/framework/src/main/java/cn/lili/modules/lmk/mapper/StorePrizeProofMapper.java new file mode 100644 index 0000000..413ed88 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/mapper/StorePrizeProofMapper.java @@ -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); + +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/PrizeClaimRecordService.java b/framework/src/main/java/cn/lili/modules/lmk/service/PrizeClaimRecordService.java new file mode 100644 index 0000000..179988f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/service/PrizeClaimRecordService.java @@ -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(); +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/ScanPrizeService.java b/framework/src/main/java/cn/lili/modules/lmk/service/ScanPrizeService.java new file mode 100644 index 0000000..925e543 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/service/ScanPrizeService.java @@ -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); +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/StorePrizeProofService.java b/framework/src/main/java/cn/lili/modules/lmk/service/StorePrizeProofService.java new file mode 100644 index 0000000..a2b2f3b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/service/StorePrizeProofService.java @@ -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(); +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeClaimRecordServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeClaimRecordServiceImpl.java new file mode 100644 index 0000000..eb80535 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeClaimRecordServiceImpl.java @@ -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()); + + // 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊 + 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); + } +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/ScanPrizeServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/ScanPrizeServiceImpl.java new file mode 100644 index 0000000..9e55bd0 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/ScanPrizeServiceImpl.java @@ -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()); + + // 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊 + 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; + } +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/StorePrizeProofServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/StorePrizeProofServiceImpl.java new file mode 100644 index 0000000..4c55b59 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/StorePrizeProofServiceImpl.java @@ -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()); + + // 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊 + 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); + } +} diff --git a/framework/src/main/resources/mapper/lmk/PrizeClaimRecordMapper.xml b/framework/src/main/resources/mapper/lmk/PrizeClaimRecordMapper.xml new file mode 100644 index 0000000..31743ee --- /dev/null +++ b/framework/src/main/resources/mapper/lmk/PrizeClaimRecordMapper.xml @@ -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> diff --git a/framework/src/main/resources/mapper/lmk/ScanPrizeMapper.xml b/framework/src/main/resources/mapper/lmk/ScanPrizeMapper.xml new file mode 100644 index 0000000..3ddcba9 --- /dev/null +++ b/framework/src/main/resources/mapper/lmk/ScanPrizeMapper.xml @@ -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> diff --git a/framework/src/main/resources/mapper/lmk/StorePrizeProofMapper.xml b/framework/src/main/resources/mapper/lmk/StorePrizeProofMapper.xml new file mode 100644 index 0000000..fcc03f2 --- /dev/null +++ b/framework/src/main/resources/mapper/lmk/StorePrizeProofMapper.xml @@ -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> diff --git a/manager-api/src/main/java/cn/lili/controller/lmk/ScanPrizeController.java b/manager-api/src/main/java/cn/lili/controller/lmk/ScanPrizeController.java new file mode 100644 index 0000000..1bd0e02 --- /dev/null +++ b/manager-api/src/main/java/cn/lili/controller/lmk/ScanPrizeController.java @@ -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); + } +} -- Gitblit v1.8.0