ExpOperationServiceImpl.java 6.75 KB
package com.topdraw.business.process.service.impl;

import com.topdraw.business.module.exp.detail.domain.ExpDetail;
import com.topdraw.business.module.exp.detail.service.ExpDetailService;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.level.service.MemberLevelService;
import com.topdraw.business.module.member.level.service.dto.MemberLevelDTO;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.process.domian.TempExp;
import com.topdraw.business.process.service.ExpOperationService;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.util.IdWorker;
import com.topdraw.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

/**
 *
 */
@Service
public class ExpOperationServiceImpl implements ExpOperationService {

    private static final Logger LOG = LoggerFactory.getLogger(ExpOperationServiceImpl.class);

    @Autowired
    ExpDetailService expDetailService;
    @Autowired
    MemberOperationService memberOperationService;
    @Autowired
    MemberLevelService memberLevelService;
    @Autowired
    MemberService memberService;
    @Autowired
    ThreadPoolTaskExecutor threadPoolTaskExecutor;

    @Override
    public void grantPointsThroughTempExp(List<TempExp> tempExpList) {

        for (TempExp tempExp : tempExpList) {
            this.refresh(tempExp);
        }

    }

    @Override
    public void grantExpByManual(Long memberId, Long userId, List<TempExp> tempExpList) {
        for (TempExp tempExp : tempExpList) {
            this.refresh(tempExp);
        }
    }

    @Override
    public void grantExpByManual(List<TempExp> tempExpList) {
        for (TempExp tempExp : tempExpList) {
            this.refresh(tempExp);
        }
    }


    /**
     *
     * @param tempExp
     */
    private void refresh(TempExp tempExp) {
        String memberCode = tempExp.getMemberCode();
        MemberDTO memberDTO = this.memberService.findByCode(memberCode);
        Long id = memberDTO.getId();
        tempExp.setId(id);
        try {
            // 原始积分
            long originExp = this.getExpByMemberId(tempExp);
            // 总积分
            long totalExp = this.calculateTotalExp(originExp, tempExp);
            // 1.添加成长值记录
//            this.threadPoolTaskExecutor.execute(() -> this.doInsertExpDetail(tempExp, originExp, totalExp));
            // 2.更新成长值与等级
            this.refreshMemberExpAndLevel(tempExp,totalExp);

            this.doInsertExpDetail(tempExp, originExp, totalExp);

        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }

    private long calculateTotalExp(long originalExp, TempExp tempExp) {
        Long rewardExp = tempExp.getRewardExp();
        return rewardExp + originalExp;
    }

    private long getExpByMemberId(TempExp tempExp) {
        Long memberId = tempExp.getMemberId();
        MemberDTO memberDTO = this.memberOperationService.findById(memberId);
        if (Objects.nonNull(memberDTO)) {
            Long exp = memberDTO.getExp();
            return Objects.isNull(exp) ? 0L : exp;
        }
        return 0L;
    }


    /**
     * 更新成长值与等级
     *
     * @param tempExp 成长值列表
     */
    private void refreshMemberExpAndLevel(TempExp tempExp, long totalExp) {

        Long memberId = tempExp.getMemberId();
        // 1.获取当前成长值
        MemberDTO memberDTO = this.getMemberInfoByMemberId(memberId);
        // 2.获取下一级需要的成长值
        MemberLevelDTO memberLevelDTO = this.getNextLevelExp(memberDTO.getLevel() + 1, 1);
        // 4.成长值比较,判断是否升级
        Integer level = this.compareExp(totalExp, memberLevelDTO,memberDTO);
        // 5.更新用户信息
        this.updateMemberInfo(level, totalExp, memberId);
    }

    /**
     *
     * @param level
     * @param totalExp 总积分
     * @param memberId 会员id
     */
    private void updateMemberInfo(Integer level,Long totalExp,Long memberId) {
        MemberDTO memberDTO = this.findMemberByMemberId(memberId);

        Member member = new Member();
        BeanUtils.copyProperties(memberDTO,member);

        member.setExp(totalExp);
        member.setLevel(level);
        member.setUpdateTime(LocalDateTime.now());
        this.memberOperationService.doUpdateMember(member);
    }

    private MemberDTO findMemberByMemberId(Long memberId) {
        MemberDTO memberDTO = this.memberService.findById(memberId);
        return memberDTO;
    }

    private Integer compareExp(long newExp, MemberLevelDTO memberLevelDTO, MemberDTO memberDTO) {
        if (Objects.nonNull(memberLevelDTO)) {
            Long nextLevelExp = memberLevelDTO.getExpValue();
            if (Objects.nonNull(nextLevelExp) && nextLevelExp > 0)
                if(newExp - nextLevelExp >= 0){
                    return memberLevelDTO.getLevel();
                }
        }
        return memberDTO.getLevel();
    }

    private MemberLevelDTO getNextLevelExp(Integer i, Integer status) {
        List<MemberLevelDTO> memberLevelDTOList = this.memberLevelService.findLevelAndStatus(i,status);
        if (!CollectionUtils.isEmpty(memberLevelDTOList)) {
            return memberLevelDTOList.get(0);
        }
        return null;
    }


    /**
     * 获取当前会员的成长值
     * @param memberId 会员id
     * @return Long 当前会员成长值
     */
    private MemberDTO getMemberInfoByMemberId(Long memberId) {
        MemberDTO memberDTO = this.memberOperationService.findById(memberId);
        return memberDTO;
    }

    /**
     * 添加成长值记录
     *
     * @param tempExp 成长值列表
     */
    private void doInsertExpDetail(TempExp tempExp, long originalExp, long totalExp) {
        // 获得的积分
        Long rewardExp = tempExp.getRewardExp();

        ExpDetail expDetail = new ExpDetail();
        BeanUtils.copyProperties(tempExp,expDetail);

        expDetail.setCode(String.valueOf(IdWorker.generator()));
        // 原始积分
        expDetail.setOriginalExp(originalExp);
        // 总积分
        expDetail.setResultExp(totalExp);
        // 获得的积分
        expDetail.setExp(rewardExp);
        if (StringUtils.isEmpty(expDetail.getDescription())) {
            expDetail.setDescription("#");
        }
        this.expDetailService.create(expDetail);
    }

}