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); } }