From f894e386d81e43831ea5fda78e30a029eca6fda5 Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期二, 16 十二月 2025 18:37:33 +0800
Subject: [PATCH] 大礼包、实物商品下单、回调

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCommissionTransactionFlowServiceImpl.java |  236 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 236 insertions(+), 0 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCommissionTransactionFlowServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCommissionTransactionFlowServiceImpl.java
index 6b59d59..9c1a94a 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCommissionTransactionFlowServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCommissionTransactionFlowServiceImpl.java
@@ -1,10 +1,21 @@
 package com.ruoyi.system.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.system.model.TAppUser;
 import com.ruoyi.system.model.TCommissionTransactionFlow;
 import com.ruoyi.system.mapper.TCommissionTransactionFlowMapper;
+import com.ruoyi.system.model.THtmlConfig;
+import com.ruoyi.system.service.TAppUserService;
 import com.ruoyi.system.service.TCommissionTransactionFlowService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.service.THtmlConfigService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDateTime;
 
 /**
  * <p>
@@ -14,7 +25,232 @@
  * @author xiaochen
  * @since 2025-12-08
  */
+@Slf4j
 @Service
 public class TCommissionTransactionFlowServiceImpl extends ServiceImpl<TCommissionTransactionFlowMapper, TCommissionTransactionFlow> implements TCommissionTransactionFlowService {
 
+    @Resource
+    private TAppUserService appUserService;
+
+    @Resource
+    private 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);
+    }
+
+    /**
+     * 获取分佣比例配置
+     */
+    private CommissionRate getCommissionRate() {
+        LambdaQueryWrapper<THtmlConfig> 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;
+        }
+    }
 }

--
Gitblit v1.7.1