zxl
2025-06-11 05e49980cd556d24239e00d028dc5efa25e0de14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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<MemberCouponSignMapper, MemberCouponSign> implements MemberCouponSignService {
 
 
    @Override
    public void clean() {
        LambdaQueryWrapper<MemberCouponSign> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.lt(MemberCouponSign::getInvalidTime, DateUtil.getCurrentDayStartTime());
        this.baseMapper.delete(queryWrapper);
    }
 
    @Override
    public List<CouponActivityVO> receiveCoupon(List<CouponActivityVO> couponActivity) {
        List<MemberCouponSign> memberCouponSigns = new ArrayList<>();
 
 
        //查询当前用户领取标记
        LambdaQueryWrapper<MemberCouponSign> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(MemberCouponSign::getMemberId, UserContext.getCurrentUser().getId());
        List<MemberCouponSign> oldMemberCouponSigns = this.list(queryWrapper);
 
        //定义生效的活动
        List<CouponActivityVO> 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();
        }
    }
 
 
}