From 665aae9e293c4e97be597ddc4f21b4c1b1edca61 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Thu, 20 Aug 2020 18:11:45 +0800
Subject: [PATCH] modify

---
 src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java          |    2 
 src/test/java/com/xcong/excoin/WholeTest.java                                                     |   29 +++++++++
 src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java    |   29 +++++++--
 src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractEntrustOrderServiceImpl.java |   23 +++++++
 src/main/java/com/xcong/excoin/modules/contract/controller/ContractEntrustOrderController.java    |    2 
 src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java                 |   22 +++---
 src/main/java/com/xcong/excoin/utils/CoinTypeConvert.java                                         |    8 ++
 src/main/resources/mapper/member/MemberDao.xml                                                    |    5 +
 src/main/java/com/xcong/excoin/modules/contract/parameter/dto/SubmitCloseEntrustDto.java          |    4 +
 src/main/java/com/xcong/excoin/modules/contract/service/ContractEntrustOrderService.java          |    3 +
 src/main/java/com/xcong/excoin/utils/CalculateUtil.java                                           |    5 -
 src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java                                  |    2 
 12 files changed, 109 insertions(+), 25 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/contract/controller/ContractEntrustOrderController.java b/src/main/java/com/xcong/excoin/modules/contract/controller/ContractEntrustOrderController.java
index c7fa80c..05685f9 100644
--- a/src/main/java/com/xcong/excoin/modules/contract/controller/ContractEntrustOrderController.java
+++ b/src/main/java/com/xcong/excoin/modules/contract/controller/ContractEntrustOrderController.java
@@ -65,6 +65,6 @@
     @ApiOperation(value = "全仓模式 -- 提交平仓委托单", notes = "平仓委托单")
     @PostMapping(value = "/submitCloseEntrustOrder")
     public Result submitCloseEntrustOrder(@RequestBody SubmitCloseEntrustDto submitCloseEntrustDto) {
-        return Result.ok("提交成功");
+        return contractEntrustOrderService.addCloseContractEntrustOrder(submitCloseEntrustDto);
     }
 }
diff --git a/src/main/java/com/xcong/excoin/modules/contract/parameter/dto/SubmitCloseEntrustDto.java b/src/main/java/com/xcong/excoin/modules/contract/parameter/dto/SubmitCloseEntrustDto.java
index 7c03c3c..e94162d 100644
--- a/src/main/java/com/xcong/excoin/modules/contract/parameter/dto/SubmitCloseEntrustDto.java
+++ b/src/main/java/com/xcong/excoin/modules/contract/parameter/dto/SubmitCloseEntrustDto.java
@@ -31,4 +31,8 @@
     @ApiModelProperty(value = "币种数量", example = "1")
     private int symbolCnt;
 
+    @NotNull
+    @ApiModelProperty(value = "币种", example = "BTC/USDT")
+    private String symbol;
+
 }
diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/ContractEntrustOrderService.java b/src/main/java/com/xcong/excoin/modules/contract/service/ContractEntrustOrderService.java
index 2e27705..c26d2d1 100644
--- a/src/main/java/com/xcong/excoin/modules/contract/service/ContractEntrustOrderService.java
+++ b/src/main/java/com/xcong/excoin/modules/contract/service/ContractEntrustOrderService.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.xcong.excoin.common.response.Result;
 import com.xcong.excoin.modules.contract.entity.ContractEntrustOrderEntity;
+import com.xcong.excoin.modules.contract.parameter.dto.SubmitCloseEntrustDto;
 import com.xcong.excoin.modules.contract.parameter.dto.SubmitEntrustDto;
 
 import java.util.List;
@@ -20,4 +21,6 @@
 
     public List<ContractEntrustOrderEntity> selectEntrustOrderListByIds( List<Long> list);
 
+    Result addCloseContractEntrustOrder(SubmitCloseEntrustDto submitCloseEntrustDto);
+
 }
diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractEntrustOrderServiceImpl.java b/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractEntrustOrderServiceImpl.java
index cda4dcf..956948d 100644
--- a/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractEntrustOrderServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractEntrustOrderServiceImpl.java
@@ -8,10 +8,13 @@
 import com.xcong.excoin.common.response.Result;
 import com.xcong.excoin.common.system.service.CommonService;
 import com.xcong.excoin.modules.contract.dao.ContractEntrustOrderDao;
+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.ContractEntrustOrderEntityMapper;
+import com.xcong.excoin.modules.contract.parameter.dto.SubmitCloseEntrustDto;
 import com.xcong.excoin.modules.contract.parameter.dto.SubmitEntrustDto;
 import com.xcong.excoin.modules.contract.parameter.dto.SubmitOrderDto;
 import com.xcong.excoin.modules.contract.parameter.vo.ContractEntrustVo;
@@ -61,6 +64,9 @@
 
     @Resource
     private OrderProducer producer;
+
+    @Resource
+    private ContractHoldOrderDao contractHoldOrderDao;
 
     @Resource
     private ContractHoldOrderService contractHoldOrderService;
@@ -207,4 +213,21 @@
     public List<ContractEntrustOrderEntity> selectEntrustOrderListByIds(List<Long> list) {
         return contractEntrustOrderDao.selectEntrustOrderListByIds(list);
     }
+
+    @Override
+    public Result addCloseContractEntrustOrder(SubmitCloseEntrustDto submitCloseEntrustDto) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        ContractHoldOrderEntity holdOrderEntity = contractHoldOrderDao.selectHoldOrderByMemberIdAndId(member.getId(), submitCloseEntrustDto.getId());
+        if (holdOrderEntity == null) {
+            return Result.fail("订单不存在");
+        }
+
+        if(holdOrderEntity.getSymbolCntSale() - submitCloseEntrustDto.getSymbolCnt() < 0) {
+            return Result.fail("可平张数不足");
+        }
+
+        // 获取最新价
+        BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(submitCloseEntrustDto.getSymbol())));
+        return null;
+    }
 }
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 4fb9319..0419bc5 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
@@ -131,7 +131,7 @@
         log.info("全仓逻辑");
         // 获取最新价
         BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(submitOrderDto.getSymbol())));
-        MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name());
+        MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeConvert.convertContractTypeToCoin(submitOrderDto.getSymbol()));
         PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting();
 
         MemberSettingEntity memberSetting = memberSettingDao.selectMemberSettingByMemberId(memberEntity.getId());
@@ -161,6 +161,12 @@
 
             BigDecimal subBondAmount = bondAmount.subtract(wholeHoldOrder.getBondAmount());
             log.info("保证金差值:{}", subBondAmount);
+
+            if (subBondAmount.compareTo(walletContract.getAvailableBalance()) > -1) {
+                // 可用余额不足
+                return Result.fail(MessageSourceUtils.getString("member_service_0085"));
+            }
+
 
 //            BigDecimal forceClosingPrice = CalculateUtil.getForceSetPriceForWhole(submitOrderDto.getSymbol(), memberEntity);
 //            log.info("新预估强平价:{}", forceClosingPrice);
@@ -750,11 +756,20 @@
         PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting();
         BigDecimal newPriceSymbol = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(symbol)));
 
-        // 当前合约委托单
-        List<ContractEntrustOrderEntity> entrustOrderEntities = contractEntrustOrderDao.selectEntrustOrderListByMemberId(memberEntity.getId());
-
-        // 当前持仓列表
-        List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectHoldOrderListByMemberId(memberEntity.getId());
+        List<ContractEntrustOrderEntity> entrustOrderEntities = new ArrayList<>();
+        List<ContractHoldOrderEntity> holdOrderEntities = new ArrayList<>();
+        MemberWalletContractEntity walletContractEntity = null;
+        if (memberEntity.getContractPositionType().equals(ContractEntrustOrderEntity.POSITION_TYPE_ADD)) {
+            // 当前合约委托单
+            entrustOrderEntities = contractEntrustOrderDao.selectEntrustOrderListByMemberId(memberEntity.getId());
+            // 当前持仓列表
+            holdOrderEntities = contractHoldOrderDao.selectHoldOrderListByMemberId(memberEntity.getId());
+            walletContractEntity = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name());
+        } else {
+            entrustOrderEntities = contractEntrustOrderDao.selectEntrustOrderListByMemberIdAndSymbol(memberEntity.getId(), symbol);
+            holdOrderEntities = contractHoldOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberEntity.getId(), symbol);
+            walletContractEntity = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeConvert.convertContractTypeToCoin(symbol));
+        }
 
         // 冻结保证金 -- 即委托单中的保证金之和
         BigDecimal frozenBondAmount = BigDecimal.ZERO;
@@ -796,8 +811,6 @@
                 totalProfitOrLess = totalProfitOrLess.add(profitOrLess);
             }
         }
-
-        MemberWalletContractEntity walletContractEntity = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name());
 
         MemberLevelRateEntity rateEntity = memberLevelRateDao.selectLeverRateByMemberIdAndSymbol(memberEntity.getId(), symbol);
 
diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java b/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java
index 48a7aec..beb8f51 100644
--- a/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java
@@ -261,7 +261,7 @@
 
         MemberEntity memberEntity = memberDao.selectById(holdOrderEntity.getMemberId());
 
-        MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(holdOrderEntity.getMemberId(), CoinTypeEnum.USDT.name());
+        MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(holdOrderEntity.getMemberId(), CoinTypeConvert.convertContractTypeToCoin(symbol));
         if (walletContract != null) {
             BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(symbol);
             // 盈亏
diff --git a/src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java b/src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java
index b7e285a..ad95e15 100644
--- a/src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java
+++ b/src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java
@@ -21,4 +21,6 @@
 
     public List<NeedMoneyMemberVo> selectAllNeedMoneyMember(@Param("list") List<String> list);
 
+    public List<MemberEntity> selectAllMember();
+
 }
diff --git a/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java b/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
index e317ffa..97b4f6a 100644
--- a/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
@@ -185,16 +185,6 @@
         member.setRefererIds(ids);
         memberDao.updateById(member);
 
-        //初始化合约钱包
-        MemberWalletContractEntity walletContract = new MemberWalletContractEntity();
-        walletContract.setMemberId(member.getId());
-        walletContract.setAvailableBalance(AppContants.INIT_MONEY);
-        walletContract.setFrozenBalance(AppContants.INIT_MONEY);
-        walletContract.setTotalBalance(AppContants.INIT_MONEY);
-        walletContract.setBorrowedFund(AppContants.INIT_MONEY);
-        walletContract.setWalletCode(CoinTypeEnum.USDT.name());
-        memberWalletContractDao.insert(walletContract);
-
         MemberWalletContractSimulateEntity walletContractSimulate = new MemberWalletContractSimulateEntity();
         walletContractSimulate.setMemberId(member.getId());
         walletContractSimulate.setAvailableBalance(new BigDecimal(AppContants.INIT_SIMULATE_MONEY));
@@ -205,8 +195,18 @@
         memberWalletContractSimulateDao.insert(walletContractSimulate);
 
 
-        // 初始化币币钱包
         for (CoinTypeEnum coinTypeEnum : CoinTypeEnum.values()) {
+            //初始化合约钱包
+            MemberWalletContractEntity walletContract = new MemberWalletContractEntity();
+            walletContract.setMemberId(member.getId());
+            walletContract.setAvailableBalance(AppContants.INIT_MONEY);
+            walletContract.setFrozenBalance(AppContants.INIT_MONEY);
+            walletContract.setTotalBalance(AppContants.INIT_MONEY);
+            walletContract.setBorrowedFund(AppContants.INIT_MONEY);
+            walletContract.setWalletCode(coinTypeEnum.name());
+            memberWalletContractDao.insert(walletContract);
+
+            // 初始化币币钱包
             MemberWalletCoinEntity walletCoin = new MemberWalletCoinEntity();
             walletCoin.setWalletCode(coinTypeEnum.name());
             walletCoin.setMemberId(member.getId());
diff --git a/src/main/java/com/xcong/excoin/utils/CalculateUtil.java b/src/main/java/com/xcong/excoin/utils/CalculateUtil.java
index 841beee..7d167ed 100644
--- a/src/main/java/com/xcong/excoin/utils/CalculateUtil.java
+++ b/src/main/java/com/xcong/excoin/utils/CalculateUtil.java
@@ -87,7 +87,6 @@
      * 全仓模式 -- 预估强平价
      * 面值*(多单张数*多单开仓价-空单张数*空单开仓价)-余额-已实现盈亏 / 面值*(多单张数-空单张数)-(维持保证金率+TAKER手续费)*面值*(开多张数+开空张数)
      *
-     * @return
      */
     public static void getForceSetPriceForWhole(@NotNull String symbol, @NotNull MemberEntity memberEntity) {
         ContractHoldOrderDao holdOrderDao = SpringContextHolder.getBean(ContractHoldOrderDao.class);
@@ -97,7 +96,7 @@
         Long memberId = memberEntity.getId();
         BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(symbol);
         PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting();
-        MemberWalletContractEntity walletContract = walletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name());
+        MemberWalletContractEntity walletContract = walletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeConvert.convertContractTypeToCoin(symbol));
         List<ContractHoldOrderEntity> holdOrderEntities = holdOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberId, symbol);
         if (CollUtil.isNotEmpty(holdOrderEntities)) {
             // 多单开仓价
@@ -149,8 +148,6 @@
                     sendOrderBombMsg(updateHoldOrder.getId(), updateHoldOrder.getOpeningType(), forceSetPrice, updateHoldOrder.getSymbol(), updateHoldOrder.getOperateNo());
                 }
             }
-        } else {
-            throw new GlobalException("强平价异常");
         }
     }
 
diff --git a/src/main/java/com/xcong/excoin/utils/CoinTypeConvert.java b/src/main/java/com/xcong/excoin/utils/CoinTypeConvert.java
index fc2dc6c..d9babcb 100644
--- a/src/main/java/com/xcong/excoin/utils/CoinTypeConvert.java
+++ b/src/main/java/com/xcong/excoin/utils/CoinTypeConvert.java
@@ -47,4 +47,12 @@
                 return null;
         }
     }
+
+    public static String convertContractTypeToCoin(String symbol) {
+        if (symbol.indexOf("/") > 0) {
+            return symbol.substring(0, symbol.indexOf("/"));
+        } else {
+            return null;
+        }
+    }
 }
diff --git a/src/main/resources/mapper/member/MemberDao.xml b/src/main/resources/mapper/member/MemberDao.xml
index 7debfd9..4a65303 100644
--- a/src/main/resources/mapper/member/MemberDao.xml
+++ b/src/main/resources/mapper/member/MemberDao.xml
@@ -44,4 +44,9 @@
             #{item}
         </foreach >
     </select>
+
+
+    <select id="selectAllMember" resultType="com.xcong.excoin.modules.member.entity.MemberEntity">
+        select * from member
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/test/java/com/xcong/excoin/WholeTest.java b/src/test/java/com/xcong/excoin/WholeTest.java
index e685505..72454e6 100644
--- a/src/test/java/com/xcong/excoin/WholeTest.java
+++ b/src/test/java/com/xcong/excoin/WholeTest.java
@@ -1,10 +1,14 @@
 package com.xcong.excoin;
 
+import com.xcong.excoin.common.contants.AppContants;
+import com.xcong.excoin.common.enumerates.CoinTypeEnum;
 import com.xcong.excoin.modules.contract.dao.ContractHoldOrderDao;
 import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity;
 import com.xcong.excoin.modules.contract.service.RabbitOrderService;
 import com.xcong.excoin.modules.member.dao.MemberDao;
+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.utils.CalculateUtil;
 import com.xcong.excoin.utils.ThreadPoolUtils;
 import org.junit.jupiter.api.Test;
@@ -30,6 +34,9 @@
     @Autowired
     private RabbitOrderService rabbitOrderService;
 
+    @Autowired
+    private MemberWalletContractDao memberWalletContractDao;
+
     @Test
     public void forceClosePriceTest() {
         MemberEntity memberEntity = memberDao.selectById(5L);
@@ -47,5 +54,27 @@
         rabbitOrderService.cancelHoldOrder(ids);
     }
 
+    @Test
+    public void wholeContractWalletTest() {
+        List<MemberEntity> memberEntities = memberDao.selectAllMember();
+        for (MemberEntity member : memberEntities) {
+            CoinTypeEnum[] values = CoinTypeEnum.values();
+            for (CoinTypeEnum value : values) {
+                MemberWalletContractEntity walletContract = new MemberWalletContractEntity();
+                if (value.name().equals(CoinTypeEnum.USDT.name())) {
+                    continue;
+                }
+
+                walletContract.setMemberId(member.getId());
+                walletContract.setAvailableBalance(AppContants.INIT_MONEY);
+                walletContract.setFrozenBalance(AppContants.INIT_MONEY);
+                walletContract.setTotalBalance(AppContants.INIT_MONEY);
+                walletContract.setBorrowedFund(AppContants.INIT_MONEY);
+                walletContract.setWalletCode(value.name());
+                memberWalletContractDao.insert(walletContract);
+            }
+        }
+    }
+
 
 }

--
Gitblit v1.9.1