xiaoyong931011
2023-08-06 65cf739fe077c398d35e58a083a1c7be40a3b7a2
src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
@@ -9,6 +9,7 @@
import cc.mrbird.febs.dapp.chain.ChainEnum;
import cc.mrbird.febs.dapp.chain.ChainService;
import cc.mrbird.febs.dapp.chain.ContractChainService;
import cc.mrbird.febs.dapp.contract.andao.AndaoContractMain;
import cc.mrbird.febs.dapp.dto.*;
import cc.mrbird.febs.dapp.entity.*;
import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum;
@@ -30,8 +31,10 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.helper.DataUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.web3j.utils.Strings;
import java.math.BigDecimal;
import java.util.*;
@@ -61,6 +64,9 @@
    private final DappMemberNodeMapper dappMemberNodeMapper;
    private final DappAKlineMapper dappAKlineMapper;
    private final DappUsdtPerkEntityMapper dappUsdtPerkEntityMapper;
    private final MallGoodsMapper mallGoodsMapper;
    private final MallOrderInfoMapper mallOrderInfoMapper;
    private final MallOrderItemMapper mallOrderItemMapper;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -138,25 +144,30 @@
        if (member == null) {
            String referenceID = null;
            int nodeType = 0;
            //
            if (!"asdf4321".equals(connectDto.getInviteId())) {
//                DappMemberEntity parent = dappMemberDao.selectMemberInfoByInviteId(connectDto.getInviteId());
                DappMemberEntity parent = dappMemberDao.selectByAddress(connectDto.getInviteId(), null);
                DappMemberEntity left = dappMemberDao.selectInviteLeft(connectDto.getInviteId());
                DappMemberEntity right = dappMemberDao.selectInviteRight(connectDto.getInviteId());
                if(ObjectUtil.isEmpty(left) && ObjectUtil.isEmpty(right)){
                    throw new FebsException("recommender is not exist");
                }
                if(ObjectUtil.isEmpty(left)){
                    nodeType = 2;
                }else{
                    nodeType = 1;
                }
                String inviteId = ObjectUtil.isEmpty(left) ? right.getInviteId() : left.getInviteId();
                DappMemberEntity parent = dappMemberDao.selectByAddress(inviteId, null);
                if (parent == null) {
                    throw new FebsException("recommender is not exist");
                }
                referenceID = parent.getInviteId();
//                List<DappMemberEntity> child = dappMemberDao.selectChildMemberDirectOrNot(connectDto.getInviteId(), 1, null);
//                if (child.size() == 6) {
//                    throw new FebsException("Invite Code is Invalid");
//                }
            } else {
                connectDto.setInviteId(null);
            }
            member = insertMember(connectDto.getAddress(), referenceID);
            //升级用户的代理等级
//            DappMemberEntity dappMemberEntity = dappMemberDao.selectMemberInfoByInviteId(connectDto.getInviteId());
//            chainProducer.sendAgentUpMsg(dappMemberEntity.getId());
            member = insertMember(connectDto.getAddress(), referenceID,nodeType);
        }
        String key = LoginUserUtil.getLoginKey(connectDto.getAddress(), connectDto.getNonce(), connectDto.getSign());
@@ -310,18 +321,19 @@
    }
    @Override
    public DappMemberEntity insertMember(String address, String refererId) {
    public DappMemberEntity insertMember(String address, String refererId,int nodeType) {
        return insertMember(address, refererId, "BSC", DataDictionaryEnum.MEMBER.getCode());
        return insertMember(address, refererId, "BSC", MemberLevelEnum.MEMBER.getType(),nodeType);
    }
    @Override
    public DappMemberEntity insertMember(String address, String refererId, String chainType, String accountType) {
    public DappMemberEntity insertMember(String address, String refererId, String chainType, String accountType,int nodeType) {
        DappMemberEntity member = new DappMemberEntity();
        member.setAddress(address);
        member.setChainType(chainType);
        member.setAccountType(accountType);
        member.setActiveStatus(2);
        member.setNodeType(nodeType);
        dappMemberDao.insert(member);
@@ -338,8 +350,10 @@
            // 若没有推荐人,则直接激活
            member.setActiveStatus(2);
        }
        member.setInviteId(ShareCodeUtil.toSerialCode(member.getId()));
        String inviteIdStr = ShareCodeUtil.toSerialCode(member.getId());
        member.setInviteId(inviteIdStr);
        member.setInviteLeft(inviteIdStr+"L");
        member.setInviteRight(inviteIdStr+"R");
        member.setRefererId(refererId);
        if (StrUtil.isNotBlank(refererId)) {
            boolean flag = false;
@@ -515,6 +529,10 @@
    public FebsResponse getMemberInfo() {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        DappMemberInfoVo dappMemberInfoVo = dappMemberDao.selectByMemberId(member.getId());
        if(StrUtil.isNotEmpty(dappMemberInfoVo.getAccountType())){
            String levelDescription = MemberLevelEnum.MEMBER.getLevelDescription(dappMemberInfoVo.getAccountType());
            dappMemberInfoVo.setAccountType(levelDescription);
        }
        BigDecimal amountPerkTotal = dappFundFlowDao.selectSumAmountByMemberIdAndTypeAndStatus(member.getId(),
                FundFlowEnum.MEMBER_AMOUNT_PERK_TOTAL.getCode(), 2);
@@ -558,6 +576,37 @@
        );
        dappMemberInfoVo.setCoinAPrice((ObjectUtil.isEmpty(coinAPriceDic) ? new BigDecimal("1") : new BigDecimal(coinAPriceDic.getValue()))
                .setScale(12,BigDecimal.ROUND_DOWN));
        /**
         * 今日涨幅
         */
        //最新的一条记录
        DappAKlineEntity dappAKlineNow = dappAKlineMapper.selectOneByType();
        BigDecimal closePriceNow = dappAKlineNow.getClosePrice();
        //拿日线的最后一条数据
        DappAKlineEntity dappAKlineStart = dappAKlineMapper.selectDayByType();
        BigDecimal closePriceStart = dappAKlineStart.getClosePrice();
        BigDecimal subtract = closePriceNow.subtract(closePriceStart);
        BigDecimal bigDecimal = subtract.divide(closePriceStart, 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_DOWN);
        dappMemberInfoVo.setTodayIncrease(bigDecimal);
        /**
         * 全网剩余ANDAO总量,燃烧ANDAO总量
         */
        DataDictionaryCustom coinACntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.COIN_A_CNT.getType(),
                PoolEnum.COIN_A_CNT.getCode()
        );
        dappMemberInfoVo.setAndaoNum(
                ObjectUtil.isEmpty(coinACntDic) ?
                new BigDecimal("0") :
                new BigDecimal(coinACntDic.getValue()).setScale(2,BigDecimal.ROUND_DOWN)
        );
        BigDecimal bigDecimal1 = dappFundFlowDao.selectSumAmountByType(FundFlowEnum.A_COIN_FIRE.getCode());
        dappMemberInfoVo.setFireAndaoNum(bigDecimal1.setScale(2,BigDecimal.ROUND_DOWN));
        return new FebsResponse().success().data(dappMemberInfoVo);
    }
@@ -587,7 +636,7 @@
        }else if(4 == type){
            redisKey = AppContants.K_LINE_MONTH;
        }else{
            redisKey = AppContants.K_LINE_HOUR;
            redisKey = AppContants.K_LINE_NOW;
        }
        Object o = redisUtils.get(redisKey);
        if(ObjectUtil.isNotEmpty(o)){
@@ -626,12 +675,14 @@
                myInviteChildInfoVo.setAddress(child.getAddress());
                myInviteChildInfoVo.setAccountType(child.getAccountType());
                DappUsdtPerkEntity childUsdtPerkEntity = dappUsdtPerkEntityMapper.selectByMemberId(child.getId());
                if(ObjectUtil.isEmpty(dappUsdtPerkEntity)){
                    dappUsdtPerkEntity = new DappUsdtPerkEntity();
                    dappUsdtPerkEntity.setMemberId(child.getId());
                    dappUsdtPerkEntityMapper.insert(dappUsdtPerkEntity);
//                BigDecimal achieveAmountByMemberId = dappUsdtPerkEntityMapper.selectAchieveAmountByMemberId(child.getId());
                if(ObjectUtil.isEmpty(childUsdtPerkEntity)){
                    childUsdtPerkEntity = new DappUsdtPerkEntity();
                    childUsdtPerkEntity.setMemberId(child.getId());
                    dappUsdtPerkEntityMapper.insert(childUsdtPerkEntity);
                }
                myInviteChildInfoVo.setMemberAchieve(childUsdtPerkEntity.getAchieveAmount());
                myInviteChildInfoVo.setMemberAchieve(ObjectUtil.isEmpty(childUsdtPerkEntity.getAchieveAmount()) ? BigDecimal.ZERO : childUsdtPerkEntity.getAchieveAmount());
                HashMap<String, BigDecimal> childMaxMinAchieve = getMaxMinAchieve(child.getId());
                myInviteChildInfoVo.setMaxAchieve(childMaxMinAchieve.get(AppContants.MAXACHIEVE));
                myInviteChildInfoVo.setMinAchieve(childMaxMinAchieve.get(AppContants.MINACHIEVE));
@@ -745,6 +796,170 @@
        return new FebsResponse().success();
    }
    @Override
    public IPage<MallGoodsListVo> findMallGoodsListInPage(MallGoodsQueryDto queryDto) {
        Page<MallGoodsListVo> page = new Page<>(queryDto.getPageNow(), queryDto.getPageSize());
        return dappMemberDao.selectMallGoodsListQueryInPage(queryDto, page);
    }
    @Override
    public IPage<MallOrderListVo> findMallOrderListInPage(MallOrderQueryDto queryDto) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        queryDto.setMemberId(member.getId());
        Page<MallOrderListVo> page = new Page<>(queryDto.getPageNow(), queryDto.getPageSize());
        return dappMemberDao.selectMallOrderListQueryInPage(queryDto, page);
    }
    @Override
    public MallOrderListVo findOrderDetailsById(Long id) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        MallOrderListVo mallOrderListVo = dappMemberDao.selectMallOrderListVoById(id);
        List<MallOrderItemVo> mallOrderItemVoList = dappMemberDao.selectMallOrderItemVoByOrderId(id);
        mallOrderListVo.setItems(mallOrderItemVoList);
        return mallOrderListVo;
    }
    @Override
    public MallGoodsListVo findGoodsDetailsById(Long id) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        MallGoodsListVo mallGoodsListVo = dappMemberDao.selectMallGoodsListVoById(id);
        return mallGoodsListVo;
    }
    @Override
    @Transactional
    public Long createOrder(AddOrderDto addOrderDto) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        /**
         * 1、商品是否上架
         * 2、用户余额是否足够
         */
        MallGoods mallGoods = mallGoodsMapper.selectById(addOrderDto.getGoodsId());
        if(ObjectUtil.isEmpty(mallGoods)){
            throw new FebsException("商品不存在");
        }
        if(MallGoods.ISSALE_STATUS_DISABLED == mallGoods.getIsSale()){
            throw new FebsException("商品已下架");
        }
        DappWalletCoinEntity dappWalletCoinEntity = dappWalletCoinDao.selectByMemberId(member.getId());
        if(ObjectUtil.isEmpty(dappWalletCoinEntity)){
            throw new FebsException("余额不足");
        }
        BigDecimal presentPrice = new BigDecimal(mallGoods.getPresentPrice());
        BigDecimal totalAmount = presentPrice.multiply(new BigDecimal(addOrderDto.getGoodsCnt())).setScale(2,BigDecimal.ROUND_DOWN);
        if(BigDecimal.ZERO.compareTo(totalAmount) >= 0){
            throw new FebsException("商品异常");
        }
        BigDecimal availableAmount = dappWalletCoinEntity.getAvailableAmount();
        if(totalAmount.compareTo(availableAmount) > 0){
            throw new FebsException("余额不足");
        }
        /**
         * 生成一条待支付的订单
         */
        String orderNo = MallUtils.getOrderNum();
        MallOrderInfo mallOrderInfo = new MallOrderInfo();
        mallOrderInfo.setOrderNo(orderNo);
        mallOrderInfo.setMemberId(member.getId());
        mallOrderInfo.setOrderTime(DateUtil.date());
        mallOrderInfo.setAmount(totalAmount);
        mallOrderInfo.setStatus(MallOrderInfo.STATUS_WAIT);
        mallOrderInfo.setOrderType(1);
        mallOrderInfoMapper.insert(mallOrderInfo);
        MallOrderItem mallOrderItem = new MallOrderItem();
        mallOrderItem.setOrderId(mallOrderInfo.getId());
        mallOrderItem.setGoodsId(addOrderDto.getGoodsId());
        mallOrderItem.setGoodsName(mallGoods.getGoodsName());
        mallOrderItem.setCnt(addOrderDto.getGoodsCnt());
        mallOrderItem.setPrice(presentPrice);
        mallOrderItem.setAmount(totalAmount);
        mallOrderItemMapper.insert(mallOrderItem);
        return mallOrderInfo.getId();
    }
    @Override
    @Transactional
    public void cancelOrder(Long id) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(id);
        if (ObjectUtil.isEmpty(orderInfo)) {
            throw new FebsException("订单异常");
        }
        if (MallOrderInfo.STATUS_WAIT != orderInfo.getStatus()) {
            throw new FebsException("只能取消待支付的订单");
        }
        orderInfo.setStatus(MallOrderInfo.STATUS_CANCEL);
        orderInfo.setCancelType(MallOrderInfo.CANCEL_BY_SELF);
        mallOrderInfoMapper.updateById(orderInfo);
    }
    @Override
    @Transactional
    public void payOrder(Long id) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(id);
        if (ObjectUtil.isEmpty(orderInfo)) {
            throw new FebsException("订单异常");
        }
        if (MallOrderInfo.STATUS_WAIT != orderInfo.getStatus()) {
            throw new FebsException("只能支付待支付的订单");
        }
        DappWalletCoinEntity dappWalletCoinEntity = dappWalletCoinDao.selectByMemberId(member.getId());
        BigDecimal availableAmount = dappWalletCoinEntity.getAvailableAmount();
        BigDecimal totalAmount = orderInfo.getAmount();
        if(totalAmount.compareTo(availableAmount) > 0){
            throw new FebsException("余额不足");
        }
        orderInfo.setPayTime(DateUtil.date());
        String payOrderNo = MallUtils.getOrderNum("PAY");
        orderInfo.setPayOrderNo(payOrderNo);
        orderInfo.setPayMethod("余额支付");
        orderInfo.setPayResult("成功");
        orderInfo.setStatus(MallOrderInfo.STATUS_PAY);
        mallOrderInfoMapper.updateById(orderInfo);
        /**
         * 更新用户余额
         */
        dappWalletCoinDao.reduceTotalAndAvailableByMemberId(member.getId(),totalAmount);
        DappFundFlowEntity donateScoreFlow = new DappFundFlowEntity(
                member.getId(),
                totalAmount.negate(),
                FundFlowEnum.PAY_ORDER.getCode(),
                2,
                BigDecimal.ZERO,
                payOrderNo,
                id);
        /**
         * 支付成功,消费后成有效账户后可分享(有效用户可推广)
         */
        DappMemberEntity dappMemberEntity = dappMemberDao.selectById(member.getId());
        if(2 == dappMemberEntity.getActiveStatus()){
            dappMemberEntity.setActiveStatus(1);
            dappMemberDao.updateById(dappMemberEntity);
        }
        /**
         * todo 发送一条订单出的消息
         */
        chainProducer.sendSpeedPayOrderMsg(id);
        chainProducer.sendAutoLevelUpMsg(member.getId());
    }
    public static List<List<String>> partitionList(List<String> originalList, int partitionSize) {
        List<List<String>> partitionedList = new ArrayList<>();
        int size = originalList.size();
        for (int i = 0; i < size; i += partitionSize) {
            int end = Math.min(size, i + partitionSize);
            List<String> sublist = originalList.subList(i, end);
            partitionedList.add(sublist);
        }
        return partitionedList;
    }
    /**
     * 获取用户的大小区业绩
     * @param memberId