From 503d3b2184c5f8c298d2867e64c5b3a5b6460e5f Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Sun, 31 May 2020 21:14:34 +0800
Subject: [PATCH] modify

---
 src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java |  104 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 103 insertions(+), 1 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 9d41ae6..0824dd1 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
@@ -2,15 +2,28 @@
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xcong.excoin.common.LoginUserUtils;
+import com.xcong.excoin.common.enumerates.CoinTypeEnum;
 import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.common.system.service.CommonService;
 import com.xcong.excoin.modules.contract.dao.ContractHoldOrderDao;
 import com.xcong.excoin.modules.contract.dao.ContractOrderDao;
+import com.xcong.excoin.modules.contract.entity.ContractEntrustOrderEntity;
 import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity;
+import com.xcong.excoin.modules.contract.entity.ContractOrderEntity;
+import com.xcong.excoin.modules.contract.mapper.ContractHoldOrderEntityMapper;
 import com.xcong.excoin.modules.contract.parameter.dto.SubmitOrderDto;
 import com.xcong.excoin.modules.contract.service.ContractHoldOrderService;
+import com.xcong.excoin.modules.member.dao.MemberWalletContractDao;
 import com.xcong.excoin.modules.member.entity.MemberEntity;
+import com.xcong.excoin.modules.member.entity.MemberWalletContractEntity;
+import com.xcong.excoin.modules.platform.dao.TradeSettingDao;
+import com.xcong.excoin.modules.platform.entity.PlatformTradeSettingEntity;
+import com.xcong.excoin.utils.CacheSettingUtils;
+import com.xcong.excoin.utils.CalculateUtil;
 import com.xcong.excoin.utils.CoinTypeConvert;
 import com.xcong.excoin.utils.RedisUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
@@ -19,6 +32,8 @@
  * @author wzy
  * @date 2020-05-27
  **/
+@Slf4j
+@Service
 public class ContractHoldOrderServiceImpl extends ServiceImpl<ContractHoldOrderDao, ContractHoldOrderEntity> implements ContractHoldOrderService {
 
     @Resource
@@ -26,6 +41,15 @@
 
     @Resource
     private ContractOrderDao contractOrderDao;
+
+    @Resource
+    private CommonService commonService;
+
+    @Resource
+    private MemberWalletContractDao memberWalletContractDao;
+
+    @Resource
+    private CacheSettingUtils cacheSettingUtils;
 
     @Resource
     private RedisUtils redisUtils;
@@ -36,6 +60,84 @@
 
         // 获取最新价
         BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(submitOrderDto.getSymbol())));
-        return null;
+
+        MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name());
+
+        PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting();
+
+        // 规格
+        BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(submitOrderDto.getSymbol());
+
+        // 开仓价
+        BigDecimal openingPrice = BigDecimal.ZERO;
+
+        // 开多
+        if (submitOrderDto.getOrderType() == ContractHoldOrderEntity.OPENING_TYPE_MORE) {
+            // 市场价*(1 + (点差/10000))
+            openingPrice = newPrice.multiply(BigDecimal.ONE.add(tradeSettingEntity.getSpread().divide(new BigDecimal(10000)))).setScale(8, BigDecimal.ROUND_DOWN);
+
+            // 开空
+        } else if (submitOrderDto.getOrderType() == ContractHoldOrderEntity.OPENING_TYPE_LESS) {
+            // 市场价*(1 - (点差/10000))
+            openingPrice = newPrice.multiply(BigDecimal.ONE.subtract(tradeSettingEntity.getSpread().divide(new BigDecimal(10000)))).setScale(8, BigDecimal.ROUND_DOWN);
+        } else {
+            return Result.fail("未知类型");
+        }
+
+        log.info("开仓价:{}", openingPrice);
+        // 开仓手续费 建仓价*规格*手数*手续费率
+        BigDecimal openFeePrice = openingPrice.multiply(lotNumber)
+                .multiply(new BigDecimal(submitOrderDto.getSymbolCnt()))
+                .multiply(tradeSettingEntity.getFeeRatio().divide(new BigDecimal(100)))
+                .setScale(8, BigDecimal.ROUND_DOWN);
+        log.info("开仓手续费:{}", openFeePrice);
+
+        // 保证金 建仓价*规格*手数*(1/杠杆倍率)
+        BigDecimal bondAmount = openingPrice.multiply(lotNumber).multiply(new BigDecimal(submitOrderDto.getSymbolCnt()))
+                .multiply(BigDecimal.ONE.divide(new BigDecimal(submitOrderDto.getLeverRatio())))
+                .setScale(8, BigDecimal.ROUND_DOWN);
+        log.info("保证金:{}", bondAmount);
+
+        // 预付款为 --> 保证金+开仓手续费+平仓手续费 (开仓平仓手续费相同)
+        BigDecimal prePaymentAmount = bondAmount.add(openFeePrice).add(openFeePrice);
+        log.info("预付款:{}", prePaymentAmount);
+
+        if (prePaymentAmount.compareTo(walletContract.getAvailableBalance()) > -1) {
+            return Result.fail("可用金额不足");
+        }
+
+        // 预估强平价
+        BigDecimal forceClosingPrice = CalculateUtil.getForceSetPrice(bondAmount, openingPrice, submitOrderDto.getSymbolCnt(), lotNumber, submitOrderDto.getOrderType(), memberEntity);
+        log.info("强平价:{}", forceClosingPrice);
+
+        ContractHoldOrderEntity holdOrderEntity = new ContractHoldOrderEntity();
+        holdOrderEntity.setMemberId(memberEntity.getId());
+        holdOrderEntity.setOrderNo(commonService.generateOrderNo(memberEntity.getId()));
+        holdOrderEntity.setPotionType(ContractEntrustOrderEntity.POSITION_TYPE_ADD);
+        holdOrderEntity.setTradeType(ContractHoldOrderEntity.TRADE_TYPE_MARK);
+        holdOrderEntity.setSymbol(submitOrderDto.getSymbol());
+        holdOrderEntity.setSymbolCnt(submitOrderDto.getSymbolCnt());
+        holdOrderEntity.setSymbolSku(lotNumber);
+        holdOrderEntity.setLeverRatio(submitOrderDto.getLeverRatio());
+        holdOrderEntity.setForceClosingPrice(forceClosingPrice);
+        holdOrderEntity.setOpeningFeeAmount(openFeePrice);
+        holdOrderEntity.setOpeningPrice(openingPrice);
+        holdOrderEntity.setOpeningType(submitOrderDto.getOrderType());
+        holdOrderEntity.setMarkPrice(newPrice);
+        holdOrderEntity.setIsCanClosing(ContractHoldOrderEntity.ORDER_CAN_CLOSING_Y);
+        holdOrderEntity.setPrePaymentAmount(prePaymentAmount);
+        holdOrderEntity.setBondAmount(bondAmount);
+
+        ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity);
+
+        contractHoldOrderDao.insert(holdOrderEntity);
+        int i = contractOrderDao.insert(contractOrderEntity);
+        walletContract.setAvailableBalance(walletContract.getAvailableBalance().subtract(prePaymentAmount));
+        walletContract.setFrozenBalance(walletContract.getFrozenBalance().add(prePaymentAmount));
+        memberWalletContractDao.updateById(walletContract);
+        if (i > 0) {
+            return Result.ok("success");
+        }
+        return Result.fail("fail");
     }
 }

--
Gitblit v1.9.1