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); } } 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; } 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); } 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; } } 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); 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); // 盈亏 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(); } 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()); 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("强平价异常"); } } 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; } } } 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> 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); } } } }