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