gongzuming
2024-09-19 a768dc3daa04d35fedfbe75c0a59b9b2545b85c4
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
package com.mzl.flower.service.menber.impl;
 
import com.mzl.flower.constant.Constants;
import com.mzl.flower.dto.request.menber.MemberGrowthRecordDTO;
import com.mzl.flower.entity.menber.Member;
import com.mzl.flower.entity.menber.MemberDowngradeRecord;
import com.mzl.flower.entity.payment.Order;
import com.mzl.flower.mapper.member.MemberDowngradeRecordMapper;
import com.mzl.flower.mapper.member.MemberGrowthRecordMapper;
import com.mzl.flower.mapper.member.MemberMapper;
import com.mzl.flower.service.menber.GrowthValueDeductionStrategy;
import com.mzl.flower.service.menber.MemberGrowthRecordService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
 
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Date;
 
/**
 * packageName com.mzl.flower.service.menber.impl
 * @author fanghaowei
 * @version version2.0
 * @className ThirdDeductionStrategy
 * @date 2024/9/2
 * @description TODO
 */
@Transactional
@RequiredArgsConstructor
@Service("ThirdDeduction")
public class ThirdDeductionStrategy  implements GrowthValueDeductionStrategy {
 
    private final MemberDowngradeRecordMapper memberDowngradeRecordMapper;
    private final MemberGrowthRecordService memberGrowthRecordService;
    private final MemberGrowthRecordMapper memberGrowthRecordMapper;
 
    private final MemberMapper memberMapper;
 
    @Override
    public void deduct(Order order) {
        LocalDate nowDate = LocalDateTime.now().toLocalDate();
        LocalDate receiveTimeDate = order.getReceiveTime().toLocalDate();
        long daysBetween = ChronoUnit.DAYS.between(receiveTimeDate, nowDate);
        //判断是否有会员降级记录
        Integer countByUserId = memberDowngradeRecordMapper.getMemberByName(order.getCreateBy());
        int day = (int) (daysBetween - countByUserId * 90);
        //扣除记录数*90
        //0-90;1-180;2-270
        if (countByUserId == 0 || day > 90) {
            //保存会员降级记录
            Member member = memberGrowthRecordService.getMemberByUserId(order.getCreateBy());
            MemberDowngradeRecord memberDowngradeRecord = new MemberDowngradeRecord();
            memberDowngradeRecord.setUserId(order.getCreateBy());
            memberDowngradeRecord.setMemberId(member.getId());
            memberDowngradeRecord.setMemberName(member.getName());
            memberDowngradeRecord.create();
            memberDowngradeRecordMapper.insert(memberDowngradeRecord);
 
            //统计当前人员现有成长值
            Integer sumGrowthByUserId = memberGrowthRecordMapper.getSumGrowthByUsertId(order.getCreateBy());
 
            //当前人员需要降到的成长值
            Member targetMember = memberMapper.getgtMembersByEndPoint(sumGrowthByUserId);
            if (!ObjectUtils.isEmpty(targetMember)) {
                //有降级目标
                int targetGrowth = targetMember.getEndPoint() - 1;
                //需要降级扣除的成长值是目标值减去当前值
                int needDeductGrowthValue = targetGrowth-sumGrowthByUserId;
                //保存会员成长记录到记录表
                MemberGrowthRecordDTO memberGrowthRecordDTO = new MemberGrowthRecordDTO();
                memberGrowthRecordDTO.setUserId(order.getCreateBy());
                memberGrowthRecordDTO.setRecordDate(new Date());
                memberGrowthRecordDTO.setGrowth(needDeductGrowthValue);
                memberGrowthRecordDTO.setSource(Constants.GROWTH_SOURCE.downgrading.name());
                memberGrowthRecordDTO.setType(Constants.GROWTH_TYPE.reduce.name());
                memberGrowthRecordDTO.setRemarks("自动降级");
                memberGrowthRecordService.saveMemberGrowthRecord(memberGrowthRecordDTO);
            } else {
                memberGrowthRecordService.growthValueDeduct(order);
            }
        } else if (countByUserId > 0) {
            if (day > 30 && day <= 90) {
                memberGrowthRecordService.growthValueDeduct(order);
            }
 
        }
    }
}