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