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