Sfoglia il codice sorgente

拼团活动_活动管理

Chris-zy 1 anno fa
parent
commit
251774ced3
31 ha cambiato i file con 2236 aggiunte e 0 eliminazioni
  1. 284 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/GroupBuyingMgrController.java
  2. 99 0
      mp-common/src/main/java/com/qs/mp/common/enums/GroupBuyingStatusEnum.java
  3. 62 0
      mp-service/src/main/java/com/qs/mp/admin/domain/GroupBuyingAwards.java
  4. 85 0
      mp-service/src/main/java/com/qs/mp/admin/domain/GroupBuyingAwardsPrize.java
  5. 39 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/GroupBuyingAwardsParam.java
  6. 50 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/GroupBuyingAwardsPrizeParam.java
  7. 75 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/GroupBuyingCreateParam.java
  8. 25 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/GroupBuyingDataQueryParam.java
  9. 22 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/GroupBuyingQueryParam.java
  10. 75 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/GroupBuyingUpdateParam.java
  11. 99 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/GroupBuying.java
  12. 23 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/GroupBuyingAwardsVO.java
  13. 33 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/GroupBuyingDataVO.java
  14. 71 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/GroupBuyingGroup.java
  15. 39 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/GroupBuyingGroupDataVO.java
  16. 56 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/GroupBuyingListVO.java
  17. 21 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/GroupBuyingVO.java
  18. 14 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/GroupBuyingAwardsMapper.java
  19. 20 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/GroupBuyingAwardsPrizeMapper.java
  20. 13 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/GroupBuyingGroupMapper.java
  21. 13 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/GroupBuyingMapper.java
  22. 20 0
      mp-service/src/main/java/com/qs/mp/admin/service/IGroupBuyingAwardsPrizeService.java
  23. 16 0
      mp-service/src/main/java/com/qs/mp/admin/service/IGroupBuyingAwardsService.java
  24. 22 0
      mp-service/src/main/java/com/qs/mp/admin/service/IGroupBuyingGroupService.java
  25. 73 0
      mp-service/src/main/java/com/qs/mp/admin/service/IGroupBuyingService.java
  26. 29 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/GroupBuyingAwardsPrizeServiceImpl.java
  27. 23 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/GroupBuyingAwardsServiceImpl.java
  28. 58 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/GroupBuyingGroupServiceImpl.java
  29. 708 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/GroupBuyingServiceImpl.java
  30. 34 0
      mp-service/src/main/java/com/qs/mp/user/service/IGroupBuyingHitPrizeService.java
  31. 35 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/GroupBuyingHitPrizeServiceImpl.java

+ 284 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/GroupBuyingMgrController.java

@@ -0,0 +1,284 @@
+package com.qs.mp.web.controller.api.admin;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.excel.MarketingHitPrizeExcel;
+import com.qs.mp.admin.domain.param.*;
+import com.qs.mp.admin.domain.vo.*;
+import com.qs.mp.admin.service.*;
+import com.qs.mp.common.annotation.Log;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.BusinessType;
+import com.qs.mp.common.enums.GroupBuyingStatusEnum;
+import com.qs.mp.common.enums.MarketingStatusEnum;
+import com.qs.mp.common.enums.UserTypeEnum;
+import com.qs.mp.user.domain.MarketingHitPrize;
+import com.qs.mp.user.domain.MarketingUserCode;
+import com.qs.mp.user.service.IGroupBuyingHitPrizeService;
+import com.qs.mp.utils.ExcelUtil;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+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.*;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+
+/**
+ * @ClassName GroupBuyingMgrController
+ * @author yang.zhao
+ * @date 2023.9.20
+ * @time 18:09
+ * @Version 1.0
+ * @Description
+ */
+@RestController
+@RequestMapping("/api/v1/mp/admin/groupbuying")
+@Api(tags = "拼团活动管理相关接口")
+public class GroupBuyingMgrController extends BaseApiController {
+
+    //拼团活动
+    @Autowired
+    private IGroupBuyingService groupBuyingService;
+
+    //拼团活动拼团
+    @Autowired
+    private IGroupBuyingGroupService groupBuyingGroupService;
+
+    //拼团活动奖项
+    @Autowired
+    private IGroupBuyingAwardsService groupBuyingAwardsService;
+
+    //拼团活动奖项对应奖品
+    @Autowired
+    private IGroupBuyingAwardsPrizeService groupBuyingAwardsPrizeService;
+
+
+    /**
+     * 复制拼团抽奖活动
+     * @param groupBuyingId
+     * @return
+     */
+    @PreAuthorize("@ss.hasPermi('business:groupbuying:copy')")
+    @PostMapping("/copy/{groupBuyingId}")
+    @ApiOperation("拷贝拼团抽奖活动")
+    public AjaxResult copy(@PathVariable("groupBuyingId") Long groupBuyingId) {
+
+        groupBuyingService.copyById(groupBuyingId);
+
+        return AjaxResult.success();
+    }
+
+    /**
+     * 创建拼团抽奖活动
+     * @param groupBuyingCreateParam
+     * @return
+     */
+    @Log(title = "拼团活动新增", businessType = BusinessType.INSERT)
+    @ApiOperation(value = "拼团活动新增")
+    @PostMapping("/create")
+    @PreAuthorize("@ss.hasPermi('business:groupbuying:add')")
+    public AjaxResult create(@Validated @RequestBody GroupBuyingCreateParam groupBuyingCreateParam) {
+        groupBuyingService.createGroupBuying(groupBuyingCreateParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 拼团抽奖活动编辑更新
+     * @param groupBuyingUpdateParam
+     * @return
+     */
+    @PostMapping("/update")
+    @PreAuthorize("@ss.hasPermi('business:groupbuying:edit')")
+    @ApiOperation("修改拼团活动")
+    public AjaxResult update(@Validated @RequestBody GroupBuyingUpdateParam groupBuyingUpdateParam) {
+        groupBuyingService.updateGroupBuying(groupBuyingUpdateParam);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 拼团活动列表
+     * @param groupBuyingQueryParam
+     * @return
+     */
+    @PostMapping("/list")
+    @PreAuthorize("@ss.hasPermi('business:groupbuying:list')")
+    @ApiOperation("拼团活动列表")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "拼团活动列表", response = GroupBuyingListVO.class)
+    )
+    public TableDataInfo list(@RequestBody GroupBuyingQueryParam groupBuyingQueryParam) {
+        startPage();
+        List<GroupBuying> groupBuyingList = groupBuyingService.listGroupBuying(groupBuyingQueryParam);
+        List<GroupBuyingListVO> groupBuyingListVOS = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(groupBuyingList)) {
+            groupBuyingListVOS = groupBuyingList.stream().map(groupBuying -> {
+                GroupBuyingListVO groupBuyingListVO = new GroupBuyingListVO();
+                BeanUtils.copyProperties(groupBuying, groupBuyingListVO);
+                return groupBuyingListVO;
+            }).collect(Collectors.toList());
+        }
+        TableDataInfo res = getDataTable(groupBuyingList);
+        res.setRows(groupBuyingListVOS);
+
+        return res;
+    }
+
+
+    /**
+     * 查看拼团活动详情
+     * @param id
+     * @return
+     */
+    @PostMapping("/detail/{id}")
+    @PreAuthorize("@ss.hasPermi('business:groupbuying:query')")
+    @ApiOperation("活动详情")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "活动详情", response = GroupBuyingVO.class)
+    )
+    public AjaxResult detail(@PathVariable("id") Long id) {
+        GroupBuyingVO groupBuyingVO = new GroupBuyingVO();
+        GroupBuying groupBuying = groupBuyingService.getById(id);
+        if (Objects.isNull(groupBuying)) {
+            return AjaxResult.error("活动信息不存在");
+        }
+        BeanUtils.copyProperties(groupBuying, groupBuyingVO);
+
+        // 获取奖级信息
+        List<GroupBuyingAwards> groupBuyingAwardsList = groupBuyingAwardsService.list(new LambdaQueryWrapper<GroupBuyingAwards>()
+                .eq(GroupBuyingAwards::getGroupbuyingId, id)
+                .orderByAsc(GroupBuyingAwards::getSort));
+
+        List<GroupBuyingAwardsVO> groupBuyingAwardsVOS = groupBuyingAwardsList.stream().map(groupBuyingAwards -> {
+            GroupBuyingAwardsVO groupBuyingAwardsVO = new GroupBuyingAwardsVO();
+            BeanUtils.copyProperties(groupBuyingAwards, groupBuyingAwardsVO);
+            List<GroupBuyingAwardsPrize> groupBuyingAwardsPrizeList = groupBuyingAwardsPrizeService.listPrizeVO(new LambdaQueryWrapper<GroupBuyingAwardsPrize>()
+                    .eq(GroupBuyingAwardsPrize::getAwardsId, groupBuyingAwards.getId()));
+            groupBuyingAwardsVO.setPrizeList(groupBuyingAwardsPrizeList);
+            return groupBuyingAwardsVO;
+        }).collect(Collectors.toList());
+
+        groupBuyingVO.setAwardsList(groupBuyingAwardsVOS);
+
+        return AjaxResult.success(groupBuyingVO);
+    }
+
+    /**
+     * 拼团活动上架
+     * @param id
+     * @return
+     */
+    @PostMapping("/up/{id}")
+    @PreAuthorize("@ss.hasPermi('business:groupbuying:up')")
+    @ApiOperation("拼团活动上架")
+    public AjaxResult up(@PathVariable("id") Long id) {
+        GroupBuying groupBuying = groupBuyingService.getById(id);
+        if (Objects.isNull(groupBuying)) {
+            return AjaxResult.error("活动信息不存在");
+        }
+        if (GroupBuyingStatusEnum.END.getValue().equals(groupBuying.getIsPutaway()) || groupBuying.getEndTime().compareTo(new Date()) < 0) {
+            return AjaxResult.error("已关闭的活动不支持上架");
+        }
+
+        if (GroupBuyingStatusEnum.UP.getValue().equals(groupBuying.getIsPutaway())) {
+            return AjaxResult.error("频繁操作,请刷新后重试");
+        }
+
+        // 开启活动
+        groupBuyingService.update(new LambdaUpdateWrapper<GroupBuying>()
+                .set(GroupBuying::getIsPutaway, GroupBuyingStatusEnum.UP.getValue())
+                .eq(GroupBuying::getId, id));
+
+        return AjaxResult.success();
+    }
+
+
+    /**
+     * 拼团活动下架
+     * @param id
+     * @return
+     */
+    @PostMapping("/down/{id}")
+    @PreAuthorize("@ss.hasPermi('business:groupbuying:down')")
+    @ApiOperation("下架活动")
+    public AjaxResult down(@PathVariable("id") Long id) {
+        GroupBuying groupBuying = groupBuyingService.getById(id);
+        if (Objects.isNull(groupBuying)) {
+            return AjaxResult.error("活动信息不存在");
+        }
+        if (MarketingStatusEnum.CLOSE.getValue().equals(groupBuying.getIsPutaway())) {
+            return AjaxResult.error("频繁操作,请刷新后重试");
+        }
+
+        //查询当前活动下的拼团信息,如果有未成团的团,修改团的状态并退款
+
+
+        // 下架活动
+        groupBuyingService.update(new LambdaUpdateWrapper<GroupBuying>()
+                .set(GroupBuying::getIsPutaway, GroupBuyingStatusEnum.DOWN.getValue())
+                .eq(GroupBuying::getId, id));
+
+        return AjaxResult.success();
+    }
+
+
+    /**
+     * 拼团活动数据
+     * @param groupBuyingDataQueryParam
+     * @return
+     */
+    @PostMapping("/data/{id}")
+    @PreAuthorize("@ss.hasPermi('business:groupbuying:queryData')")
+    @ApiOperation("活动数据")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "success", response = GroupBuyingDataVO.class)
+    )
+    public AjaxResult dataInfo(@RequestBody GroupBuyingDataQueryParam groupBuyingDataQueryParam) {
+        GroupBuyingDataVO groupBuyingDataVO = new GroupBuyingDataVO();
+        GroupBuying groupBuying = groupBuyingService.getById(groupBuyingDataQueryParam.getId());
+        if (Objects.isNull(groupBuying)) {
+            return AjaxResult.error("活动信息不存在");
+        }
+
+        groupBuyingDataVO.setTitle(groupBuying.getTitle());
+        groupBuyingDataVO.setGroupPrice(groupBuying.getGroupPrice());
+        groupBuyingDataVO.setGroupSize(groupBuyingDataVO.getGroupSize());
+
+        //查询活动对应的团列表
+        List<GroupBuyingGroupDataVO> groupBuyingGroupDataVOS = new ArrayList<>();
+        List<GroupBuyingGroup> groupBuyingGroups = groupBuyingGroupService.list(new LambdaQueryWrapper<GroupBuyingGroup>()
+                .eq(GroupBuyingGroup::getGroupbuyingId, groupBuyingDataQueryParam.getId())
+                .eq(null != groupBuyingDataQueryParam.getStatus(), GroupBuyingGroup::getGroupStatus, groupBuyingDataQueryParam.getStatus())
+                .eq(null != groupBuyingDataQueryParam.getMobile() && StringUtils.isNotBlank(groupBuyingDataQueryParam.getMobile()), GroupBuyingGroup::getStartGroupUserMobile, groupBuyingDataQueryParam.getMobile())
+                .orderByAsc(GroupBuyingGroup::getCreateTime));
+        if (CollectionUtils.isNotEmpty(groupBuyingGroups)){
+            groupBuyingGroupDataVOS = groupBuyingGroups.stream().map(groupBuyingGroup -> {
+                GroupBuyingGroupDataVO groupBuyingGroupDataVO = new GroupBuyingGroupDataVO();
+                BeanUtils.copyProperties(groupBuyingGroup, groupBuyingGroupDataVO);
+                return groupBuyingGroupDataVO;
+            }).collect(Collectors.toList());
+        }
+
+        groupBuyingDataVO.setGroupList(groupBuyingGroupDataVOS);
+
+
+        return AjaxResult.success(groupBuyingDataVO);
+    }
+
+
+}

+ 99 - 0
mp-common/src/main/java/com/qs/mp/common/enums/GroupBuyingStatusEnum.java

@@ -0,0 +1,99 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.utils.DateUtils;
+import io.swagger.annotations.ApiModel;
+
+import java.util.Date;
+
+/**
+ * 拼团活动状态枚举类
+ * @author yang.zhao
+ */
+@ApiModel("拼团活动状态枚举类")
+public enum GroupBuyingStatusEnum implements IEnum<Integer> {
+
+    UP(0, "上架"),
+
+    DOWN(1,"下架"),
+
+    END(2,"已结束"),
+
+    UNDERWAY(3,"进行中"),
+
+    WARMUP(4,"预热中"),
+
+    COMPLETED(5,"已完成");
+
+    private Integer value;
+    private String desc;
+
+    GroupBuyingStatusEnum(Integer value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    @Override
+    public Integer getValue() {
+        return value;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+
+    /**
+     * 重写toString,单个转化成json
+     * @return
+     */
+    @Override
+    public String toString() {
+        JSONObject object = new JSONObject();
+        object.put("value",value);
+        object.put("desc", desc);
+        return object.toString();
+    }
+
+    public static GroupBuyingStatusEnum getByValue(Integer value) {
+        for (GroupBuyingStatusEnum statusEnum : GroupBuyingStatusEnum.values()) {
+            if (statusEnum.getValue().equals(value)) {
+                return statusEnum;
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * 根据活动是否上架,通过开始结束时间判断活动状态
+     * @param startTime
+     * @param endTime
+     * @param isPutaway
+     * @return
+     */
+    public static String getStatus(Date startTime, Date endTime, Integer isPutaway) {
+        //活动已下架
+        if (GroupBuyingStatusEnum.DOWN.getValue().equals(isPutaway)) {
+            return GroupBuyingStatusEnum.DOWN.toString();
+        }
+        //活动已结束
+        if (GroupBuyingStatusEnum.END.getValue().equals(isPutaway)) {
+            return GroupBuyingStatusEnum.END.toString();
+        }
+
+        Date now = DateUtils.getNowDate();
+        if (now.before(startTime)) {
+            //活动预热中
+            return GroupBuyingStatusEnum.WARMUP.toString();
+        }else if (now.after(endTime)) {
+            //活动已结束
+            return GroupBuyingStatusEnum.END.toString();
+        }else {
+            //活动进行中
+            return GroupBuyingStatusEnum.UNDERWAY.toString();
+        }
+
+    }
+}

+ 62 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/GroupBuyingAwards.java

@@ -0,0 +1,62 @@
+package com.qs.mp.admin.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @describe 拼团活动奖项设置实体类
+ * @auther yang.zhao
+ */
+@TableName("mp_groupbuying_awards")
+@Data
+@ApiModel("拼团活动奖项设置实体类")
+public class GroupBuyingAwards implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("奖项id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("拼团活动id")
+    @TableField("groupbuying_id")
+    private Long groupbuyingId;
+
+    @ApiModelProperty("奖项名")
+    @TableField("name")
+    private String name;
+
+    @ApiModelProperty("奖项顺序")
+    @TableField("sort")
+    private Integer sort;
+
+    @ApiModelProperty("奖项数量")
+    @TableField("quantity")
+    private Integer quantity;
+
+    @ApiModelProperty("内定数量")
+    @TableField("inside_num")
+    private Integer insideNum;
+
+    @ApiModelProperty("奖项描述")
+    @TableField("memo")
+    private String memo;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private Date createTime;
+
+    @ApiModelProperty("更新时间")
+    @TableField("update_time")
+    private Date updateTime;
+
+    @ApiModelProperty("逻辑删除标识")
+    @TableField("is_delete")
+    @TableLogic
+    private Integer isDelete;
+
+}

+ 85 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/GroupBuyingAwardsPrize.java

@@ -0,0 +1,85 @@
+package com.qs.mp.admin.domain;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.*;
+import com.qs.mp.common.enums.TicketPrizeTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @describe 拼团活动奖项对应奖品设置实体类
+ * @auther yang.zhao
+ */
+@TableName("mp_groupbuying_awards_prize")
+@Data
+@ApiModel("拼团活动奖项对应奖品设置实体类")
+public class GroupBuyingAwardsPrize implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("奖品ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("拼团活动id")
+    @TableField("groupbuying_id")
+    private Long groupbuyingId;
+
+    @ApiModelProperty("奖项ID")
+    @TableField("awards_id")
+    private Long awardsId;
+
+    @ApiModelProperty("奖品ID(GOODS_ID或TEMPL_ID)")
+    @TableField("ref_id")
+    private String refId;
+
+    @ApiModelProperty("奖品图片")
+    @TableField("pic_url")
+    private String picUrl;
+
+    @ApiModelProperty("奖品名称")
+    @TableField("title")
+    private String title;
+
+    @ApiModelProperty("奖品类型:goods:实物商品 coupon:优惠券 coin:平台代币 coupon_pkg:券包")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    @TableField("prize_type")
+    private TicketPrizeTypeEnum prizeType;
+
+    @ApiModelProperty("奖品数")
+    @TableField("quantity")
+    private Integer quantity;
+
+    @ApiModelProperty("奖品价值")
+    @TableField("value")
+    private Integer value;
+
+    @ApiModelProperty("权重排序,值越大越靠前")
+    @TableField("sort_weight")
+    private Integer sortWeight;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private Date createTime;
+
+    @ApiModelProperty("更新时间")
+    @TableField("update_time")
+    private Date updateTime;
+
+    @ApiModelProperty("逻辑删除标识")
+    @TableField("is_delete")
+    @TableLogic
+    private Integer isDelete;
+
+    /**
+     * 优惠卷详情
+     */
+    @ApiModelProperty(value = "优惠卷详情")
+    @TableField(exist = false)
+    private String couponDetail;
+
+}

+ 39 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/GroupBuyingAwardsParam.java

@@ -0,0 +1,39 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author yang.zhao
+ */
+@ApiModel(value= "拼团活动奖级入参类")
+@Data
+public class GroupBuyingAwardsParam {
+
+    @NotBlank(message = "奖级名称不能为空")
+    @ApiModelProperty(value = "奖级名称",required=true)
+    private String name;
+
+    @NotNull(message = "奖级顺序不能为空")
+    @ApiModelProperty(value = "奖级顺序",required=true)
+    private Integer sort;
+
+    @NotNull(message = "奖级数量不能为空")
+    @ApiModelProperty(value = "奖级数量",required=true)
+    private Integer quantity;
+
+    @NotNull(message = "内定数量不能为空")
+    @ApiModelProperty(value = "内定数量",required = true)
+    private Integer insideNum;
+
+    @NotEmpty(message = "奖品列表不能为空")
+    @ApiModelProperty(value = "奖品列表",required=true)
+    List<GroupBuyingAwardsPrizeParam> prizeList;
+
+}

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

@@ -0,0 +1,50 @@
+package com.qs.mp.admin.domain.param;
+
+import com.qs.mp.common.enums.TicketPrizeTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author yang.zhao
+ */
+@ApiModel("拼团活动奖级对应奖品入参类")
+@Data
+public class GroupBuyingAwardsPrizeParam {
+
+    @NotNull(message = "拼团活动Id不能为空")
+    @ApiModelProperty(value = "拼团活动Id",required=true)
+    private String groupbuyingId;
+
+    @NotNull(message = "奖项Id不能为空")
+    @ApiModelProperty(value = "奖项Id",required=true)
+    private String awardsId;
+
+    @NotNull(message = "奖品关联ID不能为空")
+    @ApiModelProperty(value = "奖品关联ID",required=true)
+    private String refId;
+
+    @ApiModelProperty(value = "奖品图片",required=false)
+    private String picUrl;
+
+    @ApiModelProperty(value = "奖品名称",required=false)
+    private String title;
+
+    @NotNull(message = "奖品类型不能为空")
+    @ApiModelProperty(value = "奖品类型",required=true)
+    private TicketPrizeTypeEnum prizeType;
+
+    @NotNull(message = "奖品数量不能为空")
+    @ApiModelProperty(value = "奖品数量",required=true)
+    private Integer quantity;
+
+    @ApiModelProperty(value = "奖品价值",required=false)
+    private Integer value;
+
+    @ApiModelProperty(value = "排序权重",required=false)
+    private Integer sortWeight;
+
+
+}

+ 75 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/GroupBuyingCreateParam.java

@@ -0,0 +1,75 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 拼团活动创建入参类
+ *
+ * @author yang.zhao
+ */
+@ApiModel("拼团活动创建入参类")
+@Data
+public class GroupBuyingCreateParam {
+
+    @ApiModelProperty(value = "活动标题", required = true)
+    @NotBlank(message = "活动标题不能为空")
+    private String title;
+
+    @ApiModelProperty(value = "活动主图", required = true)
+    @NotBlank(message = "活动主图不能为空")
+    private String picUrl;
+
+    @ApiModelProperty(value = "开始时间", required = true)
+    @NotNull(message = "开始时间不能为空")
+    private Date startTime;
+
+    @ApiModelProperty(value = "结束时间", required = true)
+    @NotNull(message = "结束时间不能为空")
+    private Date endTime;
+
+    @ApiModelProperty(value = "拼团有效期", required = true)
+    @NotBlank(message = "拼团有效期不能为空")
+    private String groupEffectiveTime;
+
+    @ApiModelProperty(value = "成团人数", required = true)
+    @NotBlank(message = "成团人数不能为空")
+    private Integer groupSize;
+
+    @ApiModelProperty(value = "每个用户发起拼团的最大次数", required = false)
+    private Integer startGroupTimes;
+
+    @ApiModelProperty(value = "每个用户参与拼团的最大次数", required = false)
+    private Integer partinGroupTimes;
+
+    @ApiModelProperty(value = "返佣系统百分比", required = true)
+    @NotBlank(message = "返佣系数不能为空")
+    private Integer rebateCoefficientNum;
+
+    @ApiModelProperty(value = "参与门店", required = false)
+    private Integer partinStore;
+
+    @ApiModelProperty(value = "是否允许退款,0:允许;1不允许", required = false)
+    private Integer isRefund;
+
+    @ApiModelProperty(value = "是否上架,0:上架;1:下架", required = false)
+    private Integer isPutaway;
+
+    @ApiModelProperty(value = "拼团价格,单位:分", required = true)
+    @NotBlank(message = "拼团价格不能为空")
+    private Integer groupPrice;
+
+    @ApiModelProperty(value = "活动描述", required = false)
+    private String description;
+
+    @NotEmpty(message = "奖级列表不能为空")
+    @ApiModelProperty(value = "奖级列表", required = true)
+    List<GroupBuyingAwardsParam> awardsList;
+}

+ 25 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/GroupBuyingDataQueryParam.java

@@ -0,0 +1,25 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 拼团活动数据查询入参类
+ * @author yang.zhao
+ */
+@ApiModel("拼团活动数据查询入参类")
+@Data
+public class GroupBuyingDataQueryParam {
+
+    @ApiModelProperty("拼团活动ID")
+    private Long id;
+
+    @ApiModelProperty("成团状态,3:进行中,5:已完成,2:已结束")
+    private Integer status;
+
+    @ApiModelProperty("团发起人电话")
+    private String mobile;
+
+
+}

+ 22 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/GroupBuyingQueryParam.java

@@ -0,0 +1,22 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 拼团活动查询入参类
+ * @author yang.zhao
+ */
+@ApiModel("拼团活动查询入参类")
+@Data
+public class GroupBuyingQueryParam {
+
+
+    @ApiModelProperty("营销活动名称")
+    private String title;
+
+    @ApiModelProperty("活动状态:0上架,1下架,2已结束,3进行中,4预热中")
+    private Integer status;
+
+}

+ 75 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/GroupBuyingUpdateParam.java

@@ -0,0 +1,75 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 拼团活动更新入参类
+ *
+ * @author yang.zhao
+ */
+@ApiModel("拼团活动更新入参类")
+@Data
+public class GroupBuyingUpdateParam {
+
+    @ApiModelProperty(value = "拼团活动id", required = true)
+    @NotNull(message = "拼团活动id不能为空")
+    private Long id;
+
+    @ApiModelProperty(value = "活动标题", required = true)
+    @NotBlank(message = "活动标题不能为空")
+    private String title;
+
+    @ApiModelProperty(value = "活动主图", required = true)
+    @NotBlank(message = "活动主图不能为空")
+    private String picUrl;
+
+    @ApiModelProperty(value = "开始时间", required = true)
+    @NotNull(message = "开始时间不能为空")
+    private Date startTime;
+
+    @ApiModelProperty(value = "结束时间", required = true)
+    @NotNull(message = "结束时间不能为空")
+    private Date endTime;
+
+    @ApiModelProperty(value = "拼团有效期", required = true)
+    @NotNull(message = "拼团有效期不能为空")
+    private Integer groupEffectiveTime;
+
+    @ApiModelProperty(value = "成团人数", required = true)
+    @NotNull(message = "成团人数不能为空")
+    private Integer groupSize;
+
+    @ApiModelProperty(value = "每个用户发起拼团的最大次数", required = false)
+    private Integer startGroupTimes;
+
+    @ApiModelProperty(value = "每个用户参与拼团的最大次数", required = false)
+    private Integer partinGroupTimes;
+
+    @ApiModelProperty(value = "参与门店",required = false)
+    private String partinStore;
+
+    @ApiModelProperty(value = "是否允许退款,0:允许;1不允许", required = false)
+    private Integer isRefund;
+
+    @ApiModelProperty(value = "是否上架,0:上架;1:下架", required = false)
+    private Integer isPutaway;
+
+    @ApiModelProperty(value = "拼团价格,单位:分", required = true)
+    @NotNull(message = "拼团价格不能为空")
+    private Integer groupPrice;
+
+    @ApiModelProperty(value = "活动描述",required = false)
+    private String description;
+
+    @NotEmpty(message = "奖级列表不能为空")
+    @ApiModelProperty(value = "奖级列表", required = true)
+    List<GroupBuyingAwardsParam> awardsList;
+}

+ 99 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/GroupBuying.java

@@ -0,0 +1,99 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * @ClassName GroupBuying
+ * @author yang.zhao
+ * @Version 1.0
+ * @Description 拼团活动表实体
+ */
+@TableName("mp_groupbuying")
+@Data
+@ApiModel("拼团活动表实体类")
+public class GroupBuying implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "活动id,主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("活动标题")
+    @TableField("title")
+    private String title;
+
+    @ApiModelProperty(value = "活动主图")
+    @TableField("pic_url")
+    private String picUrl;
+
+    @ApiModelProperty("开始时间")
+    @TableField("start_time")
+    private Date startTime;
+
+    @ApiModelProperty("结束时间")
+    @TableField("end_time")
+    private Date endTime;
+
+    @ApiModelProperty("拼团有效期")
+    @TableField("group_effective_time")
+    private Integer groupEffectiveTime;
+
+    @ApiModelProperty("成团人数")
+    @TableField("group_size")
+    private Integer groupSize;
+
+    @ApiModelProperty("每个用户发起拼团的最大次数")
+    @TableField("start_group_times")
+    private Integer startGroupTimes;
+
+    @ApiModelProperty("每个用户参与拼团的最大次数")
+    @TableField("partin_group_times")
+    private Integer partinGroupTimes;
+
+    @ApiModelProperty("返佣系数百分比")
+    @TableField("rebate_coefficient_num")
+    private BigDecimal rebateCoefficientNum;
+
+    @ApiModelProperty("参与门店")
+    @TableField("partin_store")
+    private String partinStore;
+
+    @ApiModelProperty("是否允许退款,0:允许;1不允许")
+    @TableField("is_refund")
+    private Integer isRefund;
+
+    @ApiModelProperty("是否上架,0:上架;1:下架")
+    @TableField("is_putaway")
+    private Integer isPutaway;
+
+    @ApiModelProperty("拼团价格")
+    @TableField("group_price")
+    private Integer groupPrice;
+
+    @ApiModelProperty("活动描述")
+    @TableField("description")
+    private String description;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private Date createTime;
+
+    @ApiModelProperty("更新时间")
+    @TableField("update_time")
+    private Date updateTime;
+
+    @ApiModelProperty("逻辑删除标识")
+    @TableField("is_delete")
+    @TableLogic
+    private Integer isDelete;
+
+}

+ 23 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/GroupBuyingAwardsVO.java

@@ -0,0 +1,23 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.qs.mp.admin.domain.GroupBuyingAwards;
+import com.qs.mp.admin.domain.GroupBuyingAwardsPrize;
+import com.qs.mp.admin.domain.MarketingAwards;
+import com.qs.mp.admin.domain.MarketingAwardsPrize;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 拼团活动奖项出参类
+ * @author yang.zhao
+ */
+@ApiModel("营销活动奖项出参类")
+@Data
+public class GroupBuyingAwardsVO extends GroupBuyingAwards {
+
+    @ApiModelProperty("奖品列表")
+    List<GroupBuyingAwardsPrize> prizeList;
+}

+ 33 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/GroupBuyingDataVO.java

@@ -0,0 +1,33 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 拼团活动数据出参类
+ * @author yang.zhao
+ */
+@ApiModel("营销活动数据出参类")
+@Data
+public class GroupBuyingDataVO {
+
+    @ApiModelProperty("活动标题")
+    @TableField("title")
+    private String title;
+
+    @ApiModelProperty("拼团价格")
+    private Integer groupPrice;
+
+    @ApiModelProperty("成团人数")
+    private Integer groupSize;
+
+
+    @ApiModelProperty("活动对应成团列表")
+    private List<GroupBuyingGroupDataVO> groupList;
+
+}

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

@@ -0,0 +1,71 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * @ClassName GroupBuyingGroup
+ * @author yang.zhao
+ * @Version 1.0
+ * @Description 拼团活动拼团表实体
+ */
+@TableName("mp_groupbuying_group")
+@Data
+@ApiModel("拼团活动拼团表实体类")
+public class GroupBuyingGroup implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "团id,主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "拼团活动id")
+    @TableId(value = "groupbuying_id")
+    private Long groupbuyingId;
+
+    @ApiModelProperty("参团人数")
+    @TableField("partin_num")
+    private Integer partinNum;
+
+
+    @ApiModelProperty("参团用户ID")
+    @TableField("partin_ids")
+    private Integer partinIds;
+
+    @ApiModelProperty("成团状态,0:进行中,1:已完成,2:已结束")
+    @TableField("group_status")
+    private Integer groupStatus;
+
+    @ApiModelProperty("发起人ID")
+    @TableField("start_group_user")
+    private Long startgroupuser;
+
+    @ApiModelProperty("发起人手机号")
+    @TableField("start_group_user_mobile")
+    private Long startGroupUserMobile;
+
+    @ApiModelProperty("拼团截止时间")
+    @TableField("group_end_time")
+    private Date groupEndTime;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private Date createTime;
+
+    @ApiModelProperty("更新时间")
+    @TableField("update_time")
+    private Date updateTime;
+
+    @ApiModelProperty("逻辑删除标识")
+    @TableField("is_delete")
+    @TableLogic
+    private Integer isDelete;
+
+}

+ 39 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/GroupBuyingGroupDataVO.java

@@ -0,0 +1,39 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 拼团活动数据出参类
+ * @author yang.zhao
+ */
+@ApiModel("营销活动数据出参类")
+@Data
+public class GroupBuyingGroupDataVO {
+
+    @ApiModelProperty("团ID")
+    private Long id;
+
+    @ApiModelProperty("参团人数")
+    private Integer partinNum;
+
+    @ApiModelProperty("参团用户ID,逗号分割")
+    private String partinIds;
+
+    @ApiModelProperty("成团状态,3:进行中,5:已完成,2:已结束")
+    private Integer groupStatus;
+
+    @ApiModelProperty("发起人ID")
+    private Long startGroupUser;
+
+    @ApiModelProperty("拼团截止日期")
+    private Date groupEndTime;
+
+    @ApiModelProperty("拼团创建时间")
+    private Date createTime;
+
+}

+ 56 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/GroupBuyingListVO.java

@@ -0,0 +1,56 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.qs.mp.common.enums.MarketingStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 拼团活动列表出参类
+ * @author yang.zhao
+ */
+@ApiModel("拼团活动列表出参类")
+@Data
+public class GroupBuyingListVO {
+
+    @ApiModelProperty(value = "活动id,主键")
+    private Long id;
+
+    @ApiModelProperty("活动标题")
+    private String title;
+
+    @ApiModelProperty("开始时间")
+    private Date startTime;
+
+    @ApiModelProperty("结束时间")
+    private Date endTime;
+
+    @ApiModelProperty("拼团有效期")
+    private Integer groupEffectiveTime;
+
+    @ApiModelProperty("成团人数")
+    private Integer groupSize;
+
+    @ApiModelProperty("返佣系数百分比")
+    private BigDecimal rebateCoefficientNum;
+
+    @ApiModelProperty("是否允许退款")
+    private Integer isRefund;
+
+    @ApiModelProperty("是否上架")
+    private Integer isPutaway;
+
+    @ApiModelProperty("成团价格")
+    private Integer groupPrice;
+
+    @ApiModelProperty("活动状态:0上架,1下架,2已结束,3进行中,4已完成,5预热中")
+    private String status;
+
+    public String getStatus() {
+        return MarketingStatusEnum.getStatus(this.startTime, this.endTime, this.isPutaway);
+    }
+
+}

+ 21 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/GroupBuyingVO.java

@@ -0,0 +1,21 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.qs.mp.admin.domain.Marketing;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 拼团活动详情出参类
+ * @author yang.zhao
+ */
+@ApiModel("拼团活动详情出参类")
+@Data
+public class GroupBuyingVO extends GroupBuying {
+
+    @ApiModelProperty("奖级列表(后台显示)")
+    List<GroupBuyingAwardsVO> awardsList;
+
+}

+ 14 - 0
mp-service/src/main/java/com/qs/mp/admin/mapper/GroupBuyingAwardsMapper.java

@@ -0,0 +1,14 @@
+package com.qs.mp.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qs.mp.admin.domain.GroupBuyingAwards;
+import com.qs.mp.admin.domain.MarketingAwards;
+
+/**
+ * @auther quanshu
+ * @create 2022-05-16 14:29:18
+ * @describe 营销活动奖项设置mapper类
+ */
+public interface GroupBuyingAwardsMapper extends BaseMapper<GroupBuyingAwards> {
+
+}

+ 20 - 0
mp-service/src/main/java/com/qs/mp/admin/mapper/GroupBuyingAwardsPrizeMapper.java

@@ -0,0 +1,20 @@
+package com.qs.mp.admin.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.qs.mp.admin.domain.GroupBuyingAwardsPrize;
+import com.qs.mp.admin.domain.MarketingAwardsPrize;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @auther quanshu
+ * @create 2022-05-16 14:29:31
+ * @describe 营销活动奖项对应奖品设置mapper类
+ */
+public interface GroupBuyingAwardsPrizeMapper extends BaseMapper<GroupBuyingAwardsPrize> {
+
+    List<GroupBuyingAwardsPrize> listPrizeVO(@Param(Constants.WRAPPER) LambdaQueryWrapper<GroupBuyingAwardsPrize> eq);
+}

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

@@ -0,0 +1,13 @@
+package com.qs.mp.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qs.mp.admin.domain.vo.GroupBuying;
+import com.qs.mp.admin.domain.vo.GroupBuyingGroup;
+
+/**
+ * @auther yang.zhao
+ * @describe 拼团活动拼团表mapper类
+ */
+public interface GroupBuyingGroupMapper extends BaseMapper<GroupBuyingGroup> {
+
+}

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

@@ -0,0 +1,13 @@
+package com.qs.mp.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qs.mp.admin.domain.Marketing;
+import com.qs.mp.admin.domain.vo.GroupBuying;
+
+/**
+ * @auther yang.zhao
+ * @describe 拼团活动表mapper类
+ */
+public interface GroupBuyingMapper extends BaseMapper<GroupBuying> {
+
+}

+ 20 - 0
mp-service/src/main/java/com/qs/mp/admin/service/IGroupBuyingAwardsPrizeService.java

@@ -0,0 +1,20 @@
+package com.qs.mp.admin.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.admin.domain.GroupBuyingAwardsPrize;
+import com.qs.mp.admin.domain.MarketingAwardsPrize;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 拼团活动奖项对应奖品设置 服务类
+ * </p>
+ *
+ * @author yang.zhao
+ */
+public interface IGroupBuyingAwardsPrizeService extends IService<GroupBuyingAwardsPrize> {
+
+    List<GroupBuyingAwardsPrize> listPrizeVO(LambdaQueryWrapper<GroupBuyingAwardsPrize> eq);
+}

+ 16 - 0
mp-service/src/main/java/com/qs/mp/admin/service/IGroupBuyingAwardsService.java

@@ -0,0 +1,16 @@
+package com.qs.mp.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.admin.domain.GroupBuyingAwards;
+import com.qs.mp.admin.domain.MarketingAwards;
+
+/**
+ * <p>
+ * 营销活动奖项设置 服务类
+ * </p>
+ *
+ * @author yang.zhao
+ */
+public interface IGroupBuyingAwardsService extends IService<GroupBuyingAwards> {
+
+}

+ 22 - 0
mp-service/src/main/java/com/qs/mp/admin/service/IGroupBuyingGroupService.java

@@ -0,0 +1,22 @@
+package com.qs.mp.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.admin.domain.Marketing;
+import com.qs.mp.admin.domain.param.GroupBuyingCreateParam;
+import com.qs.mp.admin.domain.param.GroupBuyingQueryParam;
+import com.qs.mp.admin.domain.param.GroupBuyingUpdateParam;
+import com.qs.mp.admin.domain.vo.GroupBuying;
+import com.qs.mp.admin.domain.vo.GroupBuyingGroup;
+import com.qs.mp.user.domain.param.MarketingHelpParam;
+
+import java.util.List;
+
+/**
+ * @ClassName IGroupBuyingGroupService
+ * @author yang.zhao
+ * @Version 1.0
+ * @Description 拼团活动拼团表 服务类
+ */
+public interface IGroupBuyingGroupService extends IService<GroupBuyingGroup> {
+
+}

+ 73 - 0
mp-service/src/main/java/com/qs/mp/admin/service/IGroupBuyingService.java

@@ -0,0 +1,73 @@
+package com.qs.mp.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.admin.domain.Marketing;
+import com.qs.mp.admin.domain.param.*;
+import com.qs.mp.admin.domain.vo.GroupBuying;
+import com.qs.mp.user.domain.param.MarketingHelpParam;
+
+import java.util.List;
+
+/**
+ * @ClassName IGroupBuyingService
+ * @author yang.zhao
+ * @Version 1.0
+ * @Description 拼团活动表 服务类
+ */
+public interface IGroupBuyingService extends IService<GroupBuying> {
+
+    /**
+     * 拷贝营销活动
+     * @param marketingId
+     */
+    void copyById(Long marketingId);
+
+    /**
+     * 创建拼团活动
+     * @param groupBuyingCreateParam
+     */
+    void createGroupBuying(GroupBuyingCreateParam groupBuyingCreateParam);
+
+    /**
+     * 更新拼团活动
+     * @param groupBuyingUpdateParam
+     */
+    void updateGroupBuying(GroupBuyingUpdateParam groupBuyingUpdateParam);
+
+    /**
+     * 获取拼团活动列表
+     * @param
+     * @return
+     */
+    List<GroupBuying> listGroupBuying(GroupBuyingQueryParam groupBuyingQueryParam);
+
+
+
+
+    /**
+     * 根据活动id删除活动相关信息
+     * @param id
+     */
+//    void deleteById(Long id);
+
+    /**
+     * 活动助力
+     * @param marketingHelpParam
+     * @param userId
+     */
+//    void help(MarketingHelpParam marketingHelpParam, Long userId);
+
+    /**
+     * 开奖
+     * @param marketing
+     */
+//    void lottery(Marketing marketing);
+
+    /**
+     * 立即获取抽奖码
+     * @param marketingId
+     * @param userId
+     */
+//    void generateCode(Long marketingId, Long userId);
+
+}

+ 29 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/GroupBuyingAwardsPrizeServiceImpl.java

@@ -0,0 +1,29 @@
+package com.qs.mp.admin.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.admin.domain.GroupBuyingAwardsPrize;
+import com.qs.mp.admin.domain.MarketingAwardsPrize;
+import com.qs.mp.admin.mapper.GroupBuyingAwardsPrizeMapper;
+import com.qs.mp.admin.mapper.MarketingAwardsPrizeMapper;
+import com.qs.mp.admin.service.IGroupBuyingAwardsPrizeService;
+import com.qs.mp.admin.service.IMarketingAwardsPrizeService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 营销活动奖项对应奖品设置 服务实现类
+ * </p>
+ *
+ * @author yang.zhao
+ */
+@Service
+public class GroupBuyingAwardsPrizeServiceImpl extends ServiceImpl<GroupBuyingAwardsPrizeMapper, GroupBuyingAwardsPrize> implements IGroupBuyingAwardsPrizeService {
+
+    @Override
+    public List<GroupBuyingAwardsPrize> listPrizeVO(LambdaQueryWrapper<GroupBuyingAwardsPrize> eq) {
+        return getBaseMapper().listPrizeVO(eq);
+    }
+}

+ 23 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/GroupBuyingAwardsServiceImpl.java

@@ -0,0 +1,23 @@
+package com.qs.mp.admin.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.admin.domain.GroupBuyingAwards;
+import com.qs.mp.admin.domain.MarketingAwards;
+import com.qs.mp.admin.mapper.GroupBuyingAwardsMapper;
+import com.qs.mp.admin.mapper.MarketingAwardsMapper;
+import com.qs.mp.admin.service.IGroupBuyingAwardsService;
+import com.qs.mp.admin.service.IMarketingAwardsService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 营销活动奖项设置 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-05-16
+ */
+@Service
+public class GroupBuyingAwardsServiceImpl extends ServiceImpl<GroupBuyingAwardsMapper, GroupBuyingAwards> implements IGroupBuyingAwardsService {
+
+}

+ 58 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/GroupBuyingGroupServiceImpl.java

@@ -0,0 +1,58 @@
+package com.qs.mp.admin.service.impl;
+
+import cn.hutool.core.util.RandomUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.admin.domain.*;
+import com.qs.mp.admin.domain.param.*;
+import com.qs.mp.admin.domain.vo.GroupBuying;
+import com.qs.mp.admin.domain.vo.GroupBuyingGroup;
+import com.qs.mp.admin.mapper.GroupBuyingGroupMapper;
+import com.qs.mp.admin.mapper.GroupBuyingMapper;
+import com.qs.mp.admin.service.*;
+import com.qs.mp.common.constant.Constants;
+import com.qs.mp.common.core.redis.DistributedLocker;
+import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.enums.*;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.common.utils.bean.BeanUtils;
+import com.qs.mp.framework.redis.RedisKey;
+import com.qs.mp.framework.service.IWxSubscribeMessage;
+import com.qs.mp.system.domain.SysUser;
+import com.qs.mp.system.service.ISysUserService;
+import com.qs.mp.system.service.id.BizIdGenerator;
+import com.qs.mp.user.domain.MarketingHitPrize;
+import com.qs.mp.user.domain.MarketingUserCode;
+import com.qs.mp.user.domain.param.MarketingHelpParam;
+import com.qs.mp.user.service.IMarketingHitPrizeService;
+import com.qs.mp.user.service.IMarketingUserCodeService;
+import com.qs.mp.user.service.IUserCoinService;
+import com.qs.mp.user.service.IUserPrizeStorageService;
+import com.qs.mp.utils.MarketingUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+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.net.URLDecoder;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName GroupBuyingGroupServiceImpl
+ * @author yang.zhao
+ * @Version 1.0
+ * @Description 拼团活动拼团表 服务实现类
+ */
+@Service
+public class GroupBuyingGroupServiceImpl extends ServiceImpl<GroupBuyingGroupMapper, GroupBuyingGroup> implements IGroupBuyingGroupService {
+
+
+}

+ 708 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/GroupBuyingServiceImpl.java

@@ -0,0 +1,708 @@
+package com.qs.mp.admin.service.impl;
+
+import cn.hutool.core.util.RandomUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.admin.domain.*;
+import com.qs.mp.admin.domain.param.*;
+import com.qs.mp.admin.domain.vo.GroupBuying;
+import com.qs.mp.admin.mapper.GroupBuyingMapper;
+import com.qs.mp.admin.service.*;
+import com.qs.mp.common.constant.Constants;
+import com.qs.mp.common.core.redis.DistributedLocker;
+import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.enums.*;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.common.utils.bean.BeanUtils;
+import com.qs.mp.framework.redis.RedisKey;
+import com.qs.mp.framework.service.IWxSubscribeMessage;
+import com.qs.mp.system.domain.SysUser;
+import com.qs.mp.system.service.ISysUserService;
+import com.qs.mp.system.service.id.BizIdGenerator;
+import com.qs.mp.user.domain.MarketingHitPrize;
+import com.qs.mp.user.domain.MarketingUserCode;
+import com.qs.mp.user.domain.param.MarketingHelpParam;
+import com.qs.mp.user.service.IMarketingHitPrizeService;
+import com.qs.mp.user.service.IMarketingUserCodeService;
+import com.qs.mp.user.service.IUserCoinService;
+import com.qs.mp.user.service.IUserPrizeStorageService;
+import com.qs.mp.utils.MarketingUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+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.net.URLDecoder;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName GroupBuyingServiceImpl
+ * @author yang.zhao
+ * @Version 1.0
+ * @Description 拼团活动表 服务实现类
+ */
+@Service
+public class GroupBuyingServiceImpl extends ServiceImpl<GroupBuyingMapper, GroupBuying> implements IGroupBuyingService {
+
+    // 内部奖池
+    public static final String MARKETING_LOTTERY_INSIDE_POOL = "MARKETING_LOTTERY_INSIDE_POOL:%s";
+
+    // 普通奖池
+    public static final String MARKETING_LOTTERY_ORDINARY_POOL = "MARKETING_LOTTERY_ORDINARY_POOL:%s";
+
+    // 普通用户低阶奖池
+    public static final String MARKETING_LOW_LOTTERY_ORDINARY_POOL = "MARKETING_LOW_LOTTERY_ORDINARY_POOL:%s";
+
+
+    protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
+
+    @Autowired
+    private IGoodsService goodsService;
+
+    @Autowired
+    private ICouponService couponService;
+
+    @Autowired
+    private ICouponPkgService couponPkgService;
+
+    @Autowired
+    private IMarketingAwardsService marketingAwardsService;
+
+    @Autowired
+    private IMarketingAwardsPrizeService marketingAwardsPrizeService;
+
+    @Autowired
+    private IMarketingUserCodeService marketingUserCodeService;
+
+    @Autowired
+    private ISysUserService sysUserService;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @Autowired
+    private IMarketingHitPrizeService marketingHitPrizeService;
+
+    @Autowired
+    private IUserCoinService userCoinService;
+
+    @Autowired
+    private IUserPrizeStorageService userPrizeStorageService;
+
+    @Autowired
+    private BizIdGenerator bizIdGenerator;
+
+
+    @Autowired
+    private IWxSubscribeMessage wxSubscribeMessage;
+
+    @Autowired
+    private DistributedLocker distributedLocker;
+
+    @Autowired
+    private IMarketingMsgService marketingMsgService;
+
+
+
+
+
+
+
+
+
+    //拼团活动奖项
+    @Autowired
+    private IGroupBuyingAwardsService groupBuyingAwardsService;
+
+    //拼团活动奖项对应奖品
+    @Autowired
+    private IGroupBuyingAwardsPrizeService groupBuyingAwardsPrizeService;
+
+    /**
+     * 复制拼团活动
+     * @param groupBuyingId
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void copyById(Long groupBuyingId) {
+        GroupBuying groupBuying = this.getById(groupBuyingId);
+        if (Objects.isNull(groupBuying)) {
+            throw new ServiceException("拼团活动不存在");
+        }
+        // 初始化活动
+        groupBuying.setId(null);
+        groupBuying.setTitle(groupBuying.getTitle()+"(1)");
+        groupBuying.setIsPutaway(1);
+        groupBuying.setCreateTime(new Date());
+        groupBuying.setUpdateTime(new Date());
+        Assert.isTrue(this.save(groupBuying), "复制拼团活动失败");
+
+        List<GroupBuyingAwards> groupBuyingAwardsList = groupBuyingAwardsService.list(new LambdaQueryWrapper<GroupBuyingAwards>().eq(GroupBuyingAwards::getGroupbuyingId, groupBuyingId));
+        if (CollectionUtils.isEmpty(groupBuyingAwardsList)) {
+            throw new ServiceException("活动奖级信息不存在");
+        }
+        for (GroupBuyingAwards groupBuyingAwards : groupBuyingAwardsList) {
+            List<GroupBuyingAwardsPrize> groupBuyingAwardsPrizeList = groupBuyingAwardsPrizeService.list(new LambdaQueryWrapper<GroupBuyingAwardsPrize>()
+                    .eq(GroupBuyingAwardsPrize::getGroupbuyingId, groupBuyingAwards.getGroupbuyingId())
+                    .eq(GroupBuyingAwardsPrize::getAwardsId, groupBuyingAwards.getId()));
+            groupBuyingAwards.setId(null);
+            groupBuyingAwards.setGroupbuyingId(groupBuying.getId());
+            Assert.isTrue(groupBuyingAwardsService.save(groupBuyingAwards),"复制拼团活动奖级失败");
+
+            for (GroupBuyingAwardsPrize groupBuyingAwardsPrize : groupBuyingAwardsPrizeList) {
+                groupBuyingAwardsPrize.setId(null);
+                groupBuyingAwardsPrize.setAwardsId(groupBuyingAwards.getId());
+                groupBuyingAwardsPrize.setGroupbuyingId(groupBuying.getId());
+            }
+            Assert.isTrue(groupBuyingAwardsPrizeService.saveBatch(groupBuyingAwardsPrizeList),"复制拼团活动奖品失败");
+        }
+
+    }
+
+
+    /**
+     * 创建拼团活动
+     * @param groupBuyingCreateParam
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void createGroupBuying(GroupBuyingCreateParam groupBuyingCreateParam) {
+        // 保存拼团活动
+        GroupBuying groupBuying = new GroupBuying();
+        BeanUtils.copyProperties(groupBuyingCreateParam, groupBuying);
+
+        if (StringUtils.isNotBlank(groupBuyingCreateParam.getDescription())) {
+            groupBuying.setDescription(URLDecoder.decode(groupBuyingCreateParam.getDescription()));
+        }
+
+        this.save(groupBuying);
+
+        // 创建奖级和奖品信息
+        createAwardsAndPrize(groupBuyingCreateParam.getAwardsList(), groupBuying);
+    }
+
+
+
+    /**
+     * 创建奖级和奖品信息
+     *
+     * @param awardsList
+     * @param groupBuying
+     */
+    private void createAwardsAndPrize(List<GroupBuyingAwardsParam> awardsList, GroupBuying groupBuying) {
+
+        int insideNum = 0;
+
+        // 创建奖级对应的奖品列表
+        List<GroupBuyingAwardsPrize> groupBuyingAwardsPrizeList = new ArrayList<>();
+
+        // 创建奖级
+        for (GroupBuyingAwardsParam awardsParam : awardsList) {
+            insideNum += awardsParam.getInsideNum();
+            if (awardsParam.getInsideNum() > awardsParam.getQuantity()) {
+                throw new ServiceException("内定数量不能大于奖品数量");
+            }
+            GroupBuyingAwards groupBuyingAwards = new GroupBuyingAwards();
+            BeanUtils.copyProperties(awardsParam, groupBuyingAwards);
+            groupBuyingAwards.setId(null);
+            // 设置活动id
+            groupBuyingAwards.setGroupbuyingId(groupBuying.getId());
+            groupBuyingAwardsService.save(groupBuyingAwards);
+
+            for (GroupBuyingAwardsPrizeParam prizeParam : awardsParam.getPrizeList()) {
+                GroupBuyingAwardsPrize awardsPrize = new GroupBuyingAwardsPrize();
+                BeanUtils.copyProperties(prizeParam, awardsPrize);
+                awardsPrize.setId(null);
+                awardsPrize.setGroupbuyingId(groupBuying.getId());
+                awardsPrize.setAwardsId(groupBuyingAwards.getId());
+                if (null == awardsPrize.getQuantity() || 0 == awardsPrize.getQuantity()) {
+                    // 页面没设置奖品的具体数量,则默认为整个奖项的数量
+                    awardsPrize.setQuantity(groupBuyingAwards.getQuantity());
+                }
+                if (prizeParam.getPrizeType() == TicketPrizeTypeEnum.GOODS) {
+                    Goods goods = goodsService.getById(awardsPrize.getRefId());
+                    awardsPrize.setTitle(goods.getTitle());
+                    awardsPrize.setPicUrl(goods.getPicUrl());
+                    awardsPrize.setValue(goods.getValue());
+                } else if (prizeParam.getPrizeType() == TicketPrizeTypeEnum.COUPON) {
+                    Coupon coupon = couponService.getById(awardsPrize.getRefId());
+                    awardsPrize.setTitle(coupon.getTitle());
+                    awardsPrize.setPicUrl(coupon.getPicUrl());
+                    awardsPrize.setValue(coupon.getDiscount());
+                } else if (prizeParam.getPrizeType() == TicketPrizeTypeEnum.COUPON_PKG) {
+                    CouponPkg couponPkg = couponPkgService.getById(awardsPrize.getRefId());
+                    awardsPrize.setTitle(couponPkg.getTitle());
+                    awardsPrize.setValue(couponPkg.getFacePrice());
+                    awardsPrize.setPicUrl(couponPkg.getPicUrl());
+                } else {
+                    awardsPrize.setTitle("盲豆");
+                    awardsPrize.setPicUrl(Constants.MANGDOU_PIC);
+                }
+                groupBuyingAwardsPrizeList.add(awardsPrize);
+            }
+        }
+
+        if (insideNum > 100) {
+            throw new ServiceException("内定人数不能超过100");
+        }
+
+        groupBuyingAwardsPrizeService.saveBatch(groupBuyingAwardsPrizeList);
+    }
+
+
+    /**
+     * 更新拼团活动
+     * @param groupBuyingUpdateParam
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateGroupBuying(GroupBuyingUpdateParam groupBuyingUpdateParam) {
+        GroupBuying groupBuying = this.getById(groupBuyingUpdateParam.getId());
+        if (Objects.isNull(groupBuying)) {
+            throw new ServiceException("拼团活动不存在");
+        }
+
+        if (GroupBuyingStatusEnum.UP.getValue().equals(groupBuying.getIsPutaway())) {
+            throw new ServiceException("活动当前状态不支持修改");
+        }
+
+        Date now = DateUtils.getNowDate();
+        if (GroupBuyingStatusEnum.END.getValue().equals(groupBuying.getIsPutaway()) && now.after(groupBuying.getEndTime())) {
+            throw new ServiceException("活动当前状态不支持修改");
+        }
+
+        // 更新拼团活动
+        BeanUtils.copyProperties(groupBuyingUpdateParam, groupBuying);
+
+        if (StringUtils.isNotBlank(groupBuyingUpdateParam.getDescription())) {
+            groupBuying.setDescription(URLDecoder.decode(groupBuyingUpdateParam.getDescription()));
+        }
+
+        this.updateById(groupBuying);
+
+        // 删除奖级和奖品信息
+        groupBuyingAwardsService.remove(new LambdaUpdateWrapper<GroupBuyingAwards>().eq(GroupBuyingAwards::getGroupbuyingId, groupBuying.getId()));
+        groupBuyingAwardsPrizeService.remove(new LambdaUpdateWrapper<GroupBuyingAwardsPrize>().eq(GroupBuyingAwardsPrize::getGroupbuyingId, groupBuying.getId()));
+
+        // 创建奖级和奖品信息
+        createAwardsAndPrize(groupBuyingUpdateParam.getAwardsList(), groupBuying);
+    }
+
+    /**
+     * 拼团活动列表
+     * @param groupBuyingQueryParam
+     * @return
+     */
+    @Override
+    public List<GroupBuying> listGroupBuying(GroupBuyingQueryParam groupBuyingQueryParam) {
+        LambdaQueryWrapper<GroupBuying> queryWrapper = new LambdaQueryWrapper<>();
+        if (StringUtils.isNotBlank(groupBuyingQueryParam.getTitle())) {
+            queryWrapper.like(GroupBuying::getTitle, groupBuyingQueryParam.getTitle());
+        }
+
+        //活动状态:0上架,1下架,2已结束,3进行中,4预热中
+        if (Objects.nonNull(groupBuyingQueryParam.getStatus())) {
+            //0上架,1下架,2已结束
+            if (GroupBuyingStatusEnum.UP.getValue().equals(groupBuyingQueryParam.getStatus()) ||
+                    GroupBuyingStatusEnum.DOWN.getValue().equals(groupBuyingQueryParam.getStatus()) ||
+                    GroupBuyingStatusEnum.END.getValue().equals(groupBuyingQueryParam.getStatus())) {
+                queryWrapper.eq(GroupBuying::getIsPutaway, groupBuyingQueryParam.getStatus());
+
+            } else if (GroupBuyingStatusEnum.UNDERWAY.getValue().equals(groupBuyingQueryParam.getStatus())) {
+                //3进行中
+                queryWrapper.gt(GroupBuying::getStartTime, new Date());
+                queryWrapper.lt(GroupBuying::getEndTime, new Date());
+                queryWrapper.eq(GroupBuying::getIsPutaway, GroupBuyingStatusEnum.UP.getValue());
+
+            } else if (GroupBuyingStatusEnum.WARMUP.getValue().equals(groupBuyingQueryParam.getStatus())) {
+                //4预热中
+                queryWrapper.lt(GroupBuying::getStartTime, new Date());
+                queryWrapper.eq(GroupBuying::getIsPutaway, GroupBuyingStatusEnum.UP.getValue());
+            }
+        }
+
+        queryWrapper.orderByDesc(GroupBuying::getCreateTime);
+
+
+        return this.list(queryWrapper);
+    }
+
+
+
+
+
+    /**
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void generateCode(Long marketingId, Long userId) {
+
+        // 判断是否已经获取过
+        int count = marketingUserCodeService.count(new LambdaQueryWrapper<MarketingUserCode>()
+                .eq(MarketingUserCode::getUserId, userId)
+                .eq(MarketingUserCode::getMarketingId, marketingId)
+                .eq(MarketingUserCode::getHelpUserId, -1L));
+        if (count > 0) {
+            throw new ServiceException("您已经获取过抽奖码了");
+        }
+
+
+        // 生成唯一抽奖码
+        String code = getOnlyCode(marketingId);
+
+        MarketingUserCode marketingUserCode = new MarketingUserCode();
+        // 设置活动id
+        marketingUserCode.setMarketingId(marketingId);
+        // 设置抽奖码
+        marketingUserCode.setCode(code);
+        // 设置用户
+        marketingUserCode.setUserId(userId);
+        // -1为无人助力获取抽奖码
+        marketingUserCode.setHelpUserId(-1L);
+        // 设置用户类型
+        marketingUserCode.setUserType(UserTypeEnum.ORDINARY.getValue());
+
+        // 保存助力信息
+        marketingUserCodeService.save(marketingUserCode);
+
+
+        // 设置更新虚拟参与人数
+        int randomNum = (int) 1 + (int) (Math.random() * 3);
+        String fakeNumKey = RedisKey.build(RedisKey.MARKETING_FAKE_NUM, marketingId);
+        Integer fakeNum = redisCache.getCacheObject(fakeNumKey);
+        if (fakeNum == null) {
+            fakeNum = marketingUserCodeService.countRealUserNumByMarketingId(marketingId);
+            redisCache.setCacheObject(fakeNumKey, fakeNum * 2 + randomNum, 30, TimeUnit.HOURS);
+        } else {
+            redisCache.setCacheObject(fakeNumKey, fakeNum + randomNum, 30, TimeUnit.HOURS);
+        }
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void lottery(Marketing marketing) {
+
+        // 用户抽奖池
+        String userLotteryPool = String.format(MARKETING_LOTTERY_ORDINARY_POOL, marketing.getId());
+        // 用户低阶奖池
+        String userLowLotteryPool = String.format(MARKETING_LOW_LOTTERY_ORDINARY_POOL, marketing.getId());
+        // 内部抽奖池
+        String insideLotteryPool = String.format(MARKETING_LOTTERY_INSIDE_POOL, marketing.getId());
+
+        // 获取奖级信息
+        List<MarketingAwards> marketingAwardsList = marketingAwardsService.list(new LambdaQueryWrapper<MarketingAwards>()
+                .eq(MarketingAwards::getMarketingId, marketing.getId()));
+
+        // 奖品总数
+        int prizeQuantity = marketingAwardsList.stream().mapToInt(MarketingAwards::getQuantity).sum();
+
+        // 校准并获取真实参与人数
+        int realNum = marketingUserCodeService.countRealUserNumByMarketingId(marketing.getId());
+
+        // 设置需要的内定人数
+        int insideNum = 0;
+
+        boolean isInside = false;
+
+        // 参与人数不足,全部采用内定人员开奖
+//        if (prizeQuantity >= realNum) {
+//            insideNum = prizeQuantity;
+//            isInside = true;
+//        } else {
+            insideNum = marketingAwardsList.stream().mapToInt(MarketingAwards::getInsideNum).sum();
+//        }
+
+        // 获取一定数量的内定人员设置抽奖码加入抽奖关系表和抽奖池
+        List<SysUser> insideUserList = sysUserService.selectUserListByRand(UserTypeEnum.INSIDE.getValue(), insideNum);
+
+        Set<String> insideCodes = new HashSet<>();
+        for (SysUser sysUser : insideUserList) {
+            // 生成抽奖码
+            String code = MarketingUtils.generatePrizeCode();
+            while (true) {
+                // 判断抽奖码是否已经存在
+                int codeCount = marketingUserCodeService.count(new LambdaQueryWrapper<MarketingUserCode>()
+                        .eq(MarketingUserCode::getMarketingId, marketing.getId())
+                        .eq(MarketingUserCode::getCode, code));
+                if (codeCount > 0) {
+                    code = MarketingUtils.generatePrizeCode();
+                    continue;
+                }
+                break;
+            }
+            insideCodes.add(code);
+            MarketingUserCode marketingUserCode = new MarketingUserCode();
+            marketingUserCode.setMarketingId(marketing.getId());
+            marketingUserCode.setUserId(sysUser.getUserId());
+            marketingUserCode.setUserType(UserTypeEnum.INSIDE.getValue());
+            marketingUserCode.setCode(code);
+            marketingUserCode.setHelpUserId(0L);
+            // 设置中奖
+            marketingUserCode.setIsHit(1);
+            marketingUserCodeService.save(marketingUserCode);
+        }
+        // 将抽奖码放入内部抽奖池
+        redisCache.setCacheSet(insideLotteryPool, insideCodes);
+
+
+        // 获取普通用户拉新所获得的所有的抽奖码
+        List<MarketingUserCode> userCodeList = marketingUserCodeService.list(new LambdaQueryWrapper<MarketingUserCode>()
+                .eq(MarketingUserCode::getMarketingId, marketing.getId())
+                .eq(MarketingUserCode::getUserType, UserTypeEnum.ORDINARY.getValue()));
+        if (CollectionUtils.isNotEmpty(userCodeList)) {
+            // 用户普通抽奖码
+            Set<String> userCodes = new HashSet<>();
+            // 用户低阶抽奖码
+            Set<String> userLowCodes = new HashSet<>();
+            for (MarketingUserCode marketingUserCode : userCodeList) {
+                if (marketingUserCode.getHelpUserId() == -1L) {
+                    userLowCodes.add(marketingUserCode.getCode());
+                } else {
+                    userCodes.add(marketingUserCode.getCode());
+                }
+            }
+            if (CollectionUtils.isNotEmpty(userCodes)) {
+                // 将抽奖码放入普通抽奖池
+                redisCache.setCacheSet(userLotteryPool, userCodes);
+            }
+            if (CollectionUtils.isNotEmpty(userLowCodes)) {
+                // 将抽奖码放入低阶抽奖池
+                redisCache.setCacheSet(userLowLotteryPool, userLowCodes);
+            }
+        }
+
+
+        // 所有中奖名单
+        List<MarketingHitPrize> allHitPrizeList = new ArrayList<>();
+
+        // 普通用户中奖名单
+        List<MarketingHitPrize> userHitPrizeList = new ArrayList<>();
+
+        // 抽奖码中奖状态更新列表
+        List<MarketingUserCode> userCodeUpdateList = new ArrayList<>();
+
+        // 遍历奖级进行抽奖
+        for (MarketingAwards marketingAwards : marketingAwardsList) {
+            // 获取内部人数
+            if (isInside) {
+                insideNum = marketingAwards.getQuantity();
+            } else {
+                insideNum = marketingAwards.getInsideNum();
+            }
+
+            List<MarketingAwardsPrize> marketingAwardsPrizeList = marketingAwardsPrizeService.list(new LambdaQueryWrapper<MarketingAwardsPrize>()
+                    .eq(MarketingAwardsPrize::getMarketingId, marketing.getId())
+                    .eq(MarketingAwardsPrize::getAwardsId, marketingAwards.getId()));
+
+            if (insideNum != 0) {
+                // 设置内部用户抽奖信息
+                List<String> insideCodeList = redisCache.popCacheSet(insideLotteryPool, insideNum);
+                for (String code : insideCodeList) {
+                    MarketingUserCode marketingUserCode = marketingUserCodeService.getOne(new LambdaQueryWrapper<MarketingUserCode>()
+                            .eq(MarketingUserCode::getMarketingId, marketing.getId())
+                            .eq(MarketingUserCode::getCode, code));
+
+                    // 设置中奖信息
+                    exchangeMarketingHitPrize(marketing, allHitPrizeList, marketingAwards, marketingAwardsPrizeList, marketingUserCode);
+                }
+            }
+
+            // 用户中奖数量为 名额 - 内定人数
+            int userNum = marketingAwards.getQuantity() - insideNum;
+            if (userNum > 0) {
+                // 设置普通用户抽奖信息
+                for (int i = 0; i < userNum; i++) {
+                    List<String> hitCodeList = redisCache.popCacheSet(userLotteryPool, 1);
+                    if (CollectionUtils.isEmpty(hitCodeList)) {
+                        hitCodeList = redisCache.popCacheSet(userLowLotteryPool, 1);
+                    }
+                    if (CollectionUtils.isEmpty(hitCodeList)) {
+                        break;
+                    }
+                    MarketingUserCode marketingUserCode = marketingUserCodeService.getOne(new LambdaQueryWrapper<MarketingUserCode>()
+                            .eq(MarketingUserCode::getMarketingId, marketing.getId())
+                            .eq(MarketingUserCode::getCode, hitCodeList.get(0)));
+
+                    // 删除redis中该用户所有的抽奖码
+                    List<MarketingUserCode> list = marketingUserCodeService.list(new LambdaQueryWrapper<MarketingUserCode>()
+                            .eq(MarketingUserCode::getMarketingId, marketing.getId())
+                            .eq(MarketingUserCode::getUserId, marketingUserCode.getUserId()));
+                    List<Object> delUserCodeList = list.stream().map(MarketingUserCode::getCode).collect(Collectors.toList());
+                    redisCache.removeSetValueByKey(userLotteryPool, delUserCodeList);
+                    redisCache.removeSetValueByKey(userLowLotteryPool, delUserCodeList);
+                    MarketingHitPrize marketingHitPrize = exchangeMarketingHitPrize(marketing, allHitPrizeList, marketingAwards, marketingAwardsPrizeList, marketingUserCode);
+
+                    userHitPrizeList.add(marketingHitPrize);
+
+                    // 更新用户中奖状态
+                    marketingUserCode.setIsHit(1);
+                    userCodeUpdateList.add(marketingUserCode);
+                }
+            }
+        }
+        // 保存中奖信息
+        Assert.isTrue(marketingHitPrizeService.saveBatch(allHitPrizeList), "保存中奖信息失败。marketingId:" + marketing.getId());
+
+        // 更新抽奖码中奖状态
+        if (CollectionUtils.isNotEmpty(userCodeUpdateList)) {
+            boolean rtn = marketingUserCodeService.updateBatchById(userCodeUpdateList);
+            Assert.isTrue(rtn, "更新抽奖码中奖状态失败。marketingId:" + marketing.getId());
+        }
+
+        // 发奖品
+        if (CollectionUtils.isNotEmpty(userHitPrizeList)) {
+            for (MarketingHitPrize marketingHitPrize : userHitPrizeList) {
+                MarketingAwardsPrize marketingAwardsPrize = marketingAwardsPrizeService.getById(marketingHitPrize.getPrizeId());
+
+                // 放入仓库
+                if (marketingAwardsPrize.getPrizeType() == TicketPrizeTypeEnum.COIN) {
+                    userCoinService.produce(marketingHitPrize.getUserId(), marketingAwardsPrize.getValue(), String.valueOf(marketingHitPrize.getId()), CoinLogTypeEnum.MARKETING);
+                } else if (marketingAwardsPrize.getPrizeType() == TicketPrizeTypeEnum.COUPON) {
+                    couponService.distributeByMarketing(marketingHitPrize.getUserId(), marketingAwardsPrize.getRefId());
+                } else if (marketingAwardsPrize.getPrizeType() == TicketPrizeTypeEnum.COUPON_PKG) {
+                    couponPkgService.distributeByMarketing(marketingHitPrize.getUserId(), marketingAwardsPrize.getRefId());
+                } else {
+                    // 实物奖品
+                    userPrizeStorageService.takeInStorage(marketingHitPrize.getUserId(), marketingAwardsPrize.getTitle(), marketingAwardsPrize.getPicUrl(), marketingAwardsPrize.getRefId(), PrizeStorageInTypeEnum.MARKETING, marketingHitPrize.getId());
+                }
+            }
+        }
+
+        // 更新活动状态
+        boolean rtn = this.update(new LambdaUpdateWrapper<Marketing>().set(Marketing::getTriggerStatus, 1)
+                .eq(Marketing::getId, marketing.getId())
+                .eq(Marketing::getTriggerStatus, 0));
+        Assert.isTrue(rtn, "更新活动开奖状态失败。marketingId:" + marketing.getId());
+
+        // 删除抽奖池
+        redisCache.deleteObject(userLotteryPool);
+        redisCache.deleteObject(userLowLotteryPool);
+        redisCache.deleteObject(insideLotteryPool);
+
+    }
+
+    private MarketingHitPrize exchangeMarketingHitPrize(Marketing marketing, List<MarketingHitPrize> allHitPrizeList, MarketingAwards marketingAwards, List<MarketingAwardsPrize> marketingAwardsPrizeList, MarketingUserCode marketingUserCode) {
+        // 设置中奖信息
+        MarketingHitPrize marketingHitPrize = new MarketingHitPrize();
+        marketingHitPrize.setId(bizIdGenerator.newId());
+        marketingHitPrize.setMarketingId(marketing.getId());
+        marketingHitPrize.setAwardsId(marketingAwards.getId());
+        marketingHitPrize.setMarketingUserCodeId(marketingUserCode.getId());
+        marketingHitPrize.setUserId(marketingUserCode.getUserId());
+        marketingHitPrize.setUserType(marketingUserCode.getUserType());
+
+        // 随机抽取奖品,[0, list.size)  左闭右开
+        int randomIndex = RandomUtil.randomInt(0, marketingAwardsPrizeList.size());
+        marketingHitPrize.setPrizeId(marketingAwardsPrizeList.get(randomIndex).getId());
+
+        allHitPrizeList.add(marketingHitPrize);
+        return marketingHitPrize;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void help(MarketingHelpParam marketingHelpParam, Long userId) {
+        String inviteCode = marketingHelpParam.getInviteCode();
+        // 邀请码解码,被助力人id
+        Long helpedUserId = MarketingUtils.decodeInviteCode(inviteCode);
+
+        Marketing marketing = this.getById(marketingHelpParam.getMarketingId());
+
+        // 处理助力信息
+        // 判断是否已经助力过
+        int count = marketingUserCodeService.count(new LambdaQueryWrapper<MarketingUserCode>()
+                .eq(MarketingUserCode::getHelpUserId, userId));
+        if (count > 0) {
+            throw new ServiceException("您已经助力过了");
+        }
+        // 生成唯一抽奖码
+        String code = getOnlyCode(marketing.getId());
+
+        MarketingUserCode marketingUserCode = new MarketingUserCode();
+        // 设置活动id
+        marketingUserCode.setMarketingId(marketingHelpParam.getMarketingId());
+        // 设置抽奖码
+        marketingUserCode.setCode(code);
+        // 设置被助力人
+        marketingUserCode.setUserId(helpedUserId);
+        // 设置助力人
+        marketingUserCode.setHelpUserId(userId);
+        marketingUserCode.setUserType(UserTypeEnum.ORDINARY.getValue());
+
+        // 保存助力信息
+        marketingUserCodeService.save(marketingUserCode);
+
+
+        // 自己获得一个普通抽奖码
+        MarketingUserCode myCode= new MarketingUserCode();
+        myCode.setMarketingId(marketing.getId());
+        // 设置抽奖码
+        myCode.setCode(getOnlyCode(marketing.getId()));
+        // 设置被助力人
+        myCode.setUserId(userId);
+        myCode.setHelpUserId(-1L);
+        myCode.setUserType(UserTypeEnum.ORDINARY.getValue());
+
+        // 保存抽奖码
+        marketingUserCodeService.save(myCode);
+
+
+        // 设置更新虚拟参与人数
+        int randomNum = (int) 1 + (int) (Math.random() * 3);
+        String fakeNumKey = RedisKey.build(RedisKey.MARKETING_FAKE_NUM, marketing.getId());
+        Integer fakeNum = redisCache.getCacheObject(fakeNumKey);
+        if (fakeNum == null) {
+            fakeNum = marketingUserCodeService.countRealUserNumByMarketingId(marketing.getId());
+            redisCache.setCacheObject(fakeNumKey, fakeNum * 2 + randomNum, 30, TimeUnit.HOURS);
+        } else {
+            redisCache.setCacheObject(fakeNumKey, fakeNum + randomNum, 30, TimeUnit.HOURS);
+        }
+
+    }
+
+    */
+
+    /**
+     * 获取当前活动用户唯一的抽奖码
+     * @param marketingId
+     * @return
+     */
+    /**
+    private String getOnlyCode(Long marketingId) {
+        String code = "";
+        while (true) {
+            code = MarketingUtils.generatePrizeCode();
+            // 判断抽奖码是否已经存在
+            int codeCount = marketingUserCodeService.count(new LambdaQueryWrapper<MarketingUserCode>()
+                    .eq(MarketingUserCode::getMarketingId, marketingId)
+                    .eq(MarketingUserCode::getCode, code));
+            if (codeCount > 0) {
+                continue;
+            }
+            break;
+        }
+        return code;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteById(Long id) {
+        this.removeById(id);
+
+        // 删除奖级和奖品信息
+        marketingAwardsService.remove(new LambdaQueryWrapper<MarketingAwards>().eq(MarketingAwards::getMarketingId, id));
+
+        marketingAwardsPrizeService.remove(new LambdaQueryWrapper<MarketingAwardsPrize>().eq(MarketingAwardsPrize::getMarketingId, id));
+
+    }
+    */
+
+}

+ 34 - 0
mp-service/src/main/java/com/qs/mp/user/service/IGroupBuyingHitPrizeService.java

@@ -0,0 +1,34 @@
+package com.qs.mp.user.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.admin.domain.excel.MarketingHitPrizeExcel;
+import com.qs.mp.user.domain.MarketingHitPrize;
+import com.qs.mp.user.domain.vo.UserMarketingHitPrizeListVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 营销活动中奖信息表 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-05-16
+ */
+public interface IGroupBuyingHitPrizeService extends IService<MarketingHitPrize> {
+
+    /**
+     * 根据条件获取中奖信息列表
+     * @param queryWrapper
+     * @return
+     */
+    List<UserMarketingHitPrizeListVO> listHitPrizeByQueryWrapper(QueryWrapper<MarketingHitPrize> queryWrapper);
+
+    /**
+     * 根据条件获取中奖信息导出列表
+     * @param queryWrapper
+     * @return
+     */
+    List<MarketingHitPrizeExcel> listHitPrizeExportByQueryWrapper(QueryWrapper<MarketingHitPrize> queryWrapper);
+}

+ 35 - 0
mp-service/src/main/java/com/qs/mp/user/service/impl/GroupBuyingHitPrizeServiceImpl.java

@@ -0,0 +1,35 @@
+package com.qs.mp.user.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.admin.domain.excel.MarketingHitPrizeExcel;
+import com.qs.mp.user.domain.MarketingHitPrize;
+import com.qs.mp.user.domain.vo.UserMarketingHitPrizeListVO;
+import com.qs.mp.user.mapper.MarketingHitPrizeMapper;
+import com.qs.mp.user.service.IMarketingHitPrizeService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 营销活动中奖信息表 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-05-16
+ */
+@Service
+public class GroupBuyingHitPrizeServiceImpl extends ServiceImpl<MarketingHitPrizeMapper, MarketingHitPrize> implements IMarketingHitPrizeService {
+
+
+    @Override
+    public List<UserMarketingHitPrizeListVO> listHitPrizeByQueryWrapper(QueryWrapper<MarketingHitPrize> queryWrapper) {
+        return getBaseMapper().listHitPrizeByQueryWrapper(queryWrapper);
+    }
+
+    @Override
+    public List<MarketingHitPrizeExcel> listHitPrizeExportByQueryWrapper(QueryWrapper<MarketingHitPrize> queryWrapper) {
+        return getBaseMapper().listHitPrizeExportByQueryWrapper(queryWrapper);
+    }
+}