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