From 80a694af293a21182c14fd357a6eba27d93645a6 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Tue, 28 Sep 2021 22:57:32 +0800
Subject: [PATCH] fix return money

---
 src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java |    6 +
 src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java       |    2 
 src/test/java/cc/mrbird/febs/AgentTest.java                           |   13 +++
 src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java           |    8 ++
 src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java        |    2 
 src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java               |   86 ++++++++++++++++++++++++++++
 src/main/resources/mapper/modules/MallMemberMapper.xml                |    6 +
 src/main/resources/mapper/modules/MallMoneyFlowMapper.xml             |   13 ++++
 sql/xc_mall.sql                                                       |    2 
 src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java     |    7 ++
 10 files changed, 139 insertions(+), 6 deletions(-)

diff --git a/sql/xc_mall.sql b/sql/xc_mall.sql
index 6dc6ffd..19039be 100644
--- a/sql/xc_mall.sql
+++ b/sql/xc_mall.sql
@@ -371,3 +371,5 @@
    PRIMARY KEY (ID)
 )  COMMENT = '新闻中心';
 
+alter table mall_money_flow add is_return int null comment '是否返利';
+
diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
index 4c9b233..b4a28d6 100644
--- a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
@@ -36,7 +36,11 @@
     /**
      * 排名奖励
      */
-    RANK(7);
+    RANK(7),
+    /**
+     * 利润分红
+     */
+    PARENT_BONUS(8);
 
     private final int value;
 
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java b/src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java
index f0c5a05..334f1ef 100644
--- a/src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java
+++ b/src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java
@@ -19,7 +19,7 @@
     private BigDecimal amount;
 
     /**
-     * 流水类型 1-直推奖励 2-团队奖励 3-订单支付 4-退款 5-转账 6-提现 7-排名奖励
+     * 流水类型 1-直推奖励 2-团队奖励 3-订单支付 4-退款 5-转账 6-提现 7-排名奖励 8-利润分红
      */
     private Integer type;
 
@@ -35,4 +35,10 @@
      * 提现状态 1-提现中2-成功 3-拒绝
      */
     private Integer status;
+
+    /**
+     * 是否返利 1-是 2-否
+     */
+    private Integer isReturn;
+    public static final Integer IS_RETURN_Y = 1;
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
index d884b6a..90d483c 100644
--- a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
@@ -61,4 +61,6 @@
     BigDecimal getAgentTeamAmountByInviteId(@Param("inviteId")String inviteId);
 
     IPage<AppVersion> getAppVersionListInPage(Page<AppVersion> page, AppVersion appVersion);
+
+    List<MallMember> selectByIdAndNoLevel(@Param("refererId") String refererId, @Param("level") String level);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java
index 5cb4c6c..7af83d1 100644
--- a/src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java
@@ -14,6 +14,9 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
+import java.util.List;
+
 public interface MallMoneyFlowMapper extends BaseMapper<MallMoneyFlow> {
 
     IPage<AdminMallMoneyFlowVo> selectMoneyFlowInPage(Page<AdminMallMoneyFlowVo> page, @Param("record")MallMember mallMember);
@@ -23,4 +26,8 @@
     IPage<AdminMoneyFlowListVo> getMoneyFlowListInPage(Page<AdminMoneyFlowListVo> page,  @Param("record")MoneyFlowListDto moneyFlowListDto);
 
     IPage<AdminMoneyChargeListVo> getMoneyChargeListInPage(Page<AdminMoneyChargeListVo> page, @Param("record")MoneyChargeListDto moneyChargeListDto);
+
+    List<MallMoneyFlow> selectMoneyFlowProfitByDate(@Param("date") Date date);
+
+    int updateIsReturnByMemberId(@Param("isReturn") Integer isReturn, @Param("memberId") Long memberId);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
new file mode 100644
index 0000000..4d7a98b
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
@@ -0,0 +1,86 @@
+package cc.mrbird.febs.mall.quartz;
+
+import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
+import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
+import cc.mrbird.febs.common.utils.MallUtils;
+import cc.mrbird.febs.mall.entity.MallMember;
+import cc.mrbird.febs.mall.entity.MallMoneyFlow;
+import cc.mrbird.febs.mall.mapper.MallMemberMapper;
+import cc.mrbird.febs.mall.mapper.MallMoneyFlowMapper;
+import cc.mrbird.febs.mall.service.IApiMallMemberService;
+import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
+import cc.mrbird.febs.mall.service.impl.CommonService;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2021-09-28
+ **/
+@Slf4j
+@Component
+public class ProfitJob {
+
+    @Autowired
+    private MallMoneyFlowMapper moneyFlowMapper;
+
+    @Autowired
+    private MallMemberMapper memberMapper;
+
+    @Autowired
+    private IApiMallMemberWalletService memberWalletService;
+
+    @Autowired
+    private IApiMallMemberService memberService;
+
+    @Scheduled(cron = "0 0 1 * * ?")
+    @Transactional(rollbackFor = Exception.class)
+    public void profitJob() {
+        DateTime yesterday = DateUtil.yesterday();
+        List<MallMoneyFlow> flows = moneyFlowMapper.selectMoneyFlowProfitByDate(yesterday);
+
+        if (CollUtil.isEmpty(flows)) {
+            return;
+        }
+
+        for (MallMoneyFlow flow : flows) {
+            MallMember member = memberMapper.selectById(flow.getMemberId());
+
+            List<MallMember> child = memberMapper.selectByIdAndNoLevel(member.getInviteId(), AgentLevelEnum.ZERO_LEVEL.name());
+            if (CollUtil.isEmpty(child)) {
+                continue;
+            }
+            int size = child.size();
+            BigDecimal needReturn = flow.getAmount().multiply(BigDecimal.valueOf(0.1));
+
+            String orderNo = MallUtils.getOrderNum("R");
+            String remarkFormat = "{}, 用户:{}, 利润分红: {}";
+
+            BigDecimal returnMoney = needReturn.divide(BigDecimal.valueOf(size), 2, RoundingMode.DOWN);
+            for (MallMember mallMember : child) {
+                memberWalletService.addBalance(returnMoney, mallMember.getId());
+
+                String remark = StrUtil.format(remarkFormat, DateUtil.format(yesterday, "yyyy-MM-dd"), member.getName(), returnMoney);
+                memberService.addMoneyFlow(mallMember.getId(), returnMoney, MoneyFlowTypeEnum.PARENT_BONUS.getValue(), orderNo, null, remark, member.getId(), null);
+            }
+
+            String remark = StrUtil.format(remarkFormat, DateUtil.format(yesterday, "yyyy-MM-dd"), member.getName(), needReturn);
+            memberService.addMoneyFlow(member.getId(), needReturn.negate(), MoneyFlowTypeEnum.PARENT_BONUS.getValue(), orderNo, null, remark, null, null);
+            memberWalletService.reduceBalance(needReturn, member.getId());
+
+            moneyFlowMapper.updateIsReturnByMemberId(MallMoneyFlow.IS_RETURN_Y, flow.getMemberId());
+        }
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java b/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
index a5035d3..fd287fe 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
@@ -50,7 +50,7 @@
         }
     }
 
-//    @RabbitListener(queues = QueueConstants.AGENT_RETURN_MONEY)
+    @RabbitListener(queues = QueueConstants.AGENT_RETURN_MONEY)
     public void agentReturnMoney(String orderId) {
         log.info("收到返利消息:{}", orderId);
         try{
diff --git a/src/main/resources/mapper/modules/MallMemberMapper.xml b/src/main/resources/mapper/modules/MallMemberMapper.xml
index f4e1145..c53f2b6 100644
--- a/src/main/resources/mapper/modules/MallMemberMapper.xml
+++ b/src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -159,7 +159,7 @@
 
     <select id="selectMemberParentAgentList" resultType="cc.mrbird.febs.mall.entity.MallMember">
         select * from mall_member
-        where level not in  ('ZERO_LEVEL', 'FIRST_LEVEL') and invteId!=#{refererId} and invite_id IN
+        where level not in  ('ZERO_LEVEL', 'FIRST_LEVEL') and invite_id!=#{refererId} and invite_id IN
         <foreach collection = "list" item = "item"  separator=","  open = "(" close = ")" >
             #{item}
         </foreach >
@@ -208,4 +208,8 @@
     <select id="getAppVersionListInPage" resultType="cc.mrbird.febs.mall.entity.AppVersion">
         select a.* from app_version a
     </select>
+
+    <select id="selectByIdAndNoLevel" resultType="cc.mrbird.febs.mall.entity.MallMember">
+        select * from mall_member where referrer_id=#{refererId} and level != #{level}
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml b/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml
index e84f635..6b9836e 100644
--- a/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml
+++ b/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml
@@ -81,4 +81,17 @@
         </where>
         order by a.created_time desc
     </select>
+
+    <select id="selectMoneyFlowProfitByDate" resultType="cc.mrbird.febs.mall.entity.MallMoneyFlow">
+        select a.member_id, sum(a.amount) amount from mall_money_flow a
+        where a.type in (1, 2) and date_format(now(), '%Y-%m-%d') = date_format(#{date}, '%Y-%m-%d')
+        and is_return is null
+        group by a.member_id;
+    </select>
+
+    <update id="updateIsReturnByMemberId">
+        update mall_money_flow
+        set is_return=#{isReturn}
+        where member_id=#{memberId} and type in (1, 2)
+    </update>
 </mapper>
\ No newline at end of file
diff --git a/src/test/java/cc/mrbird/febs/AgentTest.java b/src/test/java/cc/mrbird/febs/AgentTest.java
index b9ad05c..3431bfb 100644
--- a/src/test/java/cc/mrbird/febs/AgentTest.java
+++ b/src/test/java/cc/mrbird/febs/AgentTest.java
@@ -5,6 +5,7 @@
 import cc.mrbird.febs.mall.entity.AgentInfo;
 import cc.mrbird.febs.mall.entity.DataDictionaryCustom;
 import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper;
+import cc.mrbird.febs.mall.quartz.ProfitJob;
 import cc.mrbird.febs.mall.service.IAgentService;
 import cc.mrbird.febs.rabbit.producter.AgentProducer;
 import com.alibaba.fastjson.JSONObject;
@@ -99,9 +100,9 @@
     @Test
     public void autoLevelUp() {
         // agentService.autoUpAgentLevel(3L);
-        agentProducer.sendAutoLevelUpMsg(5L);
+//        agentProducer.sendAutoLevelUpMsg(5L);
 
-//        agentProducer.sendReturnMoneyMsg(24L);
+        agentProducer.sendReturnMoneyMsg(2L);
     }
 
     @Test
@@ -111,4 +112,12 @@
         System.out.println(aa.setScale(2, RoundingMode.DOWN));
         System.out.println(aa.setScale(2, RoundingMode.UP));
     }
+
+    @Autowired
+    private ProfitJob profitJob;
+
+    @Test
+    public void profitJobTest() {
+        profitJob.profitJob();
+    }
 }

--
Gitblit v1.9.1