From 13eb3cd1d1533144c49901506c040a11ad3eb0c1 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Thu, 13 May 2021 18:12:36 +0800
Subject: [PATCH] modify

---
 src/test/java/com/xcong/excoin/XchTest.java                                           |   10 ++
 src/main/java/com/xcong/excoin/rabbit/consumer/YunDingConsumer.java                   |   11 ++
 src/main/resources/mapper/yunding/YdBasicLevelSettingDao.xml                          |    4 +
 src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java                     |   13 +++
 src/main/java/com/xcong/excoin/rabbit/producer/YunDingProducter.java                  |    7 +
 src/main/resources/application-test.yml                                               |    3 
 src/main/java/com/xcong/excoin/modules/yunding/dao/YdOrderDao.java                    |    3 
 src/main/java/com/xcong/excoin/modules/yunding/dao/YdBasicLevelSettingDao.java        |    5 +
 src/main/resources/mapper/yunding/YdOrderDao.xml                                      |    6 +
 src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java     |    1 
 src/main/resources/mapper/member/MemberDao.xml                                        |   18 ++++
 src/main/java/com/xcong/excoin/modules/yunding/service/Impl/XchProfitServiceImpl.java |   93 ++++++++++++++++++++++-
 src/main/resources/application.yml                                                    |    3 
 src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java                      |    7 +
 src/main/java/com/xcong/excoin/modules/yunding/service/Impl/YunDingServiceImpl.java   |   41 +++++++---
 15 files changed, 204 insertions(+), 21 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java b/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java
index d61e5e8..ed5c83b 100644
--- a/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java
+++ b/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java
@@ -46,6 +46,9 @@
     public static final String ROUTING_KEE_XCH_USDT_PRIFIT = "ROUTING_KEE_XCH_USDT_PRIFIT";
     public static final String EXCHANGE_XCH = "EXCHANGE_XCH";
 
+    public static final String QUEUE_XCH_AUTO_AGENT = "QUEUE_XCH_AUTO_AGENT";
+    public static final String ROUTING_KEY_XCH_AUTO_AGENT = "ROUTING_KEY_XCH_AUTO_AGENT";
+
 
     /**
      * 撮合交易
@@ -161,6 +164,16 @@
     }
 
     @Bean
+    public Queue xchAutoAgentQueue() {
+        return new Queue(QUEUE_XCH_AUTO_AGENT, true);
+    }
+
+    @Bean
+    public Binding xchAutoAgentBinding() {
+        return BindingBuilder.bind(xchAutoAgentQueue()).to(xchExchange()).with(ROUTING_KEY_XCH_AUTO_AGENT);
+    }
+
+    @Bean
     public Queue testQueue() {
         return new Queue(QUEUE_TEST, true);
     }
diff --git a/src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java b/src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java
index 6e2716a..e73f0d2 100644
--- a/src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java
+++ b/src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java
@@ -6,6 +6,7 @@
 import com.xcong.excoin.modules.member.parameter.vo.NeedMoneyMemberVo;
 import org.apache.ibatis.annotations.Param;
 
+import java.lang.reflect.Member;
 import java.util.List;
 
 /**
@@ -24,4 +25,10 @@
     public List<MemberEntity> selectAllMember();
 
     List<MemberEntity> selectYdParentAgent(@Param("list") List<String> list);
+
+    List<MemberEntity> selectMemberByInviteIds(@Param("list") List<String> list);
+
+    List<MemberEntity> selectMemberByRefererId(@Param("refererId") String refererId);
+
+    List<MemberEntity> selectTeamAgentList(@Param("inviteId") String inviteId);
 }
diff --git a/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java b/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
index 8487e17..34ce013 100644
--- a/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
@@ -166,7 +166,6 @@
         member.setRefererId(registerDto.getRefererId());
         member.setAccountStatus(MemberEntity.ACCOUNT_STATUS_ENABLE);
         member.setAccountType(MemberEntity.ACCOUNT_TYPE_NORMAL);
-        member.setAgentLevel(MemberEntity.ACCOUNT_AGENT_LEVEL);
         member.setCertifyStatus(MemberEntity.CERTIFY_STATUS_UN_SUBMIT);
         member.setIsForce(1);
         member.setIsProfit(0);
diff --git a/src/main/java/com/xcong/excoin/modules/yunding/dao/YdBasicLevelSettingDao.java b/src/main/java/com/xcong/excoin/modules/yunding/dao/YdBasicLevelSettingDao.java
index 08c072c..b3590a5 100644
--- a/src/main/java/com/xcong/excoin/modules/yunding/dao/YdBasicLevelSettingDao.java
+++ b/src/main/java/com/xcong/excoin/modules/yunding/dao/YdBasicLevelSettingDao.java
@@ -2,6 +2,11 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.xcong.excoin.modules.yunding.entity.YdBasicLevelSettingEntity;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface YdBasicLevelSettingDao extends BaseMapper<YdBasicLevelSettingEntity> {
+
+    List<YdBasicLevelSettingEntity> selectAgentLevelSetting();
 }
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 a571df0..3d7d628 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
@@ -10,6 +10,7 @@
 import com.xcong.excoin.modules.yunding.vo.YdOrderVo;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 public interface YdOrderDao extends BaseMapper<YdOrderEntity> {
@@ -27,4 +28,6 @@
     YdOrderVo selectOrderByMemberIdAndId(@Param("memberId")Long memberId, @Param("id")Long id);
 
     IPage<AgentVo> getAgentList(Page<AgentVo> page, @Param("record")  YdBasicLevelSettingEntity ydBasicLevelSettingEntity);
+
+    List<YdOrderEntity> selectTeamAllPower(@Param("inviteId") String inviteId);
 }
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 a195a60..ef83a33 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
@@ -9,6 +9,7 @@
 import com.xcong.excoin.modules.member.dao.MemberWalletCoinDao;
 import com.xcong.excoin.modules.member.entity.MemberEntity;
 import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity;
+import com.xcong.excoin.modules.yunding.dao.YdBasicLevelSettingDao;
 import com.xcong.excoin.modules.yunding.dao.YdOrderDao;
 import com.xcong.excoin.modules.yunding.dao.YdProductDao;
 import com.xcong.excoin.modules.yunding.entity.YdBasicLevelSettingEntity;
@@ -18,12 +19,10 @@
 import com.xcong.excoin.utils.LogRecordUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Service
 public class XchProfitServiceImpl implements XchProfitService {
@@ -40,12 +39,97 @@
     @Autowired
     private YdProductDao ydProductDao;
 
+    @Autowired
+    private YdBasicLevelSettingDao ydBasicLevelSettingDao;
+
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void autoBeAgent(Long id) {
+        MemberEntity member = memberDao.selectById(id);
+
+        List<MemberEntity> members = new ArrayList<>();
+        List<String> inviteIds = StrUtil.split(member.getRefererIds(), ',');
+        if (CollUtil.isNotEmpty(inviteIds)) {
+            members = memberDao.selectMemberByInviteIds(inviteIds);
+        }
+        members.add(member);
+        List<YdBasicLevelSettingEntity> settings = ydBasicLevelSettingDao.selectAgentLevelSetting();
+
+        if (CollUtil.isNotEmpty(members)) {
+            for (MemberEntity memberEntity : members) {
+                MemberEntity update = new MemberEntity();
+                update.setId(memberEntity.getId());
+
+                if (memberEntity.getAgentLevel() == null) {
+                    // 判断是否达到市代标准
+                    if(becomeSd(memberEntity, settings.get(1))) {
+                        update.setAgentLevel(2);
+                        memberDao.updateById(update);
+                    }
+                } else if (memberEntity.getAgentLevel() != null && member.getAgentLevel() == 2){
+                    // 判断是否达到总代标准
+                    if(becomeZd(memberEntity, settings.get(0))) {
+                        update.setAgentLevel(1);
+                        memberDao.updateById(update);
+                    }
+                }
+            }
+        }
 
     }
 
+    /**
+     * 市代 团队(包含自己)算力达到指定数量
+     * @param member
+     * @param basicLevelSetting
+     * @return
+     */
+    private Boolean becomeSd(MemberEntity member, YdBasicLevelSettingEntity basicLevelSetting) {
+        List<YdOrderEntity> orders = ydOrderDao.selectTeamAllPower(member.getInviteId());
+        BigDecimal totalPower = BigDecimal.ZERO;
+        if (CollUtil.isNotEmpty(orders)) {
+            for (YdOrderEntity order : orders) {
+                if ("P".equals(order.getYdProductEntity().getProUnit())) {
+                    totalPower = totalPower.add(BigDecimal.valueOf(order.getQuantity() * 1024));
+                } else {
+                    totalPower = totalPower.add(BigDecimal.valueOf(order.getQuantity()));
+                }
+            }
+        }
+
+        BigDecimal needPower = basicLevelSetting.getCalculationPower().multiply(BigDecimal.valueOf(1024));
+        return totalPower.compareTo(needPower) > 0;
+    }
+
+    /**
+     * 总代 团队(包含自己)算力达到指定数量,并下级存在3个市代且三个市代不在同一条线
+     *
+     * @param member
+     * @param basicLevelSetting
+     * @return
+     */
+    private Boolean becomeZd(MemberEntity member, YdBasicLevelSettingEntity basicLevelSetting) {
+        // 判断算力是否达到标准
+        if(!becomeSd(member, basicLevelSetting)) {
+            return false;
+        }
+
+        // 判断下级存在3个市代且不在同一条线上
+        List<MemberEntity> childs = memberDao.selectMemberByRefererId(member.getInviteId());
+        int i = 0;
+        if (CollUtil.isNotEmpty(childs)) {
+            for (MemberEntity child : childs) {
+                List<MemberEntity> agents = memberDao.selectTeamAgentList(child.getInviteId());
+                if (agents.size() > 0) {
+                    i++;
+                }
+            }
+        }
+        return i >= 3;
+    }
+
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void agentUsdtProfitDistributor() {
         List<YdOrderEntity> orders = ydOrderDao.selectNeedReturnOrders();
 
@@ -57,6 +141,7 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void usdtProfitDistributorByOrderId(Long id) {
         YdOrderEntity ydOrderEntity = ydOrderDao.selectById(id);
         usdtProfitDistributor(ydOrderEntity);
diff --git a/src/main/java/com/xcong/excoin/modules/yunding/service/Impl/YunDingServiceImpl.java b/src/main/java/com/xcong/excoin/modules/yunding/service/Impl/YunDingServiceImpl.java
index 7c60bb3..a8155ed 100644
--- a/src/main/java/com/xcong/excoin/modules/yunding/service/Impl/YunDingServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/yunding/service/Impl/YunDingServiceImpl.java
@@ -30,8 +30,10 @@
 import com.xcong.excoin.modules.yunding.entity.YdProductEntity;
 import com.xcong.excoin.modules.yunding.service.YunDingService;
 import com.xcong.excoin.modules.yunding.vo.*;
+import com.xcong.excoin.rabbit.producer.YunDingProducter;
 import com.xcong.excoin.utils.LogRecordUtils;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -60,6 +62,8 @@
     private YdBasicLevelSettingDao ydBasicLevelSettingDao;
     @Resource
     private MemberDao memberDao;
+    @Autowired
+    private YunDingProducter yunDingProducter;
 
     @Override
     public Result findAllInfo() {
@@ -240,6 +244,9 @@
         //生成流水记录
         LogRecordUtils.insertMemberAccountMoneyChangeWithId(memberId, "购买产品", multiplyUsdt,
                 "USDT", 1, 3, ydOrderEntity.getId());
+
+        yunDingProducter.sendYunDingUsdtProfit(ydOrderEntity.getId());
+        yunDingProducter.sendYunDingAutoAgent(ydOrderEntity.getMemberId());
         return Result.ok("支付成功");
     }
 
@@ -463,8 +470,6 @@
         log.info("购买代理级别");
         MemberEntity memberEntity = LoginUserUtils.getAppLoginUser();
         Long memberId = memberEntity.getId();
-//        Long memberId = 442L;
-//        MemberEntity memberEntity = memberDao.selectById(memberId);
 
         /**
          * 获取代理级别(Level字段越小,级别越高)
@@ -496,21 +501,29 @@
         Integer levelTo = ydBasicLevelSettingEntityTo.getLevel();
         //获取当前代理级别
         Integer agentLevel = memberEntity.getAgentLevel();
-        long agentId = Long.parseLong(agentLevel.toString());
+
+        BigDecimal salePrice = ydBasicLevelSettingEntityTo.getSalePrice();
         Integer levelNow = 0;
-        YdBasicLevelSettingEntity ydBasicLevelSettingEntityNow = ydBasicLevelSettingDao.selectById(agentId);
-        if(ObjectUtil.isNotEmpty(ydBasicLevelSettingEntityNow)){
-            levelNow = ydBasicLevelSettingEntityNow.getLevel();
-            if(levelTo >= levelNow){
-                return Result.fail("无法购买");
+        if (agentLevel != null) {
+            long agentId = Long.parseLong(agentLevel.toString());
+            YdBasicLevelSettingEntity ydBasicLevelSettingEntityNow = ydBasicLevelSettingDao.selectById(agentId);
+            if(ObjectUtil.isNotEmpty(ydBasicLevelSettingEntityNow)){
+                levelNow = ydBasicLevelSettingEntityNow.getLevel();
+                if(levelTo.equals(levelNow)){
+                    return Result.fail("不能重复购买当前代理");
+                }
+
+                if (levelNow < levelTo) {
+                    return Result.fail("不能购买低于当前代理");
+                }
+            }
+
+            //用户如果已经有等级则减少差价
+            if(levelNow != 0){
+                salePrice = salePrice.subtract(ydBasicLevelSettingEntityNow.getSalePrice());
             }
         }
 
-        BigDecimal salePrice = ydBasicLevelSettingEntityTo.getSalePrice();
-        //用户如果已经有等级则减少差价
-        if(levelNow != 0){
-            salePrice = salePrice.subtract(ydBasicLevelSettingEntityNow.getSalePrice());
-        }
         //获取用户当前USDT余额
         MemberWalletCoinEntity usdt = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, "USDT");
         BigDecimal availableBalance = usdt.getAvailableBalance();
@@ -526,6 +539,8 @@
 
         LogRecordUtils.insertMemberAccountMoneyChangeWithId(memberId, "购买代理", salePrice,
                 "USDT", 1, 8, memberId);
+
+        yunDingProducter.sendYunDingAutoAgent(memberId);
         return Result.ok("购买成功");
     }
 
diff --git a/src/main/java/com/xcong/excoin/rabbit/consumer/YunDingConsumer.java b/src/main/java/com/xcong/excoin/rabbit/consumer/YunDingConsumer.java
index 865220e..165ef91 100644
--- a/src/main/java/com/xcong/excoin/rabbit/consumer/YunDingConsumer.java
+++ b/src/main/java/com/xcong/excoin/rabbit/consumer/YunDingConsumer.java
@@ -19,9 +19,18 @@
     private XchProfitService xchProfitService;
 
     @RabbitListener(queues = RabbitMqConfig.QUEUE_XCH_USDT_PRIFIT)
-    public void addFollowOrder(Message message, Channel channel) {
+    public void xchUsdtProfit(Message message, Channel channel) {
         String content = new String(message.getBody());
         log.info("USDT返利 : {}", content);
         xchProfitService.usdtProfitDistributorByOrderId(Long.parseLong(content));
     }
+
+    @RabbitListener(queues = RabbitMqConfig.QUEUE_XCH_AUTO_AGENT)
+    public void xchAutoAgent(Message message, Channel channel) {
+        String content = new String(message.getBody());
+        log.info("自动升级代理消息 : {}", content);
+        xchProfitService.autoBeAgent(Long.parseLong(content));
+    }
+
+
 }
diff --git a/src/main/java/com/xcong/excoin/rabbit/producer/YunDingProducter.java b/src/main/java/com/xcong/excoin/rabbit/producer/YunDingProducter.java
index 261dea0..555234b 100644
--- a/src/main/java/com/xcong/excoin/rabbit/producer/YunDingProducter.java
+++ b/src/main/java/com/xcong/excoin/rabbit/producer/YunDingProducter.java
@@ -25,7 +25,14 @@
     }
 
     public void sendYunDingUsdtProfit(Long id) {
+        log.info("发送购买矿机USDT返利消息:{}", id);
         CorrelationData correlationData = new CorrelationData(IdUtil.simpleUUID());
         rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_XCH, RabbitMqConfig.ROUTING_KEE_XCH_USDT_PRIFIT, id.toString(), correlationData);
     }
+
+    public void sendYunDingAutoAgent(Long memberId) {
+        log.info("发送自动升级代理消息:{}", memberId);
+        CorrelationData correlationData = new CorrelationData(IdUtil.simpleUUID());
+        rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_XCH, RabbitMqConfig.ROUTING_KEY_XCH_AUTO_AGENT, memberId.toString(), correlationData);
+    }
 }
diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml
index 26cf4aa..27b403d 100644
--- a/src/main/resources/application-test.yml
+++ b/src/main/resources/application-test.yml
@@ -101,7 +101,8 @@
   loop-job: false
   rabbit-consumer: false
   block-job: true
-  xch-job: true
+  xch-job: false
+  yunding-consumer: true
 
 aliyun:
   oss:
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 3ff3474..8a1f6b0 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -107,7 +107,8 @@
   loop-job: false
   rabbit-consumer: false
   block-job: false
-  xch-job: true
+  xch-job: false
+  yunding-consumer: true
 
 aliyun:
   oss:
diff --git a/src/main/resources/mapper/member/MemberDao.xml b/src/main/resources/mapper/member/MemberDao.xml
index a16cad1..056f168 100644
--- a/src/main/resources/mapper/member/MemberDao.xml
+++ b/src/main/resources/mapper/member/MemberDao.xml
@@ -68,4 +68,22 @@
         </foreach >
         order by id desc
     </select>
+
+    <select id="selectMemberByInviteIds" resultType="com.xcong.excoin.modules.member.entity.MemberEntity">
+        select * from member
+        where invite_id != 'rxadr3' and  invite_id IN
+        <foreach collection = "list" item = "item"  separator=","  open = "(" close = ")" >
+            #{item}
+        </foreach >
+    </select>
+
+    <select id="selectMemberByRefererId" resultType="com.xcong.excoin.modules.member.entity.MemberEntity">
+        select * from member where referer_id=#{refererId} and invite_id!=#{refererId}
+    </select>
+
+    <select id="selectTeamAgentList" resultType="com.xcong.excoin.modules.member.entity.MemberEntity">
+        select * from member a
+        where (find_in_set(#{inviteId}, a.referer_ids) or invite_id=#{inviteId})
+        and agent_level in (1, 2)
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/yunding/YdBasicLevelSettingDao.xml b/src/main/resources/mapper/yunding/YdBasicLevelSettingDao.xml
index 674a49c..2d6be44 100644
--- a/src/main/resources/mapper/yunding/YdBasicLevelSettingDao.xml
+++ b/src/main/resources/mapper/yunding/YdBasicLevelSettingDao.xml
@@ -4,4 +4,8 @@
 
 <mapper namespace="com.xcong.excoin.modules.yunding.dao.YdBasicLevelSettingDao">
 
+
+    <select id="selectAgentLevelSetting" resultType="com.xcong.excoin.modules.yunding.entity.YdBasicLevelSettingEntity">
+        select * from yd_basic_level_setting
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/yunding/YdOrderDao.xml b/src/main/resources/mapper/yunding/YdOrderDao.xml
index f462c7f..845cc1d 100644
--- a/src/main/resources/mapper/yunding/YdOrderDao.xml
+++ b/src/main/resources/mapper/yunding/YdOrderDao.xml
@@ -87,4 +87,10 @@
             s.id = #{id}
     </update>
 
+    <select id="selectTeamAllPower" resultMap="orderMap">
+        select a.*, c.id p_id, c.pro_unit
+            from yd_order a
+        inner join (select * from member a where find_in_set(#{inviteId}, a.referer_ids) or invite_id=#{inviteId}) b on a.member_id=b.id
+        left join yd_product c on c.id = a.product_id
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/test/java/com/xcong/excoin/XchTest.java b/src/test/java/com/xcong/excoin/XchTest.java
index c813e87..1e62deb 100644
--- a/src/test/java/com/xcong/excoin/XchTest.java
+++ b/src/test/java/com/xcong/excoin/XchTest.java
@@ -25,4 +25,14 @@
         String day2 = "2021-05-12 23:01:00";
         System.out.println(DateUtil.between(DateUtil.parse(day1), DateUtil.parse(day2), DateUnit.DAY));
     }
+
+    @Test
+    public void becomeAgentTest() {
+        xchProfitService.autoBeAgent(40L);
+    }
+
+    @Test
+    public void orderUsdtProfitTest() {
+        xchProfitService.usdtProfitDistributorByOrderId(7L);
+    }
 }

--
Gitblit v1.9.1