From 71b049a8efeb7c887138e51a04259e32e72a8db2 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Sun, 13 Sep 2020 03:47:59 +0800
Subject: [PATCH] modify

---
 src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java |   93 +++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 78 insertions(+), 15 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 09e931b..3f590f4 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
@@ -24,11 +24,9 @@
 import com.xcong.excoin.modules.contract.service.ContractHoldOrderService;
 import com.xcong.excoin.modules.member.dao.MemberDao;
 import com.xcong.excoin.modules.member.dao.MemberLevelRateDao;
+import com.xcong.excoin.modules.member.dao.MemberSettingDao;
 import com.xcong.excoin.modules.member.dao.MemberWalletContractDao;
-import com.xcong.excoin.modules.member.entity.AgentReturnEntity;
-import com.xcong.excoin.modules.member.entity.MemberEntity;
-import com.xcong.excoin.modules.member.entity.MemberLevelRateEntity;
-import com.xcong.excoin.modules.member.entity.MemberWalletContractEntity;
+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.OrderProducer;
@@ -82,6 +80,8 @@
 
     @Resource
     private MemberDao memberDao;
+    @Resource
+    private MemberSettingDao memberSettingDao;
 
     @Transactional(rollbackFor = Exception.class)
     @Override
@@ -95,9 +95,8 @@
 
         PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting();
 
-        Long id = memberEntity.getId();
-        MemberEntity selectById = memberDao.selectById(id);
-        BigDecimal spread = selectById.getSpread();
+        MemberSettingEntity memberSetting = memberSettingDao.selectMemberSettingByMemberId(memberEntity.getId());
+        BigDecimal spread = memberSetting.getSpread();
         // 规格
         BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(submitOrderDto.getSymbol());
 
@@ -171,7 +170,7 @@
             memberWalletContractDao.increaseWalletContractBalanceById(prePaymentAmount.negate(), openFeePrice.negate(), null, walletContract.getId());
 
             // 发送爆仓消息
-            sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), forceClosingPrice, holdOrderEntity.getSymbol());
+            sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), forceClosingPrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo());
 
             // 计算佣金
             ThreadPoolUtils.calReturnMoney(memberEntity.getId(), contractOrderEntity.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_OPEN);
@@ -233,7 +232,7 @@
                     if (rewardRatio.compareTo(BigDecimal.ZERO) > -1) {
                         rewardRatio = rewardRatio.multiply(BigDecimal.ONE.subtract(tradeSettingEntity.getProfitParam()));
                     } else {
-                        rewardRatio = rewardRatio.multiply(BigDecimal.ONE.add(tradeSettingEntity.getProfitParam()));
+//                        rewardRatio = rewardRatio.multiply(BigDecimal.ONE.add(tradeSettingEntity.getProfitParam()));
                     }
                 }
 
@@ -252,6 +251,10 @@
 //                    canAddMaxBond = BigDecimal.ZERO;
 //                }
                 BigDecimal canReduceMaxBond = holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getPrePaymentAmount());
+                if (rewardRatio.compareTo(BigDecimal.ZERO) < 0) {
+                    canReduceMaxBond = canReduceMaxBond.add(rewardRatio);
+                }
+
                 if (canReduceMaxBond.compareTo(BigDecimal.ZERO) < 0) {
                     canReduceMaxBond = BigDecimal.ZERO;
                 }
@@ -437,6 +440,33 @@
             if (holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getPrePaymentAmount()).subtract(changeBondDto.getAmount()).compareTo(BigDecimal.ZERO) < 0) {
                 return Result.fail("超出保证金最大减少金额");
             }
+            BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(holdOrderEntity.getSymbol())));
+
+            BigDecimal rewardRatio = BigDecimal.ZERO;
+            // 开多
+            if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) {
+                // (最新价-开仓价)*规格*张数
+                rewardRatio = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(holdOrderEntity.getSymbolSku()).multiply(new BigDecimal(holdOrderEntity.getSymbolCnt()));
+                // 开空
+            } else {
+                // (开仓价-最新价)*规格*张数
+                rewardRatio = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(holdOrderEntity.getSymbolSku()).multiply(new BigDecimal(holdOrderEntity.getSymbolCnt()));
+            }
+
+            if (memberEntity.getIsProfit() == MemberEntity.IS_PROFIT_Y) {
+                PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting();
+                if (rewardRatio.compareTo(BigDecimal.ZERO) > -1) {
+                    rewardRatio = rewardRatio.multiply(BigDecimal.ONE.subtract(tradeSettingEntity.getProfitParam()));
+                }
+            }
+
+            if (rewardRatio.compareTo(BigDecimal.ZERO) < 0) {
+                BigDecimal canReduceMax = holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getPrePaymentAmount()).add(rewardRatio);
+                if (canReduceMax.subtract(changeBondDto.getAmount()).compareTo(BigDecimal.ZERO) < 0) {
+                    return Result.fail("超出保证金最大减少金额");
+                }
+            }
+
             memberWalletContractDao.increaseWalletContractBalanceById(changeBondDto.getAmount(), null, null, walletContract.getId());
             holdOrderEntity.setBondAmount(holdOrderEntity.getBondAmount().subtract(changeBondDto.getAmount()));
         }
@@ -449,7 +479,7 @@
 
         if (i > 0) {
             // 发送爆仓消息
-            sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), forceClosingPrice, holdOrderEntity.getSymbol());
+            sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), forceClosingPrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo());
             return Result.ok("调整成功");
         }
         return Result.fail("调整失败");
@@ -612,7 +642,7 @@
                 } else {
                     BigDecimal available = walletContractEntity.getAvailableBalance();
                     BigDecimal lessAmount = thisTimeHold.subtract(available);
-                    MemberEntity memberEntity = memberDao.selectById(holdOrderEntity.getId());
+                    MemberEntity memberEntity = memberDao.selectById(holdOrderEntity.getMemberId());
                     memberWalletContractDao.increaseWalletContractBalanceById(available.negate(), available.negate(), null, walletContractEntity.getId());
 
                     BigDecimal newBondAmount = holdOrderEntity.getBondAmount().subtract(lessAmount);
@@ -626,21 +656,54 @@
                     contractHoldOrderDao.updateById(holdOrderEntity);
 
                     // 发送爆仓消息
-                    sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), newForcePrice, holdOrderEntity.getSymbol());
+                    sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), newForcePrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo());
                 }
             }
         }
     }
 
-    public void sendOrderBombMsg(Long id, int type, BigDecimal forceClosingPrice, String symbol) {
+    public void sendOrderBombMsg(Long id, int type, BigDecimal forceClosingPrice, String symbol, int operateNo) {
         OrderModel model = null;
         // 开多
         if (ContractHoldOrderEntity.OPENING_TYPE_MORE == type) {
-            model = new OrderModel(id, RabbitPriceTypeEnum.CLOSE_MORE_BOMB.getValue(), forceClosingPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), symbol, 1);
+            model = new OrderModel(id, RabbitPriceTypeEnum.CLOSE_MORE_BOMB.getValue(), forceClosingPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), symbol, operateNo);
             // 开空
         } else {
-            model = new OrderModel(id, RabbitPriceTypeEnum.CLOSE_LESS_BOMB.getValue(), forceClosingPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), symbol, 1);
+            model = new OrderModel(id, RabbitPriceTypeEnum.CLOSE_LESS_BOMB.getValue(), forceClosingPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), symbol, operateNo);
         }
         producer.sendPriceOperate(JSONObject.toJSONString(model));
     }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void calHoldFeeAmountForBondAmount() {
+        List<ContractHoldOrderEntity> list = contractHoldOrderDao.selectAllHoldOrder();
+        PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting();
+
+        if (CollUtil.isNotEmpty(list)) {
+            for (ContractHoldOrderEntity holdOrderEntity : list) {
+                BigDecimal holdAmount = holdOrderEntity.getHoldAmount();
+                if (holdAmount == null) {
+                    holdAmount = BigDecimal.ZERO;
+                }
+
+                BigDecimal thisTimeHold = holdOrderEntity.getBondAmount().multiply(tradeSettingEntity.getDoingRatio());
+                log.info("订单编号:{}, 持仓费:{}", holdOrderEntity.getOrderNo(), thisTimeHold);
+
+                MemberEntity memberEntity = memberDao.selectById(holdOrderEntity.getMemberId());
+                BigDecimal subBond = holdOrderEntity.getBondAmount().subtract(thisTimeHold);
+
+                BigDecimal newForcePrice = CalculateUtil.getForceSetPrice(subBond.subtract(holdOrderEntity.getOpeningFeeAmount()), holdOrderEntity.getOpeningPrice(), holdOrderEntity.getSymbolCnt(), holdOrderEntity.getSymbolSku(), holdOrderEntity.getOpeningType(), memberEntity);
+                holdAmount = holdAmount.add(thisTimeHold);
+                holdOrderEntity.setBondAmount(subBond);
+                holdOrderEntity.setHoldAmount(holdAmount);
+                holdOrderEntity.setForceClosingPrice(newForcePrice);
+                holdOrderEntity.setOperateNo(holdOrderEntity.getOperateNo() + 1);
+                contractHoldOrderDao.updateById(holdOrderEntity);
+
+                // 发送爆仓消息
+                sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), newForcePrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo());
+            }
+        }
+    }
 }

--
Gitblit v1.9.1