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