From ebb754075f9fd70e214b2938d8ef90acf8d6f747 Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Wed, 26 Aug 2020 15:13:33 +0800 Subject: [PATCH] modify --- src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 103 insertions(+), 0 deletions(-) diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java b/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java index 93b135e..a40e334 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java @@ -3,6 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.xcong.excoin.modules.coin.dao.MemberAccountFlowEntityDao; import com.xcong.excoin.modules.coin.entity.MemberAccountFlowEntity; +import com.xcong.excoin.modules.contract.dao.ContractHoldOrderDao; import com.xcong.excoin.modules.contract.entity.ContractEntrustOrderEntity; import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity; import com.xcong.excoin.modules.contract.entity.ContractOrderEntity; @@ -25,6 +26,7 @@ import com.xcong.excoin.rabbit.producer.OrderProducer; import com.xcong.excoin.utils.CacheSettingUtils; import com.xcong.excoin.utils.CalculateUtil; +import com.xcong.excoin.utils.CoinTypeConvert; import com.xcong.excoin.utils.ThreadPoolUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -71,6 +73,8 @@ private MemberAccountFlowEntityDao memberAccountFlowEntityDao; @Resource private MemberSettingDao memberSettingDao; + @Resource + private ContractHoldOrderDao contractHoldOrderDao; public void dealOrderFromMq(List<OrderModel> list, Integer type) { @@ -519,6 +523,12 @@ if (CollectionUtils.isNotEmpty(orderList)) { ContractHoldOrderEntity contractHoldOrderEntity = null; for (ContractEntrustOrderEntity coinsCoinsOrder : orderList) { + // 全仓委托 + if (coinsCoinsOrder.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ALL) { + wholeEntrustOrder(coinsCoinsOrder); + continue; + } + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(coinsCoinsOrder.getMemberId(), "USDT"); if (wallet == null) { continue; @@ -594,6 +604,99 @@ } } + private void wholeEntrustOrder(ContractEntrustOrderEntity entrustOrder) { + log.info("全仓委托逻辑处理:{}", entrustOrder.getOrderNo()); + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(entrustOrder.getMemberId(), CoinTypeConvert.convertContractTypeToCoin(entrustOrder.getSymbol())); + + PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); + MemberEntity member = memberService.getById(entrustOrder.getMemberId()); + + // 手续费 + BigDecimal openFeePrice = CalculateUtil.getOpenFeePrice(entrustOrder.getEntrustPrice(), entrustOrder.getSymbolSku(), entrustOrder.getSymbolCnt(), tradeSettingEntity.getFeeRatio()); + + ContractHoldOrderEntity wholeHoldOrder = contractHoldOrderDao.selectWholeHoldOrderByOrderType(entrustOrder.getMemberId(), entrustOrder.getEntrustType()); + // 判断持仓是否存在,若不存在则创建新的持仓订单 + if (wholeHoldOrder == null) { + log.info("持仓不存在"); + ContractHoldOrderEntity holdOrderEntity = ContractEntrustOrderEntityMapper.INSTANCE.entrustOrderToHoldOrder(entrustOrder); + + int type = entrustOrder.getEntrustType(); + if (type == 1) { + // 开多 + holdOrderEntity.setOpeningType(ContractHoldOrderEntity.OPENING_TYPE_MORE); + } else { + // 开空 + holdOrderEntity.setOpeningType(ContractHoldOrderEntity.OPENING_TYPE_LESS); + } + + holdOrderEntity.setTradeType(ContractHoldOrderEntity.TRADE_TYPE_LIMIT); + holdOrderEntity.setSymbolCntSale(holdOrderEntity.getSymbolCnt()); + holdOrderEntity.setOpeningFeeAmount(openFeePrice); + holdOrderEntity.setOpeningPrice(entrustOrder.getEntrustPrice()); + holdOrderEntity.setMarkPrice(entrustOrder.getEntrustPrice()); + holdOrderEntity.setIsCanClosing(ContractHoldOrderEntity.ORDER_CAN_CLOSING_N); + holdOrderEntity.setOperateNo(1); + // 设置合约类型 + holdOrderEntity.setContractType(ContractOrderEntity.CONTRACTTYPE_NORMAL); + + ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity); + contractOrderEntity.setOpeningTime(new Date()); + contractHoldOrderDao.insert(holdOrderEntity); + + boolean isSuccess = contractOrderService.save(contractOrderEntity); + + if (isSuccess) { + contractEntrustOrderService.removeById(entrustOrder.getId()); + memberWalletContractService.increaseWalletContractBalanceById(null, openFeePrice.negate(), entrustOrder.getBondAmount().negate(), wallet.getId()); + + // 发送强平价 + ThreadPoolUtils.sendWholeForceClosingPrice(entrustOrder.getSymbol(), member); + + //返佣 + ThreadPoolUtils.calReturnMoney(member.getId(), openFeePrice, contractOrderEntity, AgentReturnEntity.ORDER_TYPE_OPEN); + } + + return; + } + + log.info("持仓存在"); + ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(wholeHoldOrder); + contractOrderEntity.setBondAmount(entrustOrder.getBondAmount().add(openFeePrice)); + contractOrderEntity.setOpeningPrice(entrustOrder.getEntrustPrice()); + contractOrderEntity.setSymbolCnt(entrustOrder.getSymbolCnt()); + contractOrderEntity.setOpeningTime(new Date()); + contractOrderEntity.setMarkPrice(entrustOrder.getEntrustPrice()); + contractOrderEntity.setOpeningFeeAmount(openFeePrice); + contractOrderService.save(contractOrderEntity); + + BigDecimal totalPrice = entrustOrder.getEntrustPrice().multiply(BigDecimal.valueOf(entrustOrder.getSymbolCnt())); + BigDecimal newOpenPrice = totalPrice.add(wholeHoldOrder.getOpeningPrice().multiply(BigDecimal.valueOf(wholeHoldOrder.getSymbolCnt()))).divide(BigDecimal.valueOf(entrustOrder.getSymbolCnt() + wholeHoldOrder.getSymbolCntSale()), 8, BigDecimal.ROUND_DOWN); + // 保证金 + BigDecimal bondAmount = entrustOrder.getBondAmount(); + // 手续费 + BigDecimal fee = CalculateUtil.getOpenFeePrice(entrustOrder.getEntrustPrice(), entrustOrder.getSymbolSku(), entrustOrder.getSymbolCnt(), tradeSettingEntity.getFeeRatio()); + // 预付款 + BigDecimal prePaymentAmount = wholeHoldOrder.getPrePaymentAmount().add(entrustOrder.getEntrustAmount()); + + wholeHoldOrder.setSymbolCnt(wholeHoldOrder.getSymbolCnt() + entrustOrder.getSymbolCnt()); + wholeHoldOrder.setSymbolCntSale(wholeHoldOrder.getSymbolCntSale() + entrustOrder.getSymbolCnt()); + wholeHoldOrder.setOpeningFeeAmount(wholeHoldOrder.getOpeningFeeAmount().add(fee)); + wholeHoldOrder.setOpeningPrice(newOpenPrice); + wholeHoldOrder.setBondAmount(wholeHoldOrder.getBondAmount().add(bondAmount)); + wholeHoldOrder.setPrePaymentAmount(prePaymentAmount); + wholeHoldOrder.setOperateNo(wholeHoldOrder.getOperateNo() + 1); + contractHoldOrderService.updateById(wholeHoldOrder); + + contractEntrustOrderService.removeById(entrustOrder.getId()); + memberWalletContractService.increaseWalletContractBalanceById(null, openFeePrice.negate(), entrustOrder.getBondAmount().negate(), wallet.getId()); + + // 发送强平价 + ThreadPoolUtils.sendWholeForceClosingPrice(entrustOrder.getSymbol(), member); + + //返佣 + ThreadPoolUtils.calReturnMoney(member.getId(), openFeePrice, contractOrderEntity, AgentReturnEntity.ORDER_TYPE_OPEN); + } + /** * 爆仓 * -- Gitblit v1.9.1