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<ContractHoldOrderMapper, ContractHoldOrderEntity> implements IContractHoldOrderService {
|
|
private final RedisService redisService;
|
|
private final CacheSettingUtils cacheSettingUtils;
|
|
@Override
|
public IPage<ContractHoldOrderEntity> findHoldList(ContractHoldOrderEntity contractHoldOrderEntity, QueryRequest request) {
|
Page<ContractHoldOrderEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
|
IPage<ContractHoldOrderEntity> 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;
|
}
|
}
|