Helius
2021-05-13 13eb3cd1d1533144c49901506c040a11ad3eb0c1
modify
15 files modified
225 ■■■■■ changed files
src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java 13 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java 1 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/dao/YdBasicLevelSettingDao.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/dao/YdOrderDao.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/service/Impl/XchProfitServiceImpl.java 93 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/service/Impl/YunDingServiceImpl.java 41 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/rabbit/consumer/YunDingConsumer.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/rabbit/producer/YunDingProducter.java 7 ●●●●● patch | view | raw | blame | history
src/main/resources/application-test.yml 3 ●●●● patch | view | raw | blame | history
src/main/resources/application.yml 3 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/member/MemberDao.xml 18 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/yunding/YdBasicLevelSettingDao.xml 4 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/yunding/YdOrderDao.xml 6 ●●●●● patch | view | raw | blame | history
src/test/java/com/xcong/excoin/XchTest.java 10 ●●●●● patch | view | raw | blame | history
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);
    }
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);
}
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);
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();
}
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);
}
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);
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("购买成功");
    }
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));
    }
}
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);
    }
}
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:
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:
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>
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>
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>
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);
    }
}