src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/dapp/vo/ApiDirectInfoVo.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/job/ProfitDailyJob.java | ●●●●● patch | view | raw | blame | history | |
src/main/resources/mapper/dapp/DappMemberDao.xml | ●●●●● patch | view | raw | blame | history | |
src/test/java/cc/mrbird/febs/MemberTest.java | ●●●●● patch | view | raw | blame | history |
src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
@@ -48,12 +48,21 @@ return new FebsResponse().success().data(dappWalletService.storageIndex()); } @ApiOperation(value = "直推有效人数排名前十", notes = "直推有效人数排名前十") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiDirectInfoVo.class) }) @PostMapping(value = "/directIndex") public FebsResponse directIndex() { return new FebsResponse().success().data(dappWalletService.directNumIndex()); } @ApiOperation(value = "直推总业绩排名前十", notes = "直推总业绩排名前十") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiStorageInfoVo.class) }) @PostMapping(value = "/directIndex") public FebsResponse directIndex() { @PostMapping(value = "/directIndexV2") public FebsResponse directIndexV2() { return new FebsResponse().success().data(dappWalletService.directIndex()); } src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java
@@ -7,6 +7,7 @@ import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; import java.util.Date; import java.util.List; /** @@ -43,4 +44,6 @@ DappMemberEntity selectNewestDirectMember(@Param("inviteId") String inviteId); List<DappMemberEntity> selectMemberListNeedProfit(); List<DappMemberEntity> selectListByDate(@Param("date") Date date); } src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
@@ -7,10 +7,7 @@ import cc.mrbird.febs.dapp.entity.DappFundFlowEntity; import cc.mrbird.febs.dapp.entity.DappWalletCoinEntity; import cc.mrbird.febs.dapp.entity.DappWalletMineEntity; import cc.mrbird.febs.dapp.vo.ApiIndexInfoVo; import cc.mrbird.febs.dapp.vo.ApiStorageInfoVo; import cc.mrbird.febs.dapp.vo.MemberNodeVo; import cc.mrbird.febs.dapp.vo.WalletInfoVo; import cc.mrbird.febs.dapp.vo.*; import com.baomidou.mybatisplus.core.metadata.IPage; import java.math.BigDecimal; @@ -65,4 +62,6 @@ List<ApiStorageInfoVo> storageIndex(); List<ApiStorageInfoVo> directIndex(); List<ApiDirectInfoVo> directNumIndex(); } src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java
@@ -1007,6 +1007,7 @@ for(DappMemberEntity directMember : directMembers){ //每一个直推的团队 List<DappMemberEntity> direct = dappMemberDao.selectChildMemberDirectOrNot(directMember.getInviteId(), 2, null); direct.add(directMember); if(CollUtil.isEmpty(direct)){ continue; } src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
@@ -761,6 +761,59 @@ return apiStorageInfoVos; } @Override public List<ApiDirectInfoVo> directNumIndex() { List<ApiDirectInfoVo> apiDirectInfoVos = new ArrayList<>(); /** * 存放直推人数<上级的memberId,直推人数> */ HashMap<Long, BigDecimal> map = new HashMap<>(); List<DappMemberEntity> dappMemberEntityList = dappMemberDao.selectListByDate(new Date()); if(CollUtil.isNotEmpty(dappMemberEntityList)){ for(DappMemberEntity member : dappMemberEntityList){ if(StrUtil.isEmpty(member.getRefererId())){ continue; } DappMemberEntity memberRef = dappMemberDao.selectMemberInfoByInviteId(member.getRefererId()); if(ObjectUtil.isEmpty(memberRef)){ continue; } Long id = memberRef.getId(); if(map.containsKey(id)){ BigDecimal bigDecimal = map.get(id); BigDecimal add = bigDecimal.add(new BigDecimal("1")); map.put(id,add); }else{ map.put(id,new BigDecimal("1")); } } } /** * 获取这个map的直推人数前十,分发奖励 */ if(!map.isEmpty()){ // 使用Stream API按照BigDecimal从大到小排序 List<Map.Entry<Long, BigDecimal>> topTenEntries = map.entrySet().stream() .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) .limit(10) .collect(Collectors.toList()); for (Map.Entry<Long, BigDecimal> entry : topTenEntries) { Long memberId = entry.getKey(); BigDecimal directCnt = entry.getValue(); ApiDirectInfoVo apiDirectInfoVo = new ApiDirectInfoVo(); apiDirectInfoVo.setAddress(dappMemberDao.selectById(memberId).getAddress()); apiDirectInfoVo.setAmount(directCnt); apiDirectInfoVos.add(apiDirectInfoVo); } } return apiDirectInfoVos; } public MemberNodeVo buildTeamMatrix(DbMemberNode dbMemberNode) { Long id = dbMemberNode.getId(); src/main/java/cc/mrbird/febs/dapp/vo/ApiDirectInfoVo.java
New file @@ -0,0 +1,18 @@ 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 = "ApiDirectInfoVo", description = "排名") public class ApiDirectInfoVo { @ApiModelProperty(value = "地址") private String address; @ApiModelProperty(value = "直推人数") private BigDecimal amount; } src/main/java/cc/mrbird/febs/job/ProfitDailyJob.java
@@ -224,15 +224,41 @@ * 另外50% 给予当天直推总业绩排名激励前10名,第1名40%,2-4名30%,5-10名30% */ BigDecimal directTotal = jiLiTotal.multiply(new BigDecimal("0.5")).setScale(2, BigDecimal.ROUND_DOWN); // /** // * 存放直推业绩<上级的memberId,直推总业绩> // */ // HashMap<Long, BigDecimal> map = new HashMap<>(); // // List<DappStorage> dappStorages = dappStorageMapper.selectListByDate(new Date()); // if(CollUtil.isNotEmpty(dappStorages)){ // for(DappStorage dappStorage : dappStorages){ // DappMemberEntity member = dappMemberDao.selectById(dappStorage.getMemberId()); // if(StrUtil.isEmpty(member.getRefererId())){ // continue; // } // DappMemberEntity memberRef = dappMemberDao.selectMemberInfoByInviteId(member.getRefererId()); // if(ObjectUtil.isEmpty(memberRef)){ // continue; // } // Long id = memberRef.getId(); // if(map.containsKey(id)){ // BigDecimal bigDecimal = map.get(id); // BigDecimal add = bigDecimal.add(dappStorage.getAmount()); // map.put(id,add); // }else{ // map.put(id,dappStorage.getAmount()); // } // } // } /** * 存放直推业绩<上级的memberId,直推总业绩> * 存放直推人数<上级的memberId,直推人数> */ HashMap<Long, BigDecimal> map = new HashMap<>(); List<DappStorage> dappStorages = dappStorageMapper.selectListByDate(new Date()); if(CollUtil.isNotEmpty(dappStorages)){ for(DappStorage dappStorage : dappStorages){ DappMemberEntity member = dappMemberDao.selectById(dappStorage.getMemberId()); List<DappMemberEntity> dappMemberEntityList = dappMemberDao.selectListByDate(new Date()); if(CollUtil.isNotEmpty(dappMemberEntityList)){ for(DappMemberEntity member : dappMemberEntityList){ if(StrUtil.isEmpty(member.getRefererId())){ continue; } @@ -243,10 +269,10 @@ Long id = memberRef.getId(); if(map.containsKey(id)){ BigDecimal bigDecimal = map.get(id); BigDecimal add = bigDecimal.add(dappStorage.getAmount()); BigDecimal add = bigDecimal.add(new BigDecimal("1")); map.put(id,add); }else{ map.put(id,dappStorage.getAmount()); map.put(id,new BigDecimal("1")); } } } src/main/resources/mapper/dapp/DappMemberDao.xml
@@ -150,4 +150,15 @@ group by referer_id having count(1) > 3 ) b on a.invite_id=b.referer_id </select> <select id="selectListByDate" resultType="cc.mrbird.febs.dapp.entity.DappMemberEntity"> select * from dapp_member where date_format(create_time, '%Y-%m-%d') = date_format(#{date}, '%Y-%m-%d') order by create_time desc </select> </mapper> src/test/java/cc/mrbird/febs/MemberTest.java
@@ -1,13 +1,21 @@ package cc.mrbird.febs; import cc.mrbird.febs.dapp.chain.ChainEnum; import cc.mrbird.febs.dapp.chain.ChainService; import cc.mrbird.febs.dapp.dto.BatchTransferDto; import cc.mrbird.febs.dapp.entity.DappMemberEntity; import cc.mrbird.febs.dapp.entity.DappStorage; import cc.mrbird.febs.dapp.enumerate.MemberLevelEnum; import cc.mrbird.febs.dapp.mapper.DappMemberDao; import cc.mrbird.febs.dapp.mapper.DappStorageMapper; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.ArrayList; import java.util.*; import java.util.stream.Collectors; /** * @author wzy @@ -24,24 +32,119 @@ // @Resource // private DappSystemService dappSystemService; // // @Resource // private DappStorageMapper dappStorageMapper; @Resource private DappStorageMapper dappStorageMapper; // // @Resource // private DataDictionaryCustomMapper dataDictionaryCustomMapper; // // @Resource // private DappMemberDao dappMemberDao; @Resource private DappMemberDao dappMemberDao; // @Test public void register() {//注册 ArrayList<BatchTransferDto> objects = new ArrayList<>(); BatchTransferDto batchTransferDto = new BatchTransferDto("0x3caf594503573341ae7a83fc6daed9bd5276b6bd",new BigDecimal("3")); objects.add(batchTransferDto); List<DappMemberEntity> dappMemberEntities = dappMemberDao.selectList(null); for(DappMemberEntity memberEntityNow : dappMemberEntities){ DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberEntityNow.getId()); if(StrUtil.isEmpty(dappMemberEntity.getRefererIds())){ continue; } //获取全部上级 ArrayList<DappMemberEntity> activeMembers = new ArrayList<>(); List<String> refererIds = Arrays.asList(StrUtil.split(dappMemberEntity.getRefererIds(),",")); for(String inviteId : refererIds){ DappMemberEntity memberEntity = dappMemberDao.selectMemberInfoByInviteId(inviteId); if(ObjectUtil.isNotEmpty(memberEntity)){ activeMembers.add(memberEntity); } } if(CollUtil.isEmpty(activeMembers)){ continue; } BatchTransferDto batchTransferDtoFee = new BatchTransferDto("0x3caf594503573341ae7a83fc6daed9bd5276b6bd",new BigDecimal("4")); objects.add(batchTransferDtoFee); ChainService.getInstance(ChainEnum.BSC_USDT.name()).transferList(objects); for(DappMemberEntity activeMember : activeMembers){ //获取每一个上级的所有直推,分辨大小区是否满足业绩需求 List<DappMemberEntity> directMembers = dappMemberDao.selectChildMemberDirectOrNot(activeMember.getInviteId(), 1, null); if(CollUtil.isEmpty(directMembers)){ continue; } if(directMembers.size() < 2){ continue; } //获取activeMember的每一个直推的团队有效业绩 HashMap<Long, BigDecimal> daXiaoQu = new HashMap<>(); for(DappMemberEntity directMember : directMembers){ //每一个直推的团队 List<DappMemberEntity> direct = dappMemberDao.selectChildMemberDirectOrNot(directMember.getInviteId(), 2, null); direct.add(directMember); if(CollUtil.isEmpty(direct)){ continue; } //获取直推的团队的全部有效业绩 List<Long> collect = direct.stream().map(DappMemberEntity::getId).collect(Collectors.toList()); QueryWrapper<DappStorage> storageQueryWrapper = new QueryWrapper<>(); storageQueryWrapper.in("member_id",collect); // storageQueryWrapper.eq("state",1); List<DappStorage> dappStorages = dappStorageMapper.selectList(storageQueryWrapper); if(CollUtil.isEmpty(dappStorages)){ continue; } BigDecimal directAchieve = dappStorages.stream() .map(DappStorage::getAmount) // 映射amount到流中 .reduce(BigDecimal.ZERO, BigDecimal::add); daXiaoQu.put(directMember.getId(),directAchieve); } if(daXiaoQu.isEmpty()){ continue; } //输出小区的总业绩 BigDecimal sum = sumExcludingMax(daXiaoQu); BigDecimal dao_1_levelAchieve = new BigDecimal(MemberLevelEnum.DAO_1.getLevelAchieve()); BigDecimal dao_2_levelAchieve = new BigDecimal(MemberLevelEnum.DAO_2.getLevelAchieve()); BigDecimal dao_3_levelAchieve = new BigDecimal(MemberLevelEnum.DAO_3.getLevelAchieve()); if(sum.compareTo(dao_3_levelAchieve) >= 0){ activeMember.setLevel(MemberLevelEnum.DAO_3.getCode()); dappMemberDao.updateById(activeMember); }else if(sum.compareTo(dao_2_levelAchieve) >= 0 && sum.compareTo(dao_3_levelAchieve) < 0){ activeMember.setLevel(MemberLevelEnum.DAO_2.getCode()); dappMemberDao.updateById(activeMember); }else if(sum.compareTo(dao_1_levelAchieve) >= 0 && sum.compareTo(dao_2_levelAchieve) < 0){ activeMember.setLevel(MemberLevelEnum.DAO_1.getCode()); dappMemberDao.updateById(activeMember); }else{ activeMember.setLevel(MemberLevelEnum.DAO_0.getCode()); dappMemberDao.updateById(activeMember); } } } } public static BigDecimal sumExcludingMax(HashMap<Long, BigDecimal> map) { if (map == null) { throw new NullPointerException("HashMap cannot be null"); } // 使用Stream API找到最大的BigDecimal值及其对应的key Optional<Map.Entry<Long, BigDecimal>> maxEntry = map.entrySet().stream() .max((e1, e2) -> e1.getValue().compareTo(e2.getValue())); // 检查是否找到了最大值 if (maxEntry.isPresent()) { // 移除最大值对应的键值对 map.remove(maxEntry.get().getKey()); // 计算剩余数据的累计和 BigDecimal sumOfRemaining = map.entrySet().stream() .map(Map.Entry::getValue) .reduce(BigDecimal.ZERO, BigDecimal::add); // 返回累计和 return sumOfRemaining; } else { // 如果没有找到最大值(即HashMap为空),则返回BigDecimal.ZERO return BigDecimal.ZERO; } } // // @Test