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 @Service public class DocumentaryServiceImpl extends ServiceImpl implements DocumentaryService { @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() { //获取用户ID Long memberId = LoginUserUtils.getAppLoginUser().getId(); MemberEntity member = memberDao.selectById(memberId); Integer isTrader = member.getIsTrader(); MemberIsTradeVo memberIsTradeVo = new MemberIsTradeVo(); if(MemberEntity.IS_TRADER_Y.equals(isTrader)) { memberIsTradeVo.setIsTrade(MemberEntity.IS_TRADER_Y); }else { memberIsTradeVo.setIsTrade(MemberEntity.IS_TRADER_N); } return Result.ok(memberIsTradeVo); } @Override public Result getFollowTraderProfitInfo(@Valid RecordsPageDto recordsPageDto) { Page page = new Page<>(recordsPageDto.getPageNum(), recordsPageDto.getPageSize()); FollowTraderProfitInfoEntity memberAccountMoneyChange = new FollowTraderProfitInfoEntity(); IPage followTraderProfitInfoList = followTraderProfitInfoDao.selectFollowTraderProfitInfoEntity(page, memberAccountMoneyChange); List 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 page = new Page<>(historyOrderRecordsDto.getPageNum(), historyOrderRecordsDto.getPageSize()); IPage historyOrderRecordsVoList = followTraderProfitInfoDao.selectHistoryOrderRecords(page, historyOrderRecordsDto.getMemberId()); return Result.ok(historyOrderRecordsVoList); } @Override public Result getFollowRecords(@Valid FollowRecordsDto followRecordsDto) { Page page = new Page<>(followRecordsDto.getPageNum(), followRecordsDto.getPageSize()); IPage historyOrderRecordsVoList = followFollowerProfitDao.selectFollowRecords(page, followRecordsDto.getTradeMemberId()); List 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 columnMap = new HashMap<>(); columnMap.put("member_id", memberId); List 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 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 result = new Page<>(); List myFollowOrderVos = result.getRecords(); //历史跟单 if(type == 2) { Page page = new Page<>(myFollowOrderDto.getPageNum(), myFollowOrderDto.getPageSize()); IPage contractOrderEntitys = followFollowerProfitDao.getMyFollowOrderHistoryRecords(page, memberId); List 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 page = new Page<>(myFollowOrderDto.getPageNum(), myFollowOrderDto.getPageSize()); IPage contractHoldOrderEntitys = followFollowerProfitDao.getMyFollowOrderNowRecords(page, myFollowOrderDto.getMemberId()); List 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 page = new Page<>(myFollowTraderInfoDto.getPageNum(), myFollowTraderInfoDto.getPageSize()); IPage followFollowerProfitEntitys = followFollowerProfitDao.selectFollowFollowerProfitEntitys(page, memberId); List records = followFollowerProfitEntitys.getRecords(); if(CollUtil.isNotEmpty(records)) { Page result = new Page<>(); List 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 columnMap = new HashMap<>(); columnMap.put("member_id", memberId); contractHoldOrderDao.selectByMap(columnMap ); List 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; } }