package com.xcong.excoin.modules.contract.service.impl; import cn.hutool.core.collection.CollUtil; 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.entity.QueryRequest; import com.xcong.excoin.common.service.RedisService; import com.xcong.excoin.common.utils.CacheSettingUtils; import com.xcong.excoin.common.utils.CoinTypeConvert; import com.xcong.excoin.modules.agent.entity.MemberEntity; import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity; import com.xcong.excoin.modules.contract.entity.PlatformTradeSettingEntity; import com.xcong.excoin.modules.contract.mapper.ContractHoldOrderMapper; import com.xcong.excoin.modules.contract.service.IContractHoldOrderService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.math.BigDecimal; /** * @author wzy * @date 2020-06-16 **/ @Slf4j @Service @RequiredArgsConstructor public class ContractHoldOrderServiceImpl extends ServiceImpl implements IContractHoldOrderService { private final RedisService redisService; private final CacheSettingUtils cacheSettingUtils; @Override public IPage findHoldList(ContractHoldOrderEntity contractHoldOrderEntity, QueryRequest request) { Page page = new Page<>(request.getPageNum(), request.getPageSize()); IPage list = this.baseMapper.selectHoldListInPage(contractHoldOrderEntity, page); if (CollUtil.isNotEmpty(list.getRecords())) { // 计算订单盈亏和回报率 for (ContractHoldOrderEntity holdOrderEntity : list.getRecords()) { BigDecimal newPrice = new BigDecimal((String) redisService.get(CoinTypeConvert.convertToKey(holdOrderEntity.getSymbol()))); BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(holdOrderEntity.getSymbol()); // 盈亏 BigDecimal rewardRatio = BigDecimal.ZERO; // 开多 if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) { // (最新价-开仓价)*规格*张数 rewardRatio = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(lotNumber).multiply(new BigDecimal(holdOrderEntity.getSymbolCnt())); // 开空 } else { // (开仓价-最新价)*规格*张数 rewardRatio = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(lotNumber).multiply(new BigDecimal(holdOrderEntity.getSymbolCnt())); } if (holdOrderEntity.getIsProfit() == MemberEntity.IS_PROFIT_Y) { PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); if (rewardRatio.compareTo(BigDecimal.ZERO) > -1) { rewardRatio = rewardRatio.multiply(BigDecimal.ONE.subtract(tradeSettingEntity.getProfitParam())); } else { rewardRatio = rewardRatio.multiply(BigDecimal.ONE.add(tradeSettingEntity.getProfitParam())); } } // 回报率 BigDecimal returnRate = rewardRatio.divide(holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount()), 8, BigDecimal.ROUND_DOWN); holdOrderEntity.setLoseOrProfit(rewardRatio); holdOrderEntity.setReturnRatio(returnRate); } } return list; } }