lubo před 4 měsíci
rodič
revize
aee712e9f2

+ 7 - 0
ruoyi-api/src/main/java/com/ruoyi/api/controller/pay/ApiNotifyController.java

@@ -85,6 +85,12 @@ public class ApiNotifyController extends AbstractApiController {
                         throw new ServicePayException("FAIL", "失败");
                     }
                     if (ObjectUtil.isNotNull(onlineOrder)) {
+                        //支付成功之后需要把平台所得立即给商家,设用第三方接口
+
+                        onlineOrderService.platformIncomeSettleHandle(onlineOrder);
+
+
+
                         int lazyTime = Long.valueOf(DateUtil.between(new Date(), onlineOrder.getLastEndTime(), DateUnit.MS)).intValue();
                         rabbitMqClient.send(DelayedConstant.OnLineOrderEndDelayedConstant.ON_LINE_ORDER_END_DELAYED_EXCHANGE,
                             DelayedConstant.OnLineOrderEndDelayedConstant.ON_LINE_ORDER_END_DELAYED_ROUTING,
@@ -101,6 +107,7 @@ public class ApiNotifyController extends AbstractApiController {
 
     }
 
+
     /**
      * 退款回调
      */

+ 55 - 0
ruoyi-common/src/main/java/com/ruoyi/common/enums/CallInterfaceStatus.java

@@ -0,0 +1,55 @@
+package com.ruoyi.common.enums;
+
+import java.util.Objects;
+
+/**
+ *
+ * 调用第三方接口的状态(0:未调用,5:调用失账,10调用成功)
+ * @author lubo
+ */
+public enum CallInterfaceStatus implements IIntegerEnum<Integer> {
+    //调用第三方接口的状态(0:未调用,5:调用失账,10调用成功)
+    NO(0, "未调用"),
+    FAIL(5, "调用失败"),
+    SUCCESS(10, "调用成功"),
+    ;
+
+
+    private Integer code;
+
+    private String msg;
+
+    CallInterfaceStatus(Integer code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    @Override
+    public Integer getCode() {
+        return code;
+    }
+
+
+    @Override
+    public String getMsg() {
+        return msg;
+    }
+
+    public static CallInterfaceStatus getByCode(Integer code, CallInterfaceStatus[] values) {
+        for (CallInterfaceStatus value : values) {
+            if (Objects.equals(code, value.getCode())) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+    public static CallInterfaceStatus getByCode(Integer code) {
+        for (CallInterfaceStatus value : CallInterfaceStatus.values()) {
+            if (Objects.equals(code, value.getCode())) {
+                return value;
+            }
+        }
+        return null;
+    }
+}

+ 21 - 0
ruoyi-line/src/main/java/com/ruoyi/onlineorder/domain/OnlineOrder.java

@@ -6,6 +6,7 @@ import com.alibaba.excel.annotation.ExcelProperty;
 import com.baomidou.mybatisplus.annotation.*;
 import com.ruoyi.common.convert.ExcelDateTimeConvert;
 import com.ruoyi.common.core.domain.BaseTimeEntity;
+import com.ruoyi.common.enums.CallInterfaceStatus;
 import com.ruoyi.onlineorder.enums.*;
 import com.ruoyi.system.enums.SequencePrefixEnum;
 import com.ruoyi.system.service.ISysSequenceService;
@@ -133,6 +134,23 @@ public class OnlineOrder extends BaseTimeEntity {
      */
     private Boolean end;
 
+
+    /**
+     * 商家所得
+     */
+    private BigDecimal businessIncome;
+
+    /**
+     * 平台所得
+     */
+    private BigDecimal platformIncome;
+
+    /**
+     * 平台所得是否已分账
+     */
+    private CallInterfaceStatus platformIncomeSettled;
+
+
     public void init(Integer expireMinute) {
         this.orderStatus = OnlineOrderStatus.WAIT_PAY;
         this.payStatus = OnlinePayStatus.WAIT_PAY;
@@ -144,6 +162,9 @@ public class OnlineOrder extends BaseTimeEntity {
         this.subsidyAmount = BigDecimal.ZERO;
         this.expireTime = DateUtil.offsetMinute(new Date(), expireMinute);
         this.end = false;
+        this.businessIncome = BigDecimal.ZERO;
+        this.platformIncome = BigDecimal.ZERO;
+        this.platformIncomeSettled = CallInterfaceStatus.NO;
     }
 
     /**

+ 20 - 0
ruoyi-line/src/main/java/com/ruoyi/onlineorder/domain/bo/OnlineOrderBo.java

@@ -3,6 +3,7 @@ package com.ruoyi.onlineorder.domain.bo;
 import com.ruoyi.common.core.domain.BaseTimeEntity;
 import com.ruoyi.common.core.validate.AddGroup;
 import com.ruoyi.common.core.validate.EditGroup;
+import com.ruoyi.common.enums.CallInterfaceStatus;
 import com.ruoyi.onlineorder.enums.*;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -181,4 +182,23 @@ public class OnlineOrderBo extends BaseTimeEntity {
     private Boolean end;
 
 
+    /**
+     * 商家所得
+     */
+    @ApiModelProperty(value = "商家所得")
+    private BigDecimal businessIncome;
+
+    /**
+     * 平台所得
+     */
+    @ApiModelProperty(value = "平台所得")
+    private BigDecimal platformIncome;
+
+    /**
+     * 平台所得是否已分账
+     */
+    @ApiModelProperty(value = "平台所得是否已分账")
+    private CallInterfaceStatus platformIncomeSettled;
+
+
 }

+ 23 - 0
ruoyi-line/src/main/java/com/ruoyi/onlineorder/domain/vo/OnlineOrderVo.java

@@ -12,6 +12,7 @@ import com.ruoyi.common.convert.ExcelEnumConvert;
 import com.ruoyi.common.core.domain.BaseVo;
 import com.ruoyi.common.core.validate.AddGroup;
 import com.ruoyi.common.core.validate.EditGroup;
+import com.ruoyi.common.enums.CallInterfaceStatus;
 import com.ruoyi.onlineorder.enums.*;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -199,4 +200,26 @@ public class OnlineOrderVo extends BaseVo {
     private Boolean end;
 
 
+    /**
+     * 商家所得
+     */
+    @ApiModelProperty(value = "商家所得")
+    @ExcelProperty(value = "商家所得")
+    private BigDecimal businessIncome;
+
+    /**
+     * 平台所得
+     */
+    @ApiModelProperty(value = "平台所得")
+    @ExcelProperty(value = "平台所得")
+    private BigDecimal platformIncome;
+
+    /**
+     * 平台所得是否已分账
+     */
+    @ApiModelProperty(value = "平台所得是否已分账")
+    @ExcelProperty(value = "平台所得是否已分账")
+    private CallInterfaceStatus platformIncomeSettled;
+
+
 }

+ 6 - 0
ruoyi-line/src/main/java/com/ruoyi/onlineorder/service/IOnlineOrderService.java

@@ -127,4 +127,10 @@ public interface IOnlineOrderService {
      * @param orderId 订单id
      */
     void endOrder(Long orderId);
+
+    /**
+     * 平台收入结算处理
+     * @param onlineOrder 订单信息
+     */
+    void platformIncomeSettleHandle(OnlineOrder onlineOrder);
 }

+ 25 - 6
ruoyi-line/src/main/java/com/ruoyi/onlineorder/service/impl/OnlineOrderServiceImpl.java

@@ -13,6 +13,7 @@ import com.ruoyi.business.domain.Business;
 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.exception.ServiceException;
 import com.ruoyi.common.utils.BeanCopyUtils;
 import com.ruoyi.common.utils.MathUtils;
@@ -33,6 +34,7 @@ import com.ruoyi.onlineorder.mapper.OnlineOrderMapper;
 import com.ruoyi.onlineorder.service.IOnlineOrderService;
 import com.ruoyi.shop.business.domain.bo.UserBusinessChangeIntegralBo;
 import com.ruoyi.shop.business.service.IUserBusinessRoleService;
+import com.ruoyi.shop.order.enums.OrderType;
 import com.ruoyi.subsidy.domain.SubsidyMode;
 import com.ruoyi.subsidy.service.ISubsidyModeService;
 import com.ruoyi.subsidy.service.ISubsidyQueueService;
@@ -296,6 +298,16 @@ public class OnlineOrderServiceImpl implements IOnlineOrderService {
         this.baseMapper.updateById(onlineOrder);
     }
 
+    @Override
+    public void platformIncomeSettleHandle(OnlineOrder onlineOrder) {
+
+        //TODO 调用第三方接口
+
+        Boolean settled = true;
+        onlineOrder.setPlatformIncomeSettled(settled? CallInterfaceStatus.SUCCESS:CallInterfaceStatus.FAIL);
+        this.baseMapper.updateById(onlineOrder);
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public OnlineOrder orderPayCallback(PayNotifyResult notifyResult) {
@@ -321,6 +333,16 @@ public class OnlineOrderServiceImpl implements IOnlineOrderService {
                 order.setPayTime(new Date());
                 SubsidyMode currentMode = subsidyModeService.loadCurrentMode(order.getBusinessId());
                 order.setSendPoint(MathUtils.setScale(order.getPayAmount().doubleValue() * currentMode.getPointSubsidyRatio().doubleValue() / 100));
+            }
+            if (Transaction.TradeStateEnum.PAYERROR.equals(tradeState)) {
+                order.setPayStatus(OnlinePayStatus.PAY_FAIL);
+            }
+            order.setTransactionId(transactionId);
+            order.setLastEndTime(DateUtil.offsetDay(DateUtil.endOfDay(new Date()), onLineOrderProperties.getEndOrderDay()));
+            this.baseMapper.updateById(order);
+            if(OnlinePayStatus.PAYED.equals(order.getPayStatus()))
+            {
+                userBusinessRoleService.updateByUserAndBusiness(order.getUserId(), order.getBusinessId(), order.getPayAmount(), OrderType.ONLINE);
                 if (order.getSendPoint().compareTo(BigDecimal.ZERO) > 0) {
                     userBusinessRoleService.changeUserIntegral(UserBusinessChangeIntegralBo.builder()
                         .userId(order.getUserId())
@@ -335,17 +357,14 @@ public class OnlineOrderServiceImpl implements IOnlineOrderService {
                         .build());
                 }
             }
-            if (Transaction.TradeStateEnum.PAYERROR.equals(tradeState)) {
-                order.setPayStatus(OnlinePayStatus.PAY_FAIL);
-            }
-            order.setTransactionId(transactionId);
-            order.setLastEndTime(DateUtil.offsetDay(DateUtil.endOfDay(new Date()), onLineOrderProperties.getEndOrderDay()));
-            this.baseMapper.updateById(order);
+
             if (!OnlinePayStatus.PAYED.equals(order.getPayStatus())) {
                 return null;
             }
             //开始送积分和排队
             subsidyQueueService.createQueue(order);
+
+
             return order;
         } catch (Exception ex) {
             log.error(ex.getMessage());

+ 14 - 10
ruoyi-line/src/main/java/com/ruoyi/subsidy/service/impl/SubsidyQueueServiceImpl.java

@@ -334,20 +334,24 @@ public class SubsidyQueueServiceImpl implements ISubsidyQueueService {
         RevenueSharingConfigVo config = iRevenueSharingConfigService.getInfo();
         BigDecimal onlineOrderServiceFeeRatio = config.getOnlineOrderServiceFeeRatio();
         BigDecimal onlineOrderServiceFee = MathUtils.setScale(order.getPayAmount().doubleValue() * onlineOrderServiceFeeRatio.doubleValue() / 100);
-        businessService.changeBalance(BusinessBalanceRecordBo.builder()
-            .billType(BusinessBillType.IN)
-            .businessId(order.getBusinessId())
-            .entryValue(order.getPayAmount().subtract(onlineOrderServiceFeeRatio).subtract(shouldSubsidyAmount))
-            .sourceType(BusinessSourceType.USER_ONLINE_ORDER)
-            .sourceId(order.getOrderId())
-            .sourceCode(order.getOrderNo())
-            .remark(String.format("用户在线下单,订单金额%s,平台服务费:%s,商家让利:%s", order.getPayAmount(), onlineOrderServiceFee,shouldSubsidyAmount))
-            .build());
+//        不在增加商家余
+//        businessService.changeBalance(BusinessBalanceRecordBo.builder()
+//            .billType(BusinessBillType.IN)
+//            .businessId(order.getBusinessId())
+//            .entryValue(order.getPayAmount().subtract(onlineOrderServiceFeeRatio).subtract(shouldSubsidyAmount))
+//            .sourceType(BusinessSourceType.USER_ONLINE_ORDER)
+//            .sourceId(order.getOrderId())
+//            .sourceCode(order.getOrderNo())
+//            .remark(String.format("用户在线下单,订单金额%s,平台服务费:%s,商家让利:%s", order.getPayAmount(), onlineOrderServiceFee,shouldSubsidyAmount))
+//            .build());
+
+        order.setBusinessIncome(order.getPayAmount().subtract(onlineOrderServiceFee).subtract(shouldSubsidyAmount));
+        order.setPlatformIncome(order.getPayAmount().subtract(order.getBusinessIncome()));
+        onlineOrderMapper.updateById(order);
 
 
         Long newValidQueueCount = this.validQueueCountAndLock(order.getBusinessId());
         subsidyModeAutoService.switchMode(order.getBusinessId(), newValidQueueCount);
-
     }
 
     @Override

+ 43 - 13
ruoyi-line/src/main/java/com/ruoyi/subsidy/service/impl/SubsidySharedPoolServiceImpl.java

@@ -2,6 +2,7 @@ package com.ruoyi.subsidy.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.business.domain.Business;
 import com.ruoyi.business.domain.bo.BusinessBalanceRecordBo;
 import com.ruoyi.business.enums.BusinessBillType;
 import com.ruoyi.business.enums.BusinessSourceType;
@@ -16,12 +17,16 @@ 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.onlineorder.domain.OnlineOrder;
+import com.ruoyi.shop.business.service.IUserBusinessRoleService;
 import com.ruoyi.subsidy.domain.SubsidyMode;
 import com.ruoyi.subsidy.domain.bo.SubsidyModeConversionLogBo;
 import com.ruoyi.subsidy.domain.bo.SubsidySharedPoolLogBo;
 import com.ruoyi.subsidy.enums.SharedPoolBehaviorType;
 import com.ruoyi.subsidy.enums.SharedSettlementMode;
 import com.ruoyi.subsidy.service.*;
+import com.ruoyi.user.domain.bo.UserChangeBalanceBo;
+import com.ruoyi.user.enums.BalanceSourceType;
+import com.ruoyi.user.service.IUserService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.jetbrains.annotations.NotNull;
@@ -74,6 +79,10 @@ public class SubsidySharedPoolServiceImpl implements ISubsidySharedPoolService {
     @Resource
     private IBusinessService businessService;
 
+    @Lazy
+    @Resource
+    private IUserService userService;
+
     /**
      * 查询商户均摊池分页
      *
@@ -243,19 +252,7 @@ public class SubsidySharedPoolServiceImpl implements ISubsidySharedPoolService {
         }
         //开始结算,并把结算剩余还给商家,同时需要记好均摊池改变日志
         BigDecimal remaining = subsidyQueueService.sharedSubsidyCompute(subsidySharedPool.getBusinessId(), subsidySharedPool.getTotalSharedAmount());
-        if(remaining.compareTo(BigDecimal.ZERO)>0)
-        {
-            // 有了商家的实际补贴金额,就可以计算商家当前这个订单的实际所得
-            // 实际所得 = 订单金额- 平台服务费(5%)- (商家补贴金额(让利)-补贴返还)
-            businessService.changeBalance(BusinessBalanceRecordBo.builder()
-                .billType(BusinessBillType.IN)
-                .businessId(subsidySharedPool.getBusinessId())
-                .entryValue(remaining)
-                .sourceType(BusinessSourceType.SUBSIDY_OVERFLOW_RETURN)
-                .sourceId(sharedId)
-                .remark(String.format("均摊定时补贴后溢出,返还商家 %s", remaining))
-                .build());
-        }
+
         subsidySharedPool.setReturnBusinessAmount(remaining);
         subsidySharedPool.setSettlemented(true);
         subsidySharedPool.setSettlementMode(sharedSettlementMode);
@@ -263,6 +260,39 @@ public class SubsidySharedPoolServiceImpl implements ISubsidySharedPoolService {
         subsidySharedPool.setSettlementRemark("均摊定时补贴");
         baseMapper.updateById(subsidySharedPool);
 
+
+        if(remaining.compareTo(BigDecimal.ZERO)>0)
+        {
+            Long businessId = subsidySharedPool.getBusinessId();
+            Business business = businessService.loadById(businessId, false);
+            if(ObjectUtil.isNotNull( business)) {
+                //用户余额增加
+                userService.changeUserBalance(UserChangeBalanceBo.builder()
+                    .userId(business.getRelationUserId())
+                    .entryValue(remaining)
+                    .isAdd(true)
+                    .sourceType(BalanceSourceType.SUBSIDY_OVERFLOW_RETURN)
+                    .sourceId(subsidySharedPool.getSharedId())
+                    .remark("消费排队均摊补贴溢出退回")
+                    .businessId(businessId)
+                    .businessName(business.getBusinessName())
+                    .build());
+            }
+//            // 商家余额做废
+//            // 有了商家的实际补贴金额,就可以计算商家当前这个订单的实际所得
+//            // 实际所得 = 订单金额- 平台服务费(5%)- (商家补贴金额(让利)-补贴返还)
+//            businessService.changeBalance(BusinessBalanceRecordBo.builder()
+//                .billType(BusinessBillType.IN)
+//                .businessId(subsidySharedPool.getBusinessId())
+//                .entryValue(remaining)
+//                .sourceType(BusinessSourceType.SUBSIDY_OVERFLOW_RETURN)
+//                .sourceId(sharedId)
+//                .remark(String.format("均摊定时补贴后溢出,返还商家 %s", remaining))
+//                .build());
+        }
+
+
+
         if(SharedSettlementMode.DUE_SETTLEMENT.equals(sharedSettlementMode)) {
             //如果还是同样的模式,则开启新的均摊池
             SubsidyMode currentMode = subsidyModeService.loadCurrentMode(subsidySharedPool.getBusinessId());

+ 5 - 1
ruoyi-line/src/main/resources/mapper/onlineorder/OnlineOrderMapper.xml

@@ -26,9 +26,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="subsidyAmount" column="subsidy_amount"/>
         <result property="sendPoint" column="send_point"/>
         <result property="expireTime" column="expire_time"/>
-
         <result property="createTime" column="create_time"/>
         <result property="updateTime" column="update_time"/>
+        <result property="end" column="end" />
+        <result property="lastEndTime" column="last_end_time" />
+        <result property="platformIncome" column="platform_income"/>
+        <result property="platformIncomeSettled" column="platform_income_settled" />
+        <result property="businessIncome" column="business_income"/>
     </resultMap>
 
     <select id="payAmountTotal" resultType="java.math.BigDecimal">

+ 1 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/business/service/IUserBusinessRoleService.java

@@ -143,4 +143,5 @@ public interface IUserBusinessRoleService {
      * @return
      */
     UserBusinessRole loadByBusinessAndUser(Long currentBusinessId, Long userId);
+
 }

+ 4 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/business/service/impl/UserBusinessRoleServiceImpl.java

@@ -213,6 +213,8 @@ public class UserBusinessRoleServiceImpl implements IUserBusinessRoleService {
         return baseMapper.deleteBatchIds(ids) > 0;
     }
 
+
+
     @Override
     public void updateByUserAndBusiness(Long userId, Long businessId, BigDecimal amount, OrderType orderType) {
         UserBusinessRole userBusinessRole = queryByUserAndBusiness(userId, businessId);
@@ -425,6 +427,8 @@ public class UserBusinessRoleServiceImpl implements IUserBusinessRoleService {
         );
     }
 
+
+
     private List<UserBusinessVerifierIntegralVo> convertVerifyList(List<UserBusinessVerifierIntegralVo> voList) {
         return voList.stream().map(vo -> {
             User user = userService.loadByIdForLock(vo.getUserId(), false);

+ 1 - 0
ruoyi-user/src/main/java/com/ruoyi/user/enums/BalanceSourceType.java

@@ -19,6 +19,7 @@ public enum BalanceSourceType implements IIntegerEnum {
     SUBSIDY(4, "消费排队补贴"),
     SHARED_SUBSIDY(5, "消费排队均摊补贴"),
     ONLINE_ORDER_REFUND_DEDUCT(6, "在线订单退款扣除补贴"),
+    SUBSIDY_OVERFLOW_RETURN(7, "消费排队均摊补贴溢出退回")
     ;
 
     @EnumValue