package cn.lili.modules.promotion.serviceimpl; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.context.UserContext; import cn.lili.common.utils.DateUtil; import cn.lili.modules.promotion.entity.dos.CouponActivity; import cn.lili.modules.promotion.entity.dos.MemberCouponSign; import cn.lili.modules.promotion.entity.enums.CouponActivityTypeEnum; import cn.lili.modules.promotion.entity.enums.CouponFrequencyEnum; import cn.lili.modules.promotion.entity.vos.CouponActivityVO; import cn.lili.modules.promotion.mapper.MemberCouponSignMapper; import cn.lili.modules.promotion.service.MemberCouponSignService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; /** * 会员优惠券领取标记 * * @author liushuai(liushuai711 @ gmail.com) * @version v4.0 * @Description: * @since 2023/1/3 18:13 */ @Service public class MemberCouponSignServiceImpl extends ServiceImpl implements MemberCouponSignService { @Override public void clean() { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.lt(MemberCouponSign::getInvalidTime, DateUtil.getCurrentDayStartTime()); this.baseMapper.delete(queryWrapper); } @Override public List receiveCoupon(List couponActivity) { List memberCouponSigns = new ArrayList<>(); //查询当前用户领取标记 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(MemberCouponSign::getMemberId, UserContext.getCurrentUser().getId()); List oldMemberCouponSigns = this.list(queryWrapper); //定义生效的活动 List assertCouponActivity = new ArrayList<>(); //生成标记对象 couponActivityFor: for (CouponActivityVO activity : couponActivity) { //如果旧的标记中包含记号,则略过 for (MemberCouponSign oldMemberCouponSign : oldMemberCouponSigns) { if (oldMemberCouponSign.getCouponActivityId().equals(activity.getId())) { continue couponActivityFor; } } assertCouponActivity.add(activity); MemberCouponSign memberCouponSign = new MemberCouponSign(); memberCouponSign.setMemberId(UserContext.getCurrentUser().getId()); memberCouponSign.setCouponActivityId(activity.getId()); memberCouponSign.setInvalidTime(getInvalidTime(activity)); memberCouponSigns.add(memberCouponSign); } this.saveBatch(memberCouponSigns); return assertCouponActivity; } /** * 根据活动优惠券获取标记失效时间 * * @param activity * @return */ private Date getInvalidTime(CouponActivity activity) { //领取周期符合预设 if (CouponFrequencyEnum.exist(activity.getCouponFrequencyEnum())) { Calendar cal = DateUtil.getCleanCalendar(); switch (CouponFrequencyEnum.valueOf(activity.getCouponFrequencyEnum())) { case DAY: return DateUtil.getCurrentDayEndTime(); case WEEK: //周一 cal.set(Calendar.DAY_OF_WEEK, 2); //去往下周 cal.set(Calendar.WEEK_OF_YEAR, cal.get(Calendar.WEEK_OF_YEAR) + 1); //减1毫秒上个星期最后一刻 cal.set(Calendar.MILLISECOND, -1); return cal.getTime(); case MONTH: //日期 1日 cal.set(Calendar.DAY_OF_MONTH, 1); //下个月 cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) + 1); //减少一毫秒去上个月最后一刻 cal.set(Calendar.MILLISECOND, -1); return cal.getTime(); default: throw new ServiceException(); } } else if (activity.getCouponActivityType().equals(CouponActivityTypeEnum.SPECIFY.name())) { //精准发券 则标记失效时间为活动结束时间 防止同一个活动同一周期被多次领取 return activity.getEndTime(); } else { throw new ServiceException(); } } }