From 54852835a9b1f9fe3574264fa9e2611f1d20e621 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Thu, 19 May 2022 15:19:20 +0800
Subject: [PATCH] add bonus-system-setting

---
 src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java |   43 ++++++++++++++++++++++++++++++++++++-------
 1 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
index c7677fa..a47d48c 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -12,8 +12,10 @@
 import cc.mrbird.febs.mall.service.IMemberProfitService;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -86,12 +88,18 @@
     /**
      * 直推20%,隔代收益为直推奖励金额的30%,a_b_c_d,d购买1000套餐,c得200,b得200*30%=60元,a得60*30%=18元。。。
      * 以此类推,结算到一元为止。
+     *
      * @param orderId
      */
     @Override
     public void dynamicProfit(Long orderId) {
         log.info("######直推奖励, 订单ID:{}######", orderId);
         MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(orderId);
+        if (orderInfo.getOrderType() == 2) {
+            log.info("积分订单无返利");
+            return;
+        }
+
         MallMember member = mallMemberMapper.selectById(orderInfo.getMemberId());
 
         if (StrUtil.isBlank(member.getReferrerId())) {
@@ -103,7 +111,10 @@
         String parent = member.getReferrerId();
         List<MallOrderItem> items = mallOrderInfoMapper.getMallOrderItemByOrderId(orderId);
         for (MallOrderItem item : items) {
-            BigDecimal dynamicProfit = item.getAmount().multiply(BigDecimal.valueOf(item.getCnt())).divide(new BigDecimal(dic.getValue()), 2, RoundingMode.HALF_UP);
+            // 减去成本后算收益
+            BigDecimal amount = item.getPrice().subtract(item.getCostPrice()).multiply(BigDecimal.valueOf(item.getCnt()));
+
+            BigDecimal dynamicProfit = amount.divide(new BigDecimal(dic.getValue()), 2, RoundingMode.HALF_UP);
 
             List<String> parents = StrUtil.split(member.getReferrerIds(), ',');
             List<MallMember> members = mallMemberMapper.selectByInviteIds(parents);
@@ -152,14 +163,16 @@
     }
 
     @Override
-    public void agentProfit() {
+    public void agentProfit(Date profitDate) {
         log.info("#####==代理分红==#####");
-        Date profitDate = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1);
-        BigDecimal totalIncome = mallOrderInfoMapper.selectTotalAmountForDate(profitDate, null);
+        if (profitDate == null) {
+            profitDate = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1);
+        }
+        BigDecimal totalIncome = mallOrderInfoMapper.selectTotalAmountUnCostForDate(profitDate, null, "D");
 
 
         DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.AGENT_BONUS.getType(), DataDictionaryEnum.AGENT_BONUS.getCode());
-        BigDecimal profit = totalIncome.divide(new BigDecimal(dic.getValue()),2, RoundingMode.HALF_UP);
+        BigDecimal profit = totalIncome.divide(new BigDecimal(dic.getValue()), 2, RoundingMode.HALF_UP);
         BigDecimal preProfit = profit.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
 
         List<MallMember> agentMembers = mallMemberMapper.selectByIdAndNoLevel(null, AgentLevelEnum.FIRST_LEVEL.name());
@@ -170,14 +183,30 @@
         for (MallMember agentMember : agentMembers) {
             DataDictionaryCustom agentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.AGENT_LEVEL_REQUIRE, agentMember.getLevel());
 
-            // TODO
+            if (agentDic == null) {
+                continue;
+            }
+
+            JSONObject jsonObject = JSONObject.parseObject(agentDic.getValue());
+            BigDecimal profitProp = jsonObject.getBigDecimal("profitProp");
+            BigDecimal income = preProfit.multiply(profitProp);
+
+            try {
+                walletService.reduce(income, agentMember.getId(), "score");
+            } catch (Exception e) {
+                log.info("直推奖励异常:{}, {}", income, agentMember.getId());
+                continue;
+            }
+            walletService.add(income, agentMember.getId(), "commission");
+
+            moneyFlowService.addMoneyFlow(agentMember.getId(), income, MoneyFlowTypeEnum.AGENT_BONUS.getValue(), null, FlowTypeEnum.COMMISSION.getValue());
+            moneyFlowService.addMoneyFlow(agentMember.getId(), income.negate(), MoneyFlowTypeEnum.AGENT_BONUS.getValue(), null, FlowTypeEnum.SCORE.getValue());
         }
     }
 
     @Override
     public void rankProfit() {
         log.info("######==排名分红==####");
-
     }
 
     public static void main(String[] args) {

--
Gitblit v1.9.1