From 93f666908b8b84336aed251a1cc22b49b5c4b12f Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Fri, 29 Jan 2021 17:25:48 +0800 Subject: [PATCH] Merge branch 'whole_new' of https://gitee.com/chonggaoxiao/new_excoin into whole_new --- src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 161 insertions(+), 6 deletions(-) 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 c1fb604..c316708 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 @@ -2,10 +2,12 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; import com.xcong.excoin.common.contants.AppContants; import com.xcong.excoin.common.enumerates.CoinTypeEnum; import com.xcong.excoin.common.enumerates.OrderClosingTypeEnum; import com.xcong.excoin.common.system.service.CommonService; +import com.xcong.excoin.modules.coin.entity.MemberAccountFlowEntity; import com.xcong.excoin.modules.contract.dao.ContractEntrustOrderDao; import com.xcong.excoin.modules.contract.dao.ContractHoldOrderDao; import com.xcong.excoin.modules.contract.dao.ContractOrderDao; @@ -33,6 +35,8 @@ import com.xcong.excoin.modules.member.entity.MemberWalletContractEntity; import com.xcong.excoin.modules.platform.entity.PlatformTradeSettingEntity; import com.xcong.excoin.rabbit.pricequeue.OrderModel; +import com.xcong.excoin.rabbit.pricequeue.whole.HoldOrderDataModel; +import com.xcong.excoin.rabbit.pricequeue.whole.WholePriceDataModel; import com.xcong.excoin.utils.*; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -43,6 +47,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Map; /** * @author wzy @@ -107,7 +112,7 @@ } } } - }catch (Exception e) { + } catch (Exception e) { log.error("平仓异常", e); } @@ -258,7 +263,7 @@ MemberEntity memberEntity = memberDao.selectById(holdOrderEntity.getMemberId()); - MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(holdOrderEntity.getMemberId(), CoinTypeConvert.convertContractTypeToCoin(symbol)); + MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(holdOrderEntity.getMemberId(), CoinTypeEnum.USDT.name()); if (walletContract != null) { BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(symbol); // 盈亏 @@ -304,7 +309,8 @@ BigDecimal fee = BigDecimal.ZERO; if (holdOrderEntity.getSymbolCntSale() != 0) { - fee = holdOrderEntity.getOpeningFeeAmount().divide(BigDecimal.valueOf(holdOrderEntity.getSymbolCnt()), 8, BigDecimal.ROUND_DOWN).multiply(BigDecimal.valueOf(closeCnt)); + BigDecimal totalFeeAmount = contractOrderDao.selectWholeFeeAmountByOrderNo(holdOrderEntity.getOrderNo()); + fee = totalFeeAmount.divide(BigDecimal.valueOf(holdOrderEntity.getSymbolCnt()), 8, BigDecimal.ROUND_DOWN).multiply(BigDecimal.valueOf(closeCnt)); } else { fee = holdOrderEntity.getOpeningFeeAmount(); } @@ -316,16 +322,27 @@ contractOrderEntity.setClosingType(closingType); contractOrderEntity.setSymbolCnt(closeCnt); contractOrderEntity.setRewardAmount(profitOrLoss); - contractOrderEntity.setBondAmount(bondAmount); + contractOrderEntity.setBondAmount(bondAmount.add(fee)); contractOrderEntity.setClosingFeeAmount(fee); + contractOrderEntity.setClosingTime(new Date()); contractOrderDao.insert(contractOrderEntity); if (holdOrderEntity.getSymbolCntSale() != 0) { holdOrderEntity.setOpeningFeeAmount(holdOrderEntity.getOpeningFeeAmount().subtract(fee)); holdOrderEntity.setBondAmount(holdOrderEntity.getBondAmount().subtract(bondAmount)); + BigDecimal rewardAmount = holdOrderEntity.getRewardAmount() == null ? BigDecimal.ZERO : holdOrderEntity.getRewardAmount(); + holdOrderEntity.setRewardAmount(rewardAmount.add(profitOrLoss)); contractHoldOrderDao.updateById(holdOrderEntity); } else { contractHoldOrderDao.deleteById(holdOrderEntity.getId()); + + // 若平掉所有张数,若存在委托平仓,则删除委托平仓记录 + List<ContractEntrustOrderEntity> entrustOrders = contractEntrustOrderDao.selectEntrustOrderByOrderNo(holdOrderEntity.getOrderNo()); + if (CollUtil.isNotEmpty(entrustOrders)) { + for (ContractEntrustOrderEntity entrustOrder : entrustOrders) { + contractEntrustOrderDao.deleteById(entrustOrder.getId()); + } + } } BigDecimal changeAmount = profitOrLoss.add(bondAmount); @@ -335,6 +352,8 @@ log.info("totalMoney : {}", total); memberWalletContractDao.increaseWalletContractBalanceById(changeAmount, total, null, walletContract.getId()); + + ThreadPoolUtils.sendWholePrice(memberEntity.getId()); ThreadPoolUtils.sendWholeForceClosingPrice(holdOrderEntity.getSymbol(), memberEntity); // 计算佣金 @@ -368,7 +387,7 @@ String symbol = entrustOrder.getSymbol(); MemberEntity memberEntity = memberDao.selectById(memberId); - MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeConvert.convertContractTypeToCoin(symbol)); + MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(symbol); @@ -376,6 +395,13 @@ int closeCnt = entrustOrder.getSymbolCnt(); ContractHoldOrderEntity holdOrderEntity = contractHoldOrderDao.selectWholeHoldOrderByOrderType(memberId, orderType, symbol); + + List<Object> types = redisUtils.lGet(AppContants.RABBIT_TYPE + holdOrderEntity.getId(), 0, -1); + if (types.contains(9) || types.contains(10) || types.contains(11) || types.contains(12)) { + log.info("存在止盈/止损 orderId : {}, types : {}", holdOrderEntity.getId(), JSONObject.toJSONString(types)); + return; + } + BigDecimal profitOrLoss; int closingType; // 平多 @@ -415,6 +441,8 @@ log.info("fee:{}", fee); ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity); contractOrderEntity.setId(null); + contractOrderEntity.setEntrustOpeningPrice(newPrice); + contractOrderEntity.setEntrustTime(new Date()); contractOrderEntity.setClosingPrice(newPrice); contractOrderEntity.setOrderType(orderType); contractOrderEntity.setClosingType(closingType); @@ -424,7 +452,8 @@ contractOrderEntity.setClosingFeeAmount(fee); contractOrderDao.insert(contractOrderEntity); - if (holdOrderEntity.getSymbolCntSale() != 0) { + if (holdOrderEntity.getSymbolCntSale() - closeCnt != 0) { + holdOrderEntity.setSymbolCntSale(holdOrderEntity.getSymbolCntSale() - closeCnt); holdOrderEntity.setOpeningFeeAmount(holdOrderEntity.getOpeningFeeAmount().subtract(fee)); holdOrderEntity.setBondAmount(holdOrderEntity.getBondAmount().subtract(bondAmount)); contractHoldOrderDao.updateById(holdOrderEntity); @@ -440,8 +469,134 @@ memberWalletContractDao.increaseWalletContractBalanceById(changeAmount, total, null, walletContract.getId()); + contractEntrustOrderDao.deleteById(entrustOrder.getId()); + + ThreadPoolUtils.sendWholePrice(memberEntity.getId()); + ThreadPoolUtils.sendWholeForceClosingPrice(holdOrderEntity.getSymbol(), memberEntity); // 计算佣金 ThreadPoolUtils.calReturnMoney(memberEntity.getId(), fee, contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); } + + @Transactional(rollbackFor = Exception.class) + @Override + public void wholeBombOrder(WholePriceDataModel wholePriceData) { + MemberWalletContractEntity wallet = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(wholePriceData.getMemberId(), CoinTypeEnum.USDT.name()); + + List<HoldOrderDataModel> list = wholePriceData.getList(); + if (CollUtil.isNotEmpty(list)) { + for (HoldOrderDataModel holdOrderDataModel : list) { + ContractHoldOrderEntity holdOrderEntity = contractHoldOrderDao.selectById(holdOrderDataModel.getId()); + if (holdOrderEntity == null) { + continue; + } + + contractHoldOrderDao.deleteById(holdOrderDataModel.getId()); + + ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity); + + if (holdOrderEntity.getOpeningType() == ContractHoldOrderEntity.OPENING_TYPE_MORE) { + contractOrderEntity.setClosingType(4); + } else { + contractOrderEntity.setClosingType(5); + } + + BigDecimal rewardRatio = holdOrderDataModel.getRewardAmount().divide(holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount()), 8, BigDecimal.ROUND_DOWN); + contractOrderEntity.setRewardRatio(rewardRatio); + contractOrderEntity.setRewardAmount(holdOrderDataModel.getRewardAmount().add(contractOrderEntity.getBondAmount().negate())); + contractOrderEntity.setClosingPrice(holdOrderDataModel.getClosingPrice()); +// contractOrderEntity.setForceClosingPrice(holdOrderDataModel.getClosingPrice()); + + // 订单状态转换 + if (ContractOrderEntity.ORDER_TYPE_OPEN_MORE == contractOrderEntity.getOrderType()) { + contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_MORE); + } else { + contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_LESS); + } + contractOrderEntity.setClosingTime(new Date()); + + contractOrderDao.insert(contractOrderEntity); + } + + List<ContractEntrustOrderEntity> entrustOrder = contractEntrustOrderDao.selectEntrustOrderListByMemberId(wholePriceData.getMemberId()); + BigDecimal totalAmount = BigDecimal.ZERO; + if (CollUtil.isNotEmpty(entrustOrder)) { + for (ContractEntrustOrderEntity contractEntrustOrderEntity : entrustOrder) { + totalAmount.add(contractEntrustOrderEntity.getEntrustAmount()); + } + } + + memberWalletContractDao.increaseWalletContractBalanceById(wallet.getAvailableBalance().negate(), wallet.getTotalBalance().subtract(totalAmount).negate(), null, wallet.getId()); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void wholeBombOrder(List<OrderModel> list) { + for (OrderModel orderModel : list) { + MemberEntity memberEntity = memberDao.selectById(orderModel.getMemberId()); + Long memberId = memberEntity.getId(); + List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberId, null); + MemberWalletContractEntity wallet = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); + + Map<Object, Object> value = redisUtils.hmget(AppContants.WHOLE_BOMB_PREFIX + memberId); + if (CollUtil.isNotEmpty(holdOrderEntities)) { + BigDecimal maxLess = BigDecimal.ZERO; + ContractOrderEntity maxLessEntity = null; + BigDecimal totalProfitOrLess = BigDecimal.ZERO; + for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) { + // 删除次仓订单 + contractHoldOrderDao.deleteById(holdOrderEntity.getId()); + BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(holdOrderEntity.getSymbol()); + String symbolPrice = (String) value.get(holdOrderEntity.getSymbol()); + log.info("symbolPrice : {}, symbol : {}", symbolPrice, holdOrderEntity.getSymbol()); + BigDecimal currentPrice = new BigDecimal(symbolPrice); + + BigDecimal profitOrLess = CalculateUtil.calOrderProfitOrLess(holdOrderEntity.getOpeningType(), currentPrice, holdOrderEntity.getOpeningPrice(), lotNumber, holdOrderEntity.getSymbolCntSale(), memberEntity.getIsProfit()); + log.info("profitOrLess ---> {}", profitOrLess); + ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity); + + // 查询是否满足爆仓条件 + if (holdOrderEntity.getOpeningType() == ContractHoldOrderEntity.OPENING_TYPE_MORE) { + contractOrderEntity.setClosingType(4); + } else { + contractOrderEntity.setClosingType(5); + } + + // 盈亏比例(回报率) + BigDecimal rewardRatio = profitOrLess.divide(holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount()), 8, BigDecimal.ROUND_DOWN); + contractOrderEntity.setId(null); + contractOrderEntity.setRewardRatio(rewardRatio); + contractOrderEntity.setRewardAmount(profitOrLess); + contractOrderEntity.setClosingPrice(currentPrice); + contractOrderEntity.setForceClosingPrice(currentPrice); + + // 订单状态转换 + if (ContractOrderEntity.ORDER_TYPE_OPEN_MORE == contractOrderEntity.getOrderType()) { + contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_MORE); + } else { + contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_LESS); + } + contractOrderEntity.setClosingTime(new Date()); + contractOrderEntity.setClosingFeeAmount(holdOrderEntity.getOpeningFeeAmount()); + + contractOrderDao.insert(contractOrderEntity); + } + + List<ContractEntrustOrderEntity> entrustOrder = contractEntrustOrderDao.selectEntrustOrderListByMemberId(memberId); + BigDecimal totalAmount = BigDecimal.ZERO; + if (CollUtil.isNotEmpty(entrustOrder)) { + for (ContractEntrustOrderEntity contractEntrustOrderEntity : entrustOrder) { + totalAmount.add(contractEntrustOrderEntity.getEntrustAmount()); + } + } + + memberWalletContractDao.increaseWalletContractBalanceById(wallet.getAvailableBalance().negate(), wallet.getTotalBalance().subtract(totalAmount).negate(), null, wallet.getId()); + + redisUtils.del(AppContants.WHOLE_BOMB_PREFIX + memberId); + } else { + log.info("无当前持仓"); + } + } + } } -- Gitblit v1.9.1