From cc6d44ddf61b67225461b159f0eccdf597982c10 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Thu, 18 Mar 2021 18:14:52 +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