src/main/java/cc/mrbird/febs/FebsShiroApplication.java
@@ -50,7 +50,7 @@ Field field = systemConstants.getClass().getDeclaredField(key); field.set(systemConstants, value); AppContants.FEE_ADDRESS_KEY.put("feeAddressKey",systemConstants.getFeeAddressKey()); dataDictionaryCustom.setValue("isReady"); // dataDictionaryCustom.setValue("isReady"); dataDictionaryCustomMapper.updateById(dataDictionaryCustom); } catch (Exception e) { e.printStackTrace(); src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
@@ -27,6 +27,7 @@ registration.addPathPatterns("/dapi/**"); registration.excludePathPatterns("/dapi/common/**"); registration.excludePathPatterns("/dapi/member/runListInfo"); registration.excludePathPatterns("/dapi/member/nodeInfo"); } /** src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
@@ -14,16 +14,17 @@ * 0x55d398326f99059fF775485246999027B3197955 * 测试链 0x337610d27c682E347C9cD60BD4b3b107C9d34dDd */ // BSC_USDT("BSC", "0xa9B85Fc19f3E330Cd703050fACA2110c7A33fd06", // "0xb97d6046268b76a21c11c4b33357dc8e203542d7c2a7fc40fccf364099b06477", // "https://bsc-dataseed1.ninicoin.io", // "0x55d398326f99059fF775485246999027B3197955", // ""), BSC_USDT("BSC", "0xBa6206B3Be305278Ea65bA54C4E6188B252AEc4a", "0x1bc264d17bd2b1f3c0480764272284b8e6c8b0a39a590c26940f84f7b090cc74", BSC_USDT("BSC", "0xA60AaC0da34C76F3f60207ee09e9F75043319ab4", "221be67f85375a5af6dd0f4b77fbe877ad2e57e05db201de1b1383fb76494d18", "https://bsc-dataseed1.ninicoin.io", "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", // "0x55d398326f99059fF775485246999027B3197955", "0x532B0F9554D92b8BF1bdE85DD4E8b86E4228DE27", ""), // BSC_USDT("BSC", "0xBa6206B3Be305278Ea65bA54C4E6188B252AEc4a", // "0x1bc264d17bd2b1f3c0480764272284b8e6c8b0a39a590c26940f84f7b090cc74", // "https://bsc-dataseed1.ninicoin.io", // "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", // ""), BNB("BSC", "0xBa6206B3Be305278Ea65bA54C4E6188B252AEc4a", "0x1bc264d17bd2b1f3c0480764272284b8e6c8b0a39a590c26940f84f7b090cc74", "https://bsc-dataseed1.ninicoin.io", src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
@@ -215,7 +215,8 @@ } public String tokenTransferFrom(String privateKey, String fromAddress, String toAddress, String amount) throws ExecutionException, InterruptedException { String gas = getGas(); // String gas = getGas(); String gas = "5"; BigDecimal amountPow = new BigDecimal(amount).multiply(BigDecimal.TEN.pow(decimals())); amount = amountPow.toPlainString(); @@ -256,8 +257,8 @@ } public String tokenTransfer(String privateKey, String fromAddress, String toAddress, String amount) throws ExecutionException, InterruptedException { String gas = getGas(); // String gas = "5"; // String gas = getGas(); String gas = "5"; BigDecimal amountPow = new BigDecimal(amount).multiply(BigDecimal.TEN.pow(decimals())); amount = amountPow.toPlainString(); src/main/java/cc/mrbird/febs/dapp/contract/ContractInit.java
@@ -28,18 +28,13 @@ @PostConstruct public void init(){ // 设置起始区块编号 TODO BigInteger start = new BigInteger("23886625"); BigInteger start = new BigInteger("28282373"); // 需要打开 获取最新区块编号 Object bnb_block_number = redisService.get("BNB_BLOCK_NUMBER"); if(bnb_block_number !=null){ start = BigInteger.valueOf(Long.valueOf(bnb_block_number.toString())); } // DataDictionaryCustom feeAddressKey = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.FEE_ADDRESS_KEY.getType(), DataDictionaryEnum.FEE_ADDRESS_KEY.getCode()); // AppContants.FEE_ADDRESS_KEY.put("feeAddressKey",feeAddressKey.getValue()); // feeAddressKey.setValue("已初始化"); // dataDictionaryCustomMapper.updateById(feeAddressKey); System.out.println("启动区块事件监听,监听起始:"+start); // System.out.println("启动区块事件监听,监听起始:"+AppContants.FEE_ADDRESS_KEY.get("feeAddressKey").toString() ); contractMain.listenBetting(start); } } src/main/java/cc/mrbird/febs/dapp/contract/ContractMain.java
@@ -58,11 +58,8 @@ return web3; } // gas费用单价 // public static final BigInteger GAS_PRICE = BigInteger.valueOf(32000000000L); public static final BigInteger GAS_PRICE = Convert.toWei(getGas(), Convert.Unit.GWEI).toBigInteger(); // public static final BigInteger GAS_PRICE = Convert.toWei("5", Convert.Unit.GWEI).toBigInteger(); // gas费用最大值 // public static final BigInteger GAS_LIMIT = BigInteger.valueOf(4300000L); public static final BigInteger GAS_LIMIT = Convert.toWei("100000", Convert.Unit.WEI).toBigInteger(); private static StaticGasProvider getStaticGasProvider(){ return new StaticGasProvider(GAS_PRICE,GAS_LIMIT); @@ -70,13 +67,13 @@ private static String getGas() { String gas = "5"; try{ String resp = HttpUtil.get("https://gbsc.blockscan.com/gasapi.ashx?apikey=key&method=gasoracle"); JSONObject data = JSONObject.parseObject(resp); gas = data.getString("FastGasPrice"); }catch (Exception exception) { exception.printStackTrace(); } // try{ // String resp = HttpUtil.get("https://gbsc.blockscan.com/gasapi.ashx?apikey=key&method=gasoracle"); // JSONObject data = JSONObject.parseObject(resp); // gas = data.getString("FastGasPrice"); // }catch (Exception exception) { // exception.printStackTrace(); // } return StrUtil.isBlank(gas) ? "5" : gas; } @@ -92,12 +89,12 @@ // 合约地址 TODO // private static String contractAddr = "0xb5a1aC0fA05BFb8ad16B231e84b0bAC1d46eAfD0";//测试 private static String contractAddr = "0xB4fAAfD3884316AaEE342fda57E84996c70F1A75"; private static String contractAddr = "0x532B0F9554D92b8BF1bdE85DD4E8b86E4228DE27"; // 操作账号 手续费钱包地址的私钥(合约里会把手续费转到你这个私钥地址上) 用于操作合约内方法 TODO // private static String privateKey = "0x5672e3b09eae475fc2ad725757874b453b9c7ed76bb3df76340a96c819de0845";//测试 private static String privateKey = "221be67f85375a5af6dd0f4b77fbe877ad2e57e05db201de1b1383fb76494d18";//测试 private static String privateKey = AppContants.FEE_ADDRESS_KEY.get("feeAddressKey").toString() ; // private static String privateKey = AppContants.FEE_ADDRESS_KEY.get("feeAddressKey").toString() ; private EthFilter getFilter(BigInteger startBlock) { if (startBlock != null) { @@ -178,8 +175,9 @@ public static void main(String[] args) { ContractMain contractMain = new ContractMain(); String address = "0xd9076245473060dda1a65f5f3d89a4d0598995e6"; BigInteger bigInteger = new BigInteger(Convert.toWei("0.00105", Convert.Unit.ETHER).setScale(0).toString()); String address = "0xA60AaC0da34C76F3f60207ee09e9F75043319ab4"; // String address = "0x785D5Aa2951Ac4C6f28Dc593AF0b0536Dd3E82Fe"; BigInteger bigInteger = new BigInteger(Convert.toWei("0.001", Convert.Unit.ETHER).setScale(0).toString()); String hash = contractMain.trans(bigInteger,address); System.out.println(hash); } src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
@@ -8,13 +8,11 @@ import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.dapp.dto.*; import cc.mrbird.febs.dapp.entity.DappMemberEntity; import cc.mrbird.febs.dapp.entity.DappNodeOrderEntity; import cc.mrbird.febs.dapp.service.DappMemberService; import cc.mrbird.febs.dapp.service.DappSystemService; import cc.mrbird.febs.dapp.service.DappWalletService; import cc.mrbird.febs.dapp.vo.ActiveNftListVo; import cc.mrbird.febs.dapp.vo.ApiRunListInfoVo; import cc.mrbird.febs.dapp.vo.TeamListVo; import cc.mrbird.febs.dapp.vo.WalletInfoVo; import cc.mrbird.febs.dapp.vo.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; @@ -53,6 +51,15 @@ return new FebsResponse().success().data(walletInfoVo); } @ApiOperation(value = "获取节点信息", notes = "获取节点信息") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = DappNodeOrderVo.class) }) @PostMapping(value = "/nodeInfo") public FebsResponse nodeInfo() { return dappMemberService.getNodeInfo(); } @ApiOperation(value = "转账", notes = "转账") @PostMapping(value = "/transfer") public FebsResponse transfer(@RequestBody TransferDto transferDto) { src/main/java/cc/mrbird/febs/dapp/dto/TransferDto.java
@@ -40,6 +40,9 @@ @ApiModelProperty(value = "1-余额 2-钱包") private Integer buyType; @ApiModelProperty(value = "节点编码") private String nodeCode; @ApiModelProperty(hidden = true) private Long memberId; } src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
@@ -51,6 +51,16 @@ this.fromHash = fromHash; } public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status, BigDecimal fee, String fromHash,String toHash) { this.memberId = memberId; this.amount = amount; this.type = type; this.status = status; this.fee = fee; this.fromHash = fromHash; this.toHash = toHash; } public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status, BigDecimal fee, String fromHash,Long systemProfitId) { this.memberId = memberId; this.amount = amount; @@ -68,6 +78,7 @@ /** * 类型 1-买入 2-矩阵收益 3-直推收益 4-保险池 5-提现 6-手续费充值 7-手续费扣除 8-结算 9-冻结 10-冻结释放 11-产矿 12-手续费返利 * 类型 1-加入动能 2-技术方收益 3-直推收益 4-层级收益 5-剩余层级收益给系统 6-复投动能 7-动能收益 8-结算 9-冻结 10-冻结释放 11-产矿 12-手续费返利 * 类型 1-认购节点 2-直推收益 3-技术方收款 */ private Integer type; @@ -85,7 +96,9 @@ private String address; private BigDecimal fee; /** * 用来存放用户购买节点的节点编码 */ private String toHash; private String fromHash; @@ -93,6 +106,8 @@ private BigDecimal newestPrice; private BigDecimal targetAmount; /** * 会员节点表ID-对应认购记录 */ private Long systemProfitId; } src/main/java/cc/mrbird/febs/dapp/entity/DappMemberNodeEntity.java
New file @@ -0,0 +1,39 @@ package cc.mrbird.febs.dapp.entity; import cc.mrbird.febs.common.entity.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.math.BigDecimal; /** * 会员节点表 */ @Data @TableName("dapp_member_node") public class DappMemberNodeEntity extends BaseEntity { /** * 会员id */ private Long memberId; /** * 节点ID */ private Long nodeId; /** * 节点编码 */ private String nodeCode; /** * 节点价格 */ private BigDecimal nodePrice; public DappMemberNodeEntity(Long memberId, Long nodeId, String nodeCode, BigDecimal nodePrice) { this.memberId = memberId; this.nodeId = nodeId; this.nodeCode = nodeCode; this.nodePrice = nodePrice; } } src/main/java/cc/mrbird/febs/dapp/entity/DappNodeOrderEntity.java
@@ -1,4 +1,37 @@ package cc.mrbird.febs.dapp.entity; public class DappNodeOrderEntity { import cc.mrbird.febs.common.entity.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.math.BigDecimal; /** * 节点表 */ @Data @TableName("dapp_node_order") public class DappNodeOrderEntity extends BaseEntity { /** * 节点编码 */ private String nodeCode; /** * 节点名称 */ private String nodeName; /** * 总数 */ private Integer totalCnt; /** * 剩余数量 */ private Integer surplusCnt; /** * 价格 */ private BigDecimal price; } src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java
@@ -4,6 +4,8 @@ @Getter public enum DataDictionaryEnum { // 前期节点归集地址 TOTAL_ADDRESS("SYSTEM_SETTING","TOTAL_ADDRESS"), // 分发地址的私钥 FEE_ADDRESS_KEY("SYSTEM_SETTING","FEE_ADDRESS_KEY"), // 复投盈利收益 src/main/java/cc/mrbird/febs/dapp/enumerate/NodeCodeEnum.java
New file @@ -0,0 +1,25 @@ package cc.mrbird.febs.dapp.enumerate; import lombok.Getter; /** * 节点编码枚举 */ @Getter public enum NodeCodeEnum { NODE_1("NODE_CODE", "node_1"), NODE_2("NODE_CODE", "node_2"), NODE_3("NODE_CODE", "node_3"), NODE_4("NODE_CODE", "node_4"), NODE_5("NODE_CODE", "node_5"), SUPER_NODE("NODE_CODE", "super_node"); private String type; private String code; NodeCodeEnum(String type, String code) { this.type = type; this.code = code; } } src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberNodeMapper.java
New file @@ -0,0 +1,21 @@ package cc.mrbird.febs.dapp.mapper; import cc.mrbird.febs.dapp.entity.DappMemberNodeEntity; import cc.mrbird.febs.dapp.vo.DappMemberNodeVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; import java.util.List; public interface DappMemberNodeMapper extends BaseMapper<DappMemberNodeEntity> { /** * 根据会员ID获取会员的节点买卖记录 * @param id * @return */ List<DappMemberNodeVo> selectListByMemberId(@Param("memberId")Long id); DappMemberNodeEntity selectNodeByMemberId(@Param("memberId")Long id); DappMemberNodeEntity selectNodeByMemberIdAndNodeCode(@Param("memberId")Long id, @Param("nodeCode")String code); } src/main/java/cc/mrbird/febs/dapp/mapper/DappNodeOrderMapper.java
New file @@ -0,0 +1,15 @@ package cc.mrbird.febs.dapp.mapper; import cc.mrbird.febs.dapp.entity.DappNodeOrderEntity; import cc.mrbird.febs.dapp.vo.DappNodeOrderVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; import java.util.List; public interface DappNodeOrderMapper extends BaseMapper<DappNodeOrderEntity> { List<DappNodeOrderVo> selectNodeOrderList(); DappNodeOrderEntity selectNodeOrderByNodeCode(@Param("nodeCode")String nodeCode); } src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java
@@ -1,5 +1,6 @@ package cc.mrbird.febs.dapp.service; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.dapp.dto.ApproveDto; import cc.mrbird.febs.dapp.dto.ConnectDto; @@ -54,4 +55,10 @@ IPage<AdminSystemProfitFlowListVo> getSystemProfitFlowList(DappSystemProfit dappSystemProfit, QueryRequest request); IPage<AdminTeamInfoVo> getTeamInfo(DappMemberEntity dappMemberEntity, QueryRequest request); /** * 获取节点信息 * @return */ FebsResponse getNodeInfo(); } src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
@@ -2,6 +2,7 @@ import cc.mrbird.febs.common.configure.i18n.MessageSourceUtils; import cc.mrbird.febs.common.contants.AppContants; 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.common.utils.FebsUtil; @@ -59,6 +60,8 @@ private final DappSystemProfitDao dappSystemProfitDao; private final ChainProducer chainProducer; private final DappFundFlowDao dappFundFlowDao; private final DappNodeOrderMapper dappNodeOrderMapper; @Override @Transactional(rollbackFor = Exception.class) @@ -474,6 +477,12 @@ return adminTeamInfoVoIPage; } @Override public FebsResponse getNodeInfo() { List<DappNodeOrderVo> dappNodeOrderVos = dappNodeOrderMapper.selectNodeOrderList(); return new FebsResponse().success().data(dappNodeOrderVos); } public TeamListVo buildTeamMatrix(Long memberId) { DappMemberEntity member = dappMemberDao.selectById(memberId); TeamListVo teamListVo = new TeamListVo(); src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java
@@ -58,6 +58,8 @@ private final ChainProducer chainProducer; private final ContractMain contractMain; private final DappMemberNodeMapper dappMemberNodeMapper; @Override public SystemDto system() { @@ -469,21 +471,57 @@ return; } Integer count = dappFundFlowDao.updateStatusById(DappFundFlowEntity.WITHDRAW_STATUS_AGREE,dappFundFlowEntity.getId()); // if(count > 0){ // DappFundFlowEntity dappFundFlow = dappFundFlowDao.selectById(id); // //金额 // BigDecimal amount = dappFundFlow.getAmount(); // //目标地址 // String address = dappFundFlow.getAddress(); // // String hash = ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer(address, amount); // String hash = ChainService.getInstance(ChainEnum.BNB.name()).transferBaseToken(address, amount); // if(StrUtil.isEmpty(hash)){ // return; // } // log.info("{},{}",id,hash); // dappFundFlow.setFromHash(hash); // dappFundFlowDao.updateById(dappFundFlow); // } if(count > 0){ /** * 转账直推收益 */ DappFundFlowEntity dappFundFlow = dappFundFlowDao.selectById(id); //金额 BigDecimal amount = dappFundFlow.getAmount(); //目标地址 String address = dappMemberEntity.getAddress(); /** * 发起USDT转账 */ BigInteger bigInteger = new BigInteger(Convert.toWei(amount.toString(), Convert.Unit.ETHER).setScale(0).toString()); log.info("{}",bigInteger); String hash = contractMain.trans(bigInteger,address); // String hash = ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer(address, amount); //// String hash = ChainService.getInstance(ChainEnum.BNB.name()).transferBaseToken(address, amount); if(StrUtil.isEmpty(hash)){ return; } log.info("{},{}",id,hash); dappFundFlow.setFromHash(hash); dappFundFlowDao.updateById(dappFundFlow); /** * 把剩余的归集到一个地址中 */ Long systemProfitId = dappFundFlow.getSystemProfitId(); DappMemberNodeEntity dappMemberNodeEntity = dappMemberNodeMapper.selectById(systemProfitId); BigDecimal nodePrice = dappMemberNodeEntity.getNodePrice(); nodePrice = nodePrice.subtract(amount); DataDictionaryCustom totalAddressDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.TOTAL_ADDRESS.getType(), DataDictionaryEnum.TOTAL_ADDRESS.getCode() ); BigInteger nodePriceBigInteger = new BigInteger(Convert.toWei(nodePrice.toString(), Convert.Unit.ETHER).setScale(0).toString()); log.info("{}",nodePriceBigInteger); String hashBigInteger = contractMain.trans(nodePriceBigInteger,totalAddressDic.getValue()); // ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer(totalAddressDic.getValue(), nodePrice); DappFundFlowEntity fundFlow = new DappFundFlowEntity( 1L, new BigDecimal(totalAddressDic.getValue()), 3, 2, BigDecimal.ZERO, hashBigInteger, dappMemberNodeEntity.getNodeCode()); dappFundFlowDao.insert(fundFlow); } } @Override @@ -556,9 +594,11 @@ if(DappFundFlowEntity.WITHDRAW_STATUS_ING != dappFundFlow.getIsReturn()){ return; } //用户已经加入动能队列 DappSystemProfit dappSystemProfit = dappSystemProfitDao.selectById(dappFundFlow.getSystemProfitId()==null ? 0L : dappFundFlow.getSystemProfitId()); if(ObjectUtil.isEmpty(dappSystemProfit)){ /** * 用户是否已经生成节点购买记录 */ DappMemberNodeEntity dappMemberNodeEntity = dappMemberNodeMapper.selectById(dappFundFlow.getSystemProfitId() == null ? 0L : dappFundFlow.getSystemProfitId()); if(ObjectUtil.isEmpty(dappMemberNodeEntity)){ return; } //金额 src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
@@ -13,10 +13,12 @@ import cc.mrbird.febs.dapp.dto.*; import cc.mrbird.febs.dapp.entity.*; import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum; import cc.mrbird.febs.dapp.enumerate.NodeCodeEnum; import cc.mrbird.febs.dapp.mapper.*; import cc.mrbird.febs.dapp.service.DappWalletService; import cc.mrbird.febs.dapp.utils.BoxUtil; import cc.mrbird.febs.dapp.vo.ActiveNftListVo; import cc.mrbird.febs.dapp.vo.DappMemberNodeVo; import cc.mrbird.febs.dapp.vo.WalletInfoVo; import cc.mrbird.febs.rabbit.producer.ChainProducer; import cn.hutool.core.collection.CollUtil; @@ -63,6 +65,9 @@ private final DappSystemDao dappSystemDao; private final DappSystemProfitDao dappSystemProfitDao; private final DappNodeOrderMapper dappNodeOrderMapper; private final DappMemberNodeMapper dappMemberNodeMapper; @Override public WalletInfoVo walletInfo() { DappMemberEntity member = LoginUserUtil.getAppUser(); @@ -92,49 +97,15 @@ walletInfo.setLevelProfit(levelProfit); BigDecimal luckyProfit = dappFundFlowDao.selectSumAmountByMemberIdAndTypeAndStatus(memberInfo.getId(),7,2); walletInfo.setLuckyProfit(luckyProfit); // //获取当前是第几轮队列 // String redisKey = "QUEUE_COUNT"; // String memberOutCount = redisUtils.getString(redisKey); // DataDictionaryCustom queueCountSet = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.QUEUE_COUNT.getType(), DataDictionaryEnum.QUEUE_COUNT.getCode()); // String queueCount = queueCountSet.getValue(); // if(StrUtil.isBlank(memberOutCount)){ // redisUtils.set(redisKey,queueCount,0L); // memberOutCount = queueCount; // } // //出局条件的人数 // /** // * 初始大小 5+4*0 // * 1 1,2,3,4,5 1出局 5+4*0 // * 2 2,3,4,5,1(复投),7,8,9,10 2出局 5+4*1 // * 3 3,4,5,1(复投),7,8,9,10,2(复投),12,13,14,15 3出局 5+4*2 // * 4 4,5,1(复投),7,8,9,10,2(复投),12,13,14,15,3(复投),17,18,19,20 4出局 5+4*3 // */ // Integer memberCount = Integer.parseInt(memberOutCount) * 4 + 5; // //判断当前是否符合出局条件 // QueryWrapper<DappSystemProfit> objectQueryWrapper = new QueryWrapper<>(); // objectQueryWrapper.eq("state",DappSystemProfit.STATE_IN); // //实际投资人数 // Integer selectCount = dappSystemProfitDao.selectCount(objectQueryWrapper); // BigDecimal memberRunPercent = BigDecimal.ZERO; // List<DappSystemProfit> dappSystemProfits = dappSystemProfitDao.selectDappSysstemProfitByState(DappSystemProfit.STATE_IN); // if(CollUtil.isEmpty(dappSystemProfits)){ // walletInfo.setRunPercent(memberRunPercent); // } // // for(int i=0;i<dappSystemProfits.size();i++){ // DappSystemProfit systemProfit = dappSystemProfits.get(i); // if(memberInfo.getId() == systemProfit.getMemberId()){ // BigDecimal size = new BigDecimal(dappSystemProfits.size()); // memberRunPercent = size.subtract(new BigDecimal(i+1)); // } // } // BigDecimal runPercent = memberRunPercent.divide(new BigDecimal(memberCount), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)); // walletInfo.setRunPercent(runPercent); if(DataDictionaryEnum.BIG_BOSS.getCode().equals(memberInfo.getAccountType())){ walletInfo.setRunPercent(new BigDecimal(100)); }else{ walletInfo.setRunPercent(new BigDecimal(90)); } //获取会员节点信息 List<DappMemberNodeVo> dappMemberNodeVos = dappMemberNodeMapper.selectListByMemberId(member.getId()); walletInfo.setDappMemberNodeVos(dappMemberNodeVos); return walletInfo; } @@ -186,7 +157,6 @@ @Override public Long transfer(TransferDto transferDto) { DappMemberEntity member = LoginUserUtil.getAppUser(); // DappMemberEntity member = dappMemberDao.selectById(transferDto.getMemberId()); String upgrade = redisUtils.getString("APP_UPGRADE"); if ("upgrade".equals(upgrade)) { @@ -199,7 +169,9 @@ throw new FebsException("Do not repeat purchase"); } } /** * buyType=1,余额购买 */ if (transferDto.getBuyType() == 1) { DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId()); if (transferDto.getAmount().compareTo(walletCoin.getAvailableAmount()) > 0) { @@ -211,14 +183,43 @@ DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount().negate(), 1, 2, transferDto.getFee(), transferDto.getTxHash()); dappFundFlowDao.insert(fundFlow); chainProducer.sendAchieveTreeMsg(member.getId()); // chainProducer.sendAchieveTreeMsg(member.getId()); } else { /** * buyType=2,钱包购买 */ int type = 1; // 1-认购 2-充值tfc if (transferDto.getType() == 2) { type = 6; } /** * 第一次请求,生成一条资金流水ID,并且返回。 */ if (transferDto.getId() == null) { /** * 验证节点的价格是否和入参价格一致 */ String nodeCode = transferDto.getNodeCode(); DappNodeOrderEntity dappNodeOrderEntity = dappNodeOrderMapper.selectNodeOrderByNodeCode(nodeCode); BigDecimal price = dappNodeOrderEntity.getPrice(); BigDecimal amount = transferDto.getAmount(); if(price.compareTo(amount) != 0){ throw new FebsException("刷新后重试"); // throw new FebsException("Refresh and try again"); } /** * 超级节点只允许购买一次 */ DappMemberNodeEntity superNode = dappMemberNodeMapper.selectNodeByMemberIdAndNodeCode( member.getId(), NodeCodeEnum.SUPER_NODE.getCode()); if(ObjectUtil.isNotEmpty(superNode)){ throw new FebsException("超级节点只允许购买一次"); // throw new FebsException("Super nodes are only allowed to be purchased once"); } DappFundFlowEntity fundFlowOld = dappFundFlowDao.selectBymemberIdAndType(member.getId(),type); if(ObjectUtil.isNotEmpty(fundFlowOld)){ //网络问题导致第二次提交前,未成功就关闭了页面 @@ -227,7 +228,7 @@ } throw new FebsException("Refresh and try again"); } DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount(), type, 1, transferDto.getFee(), transferDto.getTxHash()); DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount(), type, 1, transferDto.getFee(), transferDto.getTxHash(),transferDto.getNodeCode()); dappFundFlowDao.insert(fundFlow); return fundFlow.getId(); } @@ -235,51 +236,72 @@ if ("success".equals(transferDto.getFlag())) { DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId()); if(DappFundFlowEntity.WITHDRAW_STATUS_AGREE == flow.getStatus()){ throw new FebsException("Do not repeat purchase"); throw new FebsException("请勿重复提交"); // throw new FebsException("Do not repeat purchase"); } //是否已经加入动能 DappSystemProfit dappSystemProfitIng = dappSystemProfitDao.selectByMemberIdAndState(member.getId(), DappSystemProfit.STATE_IN); if(ObjectUtil.isNotEmpty(dappSystemProfitIng)){ throw new FebsException("Do not repeat purchase"); } //插入一条会员入列记录,即加入动能队列 DappSystemProfit dappSystemProfit = new DappSystemProfit(member.getId(), flow.getAmount()); dappSystemProfitDao.insert(dappSystemProfit); /** * 生成会员节点表记录 */ String nodeCode = transferDto.getNodeCode(); DappNodeOrderEntity dappNodeOrderEntity = dappNodeOrderMapper.selectNodeOrderByNodeCode(nodeCode); DappMemberNodeEntity dappMemberNodeEntityNew = new DappMemberNodeEntity( member.getId(), dappNodeOrderEntity.getId(), dappNodeOrderEntity.getNodeCode(), transferDto.getAmount() ); dappMemberNodeMapper.insert(dappMemberNodeEntityNew); /** * 是否已经购买了节点 */ // DappMemberNodeEntity dappMemberNodeEntity = dappMemberNodeMapper.selectNodeByMemberId(member.getId()); // if(ObjectUtil.isNotEmpty(dappMemberNodeEntity)){ // throw new FebsException("Do not repeat purchase"); // } /** * 流水关联用户购买节点记录 */ flow.setSystemProfitId(dappMemberNodeEntityNew.getId()); /** * 链上转账的hash值 */ flow.setFromHash(transferDto.getTxHash()); flow.setSystemProfitId(dappSystemProfit.getId()); flow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE); dappFundFlowDao.updateById(flow); //升级成为Agent dappMemberDao.updateMemberAccountType(DataDictionaryEnum.AGENT.getCode(),member.getId()); dappMemberDao.updateMemberActiveStatus(1,member.getId()); //直接拿走0.05个BNB放入技术方 DataDictionaryCustom systemProfit = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SYSTEM_PROFIT.getType(), DataDictionaryEnum.SYSTEM_PROFIT.getCode()); String systemProfitStr = StrUtil.isEmpty(systemProfit.getValue()) ? "0.05" : systemProfit.getValue(); DappFundFlowEntity systemProfitFlow = new DappFundFlowEntity(1L, new BigDecimal(systemProfitStr), 2, 1, BigDecimal.ZERO, null,dappSystemProfit.getId()); dappFundFlowDao.insert(systemProfitFlow); //发送转币消息 // chainProducer.sendBnbTransferMsg(systemProfitFlow.getId()); //直接返利30%给直接上级 /** * 升级账号类型为对应的节点名称 */ // dappMemberDao.updateMemberAccountType(dappNodeOrderEntity.getNodeName(),member.getId()); /** * 更新账号的状态为已激活-即已经购买节点 */ // dappMemberDao.updateMemberActiveStatus(1,member.getId()); /** * 直推奖励 */ DappMemberEntity dappMemberEntity = dappMemberDao.selectById(member.getId()); String refererId = dappMemberEntity.getRefererId(); DappMemberEntity refererMember = dappMemberDao.selectMemberInfoByInviteId(refererId); DataDictionaryCustom directProfitSet = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.DIRECT_PROFIT.getType(), DataDictionaryEnum.DIRECT_PROFIT.getCode()); BigDecimal directProfitStr = new BigDecimal(StrUtil.isEmpty(directProfitSet.getValue()) ? "0.3" : directProfitSet.getValue()); BigDecimal subtract = transferDto.getAmount().subtract(new BigDecimal(systemProfitStr)); BigDecimal directProfit = subtract.multiply(directProfitStr).setScale(6,BigDecimal.ROUND_DOWN); DappFundFlowEntity fundFlow = new DappFundFlowEntity(refererMember.getId(), directProfit, 3, 1, BigDecimal.ZERO, null,dappSystemProfit.getId()); DataDictionaryCustom directProfitDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.DIRECT_PROFIT.getType(), DataDictionaryEnum.DIRECT_PROFIT.getCode()); BigDecimal directProfitPercent = new BigDecimal(StrUtil.isEmpty(directProfitDic.getValue()) ? "0.1" : directProfitDic.getValue()); BigDecimal amount = transferDto.getAmount(); BigDecimal directProfit = amount.multiply(directProfitPercent).setScale(6,BigDecimal.ROUND_DOWN); //生成直推奖励的流水 DappFundFlowEntity fundFlow = new DappFundFlowEntity( refererMember.getId(), directProfit, 3, 1, BigDecimal.ZERO, null, dappMemberNodeEntityNew.getId()); dappFundFlowDao.insert(fundFlow); //发送转币消息 /** * 发送转币消息 */ chainProducer.sendBnbTransferMsg(fundFlow.getId()); //层级奖励30% chainProducer.sendLevelProfitMsg(dappSystemProfit.getId()); //发送一个消息,计算当前是否有人可以出局 chainProducer.sendMemberOutMsg(dappSystemProfit.getId()); } else { DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId()); if (flow.getStatus() == 1) { src/main/java/cc/mrbird/febs/dapp/vo/DappMemberNodeVo.java
New file @@ -0,0 +1,28 @@ 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 = "DappMemberNodeVo", description = "会员节点购买信息") public class DappMemberNodeVo { /** * 节点编码 */ @ApiModelProperty(value = "节点编码") private String nodeCode; /** * 节点名称 */ @ApiModelProperty(value = "节点名称") private String nodeName; /** * 价格 */ @ApiModelProperty(value = "节点价格") private BigDecimal nodePrice; } src/main/java/cc/mrbird/febs/dapp/vo/DappNodeOrderVo.java
New file @@ -0,0 +1,38 @@ 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 = "DappNodeOrderVo", description = "节点信息") public class DappNodeOrderVo { /** * 节点编码 */ @ApiModelProperty(value = "节点编码") private String nodeCode; /** * 节点名称 */ @ApiModelProperty(value = "节点名称") private String nodeName; /** * 总数 */ @ApiModelProperty(value = "总数") private Integer totalCnt; /** * 剩余数量 */ @ApiModelProperty(value = "剩余数量") private Integer surplusCnt; /** * 价格 */ @ApiModelProperty(value = "价格") private BigDecimal price; } src/main/java/cc/mrbird/febs/dapp/vo/WalletInfoVo.java
@@ -5,6 +5,7 @@ import lombok.Data; import java.math.BigDecimal; import java.util.List; /** * @author @@ -55,4 +56,8 @@ @ApiModelProperty(value = "保险池") private BigDecimal safePool; @ApiModelProperty(value = "会员节点购买信息") private List<DappMemberNodeVo> dappMemberNodeVos; } src/main/resources/application-dev.yml
@@ -29,11 +29,11 @@ # Redis数据库索引(默认为 0) database: 11 # Redis服务器地址 host: 154.91.195.148 host: 120.27.238.55 # Redis服务器连接端口 port: 6379 port: 6479 # Redis 密码 password: dapp!@#123 password: d3y6dsdl;f.327 lettuce: pool: # 连接池中的最小空闲连接 @@ -47,10 +47,10 @@ # 连接超时时间(毫秒) timeout: 5000 rabbitmq: host: 154.91.195.148 host: 120.27.238.55 port: 5672 username: xc_rabbit password: xuncong123 username: ct_rabbit password: 123456 publisher-confirm-type: correlated system: @@ -58,4 +58,4 @@ chain-listener: false reset-job: false quartz-job: false debug: true debug: false src/main/resources/mapper/dapp/DappFundFlowDao.xml
@@ -42,9 +42,9 @@ <select id="selectByFromHash" resultType="cc.mrbird.febs.dapp.entity.DappFundFlowEntity"> select * from dapp_fund_flow where from_hash=#{txHash} where from_hash = #{txHash} <if test="status != null"> and status=#{status} and status = #{status} </if> </select> src/main/resources/mapper/dapp/DappMemberNodeMapper.xml
New file @@ -0,0 +1,30 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cc.mrbird.febs.dapp.mapper.DappMemberNodeMapper"> <select id="selectListByMemberId" resultType="cc.mrbird.febs.dapp.vo.DappMemberNodeVo"> select a.node_code nodeCode, b.node_name nodeName, a.node_price nodePrice from dapp_member_node a inner join dapp_node_order b on a.node_id = b.id where a.member_id = #{memberId} </select> <select id="selectNodeByMemberId" resultType="cc.mrbird.febs.dapp.entity.DappMemberNodeEntity"> select a.* from dapp_member_node a where a.member_id = #{memberId} </select> <select id="selectNodeByMemberIdAndNodeCode" resultType="cc.mrbird.febs.dapp.entity.DappMemberNodeEntity"> select a.* from dapp_member_node a where a.member_id = #{memberId} and a.node_code = #{nodeCode} </select> </mapper> src/main/resources/mapper/dapp/DappNodeOrderMapper.xml
New file @@ -0,0 +1,22 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cc.mrbird.febs.dapp.mapper.DappNodeOrderMapper"> <select id="selectNodeOrderList" resultType="cc.mrbird.febs.dapp.vo.DappNodeOrderVo"> select a.node_code, a.node_name, a.total_cnt, a.surplus_cnt, a.price from dapp_node_order a </select> <select id="selectNodeOrderByNodeCode" resultType="cc.mrbird.febs.dapp.entity.DappNodeOrderEntity"> select a.* from dapp_node_order a where a.node_code = #{nodeCode} </select> </mapper> src/test/java/cc/mrbird/febs/MemberTest.java
@@ -5,15 +5,12 @@ import cc.mrbird.febs.dapp.chain.ChainEnum; import cc.mrbird.febs.dapp.chain.ChainService; import cc.mrbird.febs.dapp.contract.ContractMain; 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.rabbit.producer.ChainProducer; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.Test; @@ -21,7 +18,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.web3j.utils.Convert; import java.lang.reflect.Field; import java.math.BigDecimal; import java.math.BigInteger; import java.util.List; @@ -80,8 +76,11 @@ private SystemConstants systemConstants; @Test public void balance() { System.out.println(ObjectUtil.isEmpty(AppContants.FEE_ADDRESS_KEY)); System.out.println(AppContants.FEE_ADDRESS_KEY.get("feeAddressKey").toString()); /** * 从contractAddress合约地址中转移对应发行的代币到address中 */ String hash = ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer("0x785D5Aa2951Ac4C6f28Dc593AF0b0536Dd3E82Fe",new BigDecimal(100)); System.out.println(hash); } @Test