From 9e6054ca0612a05ec2b698b8a63db7605c600725 Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Fri, 05 Mar 2021 14:51:08 +0800 Subject: [PATCH] modify --- src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java | 98 ++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 88 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java b/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java index c0f0234..fd1095a 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java @@ -1,11 +1,14 @@ package com.xcong.excoin.modules.contract.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; + import com.alibaba.druid.sql.visitor.functions.If; import com.alibaba.fastjson.JSONObject; 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.huobi.client.model.Candlestick; import com.xcong.excoin.common.LoginUserUtils; import com.xcong.excoin.common.contants.AppContants; import com.xcong.excoin.common.enumerates.CoinTypeEnum; @@ -36,11 +39,13 @@ import com.xcong.excoin.modules.member.entity.*; import com.xcong.excoin.modules.platform.dao.TradeSettingDao; import com.xcong.excoin.modules.platform.entity.PlatformTradeSettingEntity; +import com.xcong.excoin.rabbit.producer.FollowProducer; import com.xcong.excoin.rabbit.producer.OrderProducer; import com.xcong.excoin.utils.*; import com.xcong.excoin.rabbit.pricequeue.OrderModel; import jnr.a64asm.Mem; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import sun.rmi.runtime.Log; @@ -99,6 +104,9 @@ private FollowTraderInfoDao followTraderInfoDao; @Resource private FollowFollowerOrderRelationDao followFollowerOrderRelationDao; + + @Autowired + private FollowProducer followProducer; @Transactional(rollbackFor = Exception.class) @Override @@ -191,6 +199,7 @@ wholeHoldOrder.setSymbolCntSale(wholeHoldOrder.getSymbolCntSale() + submitOrderDto.getSymbolCnt()); wholeHoldOrder.setPrePaymentAmount(prePaymentAmount.add(wholeHoldOrder.getPrePaymentAmount())); wholeHoldOrder.setOperateNo(wholeHoldOrder.getOperateNo()); + wholeHoldOrder.setHoldBond(CalculateUtil.calMemberHoldBond(wholeHoldOrder)); int i = contractHoldOrderDao.updateById(wholeHoldOrder); if (i > 0) { memberWalletContractDao.increaseWalletContractBalanceById(prePaymentAmount.negate(), openFeePrice.negate(), null, walletContract.getId()); @@ -206,6 +215,9 @@ } else { LogRecordUtils.insertMemberAccountFlow(memberEntity.getId(), prePaymentAmount, walletContract.getAvailableBalance().subtract(prePaymentAmount), submitOrderDto.getSymbol(), "买跌持仓", "买跌:" + submitOrderDto.getSymbol()); } + + // 全仓爆仓 + ThreadPoolUtils.sendWholePrice(memberEntity.getId()); // 提交成功 return Result.ok(MessageSourceUtils.getString("member_service_0024")); @@ -228,7 +240,7 @@ holdOrderEntity.setOpeningPrice(openingPrice); holdOrderEntity.setOpeningType(submitOrderDto.getOrderType()); holdOrderEntity.setMarkPrice(newPrice); - holdOrderEntity.setIsCanClosing(ContractHoldOrderEntity.ORDER_CAN_CLOSING_N); + holdOrderEntity.setIsCanClosing(ContractHoldOrderEntity.ORDER_CAN_CLOSING_Y); holdOrderEntity.setPrePaymentAmount(prePaymentAmount); holdOrderEntity.setBondAmount(bondAmount.add(openFeePrice)); holdOrderEntity.setOperateNo(1); @@ -237,6 +249,8 @@ ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity); contractOrderEntity.setOpeningTime(new Date()); + + holdOrderEntity.setHoldBond(CalculateUtil.calMemberHoldBond(holdOrderEntity)); contractHoldOrderDao.insert(holdOrderEntity); int i = contractOrderDao.insert(contractOrderEntity); @@ -254,6 +268,9 @@ } else { LogRecordUtils.insertMemberAccountFlow(memberEntity.getId(), prePaymentAmount, walletContract.getAvailableBalance().subtract(prePaymentAmount), submitOrderDto.getSymbol(), "买跌持仓", "买跌:" + submitOrderDto.getSymbol()); } + + // 全仓爆仓 + ThreadPoolUtils.sendWholePrice(memberEntity.getId()); // 提交成功 return Result.ok(MessageSourceUtils.getString("member_service_0024")); @@ -310,7 +327,7 @@ FollowTraderInfoEntity tradeInfo = null; if (MemberEntity.IS_TRADER_Y.equals(memberEntity.getIsTrader())) { tradeInfo = followTraderInfoDao.selectTraderInfoByMemberId(memberEntity.getId()); - if (tradeInfo.getIsOpen().equals(FollowTraderInfoEntity.ISOPEN_Y)) { + if (FollowTraderInfoEntity.ISOPEN_Y.equals(tradeInfo.getIsOpen())) { isOpenFollow = true; } } @@ -370,7 +387,8 @@ relationEntity.setTradeOrderNo(holdOrderEntity.getOrderNo()); followFollowerOrderRelationDao.insert(relationEntity); - ThreadPoolUtils.sendFollowOrderTask(holdOrderEntity.getId()); + followProducer.sendAddFollowOrder(holdOrderEntity.getId()); +// ThreadPoolUtils.sendFollowOrderTask(holdOrderEntity.getId()); } // 提交成功 return Result.ok(MessageSourceUtils.getString("member_service_0024")); @@ -433,11 +451,18 @@ @Override public Result findHoldOrderList(String symbol, int type) { MemberEntity memberEntity = LoginUserUtils.getAppLoginUser(); + List<ContractHoldOrderEntity> list = null; - List<ContractHoldOrderEntity> list = contractHoldOrderDao.selectHoldOrderListByMemberIdAndSymbol(memberEntity.getId(), symbol, type); + if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == memberEntity.getContractPositionType()) { + list = contractHoldOrderDao.selectHoldOrderListByMemberIdAndSymbolTest(memberEntity.getId(), type); + } else { + list = contractHoldOrderDao.selectHoldOrderListByMemberIdAndSymbol(memberEntity.getId(), symbol, type); + } + MemberWalletContractEntity walletContractEntity = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name()); if (CollUtil.isNotEmpty(list)) { BigDecimal totalProfitOrLoss = BigDecimal.ZERO; + BigDecimal totalHoldBond = BigDecimal.ZERO; List<HoldOrderListVo> resultList = new ArrayList<>(); for (ContractHoldOrderEntity holdOrderEntity : list) { HoldOrderListVo holdOrderListVo = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToDto(holdOrderEntity); @@ -499,9 +524,22 @@ } resultList.add(holdOrderListVo); totalProfitOrLoss = totalProfitOrLoss.add(rewardRatio); + totalHoldBond = totalHoldBond.add(holdOrderEntity.getHoldBond() == null ? BigDecimal.ZERO : holdOrderEntity.getHoldBond()); } Map<String, Object> result = new HashMap<>(); + if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == memberEntity.getContractPositionType()) { + List<ContractEntrustOrderEntity> entrustOrder = contractEntrustOrderDao.selectEntrustOrderListByMemberId(memberEntity.getId()); + BigDecimal totalEntrustAmount = BigDecimal.ZERO; + if (CollUtil.isNotEmpty(entrustOrder)) { + for (ContractEntrustOrderEntity contractEntrustOrderEntity : entrustOrder) { + totalEntrustAmount = totalEntrustAmount.add(contractEntrustOrderEntity.getEntrustAmount()); + } + } + BigDecimal riskRatio = totalHoldBond.divide(walletContractEntity.getTotalBalance().add(totalProfitOrLoss).subtract(totalEntrustAmount), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)); + result.put("riskRatio", riskRatio); + } + result.put("hold", resultList); result.put("totalProfitOrLoss", totalProfitOrLoss.setScale(4, BigDecimal.ROUND_DOWN).toPlainString()); return Result.ok(result); @@ -794,6 +832,8 @@ // 占用保证金 -- 即持仓单中的保证金之和 BigDecimal beUsedBondAmount = BigDecimal.ZERO; + BigDecimal moreBondAmount = BigDecimal.ZERO; + BigDecimal lessBondAmount = BigDecimal.ZERO; // 总盈利 BigDecimal totalProfitOrLess = BigDecimal.ZERO; if (CollUtil.isNotEmpty(holdOrderEntities)) { @@ -807,9 +847,11 @@ BigDecimal profitOrLess = BigDecimal.ZERO; // 开多 if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) { + moreBondAmount = moreBondAmount.add(holdOrderEntity.getBondAmount()); profitOrLess = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())).multiply(lotNumber); // 开空 } else { + lessBondAmount = lessBondAmount.add(holdOrderEntity.getBondAmount()); profitOrLess = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())).multiply(lotNumber); } @@ -833,16 +875,31 @@ if (equity.compareTo(BigDecimal.ZERO) <= 0) { equity = BigDecimal.ZERO; } - + + BigDecimal available = walletContractEntity.getAvailableBalance(); + if (totalProfitOrLess.compareTo(BigDecimal.ZERO) <= 0) { + available = available.add(totalProfitOrLess); + if (available.compareTo(BigDecimal.ZERO) <= 0) { + available = BigDecimal.ZERO; + } + } + + // 获取当日k线的开盘价 + Candlestick symbolObject = (Candlestick) redisUtils.get(symbol); + BigDecimal openPrice = symbolObject.getOpen(); + BigDecimal upOrDown = newPriceSymbol.subtract(openPrice).divide(openPrice, 8, BigDecimal.ROUND_HALF_UP); contractMoneyInfoVo.setBeUsedBondAmount(beUsedBondAmount); contractMoneyInfoVo.setFrozenBondAmount(frozenBondAmount); contractMoneyInfoVo.setEquity(equity); - contractMoneyInfoVo.setAvailableBalance(walletContractEntity.getAvailableBalance()); + contractMoneyInfoVo.setAvailableBalance(available); contractMoneyInfoVo.setFeeRatio(tradeSetting.getFeeRatio()); contractMoneyInfoVo.setLeverAgeRatio(tradeSetting.getLeverageRatio()); contractMoneyInfoVo.setNewPrice(newPriceSymbol); + contractMoneyInfoVo.setUpOrDown(upOrDown); contractMoneyInfoVo.setSymbolSku(cacheSettingUtils.getSymbolSku(symbol)); contractMoneyInfoVo.setLeverRate(rateEntity.getLevelRateUp()); + contractMoneyInfoVo.setMoreBondAmount(moreBondAmount); + contractMoneyInfoVo.setLessBondAmount(lessBondAmount); return Result.ok(contractMoneyInfoVo); } @@ -973,8 +1030,27 @@ List<ContractHoldOrderEntity> list = contractHoldOrderDao.selectHoldOrderListByMemberId(member.getId()); List<ContractEntrustOrderEntity> entrustList = contractEntrustOrderDao.selectEntrustOrderListByMemberId(member.getId()); - if (CollUtil.isNotEmpty(list) || CollUtil.isNotEmpty(entrustList)) { - return Result.fail("存在持仓/委托, 无法更改"); +// if (CollUtil.isNotEmpty(list) || CollUtil.isNotEmpty(entrustList)) { +// return Result.fail("存在持仓/委托, 无法更改"); +// } + + if(CollUtil.isNotEmpty(list)) { + for(ContractHoldOrderEntity contractHoldOrderEntity : list) { + String symbol = contractHoldOrderEntity.getSymbol(); + if(StrUtil.isEmpty(symbol)) { + return Result.fail("存在持仓/委托, 无法更改"); + } + return Result.fail("币种"+symbol+"存在持仓/委托, 无法更改"); + } + } + if(CollUtil.isNotEmpty(entrustList)) { + for(ContractEntrustOrderEntity contractEntrustOrderEntity : entrustList) { + String symbol = contractEntrustOrderEntity.getSymbol(); + if(StrUtil.isEmpty(symbol)) { + return Result.fail("存在持仓/委托, 无法更改"); + } + return Result.fail("币种"+symbol+"存在持仓/委托, 无法更改"); + } } /** @@ -1026,8 +1102,10 @@ holdOrderEntity.setOperateNo(holdOrderEntity.getOperateNo() + 1); contractHoldOrderDao.updateById(holdOrderEntity); - // 发送爆仓消息 - sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), newForcePrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo(), holdOrderEntity.getMemberId()); + if (ContractEntrustOrderEntity.POSITION_TYPE_ADD == holdOrderEntity.getPositionType()) { + // 发送爆仓消息 + sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), newForcePrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo(), holdOrderEntity.getMemberId()); + } } } } -- Gitblit v1.9.1