src/main/java/cc/mrbird/febs/dapp/controller/ApiDappOrderController.java
@@ -94,4 +94,19 @@ dappMemberService.payOrder(id); return new FebsResponse().success().message("操作成功"); } @ApiOperation(value = "资产包详情", notes = "资产包详情") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = PackageInfoVo.class) }) @GetMapping(value = "/packageInfo") public FebsResponse packageInfo() { return dappMemberService.packageInfo(); } @ApiOperation(value = "卖出资产包积分", notes = "卖出资产包积分") @PostMapping(value = "/salePackage") public FebsResponse salePackage(@RequestBody SalePackageDto salePackageDto) { return dappMemberService.salePackage(salePackageDto); } } src/main/java/cc/mrbird/febs/dapp/dto/SalePackageDto.java
New file @@ -0,0 +1,14 @@ package cc.mrbird.febs.dapp.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data @ApiModel(value = "SalePackageDto", description = "接收参数类") public class SalePackageDto { @ApiModelProperty(value = "卖出数量", example = "20") private BigDecimal cnt; } src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java
@@ -20,7 +20,7 @@ public class DappMemberEntity extends BaseEntity { private String address; //资产积分余额 private BigDecimal balance; /** src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java
@@ -4,6 +4,25 @@ @Getter public enum DataDictionaryEnum { /** * 资产包USDT底池 */ PACKAGE_POOR("PACKAGE_POOR","PACKAGE_POOR"), /** * 资产包卖出划入底池比例 */ PACKAGE_SALE_TO_POOR_PERCENT("PACKAGE_SALE_TO_POOR_PERCENT","PACKAGE_SALE_TO_POOR_PERCENT"), /** * 资产包积分价格 */ PACKAGE_SCORE_PRICE("PACKAGE_SCORE_PRICE","PACKAGE_SCORE_PRICE"), /** * 资产包总积分 */ PACKAGE_TOTAL_SCORE("PACKAGE_TOTAL_SCORE","PACKAGE_TOTAL_SCORE"), /** * 普通会员购买上线 */ src/main/java/cc/mrbird/febs/dapp/enumerate/FundFlowEnum.java
@@ -7,6 +7,8 @@ */ @Getter public enum FundFlowEnum { //卖出资产 SALE_PACKAGE("SALE_PACKAGE", 23), //实际增加余额 ADD_AMOUNT_REAL("ADD_AMOUNT_REAL", 22), //实际减少赠送积分 src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java
@@ -78,4 +78,8 @@ void cancelOrder(Long id); void payOrder(Long id); FebsResponse packageInfo(); FebsResponse salePackage(SalePackageDto salePackageDto); } src/main/java/cc/mrbird/febs/dapp/service/DappSystemService.java
@@ -118,4 +118,6 @@ void teamStaticPerk(); void updateAchieve(); void speedSalePackageMsg(Long memberId); } src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
@@ -37,6 +37,7 @@ import org.web3j.utils.Strings; import java.math.BigDecimal; import java.math.BigInteger; import java.util.*; import java.util.stream.Collectors; @@ -777,6 +778,93 @@ chainProducer.sendAutoLevelUpTeamMsg(member.getId()); } @Override public FebsResponse packageInfo() { Long memberId = LoginUserUtil.getAppUser().getId(); PackageInfoVo packageInfoVo = new PackageInfoVo(); DataDictionaryCustom packageTotalScoreDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.PACKAGE_TOTAL_SCORE.getType(), DataDictionaryEnum.PACKAGE_TOTAL_SCORE.getCode() ); BigDecimal packageTotalScore = new BigDecimal(ObjectUtil.isEmpty(packageTotalScoreDic) ? "0" : packageTotalScoreDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN); packageInfoVo.setPackageTotalScore(packageTotalScore); DataDictionaryCustom packageScorePriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.PACKAGE_SCORE_PRICE.getType(), DataDictionaryEnum.PACKAGE_SCORE_PRICE.getCode() ); BigDecimal packageScorePrice = new BigDecimal(ObjectUtil.isEmpty(packageScorePriceDic) ? "0" : packageScorePriceDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN); packageInfoVo.setPackageScorePrice(packageScorePrice); DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId); BigDecimal balance = dappMemberEntity.getBalance(); packageInfoVo.setPackageMemberScore(balance); return new FebsResponse().success().data(packageInfoVo); } @Override public FebsResponse salePackage(SalePackageDto salePackageDto) { Long memberId = LoginUserUtil.getAppUser().getId(); BigDecimal cnt = salePackageDto.getCnt(); DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId); BigDecimal balance = dappMemberEntity.getBalance(); if(BigDecimal.ZERO.compareTo(cnt) >= 0){ throw new FebsException("资产不足"); } if(cnt.compareTo(balance) > 0){ throw new FebsException("资产不足"); } DataDictionaryCustom packageScorePriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.PACKAGE_SCORE_PRICE.getType(), DataDictionaryEnum.PACKAGE_SCORE_PRICE.getCode() ); BigDecimal packageScorePrice = new BigDecimal(ObjectUtil.isEmpty(packageScorePriceDic) ? "0" : packageScorePriceDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN); //卖出资产乘以价格获取到预期获取的总额 BigDecimal totalAmount = cnt.multiply(packageScorePrice).setScale(2, BigDecimal.ROUND_DOWN); //资产包卖出划入底池比例 DataDictionaryCustom packageToPoorPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.PACKAGE_SALE_TO_POOR_PERCENT.getType(), DataDictionaryEnum.PACKAGE_SALE_TO_POOR_PERCENT.getCode() ); BigDecimal packageToPoorPercent = new BigDecimal(ObjectUtil.isEmpty(packageToPoorPercentDic) ? "0.1" : packageToPoorPercentDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN); //划入底池的金额 BigDecimal poorAmount = totalAmount.multiply(packageToPoorPercent).setScale(2, BigDecimal.ROUND_DOWN); //生成一条资金流水 DappFundFlowEntity scoreFlow = new DappFundFlowEntity( memberId, totalAmount.subtract(poorAmount), FundFlowEnum.SALE_PACKAGE.getCode(), DappFundFlowEntity.WITHDRAW_STATUS_ING, poorAmount); dappFundFlowDao.insert(scoreFlow); //卖出积分直接销毁。 DataDictionaryCustom packageTotalScoreDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.PACKAGE_TOTAL_SCORE.getType(), DataDictionaryEnum.PACKAGE_TOTAL_SCORE.getCode() ); BigDecimal packageTotalScore = new BigDecimal(ObjectUtil.isEmpty(packageTotalScoreDic) ? "21000" : packageTotalScoreDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN); BigDecimal avaPackageTotalScore = packageTotalScore.subtract(cnt); packageTotalScoreDic.setValue(avaPackageTotalScore.toString()); dataDictionaryCustomMapper.updateById(packageTotalScoreDic); //更新USDT底池 DataDictionaryCustom packagePoorDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.PACKAGE_POOR.getType(), DataDictionaryEnum.PACKAGE_POOR.getCode() ); BigDecimal packagePoor = new BigDecimal(ObjectUtil.isEmpty(packagePoorDic) ? "0" : packagePoorDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN); BigDecimal avaPackagePoor = packagePoor.add(poorAmount); packagePoorDic.setValue(avaPackagePoor.toString()); dataDictionaryCustomMapper.updateById(packagePoorDic); //计算当前价格 BigDecimal divide = avaPackagePoor.divide(avaPackageTotalScore, 2, BigDecimal.ROUND_DOWN); packageScorePriceDic.setValue(divide.toString()); dataDictionaryCustomMapper.updateById(packageScorePriceDic); return null; } public static List<List<String>> partitionList(List<String> originalList, int partitionSize) { List<List<String>> partitionedList = new ArrayList<>(); int size = originalList.size(); src/main/java/cc/mrbird/febs/dapp/vo/PackageInfoVo.java
New file @@ -0,0 +1,22 @@ package cc.mrbird.febs.dapp.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data @ApiModel(value = "PackageInfoVo", description = "资产包详情") public class PackageInfoVo { @ApiModelProperty(value = "资产总量") private BigDecimal packageTotalScore; @ApiModelProperty(value = "我的资产") private BigDecimal packageMemberScore; @ApiModelProperty(value = "资产价格") private BigDecimal packageScorePrice; } src/main/java/cc/mrbird/febs/job/BnbTransferJob.java
@@ -1,16 +1,6 @@ package cc.mrbird.febs.job; import cc.mrbird.febs.dapp.entity.DappFundFlowEntity; import cc.mrbird.febs.dapp.entity.DataDictionaryCustom; import cc.mrbird.febs.dapp.enumerate.FundFlowEnum; import cc.mrbird.febs.dapp.enumerate.MemberLevelEnum; import cc.mrbird.febs.dapp.enumerate.NodeCodeEnum; import cc.mrbird.febs.dapp.enumerate.PoolEnum; import cc.mrbird.febs.dapp.mapper.DappFundFlowDao; import cc.mrbird.febs.dapp.mapper.DataDictionaryCustomMapper; import cc.mrbird.febs.dapp.service.DappSystemService; import cc.mrbird.febs.rabbit.producer.ChainProducer; import cn.hutool.core.util.ObjectUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; src/main/java/cc/mrbird/febs/rabbit/QueueConstants.java
@@ -7,6 +7,11 @@ public class QueueConstants { /** * speed 卖出资产 */ public static final String QUEUE_SPEED_SALE_PACKAGE = "queue_speed_sale_package"; /** * speed 直推返利 */ public static final String QUEUE_SPEED_DIRECT_PERK = "queue_speed_direct_perk"; src/main/java/cc/mrbird/febs/rabbit/QueueEnum.java
@@ -6,6 +6,10 @@ @Getter public enum QueueEnum { /** * speed 卖出资产 */ SPEED_SALE_PACKAGE("exchange_speed_sale_package", "route_key_speed_sale_package", QueueConstants.QUEUE_SPEED_SALE_PACKAGE), /** * speed 直推返利 */ SPEED_DIRECT_PERK("exchange_speed_direct_perk", "route_key_speed_direct_perk", QueueConstants.QUEUE_SPEED_DIRECT_PERK), src/main/java/cc/mrbird/febs/rabbit/RabbitConfiguration.java
@@ -96,4 +96,21 @@ return BindingBuilder.bind(speedDirectPerkQueue()).to(speedDirectPerkExchange()).with(QueueEnum.SPEED_DIRECT_PERK.getRoute()); } // === speed 代理升级 end === // === speed 卖出资产 start === @Bean public DirectExchange speedSalePackageExchange() { return new DirectExchange(QueueEnum.SPEED_SALE_PACKAGE.getExchange()); } @Bean public Queue speedSalePackageQueue() { return new Queue(QueueEnum.SPEED_SALE_PACKAGE.getQueue()); } @Bean public Binding speedSalePackageBind() { return BindingBuilder.bind(speedSalePackageQueue()).to(speedSalePackageExchange()).with(QueueEnum.SPEED_SALE_PACKAGE.getRoute()); } // === speed 卖出资产 end === } src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java
@@ -74,4 +74,17 @@ log.error("speedDirectPerkErr:", e); } } /** * speed 卖出资产 */ @RabbitListener(queues = QueueConstants.QUEUE_SPEED_SALE_PACKAGE) public void speedSalePackageMsg(Long memberId) { log.info("speedSalePackageMsg:{}", memberId); try { dappSystemService.speedSalePackageMsg(memberId); } catch (Exception e) { log.error("speedSalePackageErr:", e); } } } src/main/java/cc/mrbird/febs/rabbit/producer/ChainProducer.java
@@ -45,7 +45,6 @@ rabbitTemplate.convertAndSend(QueueEnum.SPEED_PAY_ORDER.getExchange(), QueueEnum.SPEED_PAY_ORDER.getRoute(), orderId, correlationData); } /** * speed 代理升级 * @param memberId @@ -55,7 +54,6 @@ CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); rabbitTemplate.convertAndSend(QueueEnum.SPEED_LEVEL_UP_TEAM.getExchange(), QueueEnum.SPEED_LEVEL_UP_TEAM.getRoute(), memberId, correlationData); } /** * speed 代理升级 @@ -67,7 +65,6 @@ rabbitTemplate.convertAndSend(QueueEnum.SPEED_LEVEL_UP.getExchange(), QueueEnum.SPEED_LEVEL_UP.getRoute(), memberId, correlationData); } /** * speed 直推返利 */ @@ -77,4 +74,13 @@ rabbitTemplate.convertAndSend(QueueEnum.SPEED_DIRECT_PERK.getExchange(), QueueEnum.SPEED_DIRECT_PERK.getRoute(), memberId, correlationData); } /** * speed 卖出资产 */ public void sendSalePackageMsg(@NotNull Long memberId) { log.info("sendSalePackageMsg:{}", memberId); CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); rabbitTemplate.convertAndSend(QueueEnum.SPEED_SALE_PACKAGE.getExchange(), QueueEnum.SPEED_SALE_PACKAGE.getRoute(), memberId, correlationData); } }