package com.mzl.flower.service.menber.impl; 
 | 
  
 | 
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 
 | 
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 
 | 
import com.mzl.flower.config.exception.ValidationException; 
 | 
import com.mzl.flower.config.security.SecurityUtils; 
 | 
import com.mzl.flower.constant.Constants; 
 | 
import com.mzl.flower.dto.request.menber.*; 
 | 
import com.mzl.flower.dto.response.customer.CustomerDTO; 
 | 
import com.mzl.flower.dto.response.member.MemberGrowthRecordVO; 
 | 
import com.mzl.flower.dto.response.member.UserGrowthRecordVO; 
 | 
import com.mzl.flower.entity.customer.Customer; 
 | 
import com.mzl.flower.entity.menber.Member; 
 | 
import com.mzl.flower.entity.menber.MemberGrowthRecord; 
 | 
import com.mzl.flower.entity.payment.Order; 
 | 
import com.mzl.flower.mapper.customer.CustomerMapper; 
 | 
import com.mzl.flower.mapper.member.MemberGrowthRecordMapper; 
 | 
import com.mzl.flower.mapper.member.MemberMapper; 
 | 
import com.mzl.flower.service.menber.MemberGrowthRecordService; 
 | 
import lombok.RequiredArgsConstructor; 
 | 
import org.springframework.beans.BeanUtils; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
import org.springframework.util.CollectionUtils; 
 | 
import org.springframework.util.ObjectUtils; 
 | 
import org.springframework.util.StringUtils; 
 | 
  
 | 
import java.math.BigDecimal; 
 | 
import java.util.ArrayList; 
 | 
import java.util.Date; 
 | 
import java.util.List; 
 | 
  
 | 
/** 
 | 
 * @author fanghaowei 
 | 
 * @version version2.0 
 | 
 * @className MemberGrowthRecordServiceImpl 
 | 
 * @date 2024/8/26 
 | 
 * @description 会员记录功能逻辑层 
 | 
 */ 
 | 
@Service 
 | 
@Transactional 
 | 
@RequiredArgsConstructor 
 | 
public class MemberGrowthRecordServiceImpl extends ServiceImpl<MemberGrowthRecordMapper, MemberGrowthRecord> implements MemberGrowthRecordService { 
 | 
  
 | 
    private final MemberGrowthRecordMapper memberGrowthRecordMapper; 
 | 
  
 | 
    private final MemberMapper memberMapper; 
 | 
  
 | 
    private final CustomerMapper customerMapper; 
 | 
  
 | 
  
 | 
    @Override 
 | 
    public void saveMemberGrowthRecord(MemberGrowthRecordDTO memberGrowthRecordDTO) { 
 | 
        if (StringUtils.isEmpty(memberGrowthRecordDTO.getUserId())) { 
 | 
            throw new ValidationException("用户ID不能为空"); 
 | 
        } 
 | 
  
 | 
        MemberGrowthRecord memberGrowthRecord = new MemberGrowthRecord(); 
 | 
        BeanUtils.copyProperties(memberGrowthRecordDTO, memberGrowthRecord); 
 | 
        memberGrowthRecord.create(SecurityUtils.getUserId()); 
 | 
        memberGrowthRecord.setRecordDate(new Date()); 
 | 
  
 | 
        CustomerDTO customerDTO = customerMapper.getCurrentCustomer(memberGrowthRecord.getUserId()); 
 | 
        if (ObjectUtils.isEmpty(customerDTO)) { 
 | 
            throw new ValidationException("人员信息为空"); 
 | 
        } 
 | 
  
 | 
        Customer customer = customerMapper.selectById(customerDTO.getId()); 
 | 
        if (ObjectUtils.isEmpty(customer)) { 
 | 
            throw new ValidationException("人员信息为空"); 
 | 
        } 
 | 
        Member memberBefore = memberMapper.selectById(customer.getLevelId()); 
 | 
        if(ObjectUtils.isEmpty(memberBefore)){ 
 | 
            throw new ValidationException("人员对应的会员等级不存在,请联系管理员"); 
 | 
        } 
 | 
  
 | 
        //保存会员记录逻辑: 
 | 
        if (Constants.GROWTH_SOURCE.consume.name().equals(memberGrowthRecordDTO.getSource())) { 
 | 
            //消费:成长值=消费金额/消费金额(元)*已消费产生的成长值C 
 | 
            BigDecimal totalAmount = memberGrowthRecordDTO.getTotalAmount(); 
 | 
            int consumptionAmount = memberBefore.getConsumptionAmount(); 
 | 
            int growthValue = memberBefore.getGrowthValue(); 
 | 
            BigDecimal actualGrowthValue = totalAmount.divide(new BigDecimal(consumptionAmount), 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(growthValue)); 
 | 
            int growth = actualGrowthValue.setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); // 四舍五入取整 
 | 
            memberGrowthRecord.setGrowth(growth); 
 | 
            memberGrowthRecord.setType(Constants.GROWTH_TYPE.add.name()); 
 | 
        } 
 | 
        memberGrowthRecordMapper.insert(memberGrowthRecord); 
 | 
  
 | 
        //会员等级同步逻辑: 
 | 
        Member memberAfter = getMemberByUserId(memberGrowthRecord.getUserId()); 
 | 
        customer.setLevelId(memberAfter.getId()); 
 | 
        customerMapper.updateById(customer); 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 查询当前人员的成长值 最少是0 
 | 
     * 
 | 
     * @param userId 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    public Member getMemberByUserId(String userId) { 
 | 
        if (StringUtils.isEmpty(userId)) { 
 | 
            throw new ValidationException("用户ID不能为空"); 
 | 
        } 
 | 
        Integer sumGrowth = memberGrowthRecordMapper.getSumGrowthByUsertId(userId); 
 | 
  
 | 
        //查询当前会员等级 
 | 
        Member member = memberMapper.getMemberByGrowthValue(sumGrowth); 
 | 
        if (ObjectUtils.isEmpty(member)) { 
 | 
            throw new ValidationException("会员信息为空"); 
 | 
        } 
 | 
        return member; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void updateMemberGrowthRecord(MemberGrowthRecordDTO memberGrowthRecordDTO) { 
 | 
        MemberGrowthRecord memberGrowthRecord = memberGrowthRecordMapper.selectById(memberGrowthRecordDTO.getId()); 
 | 
        if (memberGrowthRecord == null) { 
 | 
            throw new ValidationException("成长记录信息不存在"); 
 | 
        } 
 | 
        BeanUtils.copyProperties(memberGrowthRecordDTO, memberGrowthRecord); 
 | 
        memberGrowthRecord.update(SecurityUtils.getUserId()); 
 | 
        memberGrowthRecordMapper.updateById(memberGrowthRecord); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void deleteMemberGrowthRecord(String id) { 
 | 
        MemberGrowthRecord memberGrowthRecord = memberGrowthRecordMapper.selectById(id); 
 | 
        if (memberGrowthRecord == null) { 
 | 
            throw new ValidationException("成长记录信息不存在"); 
 | 
        } 
 | 
        memberGrowthRecordMapper.deleteById(id); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public UserGrowthRecordDTO getInfoByUserId(String userId) { 
 | 
        UserGrowthRecordDTO userGrowthRecordDTO = new UserGrowthRecordDTO(); 
 | 
        List<TargetMemberDTO> targetMemberDTOList = new ArrayList<>(); 
 | 
        //查询当前人员的成长值 最少是0 
 | 
        Integer sumGrowth = memberGrowthRecordMapper.getSumGrowthByUsertId(userId); 
 | 
        userGrowthRecordDTO.setCurrentGrowthValue(sumGrowth); 
 | 
        //查询当前会员等级 
 | 
        Member member = new Member(); 
 | 
        member = memberMapper.getMemberByGrowthValue(sumGrowth); 
 | 
        if (ObjectUtils.isEmpty(member)) { 
 | 
            member = memberMapper.selectById(Constants.DEFAULT_MEMBER_ID); 
 | 
        } 
 | 
        userGrowthRecordDTO.setCurrentMemberLevel(member.getName()); 
 | 
        userGrowthRecordDTO.setCurrentDiscountType(member.getDiscountType()); 
 | 
        switch (member.getDiscountType()) { 
 | 
            case "ratio": 
 | 
                userGrowthRecordDTO.setCurrentDiscountTypeStr(Constants.DISCOUNT_TYPE.ratio.getDesc()); 
 | 
                break; 
 | 
            case "amount": 
 | 
                userGrowthRecordDTO.setCurrentDiscountTypeStr(Constants.DISCOUNT_TYPE.amount.getDesc()); 
 | 
                break; 
 | 
        } 
 | 
        userGrowthRecordDTO.setCurrentDiscountRatio(StringUtils.isEmpty(member.getDiscountRatio()) ? BigDecimal.valueOf(100) : member.getDiscountRatio()); 
 | 
        userGrowthRecordDTO.setCurrentDiscountAmount(StringUtils.isEmpty(member.getDiscountAmount()) ? BigDecimal.ZERO  : member.getDiscountAmount()); 
 | 
        userGrowthRecordDTO.setCurrentGrowthValueDesc(member.getGrowthValueDesc()); 
 | 
        //查询比当前等级高的会员等级信息 
 | 
        List<Member> memberList = memberMapper.getgtMembersByGrowthValue(sumGrowth); 
 | 
        if (!CollectionUtils.isEmpty(memberList)) { 
 | 
            memberList.forEach(m -> { 
 | 
                TargetMemberDTO targetMemberDTO = new TargetMemberDTO(); 
 | 
                targetMemberDTO.setTargetMemberLevel(m.getName()); 
 | 
                targetMemberDTO.setTargetStartPoint(m.getStartPoint()); 
 | 
                targetMemberDTO.setTargetGap(m.getStartPoint() - sumGrowth); 
 | 
                targetMemberDTO.setTargetDiscountAmount(StringUtils.isEmpty(m.getDiscountAmount()) ? BigDecimal.ZERO : m.getDiscountAmount()); 
 | 
                targetMemberDTO.setTargetDiscountType(m.getDiscountType()); 
 | 
                switch (m.getDiscountType()) { 
 | 
                    case "ratio": 
 | 
                        targetMemberDTO.setTargetDiscountTypeStr(Constants.DISCOUNT_TYPE.ratio.getDesc()); 
 | 
                        break; 
 | 
                    case "amount": 
 | 
                        targetMemberDTO.setTargetDiscountTypeStr(Constants.DISCOUNT_TYPE.amount.getDesc()); 
 | 
                        break; 
 | 
                } 
 | 
                targetMemberDTO.setTargetDiscountRatio(StringUtils.isEmpty(m.getDiscountRatio()) ? BigDecimal.valueOf(100) : m.getDiscountRatio()); 
 | 
                targetMemberDTO.setTargetGrowthValueDesc(m.getGrowthValueDesc()); 
 | 
                targetMemberDTOList.add(targetMemberDTO); 
 | 
            }); 
 | 
        } 
 | 
        userGrowthRecordDTO.setTargetMemberInfos(targetMemberDTOList); 
 | 
  
 | 
        return userGrowthRecordDTO; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public Page<MemberGrowthRecordVO> queryPage(MemberRecordQueryDTO memberRecordQueryDTO, Page page) { 
 | 
        List<MemberGrowthRecordVO> list = memberGrowthRecordMapper.queryPage(memberRecordQueryDTO, page); 
 | 
        page.setRecords(list); 
 | 
        return page; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void growthValueDeduct(Order order) { 
 | 
        //超过30天不到90天,每天处理当前会员等级的成长值 
 | 
        CustomerDTO customerDTO = customerMapper.getCurrentCustomer(order.getCreateBy()); 
 | 
        Customer customer = customerMapper.selectById(customerDTO.getId()); 
 | 
        Member member = memberMapper.selectById(customer.getLevelId()); 
 | 
        if(ObjectUtils.isEmpty(member)){ 
 | 
            throw new ValidationException("用户会员等级未维护"); 
 | 
        } 
 | 
        int deductGrowthValue = member.getDowngradeValue(); 
 | 
        Integer sumGrowthByUserId = memberGrowthRecordMapper.getSumGrowthByUsertId(order.getCreateBy()); 
 | 
  
 | 
        //当前成长值如果是等于0不需要走扣除逻辑 
 | 
        if (sumGrowthByUserId != 0) { 
 | 
        int waitDeductGrowthValue = 0; 
 | 
  
 | 
        //判断当前用户的成长值是够扣除,如果够扣除直接减去成长值,如果不够扣除则全部减去 
 | 
        if (sumGrowthByUserId - deductGrowthValue > 0) { 
 | 
            waitDeductGrowthValue = deductGrowthValue; 
 | 
        } else { 
 | 
            waitDeductGrowthValue = sumGrowthByUserId; 
 | 
        } 
 | 
  
 | 
        //保存会员成长记录到记录表 
 | 
        MemberGrowthRecordDTO memberGrowthRecordDTO = new MemberGrowthRecordDTO(); 
 | 
        memberGrowthRecordDTO.setUserId(order.getCreateBy()); 
 | 
        memberGrowthRecordDTO.setRecordDate(new Date()); 
 | 
        memberGrowthRecordDTO.setGrowth(-waitDeductGrowthValue); 
 | 
        memberGrowthRecordDTO.setSource(Constants.GROWTH_SOURCE.downgrading.name()); 
 | 
        memberGrowthRecordDTO.setType(Constants.GROWTH_TYPE.reduce.name()); 
 | 
        memberGrowthRecordDTO.setRemarks("自动扣除"); 
 | 
        saveMemberGrowthRecord(memberGrowthRecordDTO); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public Page<UserGrowthRecordVO> queryUserPage(UserMemberRecordQueryDTO userMemberRecordQueryDTO, Page page) { 
 | 
        List<UserGrowthRecordVO> list = memberGrowthRecordMapper.queryUserPage(userMemberRecordQueryDTO, page); 
 | 
        page.setRecords(list); 
 | 
        return page; 
 | 
    } 
 | 
} 
 |