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); 
 | 
            } 
 | 
  
 | 
        } 
 | 
    } 
 | 
} 
 |