Browse Source

兑换码

zhangkaikai 1 year ago
parent
commit
0e5cce262c
32 changed files with 1154 additions and 15 deletions
  1. 87 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/CdKeyMgrController.java
  2. 2 0
      mp-common/src/main/java/com/qs/mp/common/enums/AsyncTaskTypeEnum.java
  3. 45 0
      mp-common/src/main/java/com/qs/mp/common/enums/CdKeyGroupGoodsTypeEnum.java
  4. 51 0
      mp-common/src/main/java/com/qs/mp/common/enums/CdKeyGroupStatusEnum.java
  5. 36 0
      mp-common/src/main/java/com/qs/mp/common/enums/CdKeyStatusEnum.java
  6. 46 0
      mp-common/src/main/java/com/qs/mp/common/enums/ValidityPeriodEnum.java
  7. 3 0
      mp-quartz/src/main/java/com/qs/mp/quartz/task/AsyncConsumeTask.java
  8. 71 0
      mp-service/src/main/java/com/qs/mp/admin/domain/CdKey.java
  9. 50 0
      mp-service/src/main/java/com/qs/mp/admin/domain/CdKeyExchange.java
  10. 103 0
      mp-service/src/main/java/com/qs/mp/admin/domain/CdKeyGroup.java
  11. 91 0
      mp-service/src/main/java/com/qs/mp/admin/domain/CdKeyGroupGoods.java
  12. 36 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/CdKeyCreateParam.java
  13. 32 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/CdKeyQueryParam.java
  14. 36 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/CdKeyGroupListVO.java
  15. 13 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/CdKeyExchangeMapper.java
  16. 13 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/CdKeyGroupGoodsMapper.java
  17. 13 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/CdKeyGroupMapper.java
  18. 13 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/CdKeyMapper.java
  19. 13 0
      mp-service/src/main/java/com/qs/mp/admin/service/ICdKeyExchangeService.java
  20. 13 0
      mp-service/src/main/java/com/qs/mp/admin/service/ICdKeyGroupGoodsService.java
  21. 27 0
      mp-service/src/main/java/com/qs/mp/admin/service/ICdKeyGroupService.java
  22. 13 0
      mp-service/src/main/java/com/qs/mp/admin/service/ICdKeyService.java
  23. 17 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/CdKeyExchangeServiceImpl.java
  24. 17 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/CdKeyGroupGoodsServiceImpl.java
  25. 183 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/CdKeyGroupServiceImpl.java
  26. 17 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/CdKeyServiceImpl.java
  27. 7 0
      mp-service/src/main/java/com/qs/mp/framework/service/IAsyncTaskService.java
  28. 15 15
      mp-service/src/main/java/com/qs/mp/framework/service/impl/AsyncTaskServiceImpl.java
  29. 19 0
      mp-service/src/main/resources/mapper/admin/CdKeyExchangeMapper.xml
  30. 24 0
      mp-service/src/main/resources/mapper/admin/CdKeyGroupGoodsMapper.xml
  31. 26 0
      mp-service/src/main/resources/mapper/admin/CdKeyGroupMapper.xml
  32. 22 0
      mp-service/src/main/resources/mapper/admin/CdKeyMapper.xml

+ 87 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/CdKeyMgrController.java

@@ -0,0 +1,87 @@
+package com.qs.mp.web.controller.api.admin;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.CdKeyGroup;
+import com.qs.mp.admin.domain.param.CdKeyCreateParam;
+import com.qs.mp.admin.domain.param.CdKeyQueryParam;
+import com.qs.mp.admin.domain.vo.CdKeyGroupListVO;
+import com.qs.mp.admin.service.ICdKeyGroupService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.web.controller.BaseController;
+import io.swagger.annotations.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-05-16 10:16 AM
+ **/
+@Api(tags = "兑换码管理API")
+@RestController
+@RequestMapping("/api/v1/mp/admin/CdKey/*")
+public class CdKeyMgrController extends BaseController {
+
+
+    @Autowired
+    ICdKeyGroupService cdKeyGroupService;
+
+
+    @ApiOperation("兑换码生成")
+    @PreAuthorize("@ss.hasPermi('business:cdKey:add')")
+    @PostMapping("/create")
+    public AjaxResult create(@Validated @RequestBody CdKeyCreateParam param) {
+        String groupId = cdKeyGroupService.createCdKeyGroup(param);
+        if (StringUtils.isNotBlank(groupId)) {
+            return AjaxResult.success();
+        }
+        return AjaxResult.error("生成兑换码失败");
+    }
+
+    @ApiOperation("查询所有兑换码组列表")
+    @PreAuthorize("@ss.hasPermi('business:cdKey:list')")
+    @PostMapping("/list")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "查询成功", response = CdKeyGroupListVO.class)
+    )
+    public TableDataInfo list(@RequestBody CdKeyQueryParam param) {
+
+        QueryWrapper<CdKeyGroup> queryWrapper = new QueryWrapper<>();
+
+        if (Objects.nonNull(param.getCreateTimeStart())&&Objects.nonNull(param.getCreateTimeEnd())) {
+            queryWrapper.between("created_time", param.getCreateTimeStart(), param.getCreateTimeEnd());
+        }
+
+        if (Objects.nonNull(param.getActiveTimeStart())&&Objects.nonNull(param.getActiveTimeEnd())) {
+            queryWrapper.between("activation_time", param.getActiveTimeStart(), param.getActiveTimeEnd());
+        }
+
+        if (Objects.nonNull(param.getMinCdKeyNum())&&Objects.nonNull(param.getMaxCdKeyNum())) {
+            queryWrapper.between("quantity", param.getMinCdKeyNum(), param.getMaxCdKeyNum());
+        }
+
+        if (Objects.nonNull(param.getChannelId())) {
+            queryWrapper.eq("channel_id", param.getChannelId());
+        }
+
+        if (Objects.nonNull(param.getStatus())) {
+            queryWrapper.eq("status", param.getStatus());
+        }
+
+        queryWrapper.orderByDesc("FIELD(`status`,'waiting','nonactivated','activated','invalid')");
+        queryWrapper.orderByDesc("created_time");
+
+        startPage();
+        List<CdKeyGroup> list = cdKeyGroupService.list(queryWrapper);
+        return getDataTable(list);
+    }
+}

+ 2 - 0
mp-common/src/main/java/com/qs/mp/common/enums/AsyncTaskTypeEnum.java

@@ -17,6 +17,8 @@ public enum AsyncTaskTypeEnum implements IEnum<Integer> {
     CARD_ORDER_DELIVER(4, "卡密订单自动发货"),
     CARD_ORDER_DELIVER(4, "卡密订单自动发货"),
 
 
     NEW_USER_SEND_COUPON(5, "新用户发券"),
     NEW_USER_SEND_COUPON(5, "新用户发券"),
+
+    CD_KET_GENERATE(6, "兑换码生成任务"),
     ;
     ;
 
 
     private Integer value;
     private Integer value;

+ 45 - 0
mp-common/src/main/java/com/qs/mp/common/enums/CdKeyGroupGoodsTypeEnum.java

@@ -0,0 +1,45 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ * 兑换码关联商品枚举类
+ * @author zhangkaikai
+ * @create 2023-05-16 3:03 PM
+ **/
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum CdKeyGroupGoodsTypeEnum implements IEnum<String> {
+
+    GOODS("goods", "商品"),
+    COUPON("coupon", "优惠券"),
+    COUPON_PKG("coupon_pkg", "优惠券包"),
+    COIN("coin", "盲豆");
+
+    private final String value;
+    private final String desc;
+
+    CdKeyGroupGoodsTypeEnum(String value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * 重写toString,单个转化成json
+     * @return
+     */
+    @Override
+    public String toString() {
+        JSONObject object = new JSONObject();
+        object.put("value",value);
+        object.put("desc", desc);
+        return object.toString();
+    }
+}

+ 51 - 0
mp-common/src/main/java/com/qs/mp/common/enums/CdKeyGroupStatusEnum.java

@@ -0,0 +1,51 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-05-16 5:34 PM
+ **/
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum CdKeyGroupStatusEnum implements IEnum<String> {
+
+    WAITING("waiting", "待生成"),
+
+    DOING("doing", "生成中"),
+    NONACTIVATED("nonactivated", "未激活"),
+
+    ACTIVATED("activated", "已激活"),
+
+    INVALID("invalid", "已失效"),
+    ;
+
+    private final String value;
+    private final String desc;
+
+
+    CdKeyGroupStatusEnum(String value, String desc) {
+        this.value = value;
+        this.desc = desc;
+
+    }
+
+
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    @Override
+    public String toString() {
+        return "CdKeyGroupStatusEnum{" +
+                "value='" + value + '\'' +
+                ", desc='" + desc + '\'' +
+                '}';
+    }
+}

+ 36 - 0
mp-common/src/main/java/com/qs/mp/common/enums/CdKeyStatusEnum.java

@@ -0,0 +1,36 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-05-17 9:22 AM
+ **/
+
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum CdKeyStatusEnum implements IEnum<Integer> {
+
+    UNCASHED(0, "未兑"),
+    CASHED(1, "已兑"),
+    ;
+
+
+    private final Integer value;
+    private final String desc;
+
+    @Override
+    public Integer getValue() {
+        return value;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    CdKeyStatusEnum(Integer value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+}

+ 46 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ValidityPeriodEnum.java

@@ -0,0 +1,46 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-05-16 5:05 PM
+ **/
+
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum ValidityPeriodEnum implements IEnum<String> {
+
+    THREEMONTHS("threeMoths","三个月"),
+    SIXMONTHS("sixMonths","六个月"),
+    FOREVER("forever", "永久"),
+
+
+    ;
+
+    private final String value;
+    private final String desc;
+
+    ValidityPeriodEnum(String value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    @Override
+    public String toString() {
+        return "ValidityPeriodEnum{" +
+                "value='" + value + '\'' +
+                ", desc='" + desc + '\'' +
+                '}';
+    }
+}

+ 3 - 0
mp-quartz/src/main/java/com/qs/mp/quartz/task/AsyncConsumeTask.java

@@ -84,6 +84,9 @@ public class AsyncConsumeTask {
         } else if (AsyncTaskTypeEnum.NEW_USER_SEND_COUPON.getValue().equals(asyncTask.getType())) {
         } else if (AsyncTaskTypeEnum.NEW_USER_SEND_COUPON.getValue().equals(asyncTask.getType())) {
             // 新人发优惠券任务
             // 新人发优惠券任务
             asyncTaskService.sendNewUserCoupon(asyncTask);
             asyncTaskService.sendNewUserCoupon(asyncTask);
+        } else if(AsyncTaskTypeEnum.CD_KET_GENERATE.getValue().equals(asyncTask.getType())){
+            // 生成兑换码相关任务
+            asyncTaskService.cdKeyGenerate(asyncTask);
         } else {
         } else {
             // 都没匹配到则忽略不处理任务
             // 都没匹配到则忽略不处理任务
             return;
             return;

+ 71 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/CdKey.java

@@ -0,0 +1,71 @@
+package com.qs.mp.admin.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+
+/**
+ * @describe 兑换码实体类
+ * @auther quanshu
+ * @create 2023-05-16 17:20:42
+ */
+@TableName("mp_cd_key")
+@Data
+public class CdKey implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+        /**
+     * 主键
+     */
+         @TableId(value = "key_id", type = IdType.INPUT)
+    private String keyId;
+
+        /**
+     * 兑换码组id
+     */
+         @TableField("group_id")
+    private String groupId;
+
+        /**
+     * 关联商品id
+     */
+         @TableField("ref_id")
+    private String refId;
+
+        /**
+     * 商品类型 goods 实物商品 coupon优惠券 coin平台代币 coupon_pkg券包
+     */
+         @TableField("type")
+    private String type;
+
+        /**
+     * 商品图片
+     */
+         @TableField("pic_url")
+    private String picUrl;
+
+        /**
+     * 兑换码状态 0未兑,1已兑
+     */
+         @TableField("status")
+    private Integer status;
+
+        /**
+     * 兑换码
+     */
+         @TableField("cd_key")
+    private String cdKey;
+
+        /**
+     * 创建时间
+     */
+         @TableField("create_time")
+    private Date createTime;
+
+
+}

+ 50 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/CdKeyExchange.java

@@ -0,0 +1,50 @@
+package com.qs.mp.admin.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+
+/**
+ * @describe 兑换码兑换表实体类
+ * @auther quanshu
+ * @create 2023-05-16 17:21:23
+ */
+@TableName("mp_cd_key_exchange")
+@Data
+public class CdKeyExchange implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+        /**
+     * 兑换码组id
+     */
+         @TableField("group_id")
+    private String groupId;
+
+        /**
+     * 兑换码id
+     */
+         @TableField("key_id")
+    private String keyId;
+
+        /**
+     * 用户id
+     */
+         @TableField("user_id")
+    private Long userId;
+
+        /**
+     * 兑换时间
+     */
+         @TableField("exchange_time")
+    private Date exchangeTime;
+
+
+}

+ 103 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/CdKeyGroup.java

@@ -0,0 +1,103 @@
+package com.qs.mp.admin.domain;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.*;
+import com.qs.mp.common.enums.ValidityPeriodEnum;
+import lombok.Data;
+import org.apache.pulsar.shade.io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @describe 兑换码组实体类
+ * @auther quanshu
+ * @create 2023-05-16 17:19:30
+ */
+@TableName("mp_cd_key_group")
+@Data
+public class CdKeyGroup implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+        /**
+     * 主键
+     */
+         @TableId(value = "group_id", type = IdType.INPUT)
+    private String groupId;
+
+        /**
+     * 渠道id
+     */
+         @TableField("channel_id")
+    private Long channelId;
+
+        /**
+     * 门店名称
+     */
+         @TableField("site_name")
+    private String siteName;
+
+        /**
+     * 兑换码数量
+     */
+         @TableField("quantity")
+    private Integer quantity;
+
+        /**
+     * 已兑数量
+     */
+         @TableField("cashed_qty")
+    private Integer cashedQty;
+
+        /**
+     * 未兑数量
+     */
+         @TableField("remain_qty")
+    private Integer remainQty;
+
+        /**
+     * 状态,未激活nonactivated/已激活activated/已失效invalid
+     */
+         @TableField("status")
+    private String status;
+
+        /**
+     * 有效期,三个月threeMonths/六个月sixMonths/forever永久
+     */
+         @TableField("validity_period")
+         private String validityPeriod;
+
+        /**
+     * 创建时间
+     */
+         @TableField("created_time")
+    private Date createdTime;
+
+        /**
+     * 更新时间
+     */
+         @TableField("updated_time")
+    private Date updatedTime;
+
+        /**
+     * 激活时间
+     */
+         @TableField("activation_time")
+    private Date activationTime;
+
+        /**
+     * 逻辑删除标识
+     */
+         @TableField("is_deleted")
+    @TableLogic
+    private Integer isDeleted;
+
+
+}

+ 91 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/CdKeyGroupGoods.java

@@ -0,0 +1,91 @@
+package com.qs.mp.admin.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+
+/**
+ * @describe 兑换码关联商品表实体类
+ * @auther quanshu
+ * @create 2023-05-16 17:21:06
+ */
+@TableName("mp_cd_key_group_goods")
+@Data
+public class CdKeyGroupGoods implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+        /**
+     * 主键
+     */
+         @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+        /**
+     * 兑换码组id
+     */
+         @TableField("group_id")
+    private String groupId;
+
+        /**
+     * 商品名称
+     */
+         @TableField("title")
+    private String title;
+
+        /**
+     * 商品图片
+     */
+         @TableField("pic_url")
+    private String picUrl;
+
+        /**
+     * 商品类型 goods 实物商品 coupon优惠券 coin平台代币 coupon_pkg券包
+     */
+         @TableField("type")
+    private String type;
+
+        /**
+     * 商品关联id
+     */
+         @TableField("ref_id")
+    private String refId;
+
+        /**
+     * 商品价值
+     */
+         @TableField("value")
+    private Integer value;
+
+        /**
+     * 逻辑删除标识
+     */
+         @TableField("is_deleted")
+    @TableLogic
+    private Integer isDeleted;
+
+        /**
+     * 创建时间
+     */
+         @TableField("create_time")
+    private Date createTime;
+
+        /**
+     * 更新时间
+     */
+         @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 关联商品数量
+     */
+    @TableField("quantity")
+    private Integer quantity;
+
+
+}

+ 36 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/CdKeyCreateParam.java

@@ -0,0 +1,36 @@
+package com.qs.mp.admin.domain.param;
+
+import com.qs.mp.admin.domain.CdKeyGroupGoods;
+import com.qs.mp.common.enums.ValidityPeriodEnum;
+import lombok.Data;
+import org.apache.pulsar.shade.io.swagger.annotations.ApiModel;
+import org.apache.pulsar.shade.io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-05-16 10:31 AM
+ **/
+@ApiModel(value = "兑换码生成参数")
+@Data
+public class CdKeyCreateParam {
+
+    @ApiModelProperty(value = "渠道id", required = true)
+    private Long channelId;
+
+    @ApiModelProperty(value = "门店名称", required = true)
+    private String siteName;
+
+    @NotNull(message = "数量不能为空")
+    @ApiModelProperty(value = "数量", required = true)
+    private Integer quantity;
+
+    @NotNull(message = "有效期不能为空")
+    @ApiModelProperty(value = "有效期", required = true)
+    private ValidityPeriodEnum type;
+
+    @ApiModelProperty(value = "兑换码关联商品")
+    private List<CdKeyGroupGoods> goodsList;
+}

+ 32 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/CdKeyQueryParam.java

@@ -0,0 +1,32 @@
+package com.qs.mp.admin.domain.param;
+
+import lombok.Data;
+import org.apache.pulsar.shade.io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-05-17 9:43 AM
+ **/
+
+@Data
+public class CdKeyQueryParam {
+
+    @ApiModelProperty("创建开始时间")
+    private Data createTimeStart;
+    @ApiModelProperty("创建结束时间")
+    private Data createTimeEnd;
+    @ApiModelProperty("激活开始时间")
+    private Data activeTimeStart;
+    @ApiModelProperty("激活结束时间")
+    private Data activeTimeEnd;
+    @ApiModelProperty("最小兑换码数量")
+    private Integer minCdKeyNum;
+    @ApiModelProperty("最大兑换码数量")
+    private Integer maxCdKeyNum;
+    @ApiModelProperty("门店id")
+    private Long channelId;
+    @ApiModelProperty("门店名称")
+    private String siteName;
+    @ApiModelProperty("状态")
+    private Integer status;
+}

+ 36 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/CdKeyGroupListVO.java

@@ -0,0 +1,36 @@
+package com.qs.mp.admin.domain.vo;
+
+import lombok.Data;
+import org.apache.pulsar.shade.io.swagger.annotations.ApiModel;
+import org.apache.pulsar.shade.io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-05-17 12:26 AM
+ **/
+
+@ApiModel("兑换码组列表出参类")
+@Data
+public class CdKeyGroupListVO {
+
+    @ApiModelProperty("兑换码组id")
+    private String groupId;
+
+    @ApiModelProperty("兑换码数量")
+    private Integer quantity;
+
+    @ApiModelProperty("门店名称")
+    private String siteName;
+
+    @ApiModelProperty("添加时间")
+    private Date createTime;
+
+    @ApiModelProperty("激活时间")
+    private Date activeTime;
+
+    @ApiModelProperty("状态")
+    private String status;
+
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/admin/mapper/CdKeyExchangeMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.admin.mapper;
+
+import com.qs.mp.admin.domain.CdKeyExchange;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2023-05-16 17:21:23
+ * @describe 兑换码兑换表mapper类
+ */
+public interface CdKeyExchangeMapper extends BaseMapper<CdKeyExchange> {
+
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/admin/mapper/CdKeyGroupGoodsMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.admin.mapper;
+
+import com.qs.mp.admin.domain.CdKeyGroupGoods;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2023-05-16 17:21:06
+ * @describe 兑换码关联商品表mapper类
+ */
+public interface CdKeyGroupGoodsMapper extends BaseMapper<CdKeyGroupGoods> {
+
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/admin/mapper/CdKeyGroupMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.admin.mapper;
+
+import com.qs.mp.admin.domain.CdKeyGroup;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2023-05-16 17:19:30
+ * @describe 兑换码组mapper类
+ */
+public interface CdKeyGroupMapper extends BaseMapper<CdKeyGroup> {
+
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/admin/mapper/CdKeyMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.admin.mapper;
+
+import com.qs.mp.admin.domain.CdKey;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2023-05-16 17:20:42
+ * @describe 兑换码mapper类
+ */
+public interface CdKeyMapper extends BaseMapper<CdKey> {
+
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/admin/service/ICdKeyExchangeService.java

@@ -0,0 +1,13 @@
+package com.qs.mp.admin.service;
+
+import com.qs.mp.admin.domain.CdKeyExchange;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @auther quanshu
+ * @create 2023-05-16 17:21:23
+ * @describe 兑换码兑换表服务类
+ */
+public interface ICdKeyExchangeService extends IService<CdKeyExchange> {
+
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/admin/service/ICdKeyGroupGoodsService.java

@@ -0,0 +1,13 @@
+package com.qs.mp.admin.service;
+
+import com.qs.mp.admin.domain.CdKeyGroupGoods;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @auther quanshu
+ * @create 2023-05-16 17:21:06
+ * @describe 兑换码关联商品表服务类
+ */
+public interface ICdKeyGroupGoodsService extends IService<CdKeyGroupGoods> {
+
+}

+ 27 - 0
mp-service/src/main/java/com/qs/mp/admin/service/ICdKeyGroupService.java

@@ -0,0 +1,27 @@
+package com.qs.mp.admin.service;
+
+import com.qs.mp.admin.domain.CdKeyGroup;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.admin.domain.param.CdKeyCreateParam;
+
+/**
+ * @auther quanshu
+ * @create 2023-05-16 17:19:30
+ * @describe 兑换码组服务类
+ */
+public interface ICdKeyGroupService extends IService<CdKeyGroup> {
+
+
+    /**
+     * 生成兑换码组
+     * @param param
+     * @return
+     */
+    String createCdKeyGroup(CdKeyCreateParam param);
+
+    /**
+     * 生成兑换码
+     * @param groupId
+     */
+    void generateCdKey(String groupId);
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/admin/service/ICdKeyService.java

@@ -0,0 +1,13 @@
+package com.qs.mp.admin.service;
+
+import com.qs.mp.admin.domain.CdKey;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @auther quanshu
+ * @create 2023-05-16 17:20:42
+ * @describe 兑换码服务类
+ */
+public interface ICdKeyService extends IService<CdKey> {
+
+}

+ 17 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/CdKeyExchangeServiceImpl.java

@@ -0,0 +1,17 @@
+package com.qs.mp.admin.service.impl;
+
+import com.qs.mp.admin.domain.CdKeyExchange;
+import com.qs.mp.admin.mapper.CdKeyExchangeMapper;
+import com.qs.mp.admin.service.ICdKeyExchangeService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * @auther quanshu
+ * @create 2023-05-16 17:21:23
+ * @describe 兑换码兑换表服务实现类
+ */
+@Service
+public class CdKeyExchangeServiceImpl extends ServiceImpl<CdKeyExchangeMapper, CdKeyExchange> implements ICdKeyExchangeService {
+
+}

+ 17 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/CdKeyGroupGoodsServiceImpl.java

@@ -0,0 +1,17 @@
+package com.qs.mp.admin.service.impl;
+
+import com.qs.mp.admin.domain.CdKeyGroupGoods;
+import com.qs.mp.admin.mapper.CdKeyGroupGoodsMapper;
+import com.qs.mp.admin.service.ICdKeyGroupGoodsService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * @auther quanshu
+ * @create 2023-05-16 17:21:06
+ * @describe 兑换码关联商品表服务实现类
+ */
+@Service
+public class CdKeyGroupGoodsServiceImpl extends ServiceImpl<CdKeyGroupGoodsMapper, CdKeyGroupGoods> implements ICdKeyGroupGoodsService {
+
+}

+ 183 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/CdKeyGroupServiceImpl.java

@@ -0,0 +1,183 @@
+package com.qs.mp.admin.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.qs.mp.admin.domain.*;
+import com.qs.mp.admin.domain.param.CdKeyCreateParam;
+import com.qs.mp.admin.mapper.CdKeyGroupMapper;
+import com.qs.mp.admin.service.*;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.common.constant.Constants;
+import com.qs.mp.common.enums.*;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.framework.service.IAsyncTaskService;
+import com.qs.mp.system.service.id.BizIdGenerator;
+import ma.glasnost.orika.MapperFacade;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @auther quanshu
+ * @create 2023-05-16 17:19:30
+ * @describe 兑换码组服务实现类
+ */
+@Service
+public class CdKeyGroupServiceImpl extends ServiceImpl<CdKeyGroupMapper, CdKeyGroup> implements ICdKeyGroupService {
+
+    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    @Autowired
+    private MapperFacade mapperFacade;
+
+    @Autowired
+    private BizIdGenerator bizIdGenerator;
+
+    @Autowired
+    private IGoodsService goodsService;
+
+    @Autowired
+    private ICouponService couponService;
+
+    @Autowired
+    private ICouponPkgService couponPkgService;
+
+    @Autowired
+    private ICdKeyGroupGoodsService cdKeyGroupGoodsService;
+
+    @Autowired
+    private ICdKeyService cdKeyService;
+
+    @Autowired
+    private IAsyncTaskService asyncTaskService;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String createCdKeyGroup(CdKeyCreateParam param) {
+
+        // 生成兑换码组
+        CdKeyGroup cdKeyGroup = mapperFacade.map(param, CdKeyGroup.class);
+        cdKeyGroup.setGroupId(bizIdGenerator.newId());
+        cdKeyGroup.setStatus(CdKeyGroupStatusEnum.WAITING.getValue());
+        cdKeyGroup.setCreatedTime(new Date());
+        cdKeyGroup.setUpdatedTime(new Date());
+        this.save(cdKeyGroup);
+
+
+        // 关联商品
+        if (CollectionUtils.isNotEmpty(param.getGoodsList())) {
+            List<CdKeyGroupGoods> cdKeyGroupGoodsList = new ArrayList<>();
+            // 设置groupId和商品信息
+            for (CdKeyGroupGoods cdKeyGroupGoods : param.getGoodsList()) {
+                CdKeyGroupGoods groupGoods = new CdKeyGroupGoods();
+                BeanUtils.copyProperties(cdKeyGroupGoods, groupGoods);
+                groupGoods.setGroupId(cdKeyGroup.getGroupId());
+                if (CdKeyGroupGoodsTypeEnum.COUPON.getValue().equals(cdKeyGroupGoods.getType())) {
+                    Coupon coupon = couponService.getById(groupGoods.getRefId());
+                    if (coupon == null) {
+                        LogUtil.error(logger,"关联优惠券信息不存在,groupId:{0}", cdKeyGroup.getGroupId());
+                        throw new ServiceException("关联优惠券信息不存在");
+                    }
+                    groupGoods.setTitle(coupon.getTitle());
+                    groupGoods.setPicUrl(coupon.getPicUrl());
+                    groupGoods.setValue(coupon.getDiscount());
+                    groupGoods.setQuantity(cdKeyGroupGoods.getQuantity());
+                } else if (CdKeyGroupGoodsTypeEnum.COUPON_PKG.getValue().equals(cdKeyGroupGoods.getType())) {
+                    CouponPkg couponPkg = couponPkgService.getById(groupGoods.getRefId());
+                    if (couponPkg == null) {
+                        LogUtil.error(logger,"关联券包信息不存在,groupId:{0}", cdKeyGroup.getGroupId());
+                        throw new ServiceException("关联券包信息不存在");
+                    }
+                    groupGoods.setTitle(couponPkg.getTitle());
+                    groupGoods.setPicUrl(couponPkg.getPicUrl());
+                    groupGoods.setValue(couponPkg.getFacePrice());
+                    groupGoods.setQuantity(cdKeyGroupGoods.getQuantity());
+                } else if (CdKeyGroupGoodsTypeEnum.GOODS.getValue().equals(cdKeyGroupGoods.getType())) {
+                    Goods goods = goodsService.getById(cdKeyGroupGoods.getRefId());
+                    if (goods == null) {
+                        LogUtil.error(logger, "关联商品信息不存在,groupId:{0}", cdKeyGroup.getGroupId());
+                        throw new ServiceException("关联商品信息不存在");
+                    }
+                    groupGoods.setTitle(goods.getTitle());
+                    groupGoods.setPicUrl(goods.getPicUrl());
+                    groupGoods.setValue(goods.getValue());
+                    groupGoods.setQuantity(cdKeyGroupGoods.getQuantity());
+                } else {
+                    groupGoods.setTitle("盲豆");
+                    groupGoods.setPicUrl(Constants.MANGDOU_PIC);
+                    groupGoods.setQuantity(cdKeyGroupGoods.getQuantity());
+                }
+                cdKeyGroupGoodsList.add(groupGoods);
+            }
+            if (CollectionUtils.isNotEmpty(cdKeyGroupGoodsList)) {
+                cdKeyGroupGoodsService.saveBatch(cdKeyGroupGoodsList);
+            }
+        }
+
+        if (StringUtils.isNotBlank(cdKeyGroup.getGroupId())) {
+            // 插入兑换码生成异步任务
+            Assert.isTrue(asyncTaskService.insertAsyncTask(AsyncTaskTypeEnum.CD_KET_GENERATE, cdKeyGroup.getGroupId())
+                    , "兑换码组保存,创建异步任务失败.groupId:" + cdKeyGroup.getGroupId());
+        }
+        return cdKeyGroup.getGroupId();
+    }
+
+    @Override
+    public void generateCdKey(String groupId) {
+        QueryWrapper<CdKeyGroupGoods> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("group_id", groupId);
+        List<CdKeyGroupGoods> list = cdKeyGroupGoodsService.list(queryWrapper);
+        List<CdKey> cdKeyList = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(list)) {
+            for (CdKeyGroupGoods cdKeyGroupGoods : list) {
+                for (int i = 0; i < cdKeyGroupGoods.getQuantity(); i++) {
+                    // 为每一个商品生成兑换码
+                    CdKey cdKey = new CdKey();
+                    cdKey.setCdKey(bizIdGenerator.newId());
+                    cdKey.setGroupId(groupId);
+                    cdKey.setRefId(cdKeyGroupGoods.getRefId());
+                    cdKey.setType(cdKeyGroupGoods.getType());
+                    cdKey.setPicUrl(cdKeyGroupGoods.getPicUrl());
+                    cdKey.setStatus(CdKeyStatusEnum.UNCASHED.getValue());
+                    cdKey.setCdKey(cdKeyGenerate());
+                    cdKey.setCreateTime(new Date());
+                    cdKeyList.add(cdKey);
+                }
+                cdKeyService.saveBatch(cdKeyList);
+            }
+        }
+
+        boolean rst = update(new LambdaUpdateWrapper<CdKeyGroup>()
+                .set(CdKeyGroup::getStatus, CdKeyGroupStatusEnum.NONACTIVATED.getValue())
+                .eq(CdKeyGroup::getGroupId, groupId));
+
+        Assert.isTrue(rst, "兑换码生成完,兑换码组更新失败,groupId:{0}" + groupId);
+
+    }
+
+    private String cdKeyGenerate() {
+        // 生成16位大写字母和数字的随机卡密码的逻辑
+        // 可以使用随机数生成器或者其他方式实现
+        String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+        StringBuilder codeBuilder = new StringBuilder();
+        for (int i = 0; i < 16; i++) {
+            int randomIndex = (int) (Math.random() * characters.length());
+            codeBuilder.append(characters.charAt(randomIndex));
+        }
+        return codeBuilder.toString();
+    }
+
+
+}

+ 17 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/CdKeyServiceImpl.java

@@ -0,0 +1,17 @@
+package com.qs.mp.admin.service.impl;
+
+import com.qs.mp.admin.domain.CdKey;
+import com.qs.mp.admin.mapper.CdKeyMapper;
+import com.qs.mp.admin.service.ICdKeyService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * @auther quanshu
+ * @create 2023-05-16 17:20:42
+ * @describe 兑换码服务实现类
+ */
+@Service
+public class CdKeyServiceImpl extends ServiceImpl<CdKeyMapper, CdKey> implements ICdKeyService {
+
+}

+ 7 - 0
mp-service/src/main/java/com/qs/mp/framework/service/IAsyncTaskService.java

@@ -51,4 +51,11 @@ public interface IAsyncTaskService extends IService<AsyncTask> {
      * @param asyncTask
      * @param asyncTask
      */
      */
     void sendNewUserCoupon(AsyncTask asyncTask);
     void sendNewUserCoupon(AsyncTask asyncTask);
+
+    /**
+     * 兑换码生成任务
+     * @param asyncTask
+     */
+    void cdKeyGenerate(AsyncTask asyncTask);
+
 }
 }

+ 15 - 15
mp-service/src/main/java/com/qs/mp/framework/service/impl/AsyncTaskServiceImpl.java

@@ -4,21 +4,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.qs.mp.admin.domain.Coupon;
-import com.qs.mp.admin.domain.Goods;
-import com.qs.mp.admin.domain.GoodsCard;
-import com.qs.mp.admin.domain.Ticket;
-import com.qs.mp.admin.domain.TicketBox;
-import com.qs.mp.admin.domain.TicketBoxGoods;
-import com.qs.mp.admin.domain.TicketPackage;
-import com.qs.mp.admin.service.ICouponPkgService;
-import com.qs.mp.admin.service.ICouponService;
-import com.qs.mp.admin.service.IGoodsCardService;
-import com.qs.mp.admin.service.IGoodsService;
-import com.qs.mp.admin.service.ITicketBoxGoodsService;
-import com.qs.mp.admin.service.ITicketBoxService;
-import com.qs.mp.admin.service.ITicketPackageService;
-import com.qs.mp.admin.service.ITicketService;
+import com.qs.mp.admin.domain.*;
+import com.qs.mp.admin.service.*;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.service.IChannelOrderService;
 import com.qs.mp.channel.service.IChannelOrderService;
 import com.qs.mp.channel.service.IChannelUserRelService;
 import com.qs.mp.channel.service.IChannelUserRelService;
@@ -124,6 +111,8 @@ public class AsyncTaskServiceImpl extends ServiceImpl<AsyncTaskMapper, AsyncTask
     @Autowired
     @Autowired
     private ISysUserService sysUserService;
     private ISysUserService sysUserService;
 
 
+    @Autowired
+    private ICdKeyGroupService  cdKeyGroupService;
 
 
     @Override
     @Override
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
@@ -315,5 +304,16 @@ public class AsyncTaskServiceImpl extends ServiceImpl<AsyncTaskMapper, AsyncTask
 
 
     }
     }
 
 
+    @Override
+    public void cdKeyGenerate(AsyncTask asyncTask) {
+        String groupId = asyncTask.getBizId();
+        CdKeyGroup cdKeyGroup = cdKeyGroupService.getById(groupId);
+        if (!CdKeyGroupStatusEnum.WAITING.getValue().equals(cdKeyGroup.getStatus())) {
+            LogUtil.error(logger, "收到兑换码生成任务,码组状态不是待生成,忽略任务。groupId=" + groupId);
+            return;
+        }
+        cdKeyGroupService.generateCdKey(groupId);
+    }
+
 
 
 }
 }

+ 19 - 0
mp-service/src/main/resources/mapper/admin/CdKeyExchangeMapper.xml

@@ -0,0 +1,19 @@
+<?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="com.qs.mp.admin.mapper.CdKeyExchangeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.admin.domain.CdKeyExchange">
+        <id column="id" property="id" />
+        <result column="group_id" property="groupId" />
+        <result column="key_id" property="keyId" />
+        <result column="user_id" property="userId" />
+        <result column="exchange_time" property="exchangeTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, group_id, key_id, user_id, exchange_time
+    </sql>
+
+</mapper>

+ 24 - 0
mp-service/src/main/resources/mapper/admin/CdKeyGroupGoodsMapper.xml

@@ -0,0 +1,24 @@
+<?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="com.qs.mp.admin.mapper.CdKeyGroupGoodsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.admin.domain.CdKeyGroupGoods">
+        <id column="id" property="id" />
+        <result column="group_id" property="groupId" />
+        <result column="title" property="title" />
+        <result column="pic_url" property="picUrl" />
+        <result column="type" property="type" />
+        <result column="ref_id" property="refId" />
+        <result column="value" property="value" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, group_id, title, pic_url, type, ref_id, value, is_deleted, create_time, update_time
+    </sql>
+
+</mapper>

+ 26 - 0
mp-service/src/main/resources/mapper/admin/CdKeyGroupMapper.xml

@@ -0,0 +1,26 @@
+<?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="com.qs.mp.admin.mapper.CdKeyGroupMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.admin.domain.CdKeyGroup">
+        <id column="group_id" property="groupId" />
+        <result column="channel_id" property="channelId" />
+        <result column="site_name" property="siteName" />
+        <result column="quantity" property="quantity" />
+        <result column="cashed_qty" property="cashedQty" />
+        <result column="remain_qty" property="remainQty" />
+        <result column="status" property="status" />
+        <result column="validity_period" property="validityPeriod" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="activation_time" property="activationTime" />
+        <result column="is_deleted" property="isDeleted" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        group_id, channel_id, site_name, quantity, cashed_qty, remain_qty, status, validity_period, created_time, updated_time, activation_time, is_deleted
+    </sql>
+
+</mapper>

+ 22 - 0
mp-service/src/main/resources/mapper/admin/CdKeyMapper.xml

@@ -0,0 +1,22 @@
+<?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="com.qs.mp.admin.mapper.CdKeyMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.admin.domain.CdKey">
+        <id column="key_id" property="keyId" />
+        <result column="group_id" property="groupId" />
+        <result column="ref_id" property="refId" />
+        <result column="type" property="type" />
+        <result column="pic_url" property="picUrl" />
+        <result column="status" property="status" />
+        <result column="cd_key" property="cdKey" />
+        <result column="create_time" property="createTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        key_id, group_id, ref_id, type, pic_url, status, cd_key, create_time
+    </sql>
+
+</mapper>