diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivity.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivity.java index 122d8249..00be19bc 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivity.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivity.java @@ -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; } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivityItem.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivityItem.java index c2cede81..0bb06e67 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivityItem.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivityItem.java @@ -12,7 +12,7 @@ import javax.persistence.Table; /** * 优惠券活动实体类 * - * @author Chopper + * @author Bulbasaur * @date 2020-03-19 10:44 上午 */ @Data diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/CouponActivityDTO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/CouponActivityDTO.java new file mode 100644 index 00000000..0e997819 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/CouponActivityDTO.java @@ -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 couponActivityItems; +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/ActivityRangeEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/ActivityRangeEnum.java deleted file mode 100644 index 33c16f07..00000000 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/ActivityRangeEnum.java +++ /dev/null @@ -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; - } -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponActivityVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponActivityVO.java new file mode 100644 index 00000000..956c9f8c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponActivityVO.java @@ -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 couponActivityItems; + + public CouponActivityVO(CouponActivity couponActivity, List couponActivityItems) { + BeanUtil.copyProperties(couponActivity, this); + this.couponActivityItems = couponActivityItems; + } +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponActivityItemMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponActivityItemMapper.java index 9a42d55a..000d8b5c 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponActivityItemMapper.java +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponActivityItemMapper.java @@ -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 { +public interface CouponActivityItemMapper extends BaseMapper { } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityItemService.java b/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityItemService.java index 337e0488..5616b7c8 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityItemService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityItemService.java @@ -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 { + + /** + * 获取优惠券活动关联优惠券列表 + * + * @param activityId 优惠券活动ID + * @return 优惠券关联优惠券列表 + */ + List getCouponActivityList(String activityId); } diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityService.java b/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityService.java index 91e3d0e2..f178b21d 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityService.java @@ -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 { - //创建优惠券活动--精准发券、新人赠券、会员等级赠券 + /** + * 创建优惠券活动--精准发券、新人赠券 + * @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 couponActivityIds, String memberId); //编辑优惠券活动 diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityItemServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityItemServiceImpl.java new file mode 100644 index 00000000..b5993abc --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityItemServiceImpl.java @@ -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 implements CouponActivityItemService { + @Override + public List getCouponActivityList(String activityId) { + return this.list(this.lambdaQuery().eq(CouponActivityItem::getActivityId, activityId)); + } +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityServiceImpl.java index cc75a1ad..4ae3801b 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityServiceImpl.java @@ -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 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() + .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> memberList = this.getMemberList(couponActivity); + //优惠优惠券活动的优惠券列表 + List couponActivityItems = couponActivityItemService.getCouponActivityList(couponActivity.getId()); + //发送优惠券 + sendCoupon(memberList, couponActivityItems); + } + + @Override + public void registered(List couponActivityIds, String memberId) { + for (String couponActivityId : couponActivityIds) { + //获取优惠券 + CouponActivity couponActivity = this.getById(couponActivityId); + //获取会员信息 + List> memberList = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id", memberId); + map.put("nick_name", memberService.getById(memberId).getNickName()); + memberList.add(map); + + //优惠优惠券活动的优惠券列表 + List couponActivityItems = couponActivityItemService.getCouponActivityList(couponActivity.getId()); + + //发送优惠券 + sendCoupon(memberList, couponActivityItems); + } + } + + /** + * 发送优惠券 + * + * @param memberList 用户列表 + * @param couponActivityItems 优惠券列表 + */ + private void sendCoupon(List> memberList, List couponActivityItems) { + + for (CouponActivityItem couponActivityItem : couponActivityItems) { + //获取优惠券 + Coupon coupon = couponService.getCouponDetailFromMongo(couponActivityItem.getCouponId()); + //判断优惠券是否存在 + if (coupon != null) { + List memberCouponList = new LinkedList<>(); + //循环会员列表,添加优惠券 + for (Map 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> getMemberList(CouponActivity couponActivity) { + //判断优惠券的发送范围,获取会员列表 + if (couponActivity.getActivityScope().equals("ALL")) { + return memberService.listMaps(new QueryWrapper() + .select("id") + .select("nick_name")); + } else { + return memberService.listMaps(new QueryWrapper() + .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()); + } } diff --git a/manager-api/src/main/java/cn/lili/controller/promotion/CouponActivityManagerController.java b/manager-api/src/main/java/cn/lili/controller/promotion/CouponActivityManagerController.java new file mode 100644 index 00000000..8dabf79f --- /dev/null +++ b/manager-api/src/main/java/cn/lili/controller/promotion/CouponActivityManagerController.java @@ -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> 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 getCouponActivity(@PathVariable String couponActivityId) { + return ResultUtil.data(couponActivityService.getCouponActivityVO(couponActivityId)); + } + + @ApiOperation(value = "添加优惠券活动") + @PostMapping("/add") + public ResultMessage addCouponActivity(@Validated CouponActivityDTO couponActivityDTO) { + return ResultUtil.data(couponActivityService.addCouponActivity(couponActivityDTO)); + } +}