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