From ef506d591338c4e1deabede781550cf2e0156f3f Mon Sep 17 00:00:00 2001 From: wzy <wzy19931122ai@163.com> Date: Wed, 09 Nov 2022 23:46:18 +0800 Subject: [PATCH] 增加每日返利,提现逻辑修改,手续费分发逻辑 --- src/main/java/cc/mrbird/febs/job/ProfitDailyJob.java | 95 +++++++++++++ src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java | 40 +++++ src/main/java/cc/mrbird/febs/dapp/controller/ViewController.java | 24 ++- src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java | 10 + src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java | 23 ++ src/main/java/cc/mrbird/febs/dapp/vo/AdminSystemFeeVo.java | 2 src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java | 5 src/main/resources/application-prod.yml | 1 src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java | 2 src/main/resources/templates/febs/views/dapp/system-fee-set.html | 10 + src/main/java/cc/mrbird/febs/rabbit/producer/ChainProducer.java | 11 + src/main/java/cc/mrbird/febs/rabbit/RabbitConfiguration.java | 19 ++ src/main/java/cc/mrbird/febs/dapp/service/impl/AdminOperationServiceImpl.java | 85 +++-------- src/main/resources/mapper/dapp/DappMemberDao.xml | 11 + src/main/java/cc/mrbird/febs/dapp/entity/MemberCoinWithdrawEntity.java | 2 src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java | 10 src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java | 2 src/main/java/cc/mrbird/febs/dapp/service/DappSystemService.java | 2 src/test/java/cc/mrbird/febs/ChainTest.java | 9 + src/main/resources/application-dev.yml | 3 20 files changed, 285 insertions(+), 81 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/dapp/controller/ViewController.java b/src/main/java/cc/mrbird/febs/dapp/controller/ViewController.java index ddb28f3..82a9167 100644 --- a/src/main/java/cc/mrbird/febs/dapp/controller/ViewController.java +++ b/src/main/java/cc/mrbird/febs/dapp/controller/ViewController.java @@ -21,7 +21,7 @@ import java.math.BigDecimal; /** - * @author + * @author * @date 2022-03-21 **/ @Controller("dappView") @@ -114,7 +114,7 @@ } - @GetMapping(value ="priceSetting") + @GetMapping(value = "priceSetting") @RequiresPermissions("price:setting:view") public String priceSetting(Model model) { BigDecimal price = (BigDecimal) redisUtils.get(AppContants.REDIS_KEY_ETH_NEW_PRICE); @@ -123,25 +123,31 @@ } //费率设置 - @GetMapping(value ="systemFeeSet") + @GetMapping(value = "systemFeeSet") @RequiresPermissions("fee:setting:view") public String systemFeeSet(Model model) { AdminSystemFeeVo adminSystemFeeVo = new AdminSystemFeeVo(); DataDictionaryCustom rebateDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.REBATE_PERCENT.getType(), DataDictionaryEnum.REBATE_PERCENT.getCode()); - if(ObjectUtil.isNotEmpty(rebateDic)){ - String value = rebateDic.getValue() == null ? "0":rebateDic.getValue(); + if (ObjectUtil.isNotEmpty(rebateDic)) { + String value = rebateDic.getValue() == null ? "0" : rebateDic.getValue(); adminSystemFeeVo.setRebatePercent(value); } DataDictionaryCustom memberFeeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.MEMBER_FEE.getType(), DataDictionaryEnum.MEMBER_FEE.getCode()); - if(ObjectUtil.isNotEmpty(memberFeeDic)){ - String value = memberFeeDic.getValue() == null ? "0":memberFeeDic.getValue(); + if (ObjectUtil.isNotEmpty(memberFeeDic)) { + String value = memberFeeDic.getValue() == null ? "0" : memberFeeDic.getValue(); adminSystemFeeVo.setMemberFee(value); } DataDictionaryCustom serviceFeeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.WITHDRAW_SERVICE_FEE.getType(), DataDictionaryEnum.WITHDRAW_SERVICE_FEE.getCode()); - if(ObjectUtil.isNotEmpty(serviceFeeDic)){ - String value = serviceFeeDic.getValue() == null ? "0":serviceFeeDic.getValue(); + if (ObjectUtil.isNotEmpty(serviceFeeDic)) { + String value = serviceFeeDic.getValue() == null ? "0" : serviceFeeDic.getValue(); adminSystemFeeVo.setServiceFee(value); } + + DataDictionaryCustom symbolPrice = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SYMBOL_PRICE.getType(), DataDictionaryEnum.SYMBOL_PRICE.getCode()); + if (ObjectUtil.isNotEmpty(symbolPrice)) { + String value = symbolPrice.getValue() == null ? "0" : symbolPrice.getValue(); + adminSystemFeeVo.setSymbolPrice(value); + } model.addAttribute("systemFee", adminSystemFeeVo); return FebsUtil.view("dapp/system-fee-set"); } diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java index b1dc889..48b26b4 100644 --- a/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java +++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java @@ -47,7 +47,7 @@ private BigDecimal amount; /** - * 类型 1-买入 2-矩阵收益 3-直推收益 4-保险池 5-提现 6-手续费充值 7-手续费扣除 8-结算 9-冻结 10-冻结释放 + * 类型 1-买入 2-矩阵收益 3-直推收益 4-保险池 5-提现 6-手续费充值 7-手续费扣除 8-结算 9-冻结 10-冻结释放 11-产矿 12-手续费返利 */ private Integer type; diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/MemberCoinWithdrawEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/MemberCoinWithdrawEntity.java index b96e243..a5da297 100644 --- a/src/main/java/cc/mrbird/febs/dapp/entity/MemberCoinWithdrawEntity.java +++ b/src/main/java/cc/mrbird/febs/dapp/entity/MemberCoinWithdrawEntity.java @@ -55,6 +55,8 @@ private String tag; + private Long flowId; + /** * 后台操作用户的标识 */ diff --git a/src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java b/src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java index 54569d3..fcd2b5f 100644 --- a/src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java +++ b/src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java @@ -4,12 +4,14 @@ @Getter public enum DataDictionaryEnum { - //每日返利的产矿百分比 + // 每日返利的产矿百分比 REBATE_PERCENT("SYSTEM_SETTING","REBATE_PERCENT"), - //分给推荐三人的终身VIP会员手续费 + // 分给推荐三人的终身VIP会员手续费 MEMBER_FEE("SYSTEM_SETTING","MEMBER_FEE"), - //提现手续费 - WITHDRAW_SERVICE_FEE("SYSTEM_SETTING", "WITHDRAW_SERVICE_FEE"); + // 提现手续费 + WITHDRAW_SERVICE_FEE("SYSTEM_SETTING", "WITHDRAW_SERVICE_FEE"), + // 币的价格 + SYMBOL_PRICE("SYSTEM_SETTING", "SYMBOL_PRICE"); private String type; diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java index 218c222..8d31cec 100644 --- a/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java +++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java @@ -42,4 +42,6 @@ int updateMemberActive(); DappMemberEntity selectNewestDirectMember(@Param("inviteId") String inviteId); + + List<DappMemberEntity> selectMemberListNeedProfit(); } diff --git a/src/main/java/cc/mrbird/febs/dapp/service/DappSystemService.java b/src/main/java/cc/mrbird/febs/dapp/service/DappSystemService.java index b3c6361..48b585c 100644 --- a/src/main/java/cc/mrbird/febs/dapp/service/DappSystemService.java +++ b/src/main/java/cc/mrbird/febs/dapp/service/DappSystemService.java @@ -22,4 +22,6 @@ void tfcNewPrice(String data); void resetMatrix(); + + void feeDistribute(String data); } diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/AdminOperationServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/AdminOperationServiceImpl.java index 13bf4f4..2437f41 100644 --- a/src/main/java/cc/mrbird/febs/dapp/service/impl/AdminOperationServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/AdminOperationServiceImpl.java @@ -3,16 +3,12 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.common.exception.FebsException; -import cc.mrbird.febs.dapp.entity.DappAccountMoneyChangeEntity; -import cc.mrbird.febs.dapp.entity.DappMemberEntity; -import cc.mrbird.febs.dapp.entity.DappWalletCoinEntity; -import cc.mrbird.febs.dapp.entity.MemberCoinWithdrawEntity; -import cc.mrbird.febs.dapp.mapper.DappAccountMoneyChangeDao; -import cc.mrbird.febs.dapp.mapper.DappMemberDao; -import cc.mrbird.febs.dapp.mapper.DappWalletCoinDao; -import cc.mrbird.febs.dapp.mapper.MemberCoinWithdrawDao; +import cc.mrbird.febs.dapp.entity.*; +import cc.mrbird.febs.dapp.mapper.*; import cc.mrbird.febs.dapp.service.AdminOperationService; +import cc.mrbird.febs.dapp.service.DappWalletService; import cc.mrbird.febs.dapp.vo.AdminMemberCoinWithdrawVo; +import cc.mrbird.febs.rabbit.producer.ChainProducer; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -31,6 +27,9 @@ private final DappWalletCoinDao dappWalletCoinDao; private final DappMemberDao dappMemberDao; private final DappAccountMoneyChangeDao dappAccountMoneyChangeDao; + private final DappWalletService dappWalletService; + private final DappFundFlowDao dappFundFlowDao; + private final ChainProducer chainProducer; @Override public IPage<AdminMemberCoinWithdrawVo> findMemberWithdrawCoinAllOneInPage(MemberCoinWithdrawEntity memberCoinWithdrawEntity, QueryRequest request) { @@ -48,53 +47,12 @@ } memberCoinWithdrawEntity.setStatus(MemberCoinWithdrawEntity.STATUS_YES); memberCoinWithdrawDao.updateById(memberCoinWithdrawEntity); - //转出账户,总额减少,冻结减少 - BigDecimal amount = memberCoinWithdrawEntity.getAmount().setScale(4,BigDecimal.ROUND_DOWN); - Long memberIdOut = memberCoinWithdrawEntity.getMemberId(); - DappWalletCoinEntity dappWalletCoinEntityOut = dappWalletCoinDao.selectByMemberId(memberIdOut); - dappWalletCoinDao.delTotalAndDelFrozenById(dappWalletCoinEntityOut.getId(),amount); - String isInside = memberCoinWithdrawEntity.getIsInside(); - String content = ""; - Integer type = 0; - if(MemberCoinWithdrawEntity.ISINSIDE_NO.equals(isInside)){ - content = "提现"; - type = 2; - }else{ - content = "转账"; - type = 4; - } - //转出账户生成一条账户资金变化记录 - DappAccountMoneyChangeEntity dappAccountMoneyChangeEntityOut = new DappAccountMoneyChangeEntity(memberIdOut, - dappWalletCoinEntityOut.getTotalAmount().setScale(4,BigDecimal.ROUND_DOWN), - amount.negate(), - dappWalletCoinEntityOut.getTotalAmount().setScale(4,BigDecimal.ROUND_DOWN).subtract(amount), - content, - type); - dappAccountMoneyChangeDao.insert(dappAccountMoneyChangeEntityOut); + DappFundFlowEntity dappFundFlowEntity = dappFundFlowDao.selectById(memberCoinWithdrawEntity.getFlowId()); + dappFundFlowEntity.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE); + dappFundFlowDao.updateById(dappFundFlowEntity); - //转入账户,总额增加,余额增加 - //转账 -// if(MemberCoinWithdrawEntity.ISINSIDE_YES.equals(isInside)){ -// String addressIn = memberCoinWithdrawEntity.getAddress(); -// DappMemberEntity dappMemberEntityIn = dappMemberDao.selectMemberInfoByInviteId(addressIn); -// if(ObjectUtil.isEmpty(dappMemberEntityIn)){ -// throw new FebsException("系统异常,联系开发人员"); -// } -// DappWalletCoinEntity dappWalletCoinEntityIn = dappWalletCoinDao.selectByMemberId(dappMemberEntityIn.getId()); -// Integer countIn = dappWalletCoinDao.addTotalAndaddAvailableById(dappWalletCoinEntityIn.getId(), memberCoinWithdrawEntity.getAmount()); -// if(1 != countIn){ -// throw new FebsException("系统异常,联系开发人员"); -// } -// //生成流水记录 -// DappAccountMoneyChangeEntity dappAccountMoneyChangeEntityIn = new DappAccountMoneyChangeEntity(dappMemberEntityIn.getId(), -// dappWalletCoinEntityIn.getTotalAmount().setScale(4,BigDecimal.ROUND_DOWN), -// amount, -// dappWalletCoinEntityIn.getTotalAmount().setScale(4,BigDecimal.ROUND_DOWN).add(amount), -// "转账", -// 4); -// dappAccountMoneyChangeDao.insert(dappAccountMoneyChangeEntityIn); -// } + chainProducer.sendFeeDistributeMsg(dappFundFlowEntity.getId()); return new FebsResponse().success(); } @@ -105,14 +63,25 @@ if(ObjectUtil.isEmpty(memberCoinWithdrawEntity)){ throw new FebsException("刷新页面重试"); } + + DappFundFlowEntity dappFundFlowEntity = dappFundFlowDao.selectById(memberCoinWithdrawEntity.getFlowId()); + if (dappFundFlowEntity == null) { + throw new FebsException("审核失败,联系管理员"); + } memberCoinWithdrawEntity.setStatus(MemberCoinWithdrawEntity.STATUS_NO); memberCoinWithdrawDao.updateById(memberCoinWithdrawEntity); - DappWalletCoinEntity dappWalletCoinEntity = dappWalletCoinDao.selectByMemberId(memberCoinWithdrawEntity.getMemberId()); - Integer count = dappWalletCoinDao.addFrozenAndDelAvailableById(dappWalletCoinEntity.getId(),memberCoinWithdrawEntity.getAmount()); - if(1 != count){ - throw new FebsException("系统异常,联系开发人员"); - } + dappFundFlowEntity.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_DISAGREE); + dappFundFlowDao.updateById(dappFundFlowEntity); + + dappWalletService.updateWalletCoinWithLock(memberCoinWithdrawEntity.getAmount(), memberCoinWithdrawEntity.getMemberId(), 1); + dappWalletService.updateWalletMineWithLock(memberCoinWithdrawEntity.getFeeAmount(), memberCoinWithdrawEntity.getMemberId(), 1); + + DappFundFlowEntity feeFlow = new DappFundFlowEntity(memberCoinWithdrawEntity.getMemberId(), memberCoinWithdrawEntity.getFeeAmount(), 7, 2, null, null); + dappFundFlowDao.insert(feeFlow); + + DappFundFlowEntity fundFlow = new DappFundFlowEntity(memberCoinWithdrawEntity.getMemberId(), memberCoinWithdrawEntity.getAmount(), 5, 1, memberCoinWithdrawEntity.getFeeAmount(), null); + dappFundFlowDao.insert(fundFlow); return new FebsResponse().success(); } } diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java index 667bd27..0eb36c9 100644 --- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java @@ -364,6 +364,11 @@ DataDictionaryCustom memberFeeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.MEMBER_FEE.getType(), DataDictionaryEnum.MEMBER_FEE.getCode()); memberFeeDic.setValue(memberFee); dataDictionaryCustomMapper.updateById(memberFeeDic); + + String symbolPrice = adminSystemFeeVo.getSymbolPrice(); + DataDictionaryCustom symbolPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SYMBOL_PRICE.getType(), DataDictionaryEnum.SYMBOL_PRICE.getCode()); + symbolPriceDic.setValue(symbolPrice); + dataDictionaryCustomMapper.updateById(symbolPriceDic); } public TeamListVo buildTeamMatrix(DappAchieveMemberTreeEntity node) { diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java index 3d6bb3b..dc692cb 100644 --- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java @@ -8,6 +8,7 @@ import cc.mrbird.febs.dapp.chain.ChainService; import cc.mrbird.febs.dapp.dto.SystemDto; import cc.mrbird.febs.dapp.entity.*; +import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum; import cc.mrbird.febs.dapp.mapper.*; import cc.mrbird.febs.dapp.service.DappSystemService; import cc.mrbird.febs.dapp.service.DappWalletService; @@ -18,6 +19,7 @@ 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 lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -44,6 +46,7 @@ private final DappAchieveTreeDao dappAchieveTreeDao; private final DappAchieveMemberTreeDao dappAchieveMemberTreeDao; private final DappWalletService dappWalletService; + private final DataDictionaryCustomMapper dataDictionaryCustomMapper; @Override @@ -194,8 +197,6 @@ amount = TreeConstants.FULL_PROFIT_AMOUNT; } - dappWalletService.releaseFrozenAmountWithLock(memberId); - member.setOutCnt(member.getOutCnt() + 1); dappMemberDao.updateById(member); @@ -246,4 +247,39 @@ dappAchieveMemberTreeDao.emptyTable(); dappMemberDao.updateMemberActive(); } + + @Override + public void feeDistribute(String data) { + if (StrUtil.isBlank(data)) { + return; + } + + Long flowId = Long.parseLong(data); + DappFundFlowEntity fundFlow = dappFundFlowDao.selectById(flowId); + if (fundFlow == null) { + return; + } + + DataDictionaryCustom memberFeeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.MEMBER_FEE.getType(), DataDictionaryEnum.MEMBER_FEE.getCode()); + if (memberFeeDic == null) { + log.info("未设置手续费返利比例"); + return; + } + List<DappMemberEntity> memberList = dappMemberDao.selectMemberListNeedProfit(); + if (CollUtil.isEmpty(memberList)) { + return; + } + + BigDecimal feeReturnRatio = new BigDecimal(memberFeeDic.getValue()); + int size = memberList.size(); + BigDecimal totalProfit = fundFlow.getFee().multiply(feeReturnRatio.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_DOWN)); + BigDecimal perProfit = totalProfit.divide(BigDecimal.valueOf(size), 2, RoundingMode.HALF_DOWN); + + memberList.forEach(item -> { + dappWalletService.updateWalletMineWithLock(perProfit, item.getId(), 1); + + DappFundFlowEntity profitFlow = new DappFundFlowEntity(item.getId(), perProfit, 12, 2, null, null); + dappFundFlowDao.insert(profitFlow); + }); + } } diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java index cb9e924..1b4574b 100644 --- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java @@ -12,6 +12,7 @@ import cc.mrbird.febs.dapp.chain.ContractChainService; import cc.mrbird.febs.dapp.dto.*; import cc.mrbird.febs.dapp.entity.*; +import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum; import cc.mrbird.febs.dapp.mapper.*; import cc.mrbird.febs.dapp.service.DappWalletService; import cc.mrbird.febs.dapp.utils.BoxUtil; @@ -54,6 +55,7 @@ private final RedisUtils redisUtils; private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final DappNftActivationDao dappNftActivationDao; + private final MemberCoinWithdrawDao memberCoinWithdrawDao; private final ChainProducer chainProducer; private final DappSystemDao dappSystemDao; @@ -176,13 +178,15 @@ @Override public BigDecimal calPrice(PriceDto priceDto) { - String priceStr = redisUtils.getString(AppContants.REDIS_KEY_TFC_NEW_PRICE); +// String priceStr = redisUtils.getString(AppContants.REDIS_KEY_TFC_NEW_PRICE); + DataDictionaryCustom symbolPrice = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SYMBOL_PRICE.getType(), DataDictionaryEnum.SYMBOL_PRICE.getCode()); + DataDictionaryCustom serviceFeeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.WITHDRAW_SERVICE_FEE.getType(), DataDictionaryEnum.WITHDRAW_SERVICE_FEE.getCode()); BigDecimal amount = priceDto.getAmount(); if (priceDto.getAmount() == null) { amount = BigDecimal.ZERO; } - return amount.multiply(new BigDecimal("0.1")).divide(new BigDecimal(priceStr), 2, RoundingMode.HALF_UP); + return amount.multiply(new BigDecimal(serviceFeeDic.getValue()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_DOWN)).divide(new BigDecimal(symbolPrice.getValue()), 2, RoundingMode.HALF_UP); } @Override @@ -197,17 +201,28 @@ DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(member.getId()); if (walletMine.getAvailableAmount().compareTo(withdrawDto.getFee()) < 0) { - throw new FebsException("TFC Not Enough"); + throw new FebsException("DMD Not Enough"); } updateWalletCoinWithLock(withdrawDto.getAmount(), member.getId(), 2); updateWalletMineWithLock(withdrawDto.getFee(), member.getId(), 2); + DappFundFlowEntity feeFlow = new DappFundFlowEntity(member.getId(), withdrawDto.getFee().negate(), 7, 2, null, null); dappFundFlowDao.insert(feeFlow); DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), withdrawDto.getAmount().negate(), 5, 1, withdrawDto.getFee(), null); dappFundFlowDao.insert(fundFlow); + + MemberCoinWithdrawEntity memberCoinWithdraw = new MemberCoinWithdrawEntity(); + memberCoinWithdraw.setMemberId(member.getId()); + memberCoinWithdraw.setAddress(member.getAddress()); + memberCoinWithdraw.setAmount(withdrawDto.getAmount()); + memberCoinWithdraw.setFeeAmount(withdrawDto.getFee()); + memberCoinWithdraw.setStatus(MemberCoinWithdrawEntity.STATUS_DOING); + memberCoinWithdraw.setSymbol("USDT"); + memberCoinWithdraw.setFlowId(fundFlow.getId()); + memberCoinWithdrawDao.insert(memberCoinWithdraw); // String hash = ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer(member.getAddress(), withdrawDto.getAmount()); // fundFlow.setToHash(hash); @@ -257,7 +272,7 @@ walletMine.setAvailableAmount(walletMine.getAvailableAmount().add(amount)); } else { if (amount.compareTo(walletMine.getAvailableAmount()) > 0) { - throw new FebsException("TFC Not Enough"); + throw new FebsException("DMD Not Enough"); } walletMine.setTotalAmount(walletMine.getTotalAmount().subtract(amount)); walletMine.setAvailableAmount(walletMine.getAvailableAmount().subtract(amount)); diff --git a/src/main/java/cc/mrbird/febs/dapp/vo/AdminSystemFeeVo.java b/src/main/java/cc/mrbird/febs/dapp/vo/AdminSystemFeeVo.java index 0d71027..5e3b0f1 100644 --- a/src/main/java/cc/mrbird/febs/dapp/vo/AdminSystemFeeVo.java +++ b/src/main/java/cc/mrbird/febs/dapp/vo/AdminSystemFeeVo.java @@ -12,4 +12,6 @@ private String memberFee; private String serviceFee; + + private String symbolPrice; } diff --git a/src/main/java/cc/mrbird/febs/job/ProfitDailyJob.java b/src/main/java/cc/mrbird/febs/job/ProfitDailyJob.java new file mode 100644 index 0000000..c220243 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/job/ProfitDailyJob.java @@ -0,0 +1,95 @@ +package cc.mrbird.febs.job; + + +import cc.mrbird.febs.dapp.entity.DappFundFlowEntity; +import cc.mrbird.febs.dapp.entity.DappMemberEntity; +import cc.mrbird.febs.dapp.entity.DataDictionaryCustom; +import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum; +import cc.mrbird.febs.dapp.mapper.DappFundFlowDao; +import cc.mrbird.febs.dapp.mapper.DappMemberDao; +import cc.mrbird.febs.dapp.mapper.DataDictionaryCustomMapper; +import cc.mrbird.febs.dapp.service.DappWalletService; +import cc.mrbird.febs.tree.TreeConstants; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; + +@Slf4j +@Component +@ConditionalOnProperty(prefix = "system", name = "quartz-job", havingValue = "true") +public class ProfitDailyJob { + + @Autowired + private DappMemberDao dappMemberDao; + @Autowired + private DappFundFlowDao dappFundFlowDao; + @Autowired + private DataDictionaryCustomMapper dataDictionaryCustomMapper; + @Autowired + private DappWalletService dappWalletService; + + @Scheduled(cron = "0 0 0 * * ?") + public void profitDailyJob() { + log.info("每日产矿任务执行"); + DataDictionaryCustom symbolPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SYMBOL_PRICE.getType(), DataDictionaryEnum.SYMBOL_PRICE.getCode()); + if (symbolPriceDic == null) { + log.info("未设置币种价格"); + return; + } + + DataDictionaryCustom rebateDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.REBATE_PERCENT.getType(), DataDictionaryEnum.REBATE_PERCENT.getCode()); + if (rebateDic == null) { + log.info("未设置每日产矿比例"); + return; + } + + BigDecimal symbolPrice = new BigDecimal(symbolPriceDic.getValue()); + BigDecimal rebateRatio = new BigDecimal(rebateDic.getValue()); + + QueryWrapper<DappMemberEntity> query = new QueryWrapper<>(); + query.eq("active_status", 1); + List<DappMemberEntity> members = dappMemberDao.selectList(query); + if (CollUtil.isEmpty(members)) { + return; + } + + members.forEach(item -> { + QueryWrapper<DappFundFlowEntity> fundFlowQuery = new QueryWrapper<>(); + fundFlowQuery.eq("member_id", item.getId()); + fundFlowQuery.eq("type", 11); + List<DappFundFlowEntity> flows = dappFundFlowDao.selectList(fundFlowQuery); + + BigDecimal sum = BigDecimal.ZERO; + if (CollUtil.isNotEmpty(flows)) { + double symbolSum = flows.stream().mapToDouble(flow -> flow.getAmount().doubleValue()).sum(); + sum = symbolPrice.multiply(new BigDecimal(symbolSum)); + } + + if (CollUtil.isEmpty(flows) || TreeConstants.PUT_IN_AMOUNT.compareTo(sum) > 0) { + BigDecimal profitU = TreeConstants.PUT_IN_AMOUNT.multiply(rebateRatio.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_DOWN)); + + BigDecimal remain = TreeConstants.PUT_IN_AMOUNT.subtract(sum); + if (remain.compareTo(profitU) < 0) { + profitU = remain; + } + + BigDecimal profitSymbol = profitU.divide(symbolPrice, 2, RoundingMode.HALF_DOWN); + + dappWalletService.updateWalletMineWithLock(profitSymbol, item.getId(), 1); + DappFundFlowEntity fundFlow = new DappFundFlowEntity(item.getId(), profitSymbol, 11, 2, null, null); + dappFundFlowDao.insert(fundFlow); + } + }); + + + } +} diff --git a/src/main/java/cc/mrbird/febs/rabbit/RabbitConfiguration.java b/src/main/java/cc/mrbird/febs/rabbit/RabbitConfiguration.java index 1085672..cb11d30 100644 --- a/src/main/java/cc/mrbird/febs/rabbit/RabbitConfiguration.java +++ b/src/main/java/cc/mrbird/febs/rabbit/RabbitConfiguration.java @@ -82,4 +82,23 @@ return BindingBuilder.bind(tfcNewPriceQueue()).to(tfcNewPriceExchange()).with(QueueEnum.TFC_NEW_PRICE.getRoute()); } // === tfc最新价 end === + + + + // === 手续费分发 start === + @Bean + public DirectExchange feeDistributeExchange() { + return new DirectExchange(QueueEnum.DISTRIB_PROFIT.getExchange()); + } + + @Bean + public Queue feeDistributeQueue() { + return new Queue(QueueEnum.DISTRIB_PROFIT.getQueue()); + } + + @Bean + public Binding feeDistributeBind() { + return BindingBuilder.bind(feeDistributeQueue()).to(feeDistributeExchange()).with(QueueEnum.DISTRIB_PROFIT.getRoute()); + } + // === 手续费分发 end === } diff --git a/src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java b/src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java index 36b35d8..95bd8f7 100644 --- a/src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java +++ b/src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java @@ -34,6 +34,14 @@ */ @RabbitListener(queues = QueueConstants.TFC_NEW_PRICE) public void tfcNewPrice(String data) { - dappSystemService.tfcNewPrice(data); +// dappSystemService.tfcNewPrice(data); + } + + /** + * @param data + */ + @RabbitListener(queues = QueueConstants.DISTRIB_PROFIT) + public void feeDistribute(String data) { + dappSystemService.feeDistribute(data); } } diff --git a/src/main/java/cc/mrbird/febs/rabbit/producer/ChainProducer.java b/src/main/java/cc/mrbird/febs/rabbit/producer/ChainProducer.java index fcae1bf..c6483d3 100644 --- a/src/main/java/cc/mrbird/febs/rabbit/producer/ChainProducer.java +++ b/src/main/java/cc/mrbird/febs/rabbit/producer/ChainProducer.java @@ -49,4 +49,15 @@ CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); rabbitTemplate.convertAndSend(QueueEnum.WITHDRAW_FEE.getExchange(), QueueEnum.WITHDRAW_FEE.getRoute(), data, correlationData); } + + /** + * 发送手续费分发消息 + * + * @param id + */ + public void sendFeeDistributeMsg(Long id) { + log.info("发送手续费分发消息:{}", id); + CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); + rabbitTemplate.convertAndSend(QueueEnum.DISTRIB_PROFIT.getExchange(), QueueEnum.DISTRIB_PROFIT.getRoute(), id, correlationData); + } } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index d4b6b9a..4f91410 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -59,6 +59,7 @@ system: online-transfer: false - chain-listener: true + chain-listener: false reset-job: false + quartz-job: true debug: true \ No newline at end of file diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 2051472..c58680a 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -56,4 +56,5 @@ online-transfer: true chain-listener: true reset-job: true + quartz-job: true debug: false \ No newline at end of file diff --git a/src/main/resources/mapper/dapp/DappMemberDao.xml b/src/main/resources/mapper/dapp/DappMemberDao.xml index d9c4300..d5185c8 100644 --- a/src/main/resources/mapper/dapp/DappMemberDao.xml +++ b/src/main/resources/mapper/dapp/DappMemberDao.xml @@ -135,4 +135,15 @@ order by id desc limit 1 </select> + + <select id="selectMemberListNeedProfit" resultType="cc.mrbird.febs.dapp.entity.DappMemberEntity"> + select + * + from dapp_member a + inner join ( + select referer_id, count(1) from dapp_member a + where active_status = 1 + group by referer_id having count(1) > 3 + ) b on a.invite_id=b.referer_id + </select> </mapper> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/dapp/system-fee-set.html b/src/main/resources/templates/febs/views/dapp/system-fee-set.html index faa89c1..f9cbece 100644 --- a/src/main/resources/templates/febs/views/dapp/system-fee-set.html +++ b/src/main/resources/templates/febs/views/dapp/system-fee-set.html @@ -33,6 +33,13 @@ <!-- 【填写整数】每日订单金额的百分之几,增加到积分池:直接输入百分比,例如25%,直接输入25--> <!-- </div>--> </div> + <div class="layui-form-item"> + <label class="layui-form-label ">DMD价格:</label> + <div class="layui-input-block"> + <input type="text" name="symbolPrice" data-th-id="${systemFee.symbolPrice}" + autocomplete="off" class="layui-input" > + </div> + </div> </div> <div class="layui-card-footer"> @@ -74,7 +81,8 @@ form.val("system-fee-set-form", { "rebatePercent": systemFee.rebatePercent, "memberFee": systemFee.memberFee, - "serviceFee": systemFee.serviceFee + "serviceFee": systemFee.serviceFee, + "symbolPrice": systemFee.symbolPrice }); } diff --git a/src/test/java/cc/mrbird/febs/ChainTest.java b/src/test/java/cc/mrbird/febs/ChainTest.java index 37af5f0..6830fd3 100644 --- a/src/test/java/cc/mrbird/febs/ChainTest.java +++ b/src/test/java/cc/mrbird/febs/ChainTest.java @@ -12,6 +12,7 @@ //import cc.mrbird.febs.job.SystemTradeJob; import cc.mrbird.febs.dapp.service.impl.BscCoinContractEvent; import cc.mrbird.febs.dapp.service.impl.BscUsdtContractEvent; +import cc.mrbird.febs.job.ProfitDailyJob; import cc.mrbird.febs.rabbit.producer.ChainProducer; import com.alibaba.fastjson.JSONObject; import org.junit.jupiter.api.Test; @@ -51,4 +52,12 @@ public void wssChainListener(){ ChainService.wssContractEventListener(new BigInteger("22819014"), bscUsdtContractEvent, ChainEnum.BSC_USDT.name()); } + + @Autowired + private ProfitDailyJob profitDailyJob; + + @Test + public void profitTest() { + profitDailyJob.profitDailyJob(); + } } -- Gitblit v1.9.1