refactor(mcwl): 调整促销活动

master
yang 2025-03-07 10:56:47 +08:00
parent f5037353d9
commit ff6b2cdf30
5 changed files with 298 additions and 79 deletions

View File

@ -4,6 +4,8 @@ package com.mcwl.web.controller.memberCenter;
import cn.hutool.core.bean.BeanUtil;
import com.mcwl.common.core.domain.AjaxResult;
import com.mcwl.common.core.domain.R;
import com.mcwl.common.core.page.PageDomain;
import com.mcwl.common.core.page.TableDataInfo;
import com.mcwl.common.utils.SecurityUtils;
import com.mcwl.memberCenter.domain.Member;
import com.mcwl.memberCenter.domain.MemberPromotion;
@ -17,10 +19,12 @@ import com.mcwl.memberCenter.service.MemberService;
import com.mcwl.memberCenter.service.PromotionService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.List;
import java.util.Optional;
@ -39,8 +43,6 @@ public class PromotionController {
private final MemberPromotionService memberPromotionService;
private final MemberService memberService;
/**
*
@ -67,76 +69,34 @@ public class PromotionController {
/**
*
*/
@GetMapping("promotionList")
@PostMapping("promotionList")
@ApiOperation(value = "活动列表")
public R<List<Promotion>> promotionList() {
List<Promotion> promotionList = promotionService.lambdaQuery()
.gt(Promotion::getEndTime, new Date())
.list();
return R.ok(promotionList);
public TableDataInfo getPromotionList(@Valid @RequestBody PageDomain pageDomain) {
return promotionService.getPromotionList(pageDomain);
}
/**
*
*/
@GetMapping("myPromotionList")
@PostMapping("myPromotionList")
@ApiOperation(value = "获取当前用户参与的活动")
public R<List<MemberPromotion>> myPromotionList() {
// 获取当前用户
Long userId = SecurityUtils.getUserId();
List<MemberPromotion> memberPromotionList = memberPromotionService.lambdaQuery()
.eq(MemberPromotion::getUserId, userId)
.list();
return R.ok(memberPromotionList);
public TableDataInfo myPromotionList(@Valid @RequestBody PageDomain pageDomain) {
return promotionService.getMyPromotionList(pageDomain);
}
/**
*
*/
@PostMapping("joinPromotion")
@GetMapping("joinPromotion")
@ApiOperation(value = "参与活动")
public R<Object> joinPromotion(@RequestBody @Valid JoinPromotionDto joinPromotionDto) {
// 用户id
Long userId = joinPromotionDto.getUserId();
// 活动id
Long promotionId = joinPromotionDto.getPromotionId();
// 按活动id查询活动信息
Promotion promotion = promotionService.getById(promotionId);
public R<Object> joinPromotion(@Valid
@NotNull(message = "活动ID不能为空")
@ApiParam("活动ID")
Long promotionId) {
if (!Optional.ofNullable(promotion).isPresent()) {
return R.fail("活动不存在");
}
if (promotion.getStartTime().after(new Date())) {
return R.fail("活动未开始");
}
// 活动是否过期
if (promotion.getEndTime().before(new Date())) {
return R.fail("活动已过期");
}
// 获取当前用户是否参与过该活动
if (isJoinPromotion(userId, promotionId)) {
return R.fail("您已参与过该活动");
}
// 是否在活动期间内订阅或续订会员
// if (!isSubscribe(userId, promotion)) {
// return AjaxResult.warn("请在活动期间内订阅或续期会员后参加该活动");
// }
Member member = memberService.getUseUserMemberByUserId(userId);
String memberLevelIds = promotion.getMemberLevelIds();
if (!memberLevelIds.contains(member.getMemberLevelId().toString())) {
return R.fail("无法参与该活动,请查看活动条件");
}
MemberPromotion memberPromotion = getMemberPromotion(userId, promotionId);
memberPromotionService.save(memberPromotion);
return R.ok();
return promotionService.joinPromotion(promotionId);
}
// private boolean isSubscribe(Long userId, Promotion promotion) {
@ -153,26 +113,5 @@ public class PromotionController {
// return true;
// }
private boolean isJoinPromotion(Long userId, Long promotionId) {
MemberPromotion memberPromotion = memberPromotionService.lambdaQuery()
.eq(MemberPromotion::getUserId, userId)
.eq(MemberPromotion::getPromotionId, promotionId)
.one();
return memberPromotion != null;
}
private static MemberPromotion getMemberPromotion(Long userId, Long promotionId) {
MemberPromotion memberPromotion = new MemberPromotion();
memberPromotion.setUserId(userId);
memberPromotion.setPromotionId(promotionId);
memberPromotion.setStatus(PromotionEnum.PARTICIPATE);
memberPromotion.setParticipationTime(new Date());
memberPromotion.setCreateBy(SecurityUtils.getUsername());
memberPromotion.setCreateTime(new Date());
memberPromotion.setUpdateBy(SecurityUtils.getUsername());
memberPromotion.setUpdateTime(new Date());
return memberPromotion;
}
}

View File

@ -0,0 +1,63 @@
package com.mcwl.memberCenter.domain.vo;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mcwl.common.core.domain.BaseEntity;
import com.mcwl.memberCenter.enums.PromotionEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* vo
*/
@Data
@ApiModel(description = "促销活动")
public class PromotionVo {
/**
* id
*/
@ApiModelProperty(value = "活动id")
private Long id;
/**
*
*/
@ApiModelProperty(value = "活动名称")
private String activityName;
/**
*
*/
@ApiModelProperty(value = "是否参与")
private Integer isJoin;
/**
*
*/
@ApiModelProperty(value = "活动的详细描述")
private String description;
/**
*
*/
@ApiModelProperty(value = "活动开始时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime;
/**
*
*/
@ApiModelProperty(value = "活动结束时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date endTime;
}

View File

@ -1,8 +1,24 @@
package com.mcwl.memberCenter.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mcwl.common.core.domain.R;
import com.mcwl.common.core.page.PageDomain;
import com.mcwl.common.core.page.TableDataInfo;
import com.mcwl.memberCenter.domain.MemberPromotion;
import com.mcwl.memberCenter.domain.Promotion;
import java.util.List;
public interface PromotionService extends IService<Promotion> {
/**
*
* @return TableDataInfo
*/
TableDataInfo getPromotionList(PageDomain pageDomain);
TableDataInfo getMyPromotionList(PageDomain pageDomain);
R<Object> joinPromotion(Long promotionId);
}

View File

@ -1,17 +1,210 @@
package com.mcwl.memberCenter.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mcwl.common.constant.HttpStatus;
import com.mcwl.common.core.domain.R;
import com.mcwl.common.core.page.PageDomain;
import com.mcwl.common.core.page.TableDataInfo;
import com.mcwl.common.utils.SecurityUtils;
import com.mcwl.memberCenter.domain.Member;
import com.mcwl.memberCenter.domain.MemberPromotion;
import com.mcwl.memberCenter.domain.Promotion;
import com.mcwl.memberCenter.domain.vo.PromotionVo;
import com.mcwl.memberCenter.enums.PromotionEnum;
import com.mcwl.memberCenter.mapper.MemberPromotionMapper;
import com.mcwl.memberCenter.mapper.PromotionMapper;
import com.mcwl.memberCenter.service.MemberPromotionService;
import com.mcwl.memberCenter.service.MemberService;
import com.mcwl.memberCenter.service.PromotionService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.*;
@Service
@RequiredArgsConstructor
public class PromotionServiceImpl extends ServiceImpl<PromotionMapper, Promotion> implements PromotionService {
private final MemberPromotionService memberPromotionService;
private final MemberService memberService;
/**
*
*
* @return TableDataInfo
*/
@Override
public TableDataInfo getPromotionList(PageDomain pageDomain) {
// 封装用户参加的促销活动, key为促销活动id, value为用户参加的促销活动
Map<Long, MemberPromotion> map = new HashMap<>();
// 获取用户参加的促销活动
Long userId = SecurityUtils.getUserId();
List<MemberPromotion> memberPromotionList = memberPromotionService.lambdaQuery()
.eq(MemberPromotion::getUserId, userId)
.eq(MemberPromotion::getStatus, PromotionEnum.PARTICIPATE)
.list();
for (MemberPromotion memberPromotion : memberPromotionList) {
map.put(memberPromotion.getPromotionId(), memberPromotion);
}
// 查询促销活动列表
Page<Promotion> page = new Page<>(pageDomain.getPageNum(), pageDomain.getPageSize());
LambdaQueryWrapper<Promotion> lqw = new LambdaQueryWrapper<>();
lqw.gt(Promotion::getEndTime, new Date());
baseMapper.selectPage(page, lqw);
// 封装数据
List<PromotionVo> promotionVoList = new ArrayList<>();
page.getRecords().forEach(promotion -> {
PromotionVo promotionVo = new PromotionVo();
BeanUtil.copyProperties(promotion, promotionVo);
if (map.containsKey(promotion.getId())) {
promotionVo.setIsJoin(1);
} else {
promotionVo.setIsJoin(0);
}
promotionVoList.add(promotionVo);
});
// 封装分页结果
TableDataInfo rspData = new TableDataInfo();
rspData.setCode(HttpStatus.SUCCESS);
rspData.setMsg("查询成功");
rspData.setRows(promotionVoList);
rspData.setTotal(page.getTotal());
return rspData;
}
/**
*
*
* @param pageDomain
* @return TableDataInfo
*/
@Override
public TableDataInfo getMyPromotionList(PageDomain pageDomain) {
// 获取当前用户
Long userId = SecurityUtils.getUserId();
List<Long> memberPromotionIds = new ArrayList<>();
// 默认添加一个不存在的id, 防止List为空时in查询出错
memberPromotionIds.add(-1L);
// 查询用户参加的促销活动
List<MemberPromotion> memberPromotionList = memberPromotionService.lambdaQuery()
.eq(MemberPromotion::getUserId, userId)
.eq(MemberPromotion::getStatus, PromotionEnum.PARTICIPATE)
.list();
for (MemberPromotion memberPromotion : memberPromotionList) {
memberPromotionIds.add(memberPromotion.getPromotionId());
}
// 查询促销活动列表
Page<Promotion> page = new Page<>(pageDomain.getPageNum(), pageDomain.getPageSize());
LambdaQueryWrapper<Promotion> lqw = new LambdaQueryWrapper<>();
lqw.in(Promotion::getId, memberPromotionIds);
baseMapper.selectPage(page, lqw);
// 封装数据
List<PromotionVo> promotionVoList = new ArrayList<>();
page.getRecords().forEach(promotion -> {
PromotionVo promotionVo = new PromotionVo();
BeanUtil.copyProperties(promotion, promotionVo);
promotionVoList.add(promotionVo);
});
// 封装分页结果
TableDataInfo rspData = new TableDataInfo();
rspData.setCode(HttpStatus.SUCCESS);
rspData.setMsg("查询成功");
rspData.setRows(promotionVoList);
rspData.setTotal(page.getTotal());
return rspData;
}
/**
*
*
* @param promotionId id
* @return R
*/
@Override
public R<Object> joinPromotion(Long promotionId) {
// 用户id
Long userId = SecurityUtils.getUserId();
// 按活动id查询活动信息
Promotion promotion = baseMapper.selectById(promotionId);
if (!Optional.ofNullable(promotion).isPresent()) {
return R.fail("活动不存在");
}
if (promotion.getStartTime().after(new Date())) {
return R.fail("活动未开始");
}
// 活动是否过期
if (promotion.getEndTime().before(new Date())) {
return R.fail("活动已过期");
}
// 获取当前用户是否参与过该活动
if (isJoinPromotion(userId, promotionId)) {
return R.fail("您已参与过该活动");
}
// 是否在活动期间内订阅或续订会员
// if (!isSubscribe(userId, promotion)) {
// return AjaxResult.warn("请在活动期间内订阅或续期会员后参加该活动");
// }
Member member = memberService.getUseUserMemberByUserId(userId);
String memberLevelId = Objects.isNull(member) ? "-1" : member.getMemberLevelId().toString();
String memberLevelIds = promotion.getMemberLevelIds();
if (!memberLevelIds.contains(memberLevelId)) {
return R.fail("会员等级不够,无法参与该活动,请查看活动条件");
}
MemberPromotion memberPromotion = getMemberPromotion(userId, promotionId);
memberPromotionService.save(memberPromotion);
return R.ok();
}
private boolean isJoinPromotion(Long userId, Long promotionId) {
MemberPromotion memberPromotion = memberPromotionService.lambdaQuery()
.eq(MemberPromotion::getUserId, userId)
.eq(MemberPromotion::getPromotionId, promotionId)
.one();
return memberPromotion != null;
}
private static MemberPromotion getMemberPromotion(Long userId, Long promotionId) {
MemberPromotion memberPromotion = new MemberPromotion();
memberPromotion.setUserId(userId);
memberPromotion.setPromotionId(promotionId);
memberPromotion.setStatus(PromotionEnum.PARTICIPATE);
memberPromotion.setParticipationTime(new Date());
return memberPromotion;
}
}

View File

@ -129,6 +129,14 @@ public class UserMemberTask {
}
/**
* 0 0 0 0 * * ?
*/
public void checkPromotionExpiredTask() {
}
/**
*
*/