package com.ruoyi.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.system.mapper.TCommissionTransactionFlowMapper; import com.ruoyi.system.model.TAppUser; import com.ruoyi.system.model.TCommissionTransactionFlow; import com.ruoyi.system.model.THtmlConfig; import com.ruoyi.system.service.TAppUserService; import com.ruoyi.system.service.TCommissionTransactionFlowService; import com.ruoyi.system.service.THtmlConfigService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; /** *

* 佣金流水记录 服务实现类 *

* * @author xiaochen * @since 2025-12-08 */ @Slf4j @Service @RequiredArgsConstructor(onConstructor_ = @Lazy) public class TCommissionTransactionFlowServiceImpl extends ServiceImpl implements TCommissionTransactionFlowService { private final TAppUserService appUserService; private final THtmlConfigService htmlConfigService; @Override public void calculateAndSaveCommission(Integer orderId, Integer orderType, BigDecimal orderPrice, Integer appUserId) { try { log.info("开始计算分佣,订单ID:{},订单类型:{},订单金额:{},用户ID:{}", orderId, orderType, orderPrice, appUserId); // 获取购买用户信息 TAppUser buyer = appUserService.getById(appUserId); if (buyer == null) { log.error("用户不存在,用户ID:{}", appUserId); return; } // 获取分佣比例配置 CommissionRate commissionRate = getCommissionRate(); if (commissionRate == null) { log.error("分佣比例配置不存在"); return; } log.info("分佣比例配置:营销员={}%,合伙人={}%", commissionRate.getSalesRate(), commissionRate.getPartnerRate()); // 根据用户类型计算分佣 Integer buyerType = buyer.getUserType(); Integer referrerUserId = buyer.getReferrerUserId(); if (buyerType == null || buyerType == 1) { // 顾客(无身份)购买 calculateForCustomer(orderId, orderType, orderPrice, referrerUserId, commissionRate); } else if (buyerType == 2) { // 营销员本人购买 calculateForSales(orderId, orderType, orderPrice, appUserId, referrerUserId, commissionRate); } else if (buyerType == 3) { // 合伙人本人购买 calculateForPartner(orderId, orderType, orderPrice, appUserId, commissionRate); } log.info("分佣计算完成,订单ID:{}", orderId); } catch (Exception e) { log.error("分佣计算失败,订单ID:{},错误信息:{}", orderId, e.getMessage(), e); } } /** * 顾客购买的分佣计算 */ private void calculateForCustomer(Integer orderId, Integer orderType, BigDecimal orderPrice, Integer referrerUserId, CommissionRate commissionRate) { if (referrerUserId == null) { log.info("顾客无推荐人,无需分佣"); return; } // 获取推荐人信息 TAppUser referrer = appUserService.getById(referrerUserId); if (referrer == null) { log.error("推荐人不存在,推荐人ID:{}", referrerUserId); return; } Integer referrerType = referrer.getUserType(); if (referrerType == null || referrerType == 1) { log.info("推荐人不是营销员或合伙人,无需分佣"); return; } if (referrerType == 2) { // 直接营销员 saveCommissionFlow(orderId, orderType, orderPrice, referrerUserId, 2, commissionRate.getSalesRate()); log.info("顾客购买,直接营销员分佣:{}%", commissionRate.getSalesRate()); // 查找直接合伙人 Integer partnerUserId = findDirectPartner(referrer); if (partnerUserId != null) { saveCommissionFlow(orderId, orderType, orderPrice, partnerUserId, 3, commissionRate.getPartnerRate()); log.info("顾客购买,直接合伙人分佣:{}%", commissionRate.getPartnerRate()); } } else if (referrerType == 3) { // 直接合伙人(无直接营销员) BigDecimal totalRate = commissionRate.getSalesRate().add(commissionRate.getPartnerRate()); saveCommissionFlow(orderId, orderType, orderPrice, referrerUserId, 3, totalRate); log.info("顾客购买,直接合伙人(无营销员)分佣:{}%", totalRate); } } /** * 营销员本人购买的分佣计算 */ private void calculateForSales(Integer orderId, Integer orderType, BigDecimal orderPrice, Integer salesUserId, Integer referrerUserId, CommissionRate commissionRate) { // 营销员本人获得 8% saveCommissionFlow(orderId, orderType, orderPrice, salesUserId, 2, commissionRate.getSalesRate()); log.info("营销员本人购买,本人分佣:{}%", commissionRate.getSalesRate()); // 查找直接合伙人 TAppUser sales = appUserService.getById(salesUserId); if (sales != null) { Integer partnerUserId = findDirectPartner(sales); if (partnerUserId != null) { saveCommissionFlow(orderId, orderType, orderPrice, partnerUserId, 3, commissionRate.getPartnerRate()); log.info("营销员本人购买,直接合伙人分佣:{}%", commissionRate.getPartnerRate()); } } } /** * 合伙人本人购买的分佣计算 */ private void calculateForPartner(Integer orderId, Integer orderType, BigDecimal orderPrice, Integer partnerUserId, CommissionRate commissionRate) { // 合伙人本人获得 10% + 8% = 18% BigDecimal totalRate = commissionRate.getSalesRate().add(commissionRate.getPartnerRate()); saveCommissionFlow(orderId, orderType, orderPrice, partnerUserId, 3, totalRate); log.info("合伙人本人购买,本人分佣:{}%", totalRate); } /** * 查找直接合伙人 */ private Integer findDirectPartner(TAppUser user) { Integer referrerUserId = user.getReferrerUserId(); if (referrerUserId == null) { return null; } TAppUser referrer = appUserService.getById(referrerUserId); if (referrer == null) { return null; } // 如果推荐人是合伙人,直接返回 if (referrer.getUserType() != null && referrer.getUserType() == 3) { return referrerUserId; } // 如果推荐人是营销员,继续向上查找 if (referrer.getUserType() != null && referrer.getUserType() == 2) { return findDirectPartner(referrer); } return null; } /** * 保存佣金流水记录 */ private void saveCommissionFlow(Integer orderId, Integer orderType, BigDecimal orderPrice, Integer userId, Integer userType, BigDecimal commissionRate) { // 计算佣金金额 BigDecimal commissionAmount = orderPrice.multiply(commissionRate) .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP); TCommissionTransactionFlow flow = new TCommissionTransactionFlow(); flow.setAppUserId(userId); flow.setAppUserType(userType); flow.setCommissionRate(commissionRate); flow.setOrderId(orderId); flow.setOrderType(orderType); flow.setOrderPrice(orderPrice); flow.setCommissionAmount(commissionAmount.intValue()); flow.setCreateTime(LocalDateTime.now()); save(flow); log.info("保存佣金流水成功,用户ID:{},佣金金额:{}", userId, commissionAmount); // 更新用户累计积分(佣金金额1:1转积分) TAppUser user = appUserService.getById(userId); if (user != null) { int currentIntegral = user.getAccumulativeIntegral() != null ? user.getAccumulativeIntegral() : 0; user.setAccumulativeIntegral(currentIntegral + commissionAmount.intValue()); appUserService.updateById(user); log.info("更新用户累计积分成功,用户ID:{},新增积分:{},累计积分:{}", userId, commissionAmount.intValue(), user.getAccumulativeIntegral()); } } /** * 获取分佣比例配置 */ private CommissionRate getCommissionRate() { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(THtmlConfig::getConfigType, 5); THtmlConfig config = htmlConfigService.getOne(wrapper); if (config == null || config.getContent() == null || config.getContent().isEmpty()) { return null; } try { String[] rates = config.getContent().split(","); if (rates.length != 2) { log.error("分佣比例配置格式错误:{}", config.getContent()); return null; } BigDecimal salesRate = new BigDecimal(rates[0].trim()); BigDecimal partnerRate = new BigDecimal(rates[1].trim()); return new CommissionRate(salesRate, partnerRate); } catch (Exception e) { log.error("解析分佣比例配置失败:{}", config.getContent(), e); return null; } } /** * 分佣比例配置类 */ private static class CommissionRate { private final BigDecimal salesRate; private final BigDecimal partnerRate; public CommissionRate(BigDecimal salesRate, BigDecimal partnerRate) { this.salesRate = salesRate; this.partnerRate = partnerRate; } public BigDecimal getSalesRate() { return salesRate; } public BigDecimal getPartnerRate() { return partnerRate; } } }