From a768dc3daa04d35fedfbe75c0a59b9b2545b85c4 Mon Sep 17 00:00:00 2001 From: gongzuming <gongzuming> Date: 星期四, 19 九月 2024 16:59:33 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master-v2' --- src/main/java/com/mzl/flower/service/menber/impl/MemberGrowthRecordServiceImpl.java | 238 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 238 insertions(+), 0 deletions(-) diff --git a/src/main/java/com/mzl/flower/service/menber/impl/MemberGrowthRecordServiceImpl.java b/src/main/java/com/mzl/flower/service/menber/impl/MemberGrowthRecordServiceImpl.java new file mode 100644 index 0000000..34b83f9 --- /dev/null +++ b/src/main/java/com/mzl/flower/service/menber/impl/MemberGrowthRecordServiceImpl.java @@ -0,0 +1,238 @@ +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()); + //查询比当前等级高的会员等级信息 + 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()); + 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; + } +} -- Gitblit v1.9.3