xiaoyong931011
2020-07-29 e08d29b508b4bbed9434328284d9939e6ad8b3ce
src/main/java/com/xcong/excoin/modules/documentary/service/impl/DocumentaryServiceImpl.java
@@ -1,19 +1,54 @@
package com.xcong.excoin.modules.documentary.service.impl;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.validation.Valid;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xcong.excoin.common.LoginUserUtils;
import com.xcong.excoin.common.response.Result;
import com.xcong.excoin.modules.coin.dao.OrderCoinsDao;
import com.xcong.excoin.modules.coin.parameter.dto.RecordsPageDto;
import com.xcong.excoin.modules.contract.dao.ContractHoldOrderDao;
import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity;
import com.xcong.excoin.modules.contract.entity.ContractOrderEntity;
import com.xcong.excoin.modules.documentary.dao.FollowFollowerProfitDao;
import com.xcong.excoin.modules.documentary.dao.FollowTraderInfoDao;
import com.xcong.excoin.modules.documentary.dao.FollowTraderProfitDetailDao;
import com.xcong.excoin.modules.documentary.dao.FollowTraderProfitInfoDao;
import com.xcong.excoin.modules.documentary.dto.FollowRecordsDto;
import com.xcong.excoin.modules.documentary.dto.HistoryOrderRecordsDto;
import com.xcong.excoin.modules.documentary.dto.MyFollowOrderDto;
import com.xcong.excoin.modules.documentary.dto.MyFollowTraderInfoDto;
import com.xcong.excoin.modules.documentary.entity.FollowFollowerProfitEntity;
import com.xcong.excoin.modules.documentary.entity.FollowTraderInfoEntity;
import com.xcong.excoin.modules.documentary.entity.FollowTraderProfitInfoEntity;
import com.xcong.excoin.modules.documentary.service.DocumentaryService;
import com.xcong.excoin.modules.documentary.vo.FollowInfoVo;
import com.xcong.excoin.modules.documentary.vo.FollowRecordsVo;
import com.xcong.excoin.modules.documentary.vo.FollowTraderProfitInfoVo;
import com.xcong.excoin.modules.documentary.vo.HistoryOrderRecordsVo;
import com.xcong.excoin.modules.documentary.vo.MemberIsTradeVo;
import com.xcong.excoin.modules.documentary.vo.MyFollowOrderVo;
import com.xcong.excoin.modules.documentary.vo.MyFollowTraderInfoVo;
import com.xcong.excoin.modules.member.dao.MemberDao;
import com.xcong.excoin.modules.member.entity.MemberEntity;
import com.xcong.excoin.modules.platform.entity.PlatformTradeSettingEntity;
import com.xcong.excoin.utils.CacheSettingUtils;
import com.xcong.excoin.utils.CoinTypeConvert;
import com.xcong.excoin.utils.RedisUtils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@@ -22,6 +57,22 @@
   @Resource
    private MemberDao memberDao;
   @Resource
   private FollowTraderInfoDao followTraderInfoDao;
   @Resource
   private FollowTraderProfitDetailDao followTraderProfitDetailDao;
   @Resource
   private FollowTraderProfitInfoDao followTraderProfitInfoDao;
   @Resource
   private FollowFollowerProfitDao followFollowerProfitDao;
   @Resource
   private OrderCoinsDao orderCoinsDao;
   @Resource
   private RedisUtils redisUtils;
    @Resource
    private CacheSettingUtils cacheSettingUtils;
    @Resource
    private ContractHoldOrderDao contractHoldOrderDao;
   
   @Override
   public Result getMemberIsTradeInfo() {
@@ -39,4 +90,325 @@
        return Result.ok(memberIsTradeVo);
   }
   @Override
   public Result getFollowTraderProfitInfo(@Valid RecordsPageDto recordsPageDto) {
        Page<FollowTraderProfitInfoVo> page = new Page<>(recordsPageDto.getPageNum(), recordsPageDto.getPageSize());
        FollowTraderProfitInfoEntity memberAccountMoneyChange = new FollowTraderProfitInfoEntity();
        IPage<FollowTraderProfitInfoVo> followTraderProfitInfoList = followTraderProfitInfoDao.selectFollowTraderProfitInfoEntity(page, memberAccountMoneyChange);
        List<FollowTraderProfitInfoVo> followTraderProfitInfoVoList = followTraderProfitInfoList.getRecords();
        if(CollUtil.isNotEmpty(followTraderProfitInfoVoList)) {
           for(FollowTraderProfitInfoVo FollowTraderProfitInfoVo : followTraderProfitInfoVoList) {
              Long traderId = FollowTraderProfitInfoVo.getTraderId();
              FollowTraderInfoEntity followTraderInfoEntity = followTraderInfoDao.selectFollowTraderInfoEntityBytreaderId(traderId);
              String avatar = followTraderInfoEntity.getAvatar();
              FollowTraderProfitInfoVo.setAvatar(avatar);
              String nickname = followTraderInfoEntity.getNickname();
              FollowTraderProfitInfoVo.setNickname(nickname);
              String declaration = followTraderInfoEntity.getDeclaration();
              FollowTraderProfitInfoVo.setDeclaration(declaration);
              Integer isAll = followTraderInfoEntity.getIsAll();
              FollowTraderProfitInfoVo.setIsAll(isAll);
              Integer isOpen = followTraderInfoEntity.getIsOpen();
              FollowTraderProfitInfoVo.setIsOpen(isOpen);
           }
        }
      return Result.ok(followTraderProfitInfoVoList);
   }
   @Override
   public Result getHistoryOrderRecords(@Valid HistoryOrderRecordsDto historyOrderRecordsDto) {
      Page<HistoryOrderRecordsVo> page = new Page<>(historyOrderRecordsDto.getPageNum(), historyOrderRecordsDto.getPageSize());
        IPage<HistoryOrderRecordsVo> historyOrderRecordsVoList = followTraderProfitInfoDao.selectHistoryOrderRecords(page, historyOrderRecordsDto.getMemberId());
      return Result.ok(historyOrderRecordsVoList);
   }
   @Override
   public Result getFollowRecords(@Valid FollowRecordsDto followRecordsDto) {
      Page<FollowRecordsVo> page = new Page<>(followRecordsDto.getPageNum(), followRecordsDto.getPageSize());
      IPage<FollowRecordsVo> historyOrderRecordsVoList = followFollowerProfitDao.selectFollowRecords(page, followRecordsDto.getTradeMemberId());
      List<FollowRecordsVo> records = historyOrderRecordsVoList.getRecords();
      if(CollUtil.isNotEmpty(records)) {
         for(FollowRecordsVo followRecordsVo : records) {
            Long memberId =followRecordsVo.getMemberId();
            MemberEntity member = memberDao.selectById(memberId);
            String email = member.getEmail();
            String phone = member.getPhone();
            if(StrUtil.isNotEmpty(email)) {
               followRecordsVo.setAccount(email);
            }else {
               followRecordsVo.setAccount(phone);
            }
         }
      }
      return Result.ok(historyOrderRecordsVoList);
   }
   @Override
   public Result getFollowInfo() {
      //获取用户ID
        Long memberId = LoginUserUtils.getAppLoginUser().getId();
        MemberEntity member = memberDao.selectById(memberId);
        FollowInfoVo followInfoVo = new FollowInfoVo();
        followInfoVo.setMemberId(memberId);
        String email = member.getEmail();
      String phone = member.getPhone();
      if(StrUtil.isNotEmpty(email)) {
         followInfoVo.setNickname(email);
      }else {
         followInfoVo.setNickname(phone);
      }
      BigDecimal totalPrincipals =  BigDecimal.ZERO;
      BigDecimal totalProfits =  BigDecimal.ZERO;
      Map<String, Object> columnMap = new HashMap<>();
      columnMap.put("member_id", memberId);
      List<FollowFollowerProfitEntity> selectByMap = followFollowerProfitDao.selectByMap(columnMap);
      if(CollUtil.isNotEmpty(selectByMap)) {
         for(FollowFollowerProfitEntity followFollowerProfitEntity : selectByMap) {
            BigDecimal totalPrincipal = followFollowerProfitEntity.getTotalPrincipal();
            totalPrincipals = totalPrincipals.add(totalPrincipal);
            BigDecimal totalProfit = followFollowerProfitEntity.getTotalProfit();
            totalProfits = totalProfits.add(totalProfit);
              //当前跟单
              List<ContractHoldOrderEntity> contractHoldOrderEntitys = followFollowerProfitDao.getFollowOrderNowRecords(memberId);
              if(CollUtil.isNotEmpty(contractHoldOrderEntitys)) {
                 for(ContractHoldOrderEntity contractHoldOrderEntity : contractHoldOrderEntitys) {
                       // 获取最新价
                       BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(contractHoldOrderEntity.getSymbol())));
                       BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(contractHoldOrderEntity.getSymbol());
                       // 盈亏
                       BigDecimal rewardRatio = BigDecimal.ZERO;
                       // 开多
                       if (contractHoldOrderEntity.OPENING_TYPE_MORE == contractHoldOrderEntity.getOpeningType()) {
                           // (最新价-开仓价)*规格*张数
                           rewardRatio = newPrice.subtract(contractHoldOrderEntity.getOpeningPrice()).multiply(lotNumber).multiply(new BigDecimal(contractHoldOrderEntity.getSymbolCnt()));
                           // 开空
                       } else {
                           // (开仓价-最新价)*规格*张数
                           rewardRatio = contractHoldOrderEntity.getOpeningPrice().subtract(newPrice).multiply(lotNumber).multiply(new BigDecimal(contractHoldOrderEntity.getSymbolCnt()));
                       }
                       if (member.getIsProfit() == MemberEntity.IS_PROFIT_Y) {
                           PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting();
                           if (rewardRatio.compareTo(BigDecimal.ZERO) > -1) {
                               rewardRatio = rewardRatio.multiply(BigDecimal.ONE.subtract(tradeSettingEntity.getProfitParam()));
                           }
                       }
                       totalProfits = totalProfits.add(rewardRatio);
                 }
              }
         }
      }
      followInfoVo.setTotalPrincipal(totalPrincipals.setScale(4, BigDecimal.ROUND_DOWN));
      followInfoVo.setTotalProfit(totalProfits.setScale(4, BigDecimal.ROUND_DOWN));
      return Result.ok(followInfoVo);
   }
   @Override
   public Result getMyFollowOrderRecords(@Valid MyFollowOrderDto myFollowOrderDto) {
      //获取用户ID
        Long memberId = LoginUserUtils.getAppLoginUser().getId();
        MemberEntity member = memberDao.selectById(memberId);
        int type = myFollowOrderDto.getOrderType();
        Page<MyFollowOrderVo> result = new Page<>();
        List<MyFollowOrderVo> myFollowOrderVos = result.getRecords();
        //历史跟单
        if(type == 2) {
           Page<ContractOrderEntity> page = new Page<>(myFollowOrderDto.getPageNum(), myFollowOrderDto.getPageSize());
           IPage<ContractOrderEntity> contractOrderEntitys = followFollowerProfitDao.getMyFollowOrderHistoryRecords(page, memberId);
           List<ContractOrderEntity> records = contractOrderEntitys.getRecords();
           if(CollUtil.isNotEmpty(records)) {
              for(ContractOrderEntity contractOrderEntity : records) {
                 MyFollowOrderVo myFollowOrderVo = new MyFollowOrderVo();
                 String symbol = contractOrderEntity.getSymbol();
                 myFollowOrderVo.setSymbol(symbol);
                 int orderType = contractOrderEntity.getOrderType();
                 myFollowOrderVo.setOrderType(orderType);
                 int leverRatio = contractOrderEntity.getLeverRatio();
                 myFollowOrderVo.setLeverRatio(leverRatio);
                 BigDecimal rewardAmount = contractOrderEntity.getRewardAmount().setScale(4, BigDecimal.ROUND_DOWN);
                 myFollowOrderVo.setRewardAmount(rewardAmount);
                 BigDecimal rewardRatio = contractOrderEntity.getRewardRatio().setScale(4, BigDecimal.ROUND_DOWN);
                 myFollowOrderVo.setRewardRatio(rewardRatio);
                 int symbolCnt = contractOrderEntity.getSymbolCnt();
                 myFollowOrderVo.setSymbolCnt(symbolCnt);
                 BigDecimal bondAmount = contractOrderEntity.getBondAmount().setScale(4, BigDecimal.ROUND_DOWN);
                 myFollowOrderVo.setBondAmount(bondAmount);
                 BigDecimal openingPrice = contractOrderEntity.getOpeningPrice().setScale(4, BigDecimal.ROUND_DOWN);
                 myFollowOrderVo.setOpeningPrice(openingPrice);
                 BigDecimal closingPrice = contractOrderEntity.getClosingPrice().setScale(4, BigDecimal.ROUND_DOWN);
                 myFollowOrderVo.setClosingPrice(closingPrice);
                 Date openingTime = contractOrderEntity.getOpeningTime();
                 myFollowOrderVo.setOpeningTime(openingTime);
                 Date closingTime = contractOrderEntity.getClosingTime();
                 myFollowOrderVo.setClosingTime(closingTime);
                 String orderNo = contractOrderEntity.getOrderNo();
                 myFollowOrderVo.setOrderNo(orderNo);
                 myFollowOrderVos.add(myFollowOrderVo);
              }
           }
        }else {
        //当前跟单
           Page<ContractHoldOrderEntity> page = new Page<>(myFollowOrderDto.getPageNum(), myFollowOrderDto.getPageSize());
           IPage<ContractHoldOrderEntity> contractHoldOrderEntitys = followFollowerProfitDao.getMyFollowOrderNowRecords(page, myFollowOrderDto.getMemberId());
           List<ContractHoldOrderEntity> records = contractHoldOrderEntitys.getRecords();
           if(CollUtil.isNotEmpty(records)) {
              for(ContractHoldOrderEntity contractHoldOrderEntity : records) {
                 MyFollowOrderVo myFollowOrderVo = new MyFollowOrderVo();
                 String symbol = contractHoldOrderEntity.getSymbol();
                 myFollowOrderVo.setSymbol(symbol);
                 int orderType = contractHoldOrderEntity.getOpeningType();
                 myFollowOrderVo.setOrderType(orderType);
                 int leverRatio = contractHoldOrderEntity.getLeverRatio();
                 myFollowOrderVo.setLeverRatio(leverRatio);
                 int symbolCnt = contractHoldOrderEntity.getSymbolCnt();
                 myFollowOrderVo.setSymbolCnt(symbolCnt);
                 BigDecimal bondAmount = contractHoldOrderEntity.getBondAmount().setScale(4, BigDecimal.ROUND_DOWN);
                 myFollowOrderVo.setBondAmount(bondAmount);
                 BigDecimal openingPrice = contractHoldOrderEntity.getOpeningPrice().setScale(4, BigDecimal.ROUND_DOWN);
                 myFollowOrderVo.setOpeningPrice(openingPrice);
                 String orderNo = contractHoldOrderEntity.getOrderNo();
                 myFollowOrderVo.setOrderNo(orderNo);
                 Date openingTime = contractHoldOrderEntity.getCreateTime();
                 myFollowOrderVo.setOpeningTime(openingTime);
                    // 获取最新价
                    BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(contractHoldOrderEntity.getSymbol())));
                    BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(contractHoldOrderEntity.getSymbol());
                    // 盈亏
                    BigDecimal rewardRatio = BigDecimal.ZERO;
                    // 开多
                    if (contractHoldOrderEntity.OPENING_TYPE_MORE == contractHoldOrderEntity.getOpeningType()) {
                        // (最新价-开仓价)*规格*张数
                        rewardRatio = newPrice.subtract(contractHoldOrderEntity.getOpeningPrice()).multiply(lotNumber).multiply(new BigDecimal(contractHoldOrderEntity.getSymbolCnt()));
                        // 开空
                    } else {
                        // (开仓价-最新价)*规格*张数
                        rewardRatio = contractHoldOrderEntity.getOpeningPrice().subtract(newPrice).multiply(lotNumber).multiply(new BigDecimal(contractHoldOrderEntity.getSymbolCnt()));
                    }
                    if (member.getIsProfit() == MemberEntity.IS_PROFIT_Y) {
                        PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting();
                        if (rewardRatio.compareTo(BigDecimal.ZERO) > -1) {
                            rewardRatio = rewardRatio.multiply(BigDecimal.ONE.subtract(tradeSettingEntity.getProfitParam()));
                        }
                    }
                    myFollowOrderVo.setRewardAmount(rewardRatio.setScale(4, BigDecimal.ROUND_DOWN));
                    // 回报率
                    BigDecimal returnRate = rewardRatio.divide(contractHoldOrderEntity.getBondAmount().subtract(contractHoldOrderEntity.getOpeningFeeAmount()), 8, BigDecimal.ROUND_DOWN);
                    myFollowOrderVo.setRewardRatio(returnRate.setScale(4, BigDecimal.ROUND_DOWN));
                 myFollowOrderVos.add(myFollowOrderVo);
              }
           }
        }
      return Result.ok(myFollowOrderVos);
   }
   @Override
   public Result getMyFollowTraderInfo(@Valid MyFollowTraderInfoDto myFollowTraderInfoDto) {
      //获取用户ID
        Long memberId = LoginUserUtils.getAppLoginUser().getId();
        MemberEntity member = memberDao.selectById(memberId);
        Page<FollowFollowerProfitEntity> page = new Page<>(myFollowTraderInfoDto.getPageNum(), myFollowTraderInfoDto.getPageSize());
      IPage<FollowFollowerProfitEntity> followFollowerProfitEntitys = followFollowerProfitDao.selectFollowFollowerProfitEntitys(page, memberId);
      List<FollowFollowerProfitEntity> records = followFollowerProfitEntitys.getRecords();
      if(CollUtil.isNotEmpty(records)) {
         Page<MyFollowTraderInfoVo> result = new Page<>();
           List<MyFollowTraderInfoVo> myFollowOrderVos = result.getRecords();
         for(FollowFollowerProfitEntity FollowFollowerProfitEntity : records) {
            MyFollowTraderInfoVo myFollowTraderInfoVo = new MyFollowTraderInfoVo();
            Long tradeId = FollowFollowerProfitEntity.getTradeId();
            FollowTraderInfoEntity followTraderInfoEntity = followTraderInfoDao.selectById(tradeId);
            String avatar = followTraderInfoEntity.getAvatar();
            myFollowTraderInfoVo.setAvatar(avatar);
            String nickname = followTraderInfoEntity.getNickname();
            myFollowTraderInfoVo.setNickname(nickname);
            BigDecimal totalPrincipal = FollowFollowerProfitEntity.getTotalPrincipal();
            myFollowTraderInfoVo.setTotalPrincipal(totalPrincipal);
            BigDecimal totalProfit = BigDecimal.ZERO;
            Map<String, Object> columnMap = new HashMap<>();
            columnMap.put("member_id", memberId);
            contractHoldOrderDao.selectByMap(columnMap );
              List<ContractHoldOrderEntity> contractHoldOrderEntitys = contractHoldOrderDao.selectByMap(columnMap );
              if(CollUtil.isNotEmpty(contractHoldOrderEntitys)) {
                 for(ContractHoldOrderEntity contractHoldOrderEntity : contractHoldOrderEntitys) {
                    // 获取最新价
                    BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(contractHoldOrderEntity.getSymbol())));
                    BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(contractHoldOrderEntity.getSymbol());
                    // 盈亏
                    BigDecimal rewardRatio = BigDecimal.ZERO;
                    // 开多
                    if (ContractHoldOrderEntity.OPENING_TYPE_MORE == contractHoldOrderEntity.getOpeningType()) {
                       // (最新价-开仓价)*规格*张数
                       rewardRatio = newPrice.subtract(contractHoldOrderEntity.getOpeningPrice()).multiply(lotNumber).multiply(new BigDecimal(contractHoldOrderEntity.getSymbolCnt()));
                       // 开空
                    } else {
                       // (开仓价-最新价)*规格*张数
                       rewardRatio = contractHoldOrderEntity.getOpeningPrice().subtract(newPrice).multiply(lotNumber).multiply(new BigDecimal(contractHoldOrderEntity.getSymbolCnt()));
                    }
                    if (member.getIsProfit() == MemberEntity.IS_PROFIT_Y) {
                       PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting();
                       if (rewardRatio.compareTo(BigDecimal.ZERO) > -1) {
                          rewardRatio = rewardRatio.multiply(BigDecimal.ONE.subtract(tradeSettingEntity.getProfitParam()));
                       }
                    }
                    totalProfit = totalProfit.add(rewardRatio);
                 }
                 myFollowTraderInfoVo.setTotalProfit(totalProfit.setScale(4, BigDecimal.ROUND_DOWN));
              }
            myFollowOrderVos.add(myFollowTraderInfoVo);
         }
      }
      return null;
   }
}