From 9219e18a9b2fb06b95b5c881b057d3fde7270ca3 Mon Sep 17 00:00:00 2001 From: zainali5120 <512061637@qq.com> Date: Thu, 25 Feb 2021 10:28:54 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/whole_new' into whole_new --- src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java | 105 ++++++++++++++++++++++++++++++---------------------- 1 files changed, 60 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java b/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java index f75401d..d6c5c3c 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java @@ -3,6 +3,7 @@ import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSONObject; import com.xcong.excoin.common.contants.AppContants; +import com.xcong.excoin.common.enumerates.CoinTypeEnum; import com.xcong.excoin.modules.coin.dao.MemberAccountFlowEntityDao; import com.xcong.excoin.modules.coin.entity.MemberAccountFlowEntity; import com.xcong.excoin.modules.contract.dao.ContractEntrustOrderDao; @@ -185,12 +186,7 @@ // 本次需要退回的保证金 BigDecimal prePrice = order.getBondAmount(); Long memberId = order.getMemberId(); - MemberWalletContractEntity wallet; - if (order.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) { - wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); - } else { - wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeConvert.convertContractTypeToCoin(order.getSymbol())); - } + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); if (wallet != null) { // 历史订单 @@ -199,7 +195,7 @@ contractOrderEntity.setId(null); // 本次平仓数量 - int currentFlat = order.getSymbolCnt(); + int currentFlat = order.getSymbolCntSale(); BigDecimal symbolSku = cacheSettingUtils.getSymbolSku(order.getSymbol()); // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 BigDecimal profitLossPrice = (closePrice @@ -248,6 +244,7 @@ // 全仓模式,止盈/止损 删除委托平仓 if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) { + ThreadPoolUtils.sendWholePrice(memberId); deleteEntrustCloseOrder(order.getOrderNo()); } } @@ -290,12 +287,8 @@ // 本次需要退回的预付款 BigDecimal prePrice = order.getBondAmount(); Long memberId = order.getMemberId(); - MemberWalletContractEntity wallet; - if (order.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) { - wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); - } else { - wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeConvert.convertContractTypeToCoin(order.getSymbol())); - } + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); + if (wallet != null) { // 历史订单 ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(order); @@ -303,7 +296,7 @@ contractOrderEntity.setId(null); // 本次平仓数量 - int currentFlat = order.getSymbolCnt(); + int currentFlat = order.getSymbolCntSale(); BigDecimal symbolSku = cacheSettingUtils.getSymbolSku(order.getSymbol()); // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 BigDecimal profitLossPrice = (order.getOpeningPrice() @@ -352,6 +345,7 @@ // 全仓模式,止盈/止损 删除委托平仓 if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) { + ThreadPoolUtils.sendWholePrice(memberId); deleteEntrustCloseOrder(order.getOrderNo()); } } @@ -395,12 +389,7 @@ Long memberId = order.getMemberId(); // 本次需要退回的预付款 BigDecimal prePrice = order.getBondAmount(); - MemberWalletContractEntity wallet; - if (order.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) { - wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); - } else { - wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeConvert.convertContractTypeToCoin(order.getSymbol())); - } + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); if (wallet != null) { // 历史订单 @@ -409,7 +398,7 @@ contractOrderEntity.setId(null); // 本次平仓数量 - int currentFlat = order.getSymbolCnt(); + int currentFlat = order.getSymbolCntSale(); BigDecimal symbolSku = cacheSettingUtils.getSymbolSku(order.getSymbol()); // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 BigDecimal profitLossPrice = (closePrice @@ -455,6 +444,7 @@ // 全仓模式,止盈/止损 删除委托平仓 if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) { + ThreadPoolUtils.sendWholePrice(memberId); deleteEntrustCloseOrder(order.getOrderNo()); } } @@ -497,12 +487,7 @@ Long memberId = order.getMemberId(); // 本次需要退回的预付款 BigDecimal prePrice = order.getBondAmount(); - MemberWalletContractEntity wallet; - if (order.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) { - wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); - } else { - wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeConvert.convertContractTypeToCoin(order.getSymbol())); - } + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); if (wallet != null) { // 历史订单 @@ -511,7 +496,7 @@ contractOrderEntity.setId(null); // 本次平仓数量 - int currentFlat = order.getSymbolCnt(); + int currentFlat = order.getSymbolCntSale(); BigDecimal symbolSku = cacheSettingUtils.getSymbolSku(order.getSymbol()); // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 BigDecimal profitLossPrice = (order.getOpeningPrice() @@ -557,6 +542,7 @@ // 全仓模式,止盈/止损 删除委托平仓 if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) { + ThreadPoolUtils.sendWholePrice(memberId); deleteEntrustCloseOrder(order.getOrderNo()); } } @@ -637,6 +623,7 @@ contractHoldOrderEntity.setOpeningPrice(entrustPrice); contractHoldOrderEntity.setTradeType(ContractHoldOrderEntity.TRADE_TYPE_LIMIT); contractHoldOrderEntity.setOperateNo(1); + contractHoldOrderEntity.setSymbolCntSale(contractHoldOrderEntity.getSymbolCnt()); contractHoldOrderService.save(contractHoldOrderEntity); // 需要一个历史插入 @@ -651,11 +638,11 @@ // 市价 if (coinsCoinsOrder.getEntrustType() == 1) { // 开多 - OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 6, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1); + OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 6, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1, coinsCoinsOrder.getMemberId()); producer.sendPriceOperate(JSONObject.toJSONString(model)); } else { // 开空 - OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 7, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1); + OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 7, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1, coinsCoinsOrder.getMemberId()); producer.sendPriceOperate(JSONObject.toJSONString(model)); } // 扣除手续费 @@ -671,7 +658,22 @@ private void wholeEntrustOrder(ContractEntrustOrderEntity entrustOrder) { log.info("全仓委托逻辑处理:{}", entrustOrder.getOrderNo()); - MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(entrustOrder.getMemberId(), CoinTypeConvert.convertContractTypeToCoin(entrustOrder.getSymbol())); + + int i = 1; + while (true) { + List<Object> types = redisUtils.lGet(AppContants.MEMBER_TYPE + entrustOrder.getMemberId(), 0, -1); + if (CollUtil.isEmpty(types)) { + break; + } + log.info("存在止盈/止损/爆仓/委托平仓,等待 -- {}", i); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + i++; + } + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(entrustOrder.getMemberId(), CoinTypeEnum.USDT.name()); PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); MemberEntity member = memberService.getById(entrustOrder.getMemberId()); @@ -703,6 +705,7 @@ holdOrderEntity.setOperateNo(1); // 设置合约类型 holdOrderEntity.setContractType(ContractOrderEntity.CONTRACTTYPE_NORMAL); + holdOrderEntity.setHoldBond(CalculateUtil.calMemberHoldBond(holdOrderEntity)); ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity); contractOrderEntity.setOpeningTime(new Date()); @@ -713,6 +716,8 @@ if (isSuccess) { contractEntrustOrderService.removeById(entrustOrder.getId()); memberWalletContractService.increaseWalletContractBalanceById(null, openFeePrice.negate(), entrustOrder.getBondAmount().negate(), wallet.getId()); + + ThreadPoolUtils.sendWholePrice(member.getId()); // 发送强平价 ThreadPoolUtils.sendWholeForceClosingPrice(entrustOrder.getSymbol(), member); @@ -767,6 +772,7 @@ * * @param */ + @Transactional(rollbackFor = Exception.class) public void dealCoinOut(List<ContractHoldOrderEntity> orderList, List<OrderModel> orderModels) { if (CollectionUtils.isNotEmpty(orderList)) { Map<Long, Integer> modelMap = new HashMap<Long, Integer>(); @@ -797,7 +803,7 @@ bombOrder(holdOrderEntity); } - MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(coinsOrder.getMemberId(), CoinTypeConvert.convertContractTypeToCoin(coinsOrder.getSymbol())); + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(coinsOrder.getMemberId(), CoinTypeEnum.USDT.name()); // 流水记录 TODO MemberAccountFlowEntity record = new MemberAccountFlowEntity(); @@ -858,7 +864,7 @@ contractOrderService.save(contractOrderEntity); //更新用户钱包数据 - MemberWalletContractEntity usdt = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memId, "USDT"); + MemberWalletContractEntity usdt = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memId, CoinTypeEnum.USDT.name()); // 减去的时候用负数 BigDecimal totalPrice = coinsOrder.getBondAmount().negate(); @@ -875,23 +881,32 @@ record.setPrice(coinsOrder.getBondAmount()); memberAccountFlowEntityDao.insert(record); } else { - MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memId, CoinTypeConvert.convertContractTypeToCoin(coinsOrder.getSymbol())); + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memId, "USDT"); - BigDecimal rewardRatio = BigDecimal.ZERO; - // 开多 - if (ContractHoldOrderEntity.OPENING_TYPE_MORE == coinsOrder.getOpeningType()) { - // (最新价-开仓价)*规格*张数 - rewardRatio = nowPrice.subtract(coinsOrder.getOpeningPrice()).multiply(coinsOrder.getSymbolSku()).multiply(new BigDecimal(coinsOrder.getSymbolCntSale())); - // 开空 - } else { - // (开仓价-最新价)*规格*张数 - rewardRatio = coinsOrder.getOpeningPrice().subtract(nowPrice).multiply(coinsOrder.getSymbolSku()).multiply(new BigDecimal(coinsOrder.getSymbolCntSale())); +// BigDecimal rewardRatio = BigDecimal.ZERO; +// // 开多 +// if (ContractHoldOrderEntity.OPENING_TYPE_MORE == coinsOrder.getOpeningType()) { +// // (最新价-开仓价)*规格*张数 +// rewardRatio = nowPrice.subtract(coinsOrder.getOpeningPrice()).multiply(coinsOrder.getSymbolSku()).multiply(new BigDecimal(coinsOrder.getSymbolCntSale())); +// // 开空 +// } else { +// // (开仓价-最新价)*规格*张数 +// rewardRatio = coinsOrder.getOpeningPrice().subtract(nowPrice).multiply(coinsOrder.getSymbolSku()).multiply(new BigDecimal(coinsOrder.getSymbolCntSale())); +// } + + // 委托单总委托金额 + BigDecimal totalPrePayment = BigDecimal.ZERO; + List<ContractEntrustOrderEntity> entrustOrderEntities = contractEntrustOrderDao.selectEntrustOrderListByMemberId(memId); + if (CollUtil.isNotEmpty(entrustOrderEntities)) { + for (ContractEntrustOrderEntity entrustOrderEntity : entrustOrderEntities) { + totalPrePayment = totalPrePayment.add(entrustOrderEntity.getEntrustAmount()); + } } - contractOrderEntity.setRewardAmount(rewardRatio); + contractOrderEntity.setRewardAmount(wallet.getTotalBalance().subtract(totalPrePayment).subtract(contractOrderEntity.getOpeningFeeAmount()).negate()); contractOrderService.save(contractOrderEntity); - memberWalletContractService.increaseWalletContractBalanceById(wallet.getAvailableBalance().negate(), wallet.getTotalBalance().negate(), null, wallet.getId()); + memberWalletContractService.increaseWalletContractBalanceById(wallet.getAvailableBalance().negate(), wallet.getTotalBalance().subtract(totalPrePayment).negate(), null, wallet.getId()); } } } -- Gitblit v1.9.1