创建优惠券活动

This commit is contained in:
lifenlong 2021-05-21 19:54:25 +08:00
parent 16498a6850
commit 8924981556
11 changed files with 365 additions and 29 deletions

View File

@ -8,11 +8,12 @@ import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
/**
* 优惠券活动实体类
*
* @author Chopper
* @author Bulbasaur
* @date 2020-03-19 10:44 上午
*/
@Data
@ -22,13 +23,15 @@ import javax.persistence.Table;
@ApiModel(value = "优惠券活动实体类")
public class CouponActivity extends BasePromotion {
@NotNull(message = "优惠券活动类型不能为空")
@ApiModelProperty(value = "优惠券活动类型")
private String couponActivityType;
@NotNull(message = "请选择活动范围")
@ApiModelProperty(value = "活动范围", allowableValues = "ALL:全部会员,DESIGNATED指定会员")
private String activityScope;
@ApiModelProperty(value = "活动范围")
@ApiModelProperty(value = "活动范围详情")
private String activityScopeInfo;
}

View File

@ -12,7 +12,7 @@ import javax.persistence.Table;
/**
* 优惠券活动实体类
*
* @author Chopper
* @author Bulbasaur
* @date 2020-03-19 10:44 上午
*/
@Data

View File

@ -0,0 +1,21 @@
package cn.lili.modules.promotion.entity.dto;
import cn.lili.modules.promotion.entity.dos.CouponActivity;
import cn.lili.modules.promotion.entity.dos.CouponActivityItem;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* 优惠券活动DTO
*
* @author Bulbasaur
* @date: 2021/5/21 7:16 下午
*/
@Data
public class CouponActivityDTO extends CouponActivity {
@ApiModelProperty(value = "优惠券列表")
private List<CouponActivityItem> couponActivityItems;
}

View File

@ -1,23 +0,0 @@
package cn.lili.modules.promotion.entity.enums;
/**
* 优惠券活动范围枚举
*
* @author Bulbasaur
* @date: 2021/5/20 6:05 下午
*/
public enum ActivityRangeEnum {
ALL("新人赠券"),
DESIGNATED("精确发券");
private final String description;
ActivityRangeEnum(String str) {
this.description = str;
}
public String description() {
return description;
}
}

View File

@ -0,0 +1,29 @@
package cn.lili.modules.promotion.entity.vos;
import cn.lili.common.utils.BeanUtil;
import cn.lili.modules.promotion.entity.dos.CouponActivity;
import cn.lili.modules.promotion.entity.dos.CouponActivityItem;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 优惠券活动VO
*
* @author Bulbasaur
* @date: 2021/5/21 7:01 下午
*/
@Data
@NoArgsConstructor
public class CouponActivityVO extends CouponActivity {
@ApiModelProperty(value = "优惠券活动下的优惠券列表")
private List<CouponActivityItem> couponActivityItems;
public CouponActivityVO(CouponActivity couponActivity, List<CouponActivityItem> couponActivityItems) {
BeanUtil.copyProperties(couponActivity, this);
this.couponActivityItems = couponActivityItems;
}
}

View File

@ -1,6 +1,6 @@
package cn.lili.modules.promotion.mapper;
import cn.lili.modules.promotion.entity.dos.CouponActivity;
import cn.lili.modules.promotion.entity.dos.CouponActivityItem;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
* @date: 2021/5/20 6:11 下午
*
*/
public interface CouponActivityItemMapper extends BaseMapper<CouponActivity> {
public interface CouponActivityItemMapper extends BaseMapper<CouponActivityItem> {
}

View File

@ -3,6 +3,8 @@ package cn.lili.modules.promotion.service;
import cn.lili.modules.promotion.entity.dos.CouponActivityItem;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* 优惠券活动-优惠券业务层
*
@ -10,4 +12,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
* @date: 2021/5/20 6:10 下午
*/
public interface CouponActivityItemService extends IService<CouponActivityItem> {
/**
* 获取优惠券活动关联优惠券列表
*
* @param activityId 优惠券活动ID
* @return 优惠券关联优惠券列表
*/
List<CouponActivityItem> getCouponActivityList(String activityId);
}

View File

@ -1,8 +1,12 @@
package cn.lili.modules.promotion.service;
import cn.lili.modules.promotion.entity.dos.CouponActivity;
import cn.lili.modules.promotion.entity.dto.CouponActivityDTO;
import cn.lili.modules.promotion.entity.vos.CouponActivityVO;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* 优惠券活动业务层
*
@ -11,7 +15,41 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface CouponActivityService extends IService<CouponActivity> {
//创建优惠券活动--精准发券新人赠券会员等级赠券
/**
* 创建优惠券活动--精准发券新人赠券
* @param couponActivityDTO 优惠券活动DTO
*/
CouponActivityDTO addCouponActivity(CouponActivityDTO couponActivityDTO);
/**
* 修改优惠券活动--精准发券新人赠券
* @param couponActivityDTO 优惠券活动DTO
*/
CouponActivityDTO updateCouponActivity(CouponActivityDTO couponActivityDTO);
/**
* 获取优惠券活动VO
* 包含优惠券活动信息以及优惠券关联优惠券列表
*
* @param couponActivityId 优惠券活动ID
* @return 优惠券VO
*/
CouponActivityVO getCouponActivityVO(String couponActivityId);
/**
* 精准发券
*
* @param couponActivityId 优惠券活动ID
*/
void specify(String couponActivityId);
/**
* 注册赠券
*
* @param couponActivityIds 优惠券活动ID
* @param memberId
*/
void registered(List<String> couponActivityIds, String memberId);
//编辑优惠券活动

View File

@ -0,0 +1,23 @@
package cn.lili.modules.promotion.serviceimpl;
import cn.lili.modules.promotion.entity.dos.CouponActivityItem;
import cn.lili.modules.promotion.mapper.CouponActivityItemMapper;
import cn.lili.modules.promotion.service.CouponActivityItemService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 优惠券活动关联优惠券业务层实现
*
* @author Bulbasaur
* @date: 2021/5/21 6:42 下午
*/
@Service
public class CouponActivityItemServiceImpl extends ServiceImpl<CouponActivityItemMapper, CouponActivityItem> implements CouponActivityItemService {
@Override
public List<CouponActivityItem> getCouponActivityList(String activityId) {
return this.list(this.lambdaQuery().eq(CouponActivityItem::getActivityId, activityId));
}
}

View File

@ -1,9 +1,30 @@
package cn.lili.modules.promotion.serviceimpl;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.utils.DateUtil;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.service.MemberService;
import cn.lili.modules.promotion.entity.dos.Coupon;
import cn.lili.modules.promotion.entity.dos.CouponActivity;
import cn.lili.modules.promotion.entity.dos.CouponActivityItem;
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
import cn.lili.modules.promotion.entity.dto.CouponActivityDTO;
import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum;
import cn.lili.modules.promotion.entity.vos.CouponActivityVO;
import cn.lili.modules.promotion.mapper.CouponActivityMapper;
import cn.lili.modules.promotion.service.CouponActivityItemService;
import cn.lili.modules.promotion.service.CouponActivityService;
import cn.lili.modules.promotion.service.CouponService;
import cn.lili.modules.promotion.service.MemberCouponService;
import cn.lili.modules.promotion.tools.PromotionTools;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import groovy.util.logging.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
/**
* 优惠券活动业务层实现
@ -11,5 +32,168 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
* @author Bulbasaur
* @date: 2021/5/20 6:10 下午
*/
@Slf4j
@Service
public class CouponActivityServiceImpl extends ServiceImpl<CouponActivityMapper, CouponActivity> implements CouponActivityService {
@Autowired
private CouponService couponService;
@Autowired
private MemberCouponService memberCouponService;
@Autowired
private CouponActivityItemService couponActivityItemService;
@Autowired
private MemberService memberService;
@Override
public CouponActivityDTO addCouponActivity(CouponActivityDTO couponActivityDTO) {
//检测优惠券活动是否可以添加
this.checkParam(couponActivityDTO);
//添加优惠券活动
this.save(couponActivityDTO);
//添加优惠券活动优惠券
this.addCouponActivityItems(couponActivityDTO);
//发送促销活动开始的延时任务
return couponActivityDTO;
}
@Override
public CouponActivityDTO updateCouponActivity(CouponActivityDTO couponActivityDTO) {
//检测优惠券活动是否可以修改
this.checkParam(couponActivityDTO);
//修改优惠券活动
this.updateById(couponActivityDTO);
//删除优惠券活动关联的优惠券
couponActivityItemService.remove(new LambdaQueryWrapper<CouponActivityItem>()
.eq(CouponActivityItem::getActivityId,couponActivityDTO.getId()));
//重新添加优惠券活动关联优惠券
this.addCouponActivityItems(couponActivityDTO);
//更新促销活动的延时任务
return couponActivityDTO;
}
@Override
public CouponActivityVO getCouponActivityVO(String couponActivityId) {
CouponActivity couponActivity = this.getById(couponActivityId);
CouponActivityVO couponActivityVO = new CouponActivityVO(couponActivity, couponActivityItemService.getCouponActivityList(couponActivityId));
return couponActivityVO;
}
@Override
public void specify(String couponActivityId) {
//获取优惠券
CouponActivity couponActivity = this.getById(couponActivityId);
//获取活动优惠券发送范围
List<Map<String, Object>> memberList = this.getMemberList(couponActivity);
//优惠优惠券活动的优惠券列表
List<CouponActivityItem> couponActivityItems = couponActivityItemService.getCouponActivityList(couponActivity.getId());
//发送优惠券
sendCoupon(memberList, couponActivityItems);
}
@Override
public void registered(List<String> couponActivityIds, String memberId) {
for (String couponActivityId : couponActivityIds) {
//获取优惠券
CouponActivity couponActivity = this.getById(couponActivityId);
//获取会员信息
List<Map<String, Object>> memberList = new ArrayList<>();
Map<String, Object> map = new HashMap<>();
map.put("id", memberId);
map.put("nick_name", memberService.getById(memberId).getNickName());
memberList.add(map);
//优惠优惠券活动的优惠券列表
List<CouponActivityItem> couponActivityItems = couponActivityItemService.getCouponActivityList(couponActivity.getId());
//发送优惠券
sendCoupon(memberList, couponActivityItems);
}
}
/**
* 发送优惠券
*
* @param memberList 用户列表
* @param couponActivityItems 优惠券列表
*/
private void sendCoupon(List<Map<String, Object>> memberList, List<CouponActivityItem> couponActivityItems) {
for (CouponActivityItem couponActivityItem : couponActivityItems) {
//获取优惠券
Coupon coupon = couponService.getCouponDetailFromMongo(couponActivityItem.getCouponId());
//判断优惠券是否存在
if (coupon != null) {
List<MemberCoupon> memberCouponList = new LinkedList<>();
//循环会员列表添加优惠券
for (Map<String, Object> map : memberList) {
MemberCoupon memberCoupon = new MemberCoupon(coupon);
memberCoupon.setMemberId(map.get("id").toString());
memberCoupon.setMemberName(map.get("nick_name").toString());
memberCoupon.setMemberCouponStatus(MemberCouponStatusEnum.NEW.name());
memberCoupon.setIsPlatform(coupon.getStoreId().equals("platform"));
//循环优惠券的领取数量
for (int i = 1; i <= couponActivityItem.getNum(); i++) {
memberCouponList.add(memberCoupon);
}
}
//批量添加优惠券
memberCouponService.saveBatch(memberCouponList);
//添加优惠券已领取数量
couponService.receiveCoupon(couponActivityItem.getCouponId(), memberCouponList.size() * couponActivityItem.getNum());
} else {
log.error("赠送优惠券失败,当前优惠券不存在:" + couponActivityItem.getCouponId());
}
}
}
/**
* 检测优惠券活动参数
*
* @param couponActivity 优惠券活动
*/
private void checkParam(CouponActivity couponActivity) {
//检测活动时间超过当前时间不能进行操作
long nowTime = DateUtil.getDateline() * 1000;
if (couponActivity.getStartTime().getTime() < nowTime && couponActivity.getEndTime().getTime() > nowTime) {
throw new ServiceException("活动时间小于当前时间,不能进行编辑删除操作");
}
//活动时间需超过当前时间
PromotionTools.checkPromotionTime(couponActivity.getStartTime().getTime(), couponActivity.getEndTime().getTime());
}
/**
* 获取优惠券的范围范围
* 此方法用于精准发券
*
* @param couponActivity 优惠券活动
* @return 获取优惠券的会员列表
*/
private List<Map<String, Object>> getMemberList(CouponActivity couponActivity) {
//判断优惠券的发送范围获取会员列表
if (couponActivity.getActivityScope().equals("ALL")) {
return memberService.listMaps(new QueryWrapper<Member>()
.select("id")
.select("nick_name"));
} else {
return memberService.listMaps(new QueryWrapper<Member>()
.select("id")
.select("nick_name")
.in("id", couponActivity.getActivityScopeInfo()));
}
}
/**
* 添加优惠券活动关联优惠券
* @param couponActivityDTO 优惠券活动DTO
*/
private void addCouponActivityItems(CouponActivityDTO couponActivityDTO){
//创建优惠券活动子列表
for(CouponActivityItem couponActivityItem:couponActivityDTO.getCouponActivityItems()){
couponActivityItem.setActivityId(couponActivityDTO.getId());
}
couponActivityItemService.saveBatch(couponActivityDTO.getCouponActivityItems());
}
}

View File

@ -0,0 +1,51 @@
package cn.lili.controller.promotion;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.utils.PageUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.promotion.entity.dos.CouponActivity;
import cn.lili.modules.promotion.entity.dto.CouponActivityDTO;
import cn.lili.modules.promotion.entity.vos.CouponActivityVO;
import cn.lili.modules.promotion.service.CouponActivityService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* 优惠券活动
*
* @author Bulbasaur
* @date: 2021/5/21 7:11 下午
*/
@RestController
@Api(tags = "管理端,优惠券接口")
@RequestMapping("/manager/promotion/coupon")
public class CouponActivityManagerController {
@Autowired
private CouponActivityService couponActivityService;
@ApiOperation(value = "获取优惠券活动分页")
@GetMapping
public ResultMessage<IPage<CouponActivity>> getCouponActivityPage(PageVO page) {
return ResultUtil.data(couponActivityService.page(PageUtil.initPage(page)));
}
@ApiOperation(value = "获取优惠券活动")
@ApiImplicitParam(name = "couponActivityId", value = "优惠券活动ID", required = true, paramType = "path")
@GetMapping("/getCouponActivity/{couponActivityId}")
public ResultMessage<CouponActivityVO> getCouponActivity(@PathVariable String couponActivityId) {
return ResultUtil.data(couponActivityService.getCouponActivityVO(couponActivityId));
}
@ApiOperation(value = "添加优惠券活动")
@PostMapping("/add")
public ResultMessage<CouponActivity> addCouponActivity(@Validated CouponActivityDTO couponActivityDTO) {
return ResultUtil.data(couponActivityService.addCouponActivity(couponActivityDTO));
}
}