From a65df41c3243877352fe6822b65c1836ddc3c19d Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Wed, 12 May 2021 14:51:14 +0800
Subject: [PATCH] Merge branch 'yunding' of http://120.27.238.55:7000/r/exchange into yunding

---
 src/main/resources/mapper/yunding/YdOrderDao.xml                                      |   28 +++++++++
 src/main/java/com/xcong/excoin/modules/yunding/service/XchProfitService.java          |    6 +
 src/test/java/com/xcong/excoin/XchTest.java                                           |   11 +++
 src/main/java/com/xcong/excoin/modules/yunding/dao/YdOrderDao.java                    |    1 
 src/main/java/com/xcong/excoin/modules/yunding/service/Impl/XchProfitServiceImpl.java |  121 +++++++++++++++++++++++++++++++++------
 5 files changed, 145 insertions(+), 22 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/yunding/dao/YdOrderDao.java b/src/main/java/com/xcong/excoin/modules/yunding/dao/YdOrderDao.java
index 078283c..d3604e0 100644
--- a/src/main/java/com/xcong/excoin/modules/yunding/dao/YdOrderDao.java
+++ b/src/main/java/com/xcong/excoin/modules/yunding/dao/YdOrderDao.java
@@ -16,6 +16,7 @@
 
     List<YdOrderEntity> selectNeedReturnOrders();
 
+    List<YdOrderEntity> selectAllValidOrders();
     void UpdateByIdAndState(@Param("id")Long id, @Param("state")int state);
 
     YdOrderVo selectOrderByMemberIdAndId(@Param("memberId")Long memberId, @Param("id")Long id);
diff --git a/src/main/java/com/xcong/excoin/modules/yunding/service/Impl/XchProfitServiceImpl.java b/src/main/java/com/xcong/excoin/modules/yunding/service/Impl/XchProfitServiceImpl.java
index 3302885..daa9063 100644
--- a/src/main/java/com/xcong/excoin/modules/yunding/service/Impl/XchProfitServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/yunding/service/Impl/XchProfitServiceImpl.java
@@ -1,6 +1,8 @@
 package com.xcong.excoin.modules.yunding.service.Impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import com.xcong.excoin.modules.coin.dao.MemberAccountMoneyChangeDao;
 import com.xcong.excoin.modules.member.dao.MemberDao;
@@ -8,14 +10,17 @@
 import com.xcong.excoin.modules.member.entity.MemberEntity;
 import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity;
 import com.xcong.excoin.modules.yunding.dao.YdOrderDao;
+import com.xcong.excoin.modules.yunding.dao.YdProductDao;
 import com.xcong.excoin.modules.yunding.entity.YdBasicLevelSettingEntity;
 import com.xcong.excoin.modules.yunding.entity.YdOrderEntity;
+import com.xcong.excoin.modules.yunding.entity.YdProductEntity;
 import com.xcong.excoin.modules.yunding.service.XchProfitService;
 import com.xcong.excoin.utils.LogRecordUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -32,13 +37,16 @@
     @Autowired
     private MemberWalletCoinDao memberWalletCoinDao;
 
+    @Autowired
+    private YdProductDao ydProductDao;
+
     @Override
     public void autoBeAgent(Long id) {
 
     }
 
     @Override
-    public void agentProfitDistributor() {
+    public void agentUsdtProfitDistributor() {
         List<YdOrderEntity> orders = ydOrderDao.selectNeedReturnOrders();
 
         if (CollUtil.isNotEmpty(orders)) {
@@ -48,25 +56,7 @@
                 List<MemberEntity> agents = memberDao.selectYdParentAgent(inviteIds);
 
                 if (CollUtil.isNotEmpty(agents)) {
-                    Map<Long, BigDecimal> returnRatio = new HashMap<Long, BigDecimal>();
-                    Long lastId = null;
-                    for (MemberEntity agent : agents) {
-                        YdBasicLevelSettingEntity settingEntity = agent.getYdBasicLevelSettingEntity();
-                        if(settingEntity.getLevel() == 1) {
-                            if (CollUtil.isNotEmpty(returnRatio)) {
-                                BigDecimal lastRatio = returnRatio.get(lastId);
-                                returnRatio.put(agent.getId(), settingEntity.getUsdtRatio().subtract(lastRatio));
-                            } else {
-                                returnRatio.put(agent.getId(), settingEntity.getUsdtRatio());
-                            }
-                            break;
-                        }
-
-                        if (CollUtil.isEmpty(returnRatio)) {
-                            lastId = agent.getId();
-                            returnRatio.put(agent.getId(), settingEntity.getUsdtRatio());
-                        }
-                    }
+                    Map<Long, BigDecimal> returnRatio = buildReturnRatioObj(agents, 1);
 
                     for (Map.Entry<Long, BigDecimal> entry : returnRatio.entrySet()) {
                         String conent = "USDT返利";
@@ -83,7 +73,98 @@
                     ydOrderDao.updateById(updateOrder);
                 }
             }
+        }
+    }
 
+    private Map<Long, BigDecimal> buildReturnRatioObj(List<MemberEntity> agents, int type) {
+        Map<Long, BigDecimal> returnRatio = new HashMap<Long, BigDecimal>();
+        Long lastId = null;
+        for (MemberEntity agent : agents) {
+            YdBasicLevelSettingEntity settingEntity = agent.getYdBasicLevelSettingEntity();
+
+            BigDecimal ratio;
+            if (type == 1) {
+                ratio = settingEntity.getUsdtRatio();
+            } else {
+                ratio = settingEntity.getXchRatio();
+            }
+            if(settingEntity.getLevel() == 1) {
+                if (CollUtil.isNotEmpty(returnRatio)) {
+                    BigDecimal lastRatio = returnRatio.get(lastId);
+                    returnRatio.put(agent.getId(), ratio.subtract(lastRatio));
+                } else {
+                    returnRatio.put(agent.getId(), ratio);
+                }
+                break;
+            }
+
+            if (CollUtil.isEmpty(returnRatio)) {
+                lastId = agent.getId();
+                returnRatio.put(agent.getId(), ratio);
+            }
+        }
+
+        return returnRatio;
+    }
+
+    @Override
+    public void xchProfitDistributor(BigDecimal totalProfit) {
+        Date currentDate = new Date();
+        List<YdProductEntity> products = ydProductDao.selectList(null);
+        if (CollUtil.isNotEmpty(products)) {
+            BigDecimal totalCount = BigDecimal.ZERO;
+            for (YdProductEntity product : products) {
+                BigDecimal count = product.getTotalT();
+                if ("P".equals(product.getProUnit())) {
+                    count = count.multiply(BigDecimal.valueOf(1024));
+                }
+
+                totalCount = totalCount.add(count);
+            }
+
+            // 单位XCH收益
+            BigDecimal unitProfit = totalProfit.divide(totalCount, 8, BigDecimal.ROUND_DOWN);
+
+            List<YdOrderEntity> orders = ydOrderDao.selectAllValidOrders();
+            if (CollUtil.isNotEmpty(orders)) {
+                for (YdOrderEntity order : orders) {
+                    long between = DateUtil.between(order.getWorkTime(), currentDate, DateUnit.DAY);
+                    if (between < 1) {
+                        continue;
+                    }
+
+                    MemberEntity memberEntity = memberDao.selectById(order.getMemberId());
+                    List<String> inviteIds = StrUtil.split(memberEntity.getRefererIds(), ',');
+                    List<MemberEntity> agents = memberDao.selectYdParentAgent(inviteIds);
+
+                    BigDecimal count = BigDecimal.valueOf(order.getQuantity());
+                    if ("P".equals(order.getYdProductEntity().getProUnit())) {
+                        count = count.multiply(BigDecimal.valueOf(1024));
+                    }
+                    BigDecimal orderProfit = count.multiply(unitProfit);
+                    BigDecimal remainProfit = orderProfit;
+                    if (CollUtil.isNotEmpty(agents)) {
+                        Map<Long, BigDecimal> returnRatio = buildReturnRatioObj(agents, 2);
+
+                        for (Map.Entry<Long, BigDecimal> entry : returnRatio.entrySet()) {
+                            String content = "XCH收益返利";
+                            BigDecimal amount = entry.getValue().multiply(orderProfit);
+
+                            LogRecordUtils.insertMemberAccountMoneyChangeWithId(entry.getKey(), content, amount, "XCH", 1, 5, order.getId());
+                            MemberWalletCoinEntity walletCoin = memberWalletCoinDao.selectWalletCoinBymIdAndCode(entry.getKey(), "XCH");
+
+                            memberWalletCoinDao.updateBlockBalance(walletCoin.getId(), amount, BigDecimal.ZERO, 0);
+                            remainProfit = remainProfit.subtract(amount);
+                        }
+                    }
+
+                    String content = "XCH收益";
+                    LogRecordUtils.insertMemberAccountMoneyChangeWithId(order.getMemberId(), content, remainProfit, "XCH", 1, 4, order.getId());
+                    MemberWalletCoinEntity walletCoin = memberWalletCoinDao.selectWalletCoinBymIdAndCode(order.getMemberId(), "XCH");
+
+                    memberWalletCoinDao.updateBlockBalance(walletCoin.getId(), remainProfit, BigDecimal.ZERO, 0);
+                }
+            }
         }
     }
 }
diff --git a/src/main/java/com/xcong/excoin/modules/yunding/service/XchProfitService.java b/src/main/java/com/xcong/excoin/modules/yunding/service/XchProfitService.java
index 707c990..fa9a50e 100644
--- a/src/main/java/com/xcong/excoin/modules/yunding/service/XchProfitService.java
+++ b/src/main/java/com/xcong/excoin/modules/yunding/service/XchProfitService.java
@@ -1,9 +1,13 @@
 package com.xcong.excoin.modules.yunding.service;
 
+import java.math.BigDecimal;
+
 public interface XchProfitService {
 
     void autoBeAgent(Long id);
 
-    void agentProfitDistributor();
+    void agentUsdtProfitDistributor();
+
+    void xchProfitDistributor(BigDecimal totalPrifit);
 
 }
diff --git a/src/main/resources/mapper/yunding/YdOrderDao.xml b/src/main/resources/mapper/yunding/YdOrderDao.xml
index 67dbd52..8d37948 100644
--- a/src/main/resources/mapper/yunding/YdOrderDao.xml
+++ b/src/main/resources/mapper/yunding/YdOrderDao.xml
@@ -27,6 +27,34 @@
         where a.state=2 and a.return_state=1
     </select>
 
+    <resultMap id="orderMap" type="com.xcong.excoin.modules.yunding.entity.YdOrderEntity">
+        <id column="id" property="id" />
+        <result column="member_id" property="memberId" />
+        <result column="product_id" property="productId" />
+        <result column="quantity" property="quantity" />
+        <result column="amount" property="amount" />
+        <result column="member_id" property="memberId" />
+        <result column="total_profit" property="totalProfit" />
+        <result column="today_profit" property="totalProfit" />
+        <result column="state" property="state" />
+        <result column="buy_time" property="buyTime" />
+        <result column="work_time" property="workTime" />
+        <result column="end_time" property="endTime" />
+        <result column="create_by" property="createBy" />
+        <result column="return_state" property="returnState" />
+        <result column="return_type" property="returnType" />
+        <association property="ydProductEntity" javaType="com.xcong.excoin.modules.yunding.entity.YdProductEntity">
+            <id column="p_id" property="id" />
+            <result column="pro_unit" property="proUnit" />
+        </association>
+    </resultMap>
+
+    <select id="selectAllValidOrders" resultMap="orderMap">
+        select a.*, b.id p_id, b.pro_unit from yd_order a
+        inner join yd_product b on a.product_id=b.id
+        where a.state=2
+    </select>
+
     <update id="UpdateByIdAndState">
         UPDATE yd_order s
         SET s.state = #{state}
diff --git a/src/test/java/com/xcong/excoin/XchTest.java b/src/test/java/com/xcong/excoin/XchTest.java
index bdde057..c813e87 100644
--- a/src/test/java/com/xcong/excoin/XchTest.java
+++ b/src/test/java/com/xcong/excoin/XchTest.java
@@ -1,6 +1,8 @@
 package com.xcong.excoin;
 
 
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
 import com.xcong.excoin.modules.yunding.service.XchProfitService;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -14,6 +16,13 @@
 
     @Test
     public void usdtReturnTest() {
-        xchProfitService.agentProfitDistributor();
+        xchProfitService.agentUsdtProfitDistributor();
+    }
+
+    @Test
+    public void dateUtilTest() {
+        String day1 = "2021-05-11 23:00:00";
+        String day2 = "2021-05-12 23:01:00";
+        System.out.println(DateUtil.between(DateUtil.parse(day1), DateUtil.parse(day2), DateUnit.DAY));
     }
 }

--
Gitblit v1.9.1