lubo 1 месяц назад
Родитель
Сommit
745882e293
34 измененных файлов с 651 добавлено и 45 удалено
  1. 3 0
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/domain/DistributionUserOrderGains.java
  2. 6 4
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/domain/UserBill.java
  3. 6 0
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/domain/vo/UserOrderGainsTo.java
  4. 55 0
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/enums/UserBillType.java
  5. 2 1
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/exception/DistributionBusinessConfigExceptionEnum.java
  6. 4 0
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/mapper/BusinessOrderGainsMapper.java
  7. 4 0
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/mapper/DistributionUserOrderGainsMapper.java
  8. 4 0
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/mapper/PlatformIncomeMapper.java
  9. 31 0
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/IBusinessOrderGainsService.java
  10. 3 1
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/IDistributionHandle.java
  11. 16 0
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/IDistributionUserOrderGainsService.java
  12. 10 0
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/IPlatformIncomeService.java
  13. 13 0
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/IUserBillService.java
  14. 133 20
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/impl/BusinessOrderGainsServiceImpl.java
  15. 5 0
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/impl/DistributionBusinessConfigServiceImpl.java
  16. 17 0
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/impl/DistributionUserOrderGainsServiceImpl.java
  17. 20 0
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/impl/PlatformIncomeServiceImpl.java
  18. 31 0
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/impl/UserBillServiceImpl.java
  19. 2 2
      ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/lvcodeimpl/GeneralGoodsDistributionHandle.java
  20. 60 0
      ruoyi-shop/src/main/java/com/ruoyi/shop/enums/InOrOuter.java
  21. 1 1
      ruoyi-shop/src/main/java/com/ruoyi/shop/order/domain/ShopOrder.java
  22. 4 2
      ruoyi-shop/src/main/java/com/ruoyi/shop/order/service/IShopOrderService.java
  23. 52 5
      ruoyi-shop/src/main/java/com/ruoyi/shop/order/service/impl/ShopOrderServiceImpl.java
  24. 18 0
      ruoyi-shop/src/main/java/com/ruoyi/shop/rights/domain/SaleRightsOrderDetail.java
  25. 28 5
      ruoyi-shop/src/main/java/com/ruoyi/shop/rights/service/impl/SaleRightsOrderServiceImpl.java
  26. 4 2
      ruoyi-shop/src/main/resources/mapper/distribution/BusinessOrderGainsMapper.xml
  27. 4 1
      ruoyi-shop/src/main/resources/mapper/distribution/DistributionUserOrderGainsMapper.xml
  28. 3 1
      ruoyi-shop/src/main/resources/mapper/distribution/PlatformIncomeMapper.xml
  29. 46 0
      ruoyi-user/src/main/java/com/ruoyi/user/domain/User.java
  30. 18 0
      ruoyi-user/src/main/java/com/ruoyi/user/domain/bo/UserBo.java
  31. 19 0
      ruoyi-user/src/main/java/com/ruoyi/user/domain/vo/UserVo.java
  32. 2 0
      ruoyi-user/src/main/java/com/ruoyi/user/service/IUserService.java
  33. 15 0
      ruoyi-user/src/main/java/com/ruoyi/user/service/impl/UserServiceImpl.java
  34. 12 0
      ruoyi-user/src/main/resources/mapper/user/UserMapper.xml

+ 3 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/domain/DistributionUserOrderGains.java

@@ -215,11 +215,14 @@ public class DistributionUserOrderGains extends BaseTimeEntity {
             if (gains.getGains().compareTo(BigDecimal.ZERO) == 0) {
                 return;
             } else {
+                //如果商户所得是全退
                 if(gains.getRefundMoney().compareTo(gains.getGains())==0)
                 {
+                    //用户退全部所得
                     this.refundDeduct = this.getGains();
                 }
                 else {
+                    //用户退部分所得
                     this.refundDeduct = MathUtils.setScale(gains.getRefundMoney().doubleValue() * this.getGains().doubleValue() / gains.getGains().doubleValue());
                 }
                 this.computeAbleGains();

+ 6 - 4
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/domain/UserBill.java

@@ -1,6 +1,8 @@
 package com.ruoyi.shop.distribution.domain;
 
 import com.baomidou.mybatisplus.annotation.*;
+import com.ruoyi.shop.distribution.enums.UserBillType;
+import com.ruoyi.shop.enums.InOrOuter;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import java.io.Serializable;
@@ -23,7 +25,7 @@ public class UserBill extends BaseEntity {
     private static final long serialVersionUID=1L;
 
     /**
-     * 
+     *
      */
     @TableId(value = "user_bill_id")
     private Long userBillId;
@@ -36,13 +38,13 @@ public class UserBill extends BaseEntity {
      */
     private String remark;
     /**
-     * 账单类型(0提现,结算分佣所得)
+     * 账单类型(0提现,1结算分佣所得)
      */
-    private Integer billType;
+    private UserBillType billType;
     /**
      * 收支类型(0支出,1收入)
      */
-    private Integer inOrOuter;
+    private InOrOuter inOrOuter;
     /**
      * 入帐前的余额
      */

+ 6 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/domain/vo/UserOrderGainsTo.java

@@ -47,4 +47,10 @@ public class UserOrderGainsTo implements Serializable {
      */
     private BigDecimal ratio = BigDecimal.ZERO;
 
+
+    /**
+     * 环境备注
+     */
+    private String envRemark;
+
 }

+ 55 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/enums/UserBillType.java

@@ -0,0 +1,55 @@
+package com.ruoyi.shop.distribution.enums;
+
+import com.ruoyi.common.enums.IIntegerEnum;
+
+import java.util.Objects;
+
+/**
+ * @Description: 账单类型(0提现,1结算分佣所得)
+ * @Author: lubo
+ * @Date: 2026/03/09
+ */
+public enum UserBillType implements IIntegerEnum<Integer> {
+
+    WITHDRAW(0, "提现"),
+    SETTLEMENT(1, "结算分佣所得");
+
+    ;
+    private Integer code;
+
+    private String msg;
+
+    UserBillType(Integer code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    @Override
+    public Integer getCode() {
+        return code;
+    }
+
+
+    @Override
+    public String getMsg() {
+        return msg;
+    }
+
+    public static UserBillType getByCode(int code, UserBillType[] values) {
+        for (UserBillType value : values) {
+            if (Objects.equals(code, value.getCode())) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+    public static UserBillType getByCode(int code) {
+        for (UserBillType value : UserBillType.values()) {
+            if (Objects.equals(code, value.getCode())) {
+                return value;
+            }
+        }
+        return null;
+    }
+}

+ 2 - 1
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/exception/DistributionBusinessConfigExceptionEnum.java

@@ -12,7 +12,8 @@ public enum DistributionBusinessConfigExceptionEnum implements IIntegerEnum {
     // TODO 注意检查错误码,保证系统内唯一
     DistributionBusinessConfig_IS_NOT_EXISTS(610001, "商家商品级分销设置不存在"),
 
-    USER_TOP_LIMIT_ERROR( 610002, "用户分润比率加平台分账比率不能超过商家分账上限");
+    USER_TOP_LIMIT_ERROR( 610002, "用户分润比率加平台分账比率不能超过商家分账上限"),
+    USER_TOP_LIMIT_ERROR_THIRTY( 610003, "最高分账比率不能超过30%");
 
 
     private Integer code;

+ 4 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/mapper/BusinessOrderGainsMapper.java

@@ -3,6 +3,9 @@ package com.ruoyi.shop.distribution.mapper;
 import com.ruoyi.shop.distribution.domain.BusinessOrderGains;
 import com.ruoyi.shop.distribution.domain.vo.BusinessOrderGainsVo;
 import com.ruoyi.common.core.mapper.BaseMapperPlus;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
 
 /**
  * 商家销售商品所得Mapper接口
@@ -12,4 +15,5 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus;
  */
 public interface BusinessOrderGainsMapper extends BaseMapperPlus<BusinessOrderGainsMapper, BusinessOrderGains, BusinessOrderGainsVo> {
 
+    BigDecimal loadTotalGains(@Param("orderId") Long orderId);
 }

+ 4 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/mapper/DistributionUserOrderGainsMapper.java

@@ -3,6 +3,9 @@ package com.ruoyi.shop.distribution.mapper;
 import com.ruoyi.shop.distribution.domain.DistributionUserOrderGains;
 import com.ruoyi.shop.distribution.domain.vo.DistributionUserOrderGainsVo;
 import com.ruoyi.common.core.mapper.BaseMapperPlus;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
 
 /**
  * 会员分佣所得Mapper接口
@@ -12,4 +15,5 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus;
  */
 public interface DistributionUserOrderGainsMapper extends BaseMapperPlus<DistributionUserOrderGainsMapper, DistributionUserOrderGains, DistributionUserOrderGainsVo> {
 
+    BigDecimal loadTotalGains(@Param("orderId") Long orderId);
 }

+ 4 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/mapper/PlatformIncomeMapper.java

@@ -3,6 +3,9 @@ package com.ruoyi.shop.distribution.mapper;
 import com.ruoyi.shop.distribution.domain.PlatformIncome;
 import com.ruoyi.shop.distribution.domain.vo.PlatformIncomeVo;
 import com.ruoyi.common.core.mapper.BaseMapperPlus;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
 
 /**
  * 平台所得Mapper接口
@@ -12,4 +15,5 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus;
  */
 public interface PlatformIncomeMapper extends BaseMapperPlus<PlatformIncomeMapper, PlatformIncome, PlatformIncomeVo> {
 
+    BigDecimal loadTotalGains(@Param("orderId") Long orderId);
 }

+ 31 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/IBusinessOrderGainsService.java

@@ -7,7 +7,10 @@ import com.ruoyi.shop.distribution.domain.bo.BusinessOrderGainsBo;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.core.domain.PageQuery;
 import com.ruoyi.shop.order.domain.ShopOrder;
+import com.ruoyi.shop.order.domain.ShopOrderDetail;
+import com.ruoyi.shop.rights.domain.SaleRightsOrder;
 
+import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.List;
 
@@ -83,6 +86,13 @@ public interface IBusinessOrderGainsService {
      */
     void initCreate(ShopOrder order);
 
+    /**
+     * 订单退款影响商家订单所得,用户分佣,平台分账
+     *
+     * @param rightsOrder 售后订单
+     */
+    void refund(SaleRightsOrder rightsOrder);
+
     /**
      * 获取商家订单所得
      *
@@ -93,4 +103,25 @@ public interface IBusinessOrderGainsService {
      * @return 商家订单所得
      */
     BusinessOrderGains loadByShopIdAndOrderAndGoodsType(Long businessId, Long orderId, Long orderDetailId, OrderType orderType);
+
+
+    /**
+     * 订单详情结算
+     *
+     * @param shopOrderDetail 订单详情
+     * @return 结算结果
+     */
+    BusinessOrderGains settlementByOrderDetail(ShopOrder order,ShopOrderDetail shopOrderDetail);
+
+
+    /**
+     * 订单结算
+     *
+     * @param 商家销售商品所得对象
+     */
+    void settlementUserGains(BusinessOrderGains obj);
+
+    BigDecimal loadTotalGains(Long orderId);
+
+    List<BusinessOrderGains> loadOrderGains(Long orderId);
 }

+ 3 - 1
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/IDistributionHandle.java

@@ -22,7 +22,8 @@ public interface IDistributionHandle {
                                                    DistributionComputer distributionComputer,
                                                    DistributionType distributionType,
                                                    BigDecimal gains,
-                                                   BigDecimal ratio)
+                                                   BigDecimal ratio,
+                                                   String envRemark)
     {
         UserOrderGainsTo userOrderGainsTo = new UserOrderGainsTo();
         userOrderGainsTo.setVo(vo);
@@ -30,6 +31,7 @@ public interface IDistributionHandle {
         userOrderGainsTo.setDistributionType(distributionType);
         userOrderGainsTo.setRatio(ratio);
         userOrderGainsTo.setGains(gains);
+        userOrderGainsTo.setEnvRemark(envRemark);
 
         return userOrderGainsTo;
     }

+ 16 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/IDistributionUserOrderGainsService.java

@@ -8,6 +8,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.core.domain.PageQuery;
 import com.ruoyi.shop.distribution.domain.vo.UserOrderGainsTo;
 
+import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.List;
 
@@ -93,4 +94,19 @@ public interface IDistributionUserOrderGainsService extends IDistributionHandle
      * @return 会员分佣
      */
     List<DistributionUserOrderGains> loadByBusinessOrderGainsId(Long businessId, Long businessOrderGainsId);
+
+    /**
+     * 退款扣除会员分佣
+     *
+     * @param businessOrderGains 商家订单分佣
+     */
+    void refundDeduct(BusinessOrderGains businessOrderGains);
+
+    /**
+     * 获取会员分佣
+     *
+     * @param orderId 订单ID
+     * @return 会员分佣
+     */
+    BigDecimal loadTotalGains(Long orderId);
 }

+ 10 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/IPlatformIncomeService.java

@@ -1,11 +1,13 @@
 package com.ruoyi.shop.distribution.service;
 
+import com.ruoyi.shop.distribution.domain.BusinessOrderGains;
 import com.ruoyi.shop.distribution.domain.PlatformIncome;
 import com.ruoyi.shop.distribution.domain.vo.PlatformIncomeVo;
 import com.ruoyi.shop.distribution.domain.bo.PlatformIncomeBo;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.core.domain.PageQuery;
 
+import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.List;
 
@@ -80,4 +82,12 @@ public interface IPlatformIncomeService {
      * @return
      */
     PlatformIncome loadByBusinessOrderGainsId(Long businessOrderGainsId);
+
+    /**
+     * 退款扣除
+     * @param businessOrderGains
+     */
+    void refundDeduct(BusinessOrderGains businessOrderGains);
+
+    BigDecimal loadTotalGains(Long orderId);
 }

+ 13 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/IUserBillService.java

@@ -5,7 +5,9 @@ import com.ruoyi.shop.distribution.domain.vo.UserBillVo;
 import com.ruoyi.shop.distribution.domain.bo.UserBillBo;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.core.domain.PageQuery;
+import com.ruoyi.shop.distribution.enums.UserBillType;
 
+import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.List;
 
@@ -74,4 +76,15 @@ public interface IUserBillService {
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
+    /**
+     * 添加账单
+     *
+     * @param userId
+     * @param envRemark
+     * @param userBillType
+     * @param ableGains
+     * @param orderNo
+     * @param operator
+     */
+    void inBill(Long userId, String envRemark, UserBillType userBillType, BigDecimal ableGains, String orderNo, String operator);
 }

+ 133 - 20
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/impl/BusinessOrderGainsServiceImpl.java

@@ -16,30 +16,33 @@ import com.ruoyi.common.core.domain.PageQuery;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.shop.distribution.domain.DistributionUserOrderGains;
 import com.ruoyi.shop.distribution.domain.bo.PlatformIncomeBo;
 import com.ruoyi.shop.distribution.domain.vo.DistributionBusinessConfigVo;
-import com.ruoyi.shop.distribution.service.IDistributionBusinessConfigService;
-import com.ruoyi.shop.distribution.service.IDistributionUserOrderGainsService;
-import com.ruoyi.shop.distribution.service.IPlatformIncomeService;
+import com.ruoyi.shop.distribution.enums.UserBillType;
+import com.ruoyi.shop.distribution.mapper.DistributionUserOrderGainsMapper;
+import com.ruoyi.shop.distribution.service.*;
+import com.ruoyi.shop.enums.RightsRefundStatus;
 import com.ruoyi.shop.order.domain.ShopOrder;
 import com.ruoyi.shop.order.domain.ShopOrderDetail;
 import com.ruoyi.shop.order.enums.PaymentStatus;
+import com.ruoyi.shop.order.service.IShopOrderService;
+import com.ruoyi.shop.rights.domain.SaleRightsOrder;
+import com.ruoyi.shop.rights.domain.SaleRightsOrderDetail;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import com.ruoyi.shop.distribution.domain.bo.BusinessOrderGainsBo;
 import com.ruoyi.shop.distribution.domain.vo.BusinessOrderGainsVo;
 import com.ruoyi.shop.distribution.domain.BusinessOrderGains;
 import com.ruoyi.shop.distribution.mapper.BusinessOrderGainsMapper;
-import com.ruoyi.shop.distribution.service.IBusinessOrderGainsService;
 import com.ruoyi.shop.distribution.exception.BusinessOrderGainsExceptionEnum;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
+import java.util.*;
 
 /**
  * 商家销售商品所得Service业务层处理
@@ -47,11 +50,14 @@ import java.util.Collection;
  * @author lubo
  * @date 2026-03-09
  */
+@Slf4j
 @RequiredArgsConstructor
 @Service
 public class BusinessOrderGainsServiceImpl implements IBusinessOrderGainsService {
 
     private final BusinessOrderGainsMapper baseMapper;
+    private final DistributionUserOrderGainsMapper distributionUserOrderGainsMapper;
+
 
     @Lazy
     @Resource
@@ -76,6 +82,15 @@ public class BusinessOrderGainsServiceImpl implements IBusinessOrderGainsService
     @Resource(name = "distributionUserOrderGainsServiceImpl")
     private IDistributionUserOrderGainsService distributionUserOrderGainsService;
 
+    @Lazy
+    @Resource
+    private IShopOrderService shopOrderService;
+
+    @Lazy
+    @Resource
+    private IUserBillService userBillService;
+
+
     /**
      * 查询商家销售商品所得分页
      *
@@ -132,7 +147,7 @@ public class BusinessOrderGainsServiceImpl implements IBusinessOrderGainsService
      * @return 商家销售商品所得
      */
     @Override
-    public BusinessOrderGainsVo queryById(Long businessOrderGainsId){
+    public BusinessOrderGainsVo queryById(Long businessOrderGainsId) {
         return baseMapper.selectVoById(businessOrderGainsId);
     }
 
@@ -143,9 +158,9 @@ public class BusinessOrderGainsServiceImpl implements IBusinessOrderGainsService
      * @return 商家销售商品所得
      */
     @Override
-    public BusinessOrderGains loadById(Long businessOrderGainsId, Boolean tw){
+    public BusinessOrderGains loadById(Long businessOrderGainsId, Boolean tw) {
         BusinessOrderGains info = this.baseMapper.selectById(businessOrderGainsId);
-        if(ObjectUtil.isEmpty(info) && tw){
+        if (ObjectUtil.isEmpty(info) && tw) {
             throw new ServiceException(BusinessOrderGainsExceptionEnum.BusinessOrderGains_IS_NOT_EXISTS);
         }
         return info;
@@ -187,7 +202,7 @@ public class BusinessOrderGainsServiceImpl implements IBusinessOrderGainsService
      *
      * @param entity 实体类数据
      */
-    private void validEntityBeforeSave(BusinessOrderGains entity){
+    private void validEntityBeforeSave(BusinessOrderGains entity) {
         //TODO 做一些数据校验,如唯一约束
     }
 
@@ -199,7 +214,7 @@ public class BusinessOrderGainsServiceImpl implements IBusinessOrderGainsService
      */
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
+        if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
         }
         return baseMapper.deleteBatchIds(ids) > 0;
@@ -213,11 +228,9 @@ public class BusinessOrderGainsServiceImpl implements IBusinessOrderGainsService
         DistributionBusinessConfigVo distributionBusinessConfigVo = distributionBusinessConfigService.queryByBusinessId(business.getBusinessId());
         if (PaymentStatus.PAID.equals(order.getPaymentStatus())) {
             List<ShopOrderDetail> shopOrderDetails = order.loadOrderDetails(true);
-            for(ShopOrderDetail shopOrderDetail : shopOrderDetails)
-            {
-                BusinessOrderGains obj = this.loadByShopIdAndOrderAndGoodsType(order.getBusinessId(), order.getOrderId(),  shopOrderDetail.getOrderDetailId(), order.getOrderType());
-                if(ObjectUtil.isNull( obj))
-                {
+            for (ShopOrderDetail shopOrderDetail : shopOrderDetails) {
+                BusinessOrderGains obj = this.loadByShopIdAndOrderAndGoodsType(order.getBusinessId(), order.getOrderId(), shopOrderDetail.getOrderDetailId(), order.getOrderType());
+                if (ObjectUtil.isNull(obj)) {
                     continue;
                 }
                 BusinessOrderGainsBo gainsBo = new BusinessOrderGainsBo();
@@ -274,9 +287,8 @@ public class BusinessOrderGainsServiceImpl implements IBusinessOrderGainsService
                 incomeBo.setShopOrderGainsId(businessOrderGains.getBusinessOrderGainsId());
                 platformIncomeService.insertByBo(incomeBo);
 
-                if(info.getOpen() && ObjectUtil.isNotNull(distributionBusinessConfigVo)&& distributionBusinessConfigVo.getOpen())
-                {
-                   distributionUserOrderGainsService.handle(businessOrderGains);
+                if (info.getOpen() && ObjectUtil.isNotNull(distributionBusinessConfigVo) && distributionBusinessConfigVo.getOpen()) {
+                    distributionUserOrderGainsService.handle(businessOrderGains);
                 }
                 businessOrderGains.computeAbleGains();
                 this.baseMapper.updateById(businessOrderGains);
@@ -285,6 +297,107 @@ public class BusinessOrderGainsServiceImpl implements IBusinessOrderGainsService
         }
     }
 
+    @Override
+    public void refund(SaleRightsOrder rightsOrder) {
+        if (RightsRefundStatus.SUCCESS.equals(rightsOrder.getRightsRefundStatus())) {
+            ShopOrder order = shopOrderService.loadById(rightsOrder.getOrderId(), true);
+            List<SaleRightsOrderDetail> rightsChildOrders = rightsOrder.loadSaleRightsOrderDetails();
+            for(SaleRightsOrderDetail rightsChildOrder : rightsChildOrders)
+            {
+                BusinessOrderGains obj = this.loadByShopIdAndOrderAndGoodsType(rightsOrder.getBusinessId(), rightsOrder.getOrderId(), rightsChildOrder.getOrderDetailId(), order.getOrderType());
+                if (obj == null) {
+                    log.info("订单{},商品【{}】退款成功后,没有找到对应的商家所得记录", rightsOrder.getOrderNo(), rightsChildOrder.getProductTitle());
+                } else {
+                    if (rightsChildOrder.getRefundMoney().compareTo(obj.getGains()) > 0) {
+                        obj.setRefundMoney(obj.getGains());
+                    } else {
+                        obj.setRefundMoney(rightsChildOrder.getRefundMoney());
+                    }
+
+                    obj.setExistsRefund(true);
+                    distributionUserOrderGainsService.refundDeduct(obj);
+                    platformIncomeService.refundDeduct(obj);
+                    obj.computeAbleGains();
+                    this.baseMapper.updateById(obj);
+
+                    //结算商家所得升级
+                    settlementByOrderDetail(order, rightsChildOrder.loadOrderDetail(true));
+                }
+            }
+        }
+    }
+
+    @Override
+    public BusinessOrderGains settlementByOrderDetail(ShopOrder order, ShopOrderDetail shopOrderDetail) {
+        OrderType goodsType = OrderType.NORMAL;
+        if (OrderType.SERVICE.equals(order.getOrderType())) {
+            goodsType = OrderType.SERVICE;
+        }
+        BusinessOrderGains obj = this.loadByShopIdAndOrderAndGoodsType(shopOrderDetail.getBusinessId(), shopOrderDetail.getOrderId(), shopOrderDetail.getOrderDetailId(), goodsType);
+        if (ObjectUtil.isNull(obj)) {
+            return null;
+        }
+        if ((!shopOrderDetail.getEnd())) {
+            log.info("订单{},所购商品【{}】还没有完成不能结算", shopOrderDetail.getOrderNo(), shopOrderDetail.getProductTitle());
+            return obj;
+        }
+
+        if (obj.getSettlement()) {
+            log.info("订单{},所购商品【{}】已结算不要重复结算", shopOrderDetail.getOrderNo(), shopOrderDetail.getProductTitle());
+            return obj;
+        }
+
+        if (ObjectUtil.isNotNull(obj)) {
+
+            obj.setSettlement(true);
+            obj.setSettlementTime(new Date());
+            this.baseMapper.updateById(obj);
+
+            List<DistributionUserOrderGains> list = obj.loadDistributionUserOrderGainsList(true);
+            for(DistributionUserOrderGains userOrderGains : list)
+            {
+                userOrderGains.setSettlement(false);
+                userOrderGains.setAbleSettlement(true);
+                userOrderGains.setSettlementRemark("系统可以给用户结算");
+                distributionUserOrderGainsMapper.updateById(userOrderGains);
+            }
+
+            settlementUserGains(obj);
+        }
+        return obj;
+    }
+    @Override
+    public void settlementUserGains(BusinessOrderGains obj) {
+        //会员分佣结算部分===========================================================
+        List<DistributionUserOrderGains> list = obj.loadDistributionUserOrderGainsList(true);
+        for(DistributionUserOrderGains userOrderGains : list)
+        {
+            userOrderGains.setSettlement(true);
+            userOrderGains.setSettlementTime(new Date());
+            userOrderGains.setAbleSettlement(true);
+            userOrderGains.setSettlementRemark("系统自动结算成功");
+            distributionUserOrderGainsMapper.updateById(userOrderGains);
+            if (userOrderGains.getAbleGains().compareTo(BigDecimal.ZERO) > 0) {
+
+                userBillService.inBill(userOrderGains.getUserId(),
+                    userOrderGains.getEnvRemark(),
+                    UserBillType.SETTLEMENT,
+                    userOrderGains.getAbleGains(),
+                    userOrderGains.getOrderNo(), "系统");
+            }
+        }
+    }
+
+    @Override
+    public BigDecimal loadTotalGains(Long orderId) {
+        return this.baseMapper.loadTotalGains(orderId);
+    }
+
+    @Override
+    public List<BusinessOrderGains> loadOrderGains(Long orderId) {
+        return this.baseMapper.selectList(new LambdaQueryWrapper<BusinessOrderGains>().eq(BusinessOrderGains::getOrderId, orderId).eq(BusinessOrderGains::getSettlement, true));
+    }
+
     @Override
     public BusinessOrderGains loadByShopIdAndOrderAndGoodsType(Long businessId, Long orderId, Long orderDetailId, OrderType orderType) {
 

+ 5 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/impl/DistributionBusinessConfigServiceImpl.java

@@ -145,6 +145,11 @@ public class DistributionBusinessConfigServiceImpl implements IDistributionBusin
             throw new ServiceException(RevenueSharingConfigExceptionEnum.RevenueSharingConfig_IS_NOT_EXISTS);
         }
 
+        if(entity.getTopLimit().compareTo(new BigDecimal("30"))>0)
+        {
+            throw new ServiceException(DistributionBusinessConfigExceptionEnum.USER_TOP_LIMIT_ERROR_THIRTY);
+        }
+
         //TODO 做一些数据校验,如唯一约束
         BigDecimal value = MathUtils.addMulti(info.getOrderServiceFeeRatio(),entity.getSecondLevelRatio(), entity.getFirstLevelRatio());
         if(value.compareTo(entity.getTopLimit()) > 0)

+ 17 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/impl/DistributionUserOrderGainsServiceImpl.java

@@ -228,6 +228,7 @@ public class DistributionUserOrderGainsServiceImpl implements IDistributionUserO
         entity.setAbleSettlement(false);
         entity.setBusinessOrderGainsId(shopOrderGains.getBusinessOrderGainsId());
         entity.setRatio(userOrderGainsTo.getRatio());
+        entity.setEnvRemark(userOrderGainsTo.getEnvRemark());
         this.baseMapper.insert(entity);
         return entity;
     }
@@ -240,6 +241,22 @@ public class DistributionUserOrderGainsServiceImpl implements IDistributionUserO
         );
     }
 
+    @Override
+    public void refundDeduct(BusinessOrderGains businessOrderGains) {
+        List<DistributionUserOrderGains> list = businessOrderGains.loadDistributionUserOrderGainsList(true);
+        for(DistributionUserOrderGains userOrderGains : list)
+        {
+            userOrderGains.setExistsRefund(true);
+            userOrderGains.computeRefundDeduct(businessOrderGains);
+            this.baseMapper.updateById(userOrderGains);
+        }
+    }
+
+    @Override
+    public BigDecimal loadTotalGains(Long orderId) {
+        return this.baseMapper.loadTotalGains(orderId);
+    }
+
 
     @Lazy
     @Resource(name = "generalGoodsDistribution")

+ 20 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/impl/PlatformIncomeServiceImpl.java

@@ -4,12 +4,14 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.BeanCopyUtils;
+import com.ruoyi.common.utils.MathUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.core.domain.PageQuery;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.shop.distribution.domain.BusinessOrderGains;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import com.ruoyi.shop.distribution.domain.bo.PlatformIncomeBo;
@@ -19,6 +21,7 @@ import com.ruoyi.shop.distribution.mapper.PlatformIncomeMapper;
 import com.ruoyi.shop.distribution.service.IPlatformIncomeService;
 import com.ruoyi.shop.distribution.exception.PlatformIncomeExceptionEnum;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 import java.util.Collection;
@@ -162,4 +165,21 @@ public class PlatformIncomeServiceImpl implements IPlatformIncomeService {
             .last("limit 1"));
     }
 
+    @Override
+    public void refundDeduct(BusinessOrderGains businessOrderGains) {
+        PlatformIncome platformIncome = this.loadByBusinessOrderGainsId(businessOrderGains.getBusinessOrderGainsId());
+        platformIncome.setExistsRefund(true);
+
+        if (businessOrderGains.getGains().compareTo(BigDecimal.ZERO)>0 && platformIncome.getDonationValue().compareTo(BigDecimal.ZERO) > 0) {
+            platformIncome.setRefundDeduct(MathUtils.setScale(businessOrderGains.getRefundMoney().doubleValue() * platformIncome.getDonationValue().doubleValue() / businessOrderGains.getGains().doubleValue()));
+            platformIncome.setAbleGains(MathUtils.subtract(platformIncome.getDonationValue(), platformIncome.getRefundDeduct()));
+        }
+        this.baseMapper.updateById(platformIncome);
+    }
+
+    @Override
+    public BigDecimal loadTotalGains(Long orderId) {
+        return this.baseMapper.loadTotalGains(orderId);
+    }
+
 }

+ 31 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/impl/UserBillServiceImpl.java

@@ -10,7 +10,12 @@ import com.ruoyi.common.core.domain.PageQuery;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.shop.distribution.enums.UserBillType;
+import com.ruoyi.shop.enums.InOrOuter;
+import com.ruoyi.user.domain.User;
+import com.ruoyi.user.service.IUserService;
 import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import com.ruoyi.shop.distribution.domain.bo.UserBillBo;
 import com.ruoyi.shop.distribution.domain.vo.UserBillVo;
@@ -19,6 +24,8 @@ import com.ruoyi.shop.distribution.mapper.UserBillMapper;
 import com.ruoyi.shop.distribution.service.IUserBillService;
 import com.ruoyi.shop.distribution.exception.UserBillExceptionEnum;
 
+import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 import java.util.Collection;
@@ -35,6 +42,10 @@ public class UserBillServiceImpl implements IUserBillService {
 
     private final UserBillMapper baseMapper;
 
+    @Lazy
+    @Resource
+    private IUserService userService;
+
     /**
      * 查询会员分销所得账单分页
      *
@@ -155,4 +166,24 @@ public class UserBillServiceImpl implements IUserBillService {
         return baseMapper.deleteBatchIds(ids) > 0;
     }
 
+    @Override
+    public void inBill(Long userId, String envRemark, UserBillType userBillType, BigDecimal ableGains, String orderNo, String operator) {
+        User user = userService.getById(userId, true);
+        BigDecimal commissionAble = user.getCommissionAble();
+        //修改会员分润
+        user = userService.updateCommissionAble(userId, ableGains, true);
+
+        UserBill userBill = new UserBill();
+        userBill.setUserId(userId);
+        userBill.setBillType(userBillType);
+        userBill.setInOrOuter(InOrOuter.IN);
+        userBill.setRemark(envRemark);
+        userBill.setCode(orderNo);
+        userBill.setEntryBefore(commissionAble);
+        userBill.setEntryAfter(user.getCommissionAble());
+        userBill.setEntryValue(ableGains);
+        userBill.setOperator(operator);
+        this.baseMapper.insert(userBill);
+    }
+
 }

+ 2 - 2
ruoyi-shop/src/main/java/com/ruoyi/shop/distribution/service/lvcodeimpl/GeneralGoodsDistributionHandle.java

@@ -89,7 +89,7 @@ public class GeneralGoodsDistributionHandle implements IDistributionHandle {
                     DistributionUserOrderGains userOrderGains = distributionUserOrderGainsService.createGains(shopOrderGains, buildUserOrderGainsTo(vo,
                         DistributionComputer.COMMON,
                         DistributionType.COMMON_ONE_LEVEL,
-                        firstGains, config.getFirstLevelRatio()));
+                        firstGains, config.getFirstLevelRatio(),"一级分销"));
                     list.add(userOrderGains);
                 }
                 continue;
@@ -107,7 +107,7 @@ public class GeneralGoodsDistributionHandle implements IDistributionHandle {
                         DistributionComputer.COMMON,
                         DistributionType.COMMON_TWO_LEVEL,
                         secondGains,
-                        config.getSecondLevelRatio()));
+                        config.getSecondLevelRatio(),"二级分销"));
                     list.add(userOrderGains);
                 }
                 break;

+ 60 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/enums/InOrOuter.java

@@ -0,0 +1,60 @@
+package com.ruoyi.shop.enums;
+
+import com.ruoyi.common.enums.IIntegerEnum;
+
+import java.util.Objects;
+
+/**
+ * 收支类型(0支出,1收入)
+ * @author lubo
+ */
+public enum InOrOuter implements IIntegerEnum<Integer> {
+    /**
+     * 支出
+     */
+    OUT(0, "支出"),
+    /**
+     * 收入
+     */
+    IN(1, "收入");
+
+    ;
+
+    private Integer code;
+
+    private String msg;
+
+    InOrOuter(Integer code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    @Override
+    public Integer getCode() {
+        return code;
+    }
+
+    @Override
+    public String getMsg() {
+        return msg;
+    }
+
+
+    public static InOrOuter getByCode(int code, InOrOuter[] values) {
+        for (InOrOuter value : values) {
+            if (Objects.equals(code, value.getCode())) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+    public static InOrOuter getByCode(int code) {
+        for (InOrOuter value : InOrOuter.values()) {
+            if (Objects.equals(code, value.getCode())) {
+                return value;
+            }
+        }
+        return null;
+    }
+}

+ 1 - 1
ruoyi-shop/src/main/java/com/ruoyi/shop/order/domain/ShopOrder.java

@@ -306,7 +306,7 @@ public class ShopOrder extends BaseTimeEntity {
     private BigDecimal platformIncome;
 
     /**
-     * 平台所得是否已分账
+     *  是否已分账
      */
     private CallInterfaceStatus platformIncomeSettled;
 

+ 4 - 2
ruoyi-shop/src/main/java/com/ruoyi/shop/order/service/IShopOrderService.java

@@ -162,14 +162,14 @@ public interface IShopOrderService {
      * @param orderId 订单id
      * @param rightsMethod 退款方式
      */
-    void refundOperate(Long orderId, RightsMethod rightsMethod);
+    void refundOperate(ShopOrder order, RightsMethod rightsMethod);
 
     /**
      * 订单退款同步
      * @param orderDetailId 订单详情id
      * @param shopOrder 订单
      */
-    void endRefundOrderSync(Long orderDetailId, Long orderId);
+     void endRefundOrderSync(ShopOrderDetail orderDetail, ShopOrder order);
 
     /**
      * 统计订单数量
@@ -238,4 +238,6 @@ public interface IShopOrderService {
     void modify(ShopOrder order);
 
     void effectiveAfterAbleShip(Long orderId);
+
+    void splitMoney(ShopOrder order);
 }

+ 52 - 5
ruoyi-shop/src/main/java/com/ruoyi/shop/order/service/impl/ShopOrderServiceImpl.java

@@ -15,6 +15,7 @@ import com.ruoyi.business.service.IBusinessService;
 
 import com.ruoyi.common.core.domain.PageQuery;
 import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.CallInterfaceStatus;
 import com.ruoyi.common.enums.order.MarketingType;
 import com.ruoyi.common.enums.order.OrderType;
 import com.ruoyi.common.exception.ServiceException;
@@ -27,7 +28,10 @@ import com.ruoyi.shop.business.service.IUserBusinessRoleService;
 import com.ruoyi.shop.config.domain.ShopSaleConfig;
 import com.ruoyi.shop.config.service.IShopSaleConfigService;
 import com.ruoyi.shop.coupon.service.ICouponReceiveRecordService;
+import com.ruoyi.shop.distribution.domain.BusinessOrderGains;
 import com.ruoyi.shop.distribution.service.IBusinessOrderGainsService;
+import com.ruoyi.shop.distribution.service.IDistributionUserOrderGainsService;
+import com.ruoyi.shop.distribution.service.IPlatformIncomeService;
 import com.ruoyi.shop.marketing.groupbuy.service.IGroupBuyTeamMemberService;
 import com.ruoyi.shop.marketing.groupbuy.service.IGroupBuyTeamService;
 import com.ruoyi.shop.order.domain.ShopOrder;
@@ -95,6 +99,9 @@ public class ShopOrderServiceImpl implements IShopOrderService {
 
     private final IBusinessOrderGainsService businessOrderGainsService;
 
+    private final IDistributionUserOrderGainsService distributionUserOrderGainsService;
+    private final IPlatformIncomeService platformIncomeService;
+
     /**
      * 查询订单分页
      *
@@ -497,8 +504,7 @@ public class ShopOrderServiceImpl implements IShopOrderService {
     }
 
     @Override
-    public void refundOperate(Long orderId, RightsMethod rightsMethod) {
-        ShopOrder order = this.loadByLockId(orderId, true);
+    public void refundOperate(ShopOrder order, RightsMethod rightsMethod) {
         order.setRightsStatus(RightsStatus.RIGHTS_COMPLETE);
         order.setEnd(true);
         order.setTransactionStatus(TransactionStatus.TRADE_CLOSED);
@@ -612,13 +618,12 @@ public class ShopOrderServiceImpl implements IShopOrderService {
     }
 
     @Override
-    public void endRefundOrderSync(Long orderDetailId, Long orderId) {
-        ShopOrder shopOrder = this.loadByLockId(orderId, true);
+    public void endRefundOrderSync(ShopOrderDetail shopOrderDetail, ShopOrder shopOrder) {
         if (shopOrder != null) {
             boolean isAbleEnd = true;
             List<ShopOrderDetail> childOrderList = shopOrder.loadOrderDetails(true);
             for (ShopOrderDetail child : childOrderList) {
-                if (!orderDetailId.equals(child.getOrderDetailId()) && !child.getEnd()) {
+                if (!shopOrderDetail.getOrderDetailId().equals(child.getOrderDetailId()) && !child.getEnd()) {
                     isAbleEnd = false;
                 }
             }
@@ -757,6 +762,48 @@ public class ShopOrderServiceImpl implements IShopOrderService {
                 commentOrderDetailSync(order, shopOrderDetail);
             }
         }
+        //结算用户所得和平台所得
+        businessOrderGainsService.settlementByOrderDetail(order, shopOrderDetail);
+
+        if(order.getEnd())
+        {
+            splitMoney(order);
+        }
+
+    }
+
+    /**
+     * 结算用户所得和平台所得
+     * @param order
+     */
+    @Override
+    public void splitMoney(ShopOrder order) {
+        BigDecimal totalUser = distributionUserOrderGainsService.loadTotalGains(order.getOrderId());
+        BigDecimal totalPlatform = platformIncomeService.loadTotalGains(order.getOrderId());
+        BigDecimal totalBusiness = businessOrderGainsService.loadTotalGains(order.getOrderId());
+        MathUtils.add(totalUser, totalPlatform);
+        try {
+            //TODO 开始分账
+
+
+            //如果分账成功
+            List<BusinessOrderGains> list = businessOrderGainsService.loadOrderGains(order.getOrderId());
+            for (BusinessOrderGains gains : list) {
+                businessOrderGainsService.settlementUserGains(gains);
+            }
+
+            order.setPlatformIncome(totalPlatform);
+            order.setBusinessIncome(totalBusiness);
+            order.setPlatformIncomeSettled(CallInterfaceStatus.SUCCESS);
+            this.baseMapper.updateById(order);
+        } catch (Exception e)
+        {
+            order.setPlatformIncome(totalPlatform);
+            order.setBusinessIncome(totalBusiness);
+
+            order.setPlatformIncomeSettled(CallInterfaceStatus.FAIL);
+            this.baseMapper.updateById(order);
+        }
     }
 
     /**

+ 18 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/rights/domain/SaleRightsOrderDetail.java

@@ -1,8 +1,13 @@
 package com.ruoyi.shop.rights.domain;
 
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.ruoyi.common.core.domain.BaseEntity;
+import com.ruoyi.shop.order.domain.ShopOrderDetail;
+import com.ruoyi.shop.order.service.IShopOrderDetailService;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -86,4 +91,17 @@ public class SaleRightsOrderDetail {
      */
     private BigDecimal refundPoint;
 
+
+    @TableField(exist = false)
+    private ShopOrderDetail orderDetail;
+
+    public ShopOrderDetail loadOrderDetail(Boolean  needLoad) {
+        if(needLoad || ObjectUtil.isNull( this.orderDetail))
+        {
+            IShopOrderDetailService service = SpringUtil.getBean("shopOrderDetailServiceImpl", IShopOrderDetailService.class);
+            this.orderDetail  = service.loadById(orderDetailId,true);
+        }
+        return this.orderDetail;
+    }
+
 }

+ 28 - 5
ruoyi-shop/src/main/java/com/ruoyi/shop/rights/service/impl/SaleRightsOrderServiceImpl.java

@@ -25,6 +25,7 @@ import com.ruoyi.shop.business.domain.bo.UserBusinessChangeIntegralBo;
 import com.ruoyi.shop.business.service.IUserBusinessRoleService;
 import com.ruoyi.shop.config.domain.ShopSaleConfig;
 import com.ruoyi.shop.config.service.IShopSaleConfigService;
+import com.ruoyi.shop.distribution.service.IBusinessOrderGainsService;
 import com.ruoyi.shop.enums.RightsCargoStatus;
 import com.ruoyi.shop.enums.RightsOperatePerson;
 import com.ruoyi.shop.enums.RightsOperateStatus;
@@ -98,6 +99,12 @@ public class SaleRightsOrderServiceImpl implements ISaleRightsOrderService {
     private final IUserBusinessRoleService userBusinessRoleService;
     private final IRightsMqService rightsMqService;
     private final IBusinessService businessService;
+
+    @Lazy
+    @Resource
+    private IBusinessOrderGainsService businessOrderGainsService;
+
+
     @Autowired
     private KD100Util kd100Util;
     @Autowired
@@ -1115,18 +1122,34 @@ public class SaleRightsOrderServiceImpl implements ISaleRightsOrderService {
         rightsOrder.setRightsOperateStatus(RightsOperateStatus.REFUND_COMPLETE);
         rightsOrder.setRightsRefundStatus(RightsRefundStatus.SUCCESS);
         baseMapper.updateById(rightsOrder);
+        ShopOrder shopOrder = shopOrderService.loadByLockId(rightsOrder.getOrderId(), true);
         if (rightsOrder.getIsAllRights()) {
-            shopOrderService.refundOperate(rightsOrder.getOrderId(), rightsOrder.getRightsType());
+            shopOrderService.refundOperate(shopOrder, rightsOrder.getRightsType());
         } else {
-            ShopOrder shopOrder = shopOrderService.loadById(rightsOrder.getOrderId(), true);
+
             List<SaleRightsOrderDetailVo> saleRightsOrderDetailVos = saleRightsOrderDetailService.loadChildRightsOrders(rightsOrder.getId());
-            saleRightsOrderDetailVos.forEach(rightsChildOrder -> {
+            for(SaleRightsOrderDetailVo rightsChildOrder : saleRightsOrderDetailVos)
+            {
                 ShopOrderDetail shopOrderDetail = shopOrderDetailService.loadById(rightsChildOrder.getOrderDetailId(), true);
                 shopOrderDetailService.refundOperate(shopOrder,shopOrderDetail, rightsOrder.getRightsType());
                 //同步把订单封单
-                shopOrderService.endRefundOrderSync(shopOrderDetail.getOrderDetailId(), shopOrderDetail.getOrderId());
-            });
+                shopOrderService.endRefundOrderSync(shopOrderDetail, shopOrder);
+
+            }
+        }
+        if (rightsOrder.getRefundMoney().compareTo(BigDecimal.ZERO) > 0) {
+            businessOrderGainsService.refund(rightsOrder);
         }
+
+        if(shopOrder.getEnd())
+        {
+            //TODO 开始分账
+            shopOrderService.splitMoney(shopOrder);
+        }
+
+
+
+
         return rightsOrder;
     }
 

+ 4 - 2
ruoyi-shop/src/main/resources/mapper/distribution/BusinessOrderGainsMapper.xml

@@ -25,7 +25,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="settlementTime" column="settlement_time"/>
         <result property="settlement" column="settlement"/>
         <result property="userId" column="user_id"/>
-        <result property="productsTitle" column="products_title"/>
         <result property="productCover" column="product_cover"/>
         <result property="shippingMethod" column="shipping_method"/>
         <result property="unit" column="unit"/>
@@ -41,5 +40,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="salePrice" column="sale_price"/>
     </resultMap>
 
-
+    <select id="loadTotalGains" resultType="java.math.BigDecimal">
+        SELECT IFNULL(SUM(able_gains),0)  FROM tb_business_order_gains
+        WHERE order_id = #{orderId} AND settlement = 1
+    </select>
 </mapper>

+ 4 - 1
ruoyi-shop/src/main/resources/mapper/distribution/DistributionUserOrderGainsMapper.xml

@@ -48,5 +48,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="ratio" column="ratio"/>
     </resultMap>
 
-
+    <select id="loadTotalGains" resultType="java.math.BigDecimal">
+        SELECT IFNULL(SUM(able_gains),0)  FROM tb_distribution_user_order_gains
+        WHERE order_id = #{orderId} AND able_settlement = 1
+    </select>
 </mapper>

+ 3 - 1
ruoyi-shop/src/main/resources/mapper/distribution/PlatformIncomeMapper.xml

@@ -19,5 +19,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="existsRefund" column="exists_refund"/>
     </resultMap>
 
-
+    <select id="loadTotalGains" resultType="java.math.BigDecimal">
+        SELECT IFNULL(SUM(able_gains),0) FROM tb_platform_income where order_id = #{orderId}
+    </select>
 </mapper>

+ 46 - 0
ruoyi-user/src/main/java/com/ruoyi/user/domain/User.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.ruoyi.common.filepathsplicing.FilePathValue;
+import com.ruoyi.common.utils.MathUtils;
 import com.ruoyi.common.utils.StringUtils;
 import jodd.util.StringUtil;
 import lombok.Data;
@@ -123,6 +124,22 @@ public class User  {
     private String payPassword;
 
 
+    /**
+     * 可提现佣金
+     */
+    private BigDecimal commissionAble;
+    /**
+     * 已结算佣金
+     */
+    private BigDecimal commissionSettled;
+
+    /**
+     * 已提现佣金
+     */
+    private BigDecimal commissionTakeOut;
+
+
+
     /**
      * 获取用户名称
      *
@@ -132,4 +149,33 @@ public class User  {
     {
         return StringUtils.isNotBlank(nickname) ? nickname : realName;
     }
+
+    /**
+     * 增加会员分佣所得
+     *
+     * @param money
+     * @return
+     */
+    public User incCommission(BigDecimal money) {
+        //增加后的会员所得
+        this.setCommissionAble(MathUtils.add(this.getCommissionAble(), money));
+        //增加已结算会员所得
+        this.setCommissionSettled(MathUtils.add(this.getCommissionSettled(), money));
+        return this;
+    }
+
+
+    /**
+     * 减少会员分佣所得
+     *
+     * @param money
+     * @return
+     */
+    public User decCommission(BigDecimal money) {
+        //减少后的会员所得
+        this.setCommissionAble(MathUtils.subtract(this.getCommissionAble(), money));
+        //增加已提现(或已消耗的)会员所得
+        this.setCommissionTakeOut(MathUtils.add(this.getCommissionTakeOut(), money));
+        return this;
+    }
 }

+ 18 - 0
ruoyi-user/src/main/java/com/ruoyi/user/domain/bo/UserBo.java

@@ -139,4 +139,22 @@ public class UserBo extends BaseEntity {
      * 注册日期
      */
     private Date createDay;
+
+
+    /**
+     * 可提现佣金
+     */
+    @ApiModelProperty("可提现佣金")
+    private BigDecimal commissionAble;
+    /**
+     * 已结算佣金
+     */
+    @ApiModelProperty("已结算佣金")
+    private BigDecimal commissionSettled;
+
+    /**
+     * 已提现佣金
+     */
+    @ApiModelProperty("已提现佣金")
+    private BigDecimal commissionTakeOut;
 }

+ 19 - 0
ruoyi-user/src/main/java/com/ruoyi/user/domain/vo/UserVo.java

@@ -192,4 +192,23 @@ public class UserVo {
     private BigDecimal shopConsume;
     @ApiModelProperty("累计扫码消费")
     private BigDecimal lineConsume;
+
+
+
+    /**
+     * 可提现佣金
+     */
+    @ApiModelProperty("可提现佣金")
+    private BigDecimal commissionAble;
+    /**
+     * 已结算佣金
+     */
+    @ApiModelProperty("已结算佣金")
+    private BigDecimal commissionSettled;
+
+    /**
+     * 已提现佣金
+     */
+    @ApiModelProperty("已提现佣金")
+    private BigDecimal commissionTakeOut;
 }

+ 2 - 0
ruoyi-user/src/main/java/com/ruoyi/user/service/IUserService.java

@@ -201,4 +201,6 @@ public interface IUserService {
     Boolean isSetPayPassword(Long userId);
 
     List<UserVo> getAllParentUser(Long userId);
+
+    User updateCommissionAble(Long userId, BigDecimal ableGains, boolean isAdd);
 }

+ 15 - 0
ruoyi-user/src/main/java/com/ruoyi/user/service/impl/UserServiceImpl.java

@@ -860,6 +860,21 @@ public class UserServiceImpl implements IUserService {
         return this.baseMapper.getAllParentUser(parentUserIdList);
     }
 
+    @Override
+    public User updateCommissionAble(Long userId, BigDecimal money, boolean isAdd) {
+
+        User user = this.loadByIdForLock(userId, true);
+        if (isAdd) {
+            //收入(会员分佣所得)
+            user.incCommission(money);
+        } else {
+            //支出(会员分佣提现)
+            user.decCommission(money);
+        }
+        this.baseMapper.updateById(user);
+        return user;
+    }
+
     private String generateUniqueMemberCode(Long userId) {
         //生成唯一码 用户不会重复 6-8位
         String userIdPart = String.valueOf(userId);

+ 12 - 0
ruoyi-user/src/main/resources/mapper/user/UserMapper.xml

@@ -17,6 +17,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="lastLoginTime" column="last_login_time"/>
         <result property="createTime" column="create_time"/>
         <result property="updateTime" column="update_time"/>
+        <result property="integralTotal" column="integral_total"/>
+        <result property="integralAble" column="integral_able"/>
+        <result property="qrCode" column="qr_code"/>
+        <result property="createDay" column="create_day"/>
+        <result property="parentUserId" column="parent_user_id"/>
+        <result property="parentUserPath" column="parent_user_path"/>
+        <result property="invitationCode" column="invitation_code"/>
+        <result property="balance" column="balance"/>
+        <result property="payPassword" column="pay_password"/>
+        <result property="commissionAble" column="commission_able"/>
+        <result property="commissionSettled" column="commission_settled"/>
+        <result property="commissionTakeOut" column="commission_take_out"/>
     </resultMap>
 
     <select id="selectUserRegister" resultType="com.ruoyi.user.domain.vo.UserStatisticsVo">