From 2f6670dc8a71ec0eb2980408d558f2c3d6ddce2a Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Wed, 27 Jan 2021 18:30:42 +0800 Subject: [PATCH] modify --- src/main/java/com/xcong/excoin/modules/contract/entity/ContractHoldOrderEntity.java | 5 + src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java | 3 src/main/java/com/xcong/excoin/rabbit/pricequeue/OrderOperatePriceService.java | 13 ++ src/main/java/com/xcong/excoin/modules/contract/service/RabbitOrderService.java | 3 src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java | 16 +++ src/main/java/com/xcong/excoin/utils/ThreadPoolUtils.java | 50 ++++++++++ src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java | 43 ++++++++ src/main/java/com/xcong/excoin/utils/CalculateUtil.java | 22 ++++ src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java | 5 + src/main/java/com/xcong/excoin/rabbit/producer/OrderProducer.java | 8 + src/main/java/com/xcong/excoin/common/contants/AppContants.java | 2 src/main/java/com/xcong/excoin/modules/contract/entity/ContractOrderEntity.java | 5 + src/main/java/com/xcong/excoin/rabbit/consumer/OperateOrderPriceConsumer.java | 15 ++ src/main/java/com/xcong/excoin/rabbit/consumer/WebsocketPriceConsumer.java | 7 src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/WholeDataQueue.java | 13 ++ src/main/java/com/xcong/excoin/quartz/job/NewestPriceUpdateJob.java | 2 src/main/java/com/xcong/excoin/modules/platform/entity/PlatformTradeSettingEntity.java | 5 + src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/WholePriceDataModel.java | 44 ++++++++ 18 files changed, 256 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/xcong/excoin/common/contants/AppContants.java b/src/main/java/com/xcong/excoin/common/contants/AppContants.java index 8e98f35..57fb115 100644 --- a/src/main/java/com/xcong/excoin/common/contants/AppContants.java +++ b/src/main/java/com/xcong/excoin/common/contants/AppContants.java @@ -87,4 +87,6 @@ public static final String WHOLE_BOMB_PREFIX = "whole_bomb_"; + public static final String HOLD_BOND_RATIO = "hold_bond_ratio"; + } diff --git a/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java b/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java index bc850b9..0aadb71 100644 --- a/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java +++ b/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java @@ -57,6 +57,9 @@ // 全仓爆仓 public static final String QUEUE_WHOLE_BOMB = "QUEUE_WHOLE_BOMB_NEW"; + // 全仓价格操作 + public static final String QUEUE_WHOLE_PRICE = "QUEUE_WHOLE_PRCE"; + // 开多止盈路由键 public static final String ROUTINGKEY_MOREPRO = "ROUTINGKEY_MOREPRO"; @@ -83,6 +86,9 @@ // 全仓爆仓 public static final String ROUTINGKEY_WHOLE_BOMB = "ROUTINGKEY_WHOLE_BOMB"; + + // 全仓价格操作 + public static final String ROUTINGKEY_WHOLE_PRICE = "ROUTINGKEY_WHOLE_PRICE"; @Resource private ConnectionFactory connectionFactory; @@ -224,6 +230,10 @@ return new Queue(QUEUE_CLOSETRADE, true); } + @Bean + public Queue queueWholePrice() { + return new Queue(QUEUE_WHOLE_PRICE, true); + } /** * 全仓爆仓 * @return @@ -233,6 +243,12 @@ return new Queue(QUEUE_WHOLE_BOMB, true); } + + @Bean + public Binding bindingWholePrice() { + return BindingBuilder.bind(queueWholePrice()).to(orderExchange()).with(RabbitMqConfig.ROUTINGKEY_WHOLE_PRICE); + } + /** * 开多止盈 * diff --git a/src/main/java/com/xcong/excoin/modules/contract/entity/ContractHoldOrderEntity.java b/src/main/java/com/xcong/excoin/modules/contract/entity/ContractHoldOrderEntity.java index 183d3f8..18ac9ea 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/entity/ContractHoldOrderEntity.java +++ b/src/main/java/com/xcong/excoin/modules/contract/entity/ContractHoldOrderEntity.java @@ -163,4 +163,9 @@ */ // @TableField(exist = false) private BigDecimal rewardAmount; + + /** + * 维持保证金 + */ + private BigDecimal holdBond; } diff --git a/src/main/java/com/xcong/excoin/modules/contract/entity/ContractOrderEntity.java b/src/main/java/com/xcong/excoin/modules/contract/entity/ContractOrderEntity.java index a59fe55..fd6ae5b 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/entity/ContractOrderEntity.java +++ b/src/main/java/com/xcong/excoin/modules/contract/entity/ContractOrderEntity.java @@ -205,4 +205,9 @@ private int operateNo; + /** + * 维持保证金 + */ + private BigDecimal holdBond; + } diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/RabbitOrderService.java b/src/main/java/com/xcong/excoin/modules/contract/service/RabbitOrderService.java index e93e054..12fdddc 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/service/RabbitOrderService.java +++ b/src/main/java/com/xcong/excoin/modules/contract/service/RabbitOrderService.java @@ -3,6 +3,7 @@ import com.xcong.excoin.modules.member.entity.MemberEntity; import com.xcong.excoin.rabbit.pricequeue.OrderModel; +import com.xcong.excoin.rabbit.pricequeue.whole.WholePriceDataModel; import java.util.List; @@ -16,4 +17,6 @@ public void entrustCloseOrder(List<OrderModel> list); public void wholeBombOrder(List<OrderModel> list); + + public void wholeBombOrder(WholePriceDataModel wholePriceData); } 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 e787b1e..d80b492 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 @@ -192,6 +192,7 @@ wholeHoldOrder.setSymbolCntSale(wholeHoldOrder.getSymbolCntSale() + submitOrderDto.getSymbolCnt()); wholeHoldOrder.setPrePaymentAmount(prePaymentAmount.add(wholeHoldOrder.getPrePaymentAmount())); wholeHoldOrder.setOperateNo(wholeHoldOrder.getOperateNo()); + wholeHoldOrder.setHoldBond(CalculateUtil.calMemberHoldBond(wholeHoldOrder)); int i = contractHoldOrderDao.updateById(wholeHoldOrder); if (i > 0) { memberWalletContractDao.increaseWalletContractBalanceById(prePaymentAmount.negate(), openFeePrice.negate(), null, walletContract.getId()); @@ -238,6 +239,8 @@ ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity); contractOrderEntity.setOpeningTime(new Date()); + + holdOrderEntity.setHoldBond(CalculateUtil.calMemberHoldBond(holdOrderEntity)); contractHoldOrderDao.insert(holdOrderEntity); int i = contractOrderDao.insert(contractOrderEntity); 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 898d1cc..08df59a 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 @@ -35,6 +35,7 @@ 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.WholePriceDataModel; import com.xcong.excoin.utils.*; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -471,6 +472,10 @@ ThreadPoolUtils.calReturnMoney(memberEntity.getId(), fee, contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); } + @Override + public void wholeBombOrder(WholePriceDataModel wholePriceData) { + + } @Transactional(rollbackFor = Exception.class) @Override diff --git a/src/main/java/com/xcong/excoin/modules/platform/entity/PlatformTradeSettingEntity.java b/src/main/java/com/xcong/excoin/modules/platform/entity/PlatformTradeSettingEntity.java index b0e342e..db20d3e 100644 --- a/src/main/java/com/xcong/excoin/modules/platform/entity/PlatformTradeSettingEntity.java +++ b/src/main/java/com/xcong/excoin/modules/platform/entity/PlatformTradeSettingEntity.java @@ -65,4 +65,9 @@ * 手续费系数 */ private BigDecimal feeSpreadRatio; + + /** + * 维持保证金率 + */ + private BigDecimal holdBondRatio; } diff --git a/src/main/java/com/xcong/excoin/quartz/job/NewestPriceUpdateJob.java b/src/main/java/com/xcong/excoin/quartz/job/NewestPriceUpdateJob.java index 0bc671e..5cc8a5a 100644 --- a/src/main/java/com/xcong/excoin/quartz/job/NewestPriceUpdateJob.java +++ b/src/main/java/com/xcong/excoin/quartz/job/NewestPriceUpdateJob.java @@ -52,7 +52,7 @@ // TODO 测试环境关闭这个插入redis redisUtils.set(CoinTypeConvert.convertToKey(symbol), price); if ("ETC/USDT".equalsIgnoreCase(symbol)) { - websocketPriceService.wholeBomb(symbol, price); + websocketPriceService.wholeBomb(); } // 比较 websocketPriceService.comparePriceAsc(symbol, price); diff --git a/src/main/java/com/xcong/excoin/rabbit/consumer/OperateOrderPriceConsumer.java b/src/main/java/com/xcong/excoin/rabbit/consumer/OperateOrderPriceConsumer.java index 45ff0f7..d6f28ba 100644 --- a/src/main/java/com/xcong/excoin/rabbit/consumer/OperateOrderPriceConsumer.java +++ b/src/main/java/com/xcong/excoin/rabbit/consumer/OperateOrderPriceConsumer.java @@ -5,6 +5,8 @@ import com.xcong.excoin.configurations.RabbitMqConfig; import com.xcong.excoin.rabbit.pricequeue.OrderModel; import com.xcong.excoin.rabbit.pricequeue.OrderOperatePriceService; +import com.xcong.excoin.rabbit.pricequeue.whole.WholePriceDataModel; +import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -16,6 +18,7 @@ * 后台打包开启 APP 不开启 * @author helius */ +@Slf4j @Component @ConditionalOnProperty(prefix = "app", name = "newest-price-update-job", havingValue = "true") public class OperateOrderPriceConsumer { @@ -31,7 +34,7 @@ @RabbitListener(queues = RabbitMqConfig.QUEUE_PRICEOPERATE) public void onMessageMorePro(Message message, Channel channel) { String content = new String(message.getBody()); - System.out.println("我收到了用户的订单操作消息:" + content); + log.info("我收到了用户的订单操作消息:{}", content); // 操作前的map // 转为model OrderModel orderModel = JSONObject.parseObject(content, OrderModel.class); @@ -40,5 +43,15 @@ } + @RabbitListener(queues = RabbitMqConfig.QUEUE_WHOLE_PRICE) + public void onMessageWholePrice(Message message, Channel channel) { + log.info("我收到了用户的全仓价格消息"); + + String content = new String(message.getBody()); + WholePriceDataModel wholePriceData = JSONObject.parseObject(content, WholePriceDataModel.class); + + OrderOperatePriceService.wholePriceDataOperation(wholePriceData); + } + } diff --git a/src/main/java/com/xcong/excoin/rabbit/consumer/WebsocketPriceConsumer.java b/src/main/java/com/xcong/excoin/rabbit/consumer/WebsocketPriceConsumer.java index 17ad834..1514f79 100644 --- a/src/main/java/com/xcong/excoin/rabbit/consumer/WebsocketPriceConsumer.java +++ b/src/main/java/com/xcong/excoin/rabbit/consumer/WebsocketPriceConsumer.java @@ -6,6 +6,7 @@ import com.xcong.excoin.modules.contract.service.RabbitOrderService; import com.xcong.excoin.modules.contract.service.impl.OrderWebsocketServiceImpl; import com.xcong.excoin.rabbit.pricequeue.OrderModel; +import com.xcong.excoin.rabbit.pricequeue.whole.WholePriceDataModel; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitListener; @@ -169,8 +170,8 @@ @RabbitListener(queues = RabbitMqConfig.QUEUE_WHOLE_BOMB) public void onMessageWholeBomb(Message message, Channel channel) { String content = new String(message.getBody()); - log.info("==message-price-consumer==我收到消息了全仓爆仓: {}", content); - List<OrderModel> list = JSONArray.parseArray(content, OrderModel.class); - orderService.wholeBombOrder(list); + WholePriceDataModel wholePriceDataModel = JSONArray.parseObject(content, WholePriceDataModel.class); + log.info("==message-price-consumer==我收到消息了全仓爆仓: {}", wholePriceDataModel.getMemberId()); + orderService.wholeBombOrder(wholePriceDataModel); } } diff --git a/src/main/java/com/xcong/excoin/rabbit/pricequeue/OrderOperatePriceService.java b/src/main/java/com/xcong/excoin/rabbit/pricequeue/OrderOperatePriceService.java index adf8b4c..b74d21f 100644 --- a/src/main/java/com/xcong/excoin/rabbit/pricequeue/OrderOperatePriceService.java +++ b/src/main/java/com/xcong/excoin/rabbit/pricequeue/OrderOperatePriceService.java @@ -1,6 +1,8 @@ package com.xcong.excoin.rabbit.pricequeue; import com.alibaba.fastjson.JSONObject; +import com.xcong.excoin.rabbit.pricequeue.whole.WholeDataQueue; +import com.xcong.excoin.rabbit.pricequeue.whole.WholePriceDataModel; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -129,4 +131,15 @@ } } + public static void wholePriceDataOperation(WholePriceDataModel wholePriceData) { + Map<String, WholePriceDataModel> dataModelMap = WholeDataQueue.MAP; + + WholePriceDataModel isExistData = dataModelMap.get(wholePriceData.getMemberId().toString()); + if (isExistData != null) { + dataModelMap.remove(wholePriceData.getMemberId().toString()); + } + + dataModelMap.put(wholePriceData.getMemberId().toString(), wholePriceData); + } + } diff --git a/src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java b/src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java index ed20d89..bdc4fba 100644 --- a/src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java +++ b/src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java @@ -12,6 +12,8 @@ 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.rabbit.pricequeue.whole.WholeDataQueue; +import com.xcong.excoin.rabbit.pricequeue.whole.WholePriceDataModel; import com.xcong.excoin.rabbit.producer.OrderProducer; import com.xcong.excoin.utils.*; import lombok.extern.slf4j.Slf4j; @@ -279,6 +281,47 @@ } } + public void wholeBomb() { + Map<String, WholePriceDataModel> dataModelMap = WholeDataQueue.MAP; + if (CollUtil.isEmpty(dataModelMap)) { + return; + } + + for (Map.Entry<String, WholePriceDataModel> entry : dataModelMap.entrySet()) { + WholePriceDataModel wholePriceData = entry.getValue(); + List<ContractHoldOrderEntity> list = wholePriceData.getList(); + + if (CollUtil.isNotEmpty(list)) { + BigDecimal totalProfitOrLoss = BigDecimal.ZERO; + Map<String, BigDecimal> prices = new HashMap<>(); + for (ContractHoldOrderEntity holdOrderEntity : list) { + BigDecimal newPrice = (BigDecimal) redisUtils.get(CoinTypeConvert.convertToKey(holdOrderEntity.getSymbol())); + + BigDecimal rewardRatio = null; + if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) { + // (最新价-开仓价)*规格*张数 + rewardRatio = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(holdOrderEntity.getSymbolSku()).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())); + // 开空 + } else { + // (开仓价-最新价)*规格*张数 + rewardRatio = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(holdOrderEntity.getSymbolSku()).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())); + } + totalProfitOrLoss = totalProfitOrLoss.add(rewardRatio); + prices.put(holdOrderEntity.getSymbol(), newPrice); + } + + BigDecimal holdBond = wholePriceData.getHoldBond(); + BigDecimal balance = wholePriceData.getBalance(); + if (balance.add(totalProfitOrLoss).compareTo(holdBond) > 0) { + continue; + } + + wholePriceData.setPrices(prices); + orderProducer.sendWholeBomb(JSONObject.toJSONString(wholePriceData)); + } + } + } + public void wholeBomb(String symbol, String price) { List<Long> memberIds = contractHoldOrderDao.selectMemberHasWholeOrder(); diff --git a/src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/WholeDataQueue.java b/src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/WholeDataQueue.java new file mode 100644 index 0000000..e2d2bc9 --- /dev/null +++ b/src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/WholeDataQueue.java @@ -0,0 +1,13 @@ +package com.xcong.excoin.rabbit.pricequeue.whole; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author wzy + * @date 2021-01-27 + **/ +public class WholeDataQueue { + + public static Map<String, WholePriceDataModel> MAP = new ConcurrentHashMap<String, WholePriceDataModel>(); +} diff --git a/src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/WholePriceDataModel.java b/src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/WholePriceDataModel.java new file mode 100644 index 0000000..330d4b5 --- /dev/null +++ b/src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/WholePriceDataModel.java @@ -0,0 +1,44 @@ +package com.xcong.excoin.rabbit.pricequeue.whole; + +import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + * @author wzy + * @date 2021-01-27 + **/ +@Data +public class WholePriceDataModel implements Serializable { + + private static final long serialVersionUID = -2933657807376740142L; + + /** + * 会员ID + */ + private Long memberId; + + /** + * 当前持仓列表 + */ + private List<ContractHoldOrderEntity> list; + + /** + * 维持保证金 + */ + private BigDecimal holdBond; + + /** + * 权益 + */ + private BigDecimal balance; + + /** + * 爆仓时,各币种价格 + */ + private Map<String, BigDecimal> prices; +} diff --git a/src/main/java/com/xcong/excoin/rabbit/producer/OrderProducer.java b/src/main/java/com/xcong/excoin/rabbit/producer/OrderProducer.java index 8424731..0420d78 100644 --- a/src/main/java/com/xcong/excoin/rabbit/producer/OrderProducer.java +++ b/src/main/java/com/xcong/excoin/rabbit/producer/OrderProducer.java @@ -161,4 +161,12 @@ rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_A, RabbitMqConfig.ROUTINGKEY_WHOLE_BOMB, content, correlationData); } + public void sendWholePrice(String content) { + CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); + log.info("发送全仓价格操作 == pid : {}", correlationData.getId()); + + rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_A, RabbitMqConfig.ROUTINGKEY_WHOLE_PRICE, content, correlationData); + + } + } diff --git a/src/main/java/com/xcong/excoin/utils/CalculateUtil.java b/src/main/java/com/xcong/excoin/utils/CalculateUtil.java index 9eebe41..183a4a4 100644 --- a/src/main/java/com/xcong/excoin/utils/CalculateUtil.java +++ b/src/main/java/com/xcong/excoin/utils/CalculateUtil.java @@ -4,6 +4,7 @@ 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.RabbitPriceTypeEnum; import com.xcong.excoin.common.exception.GlobalException; @@ -14,6 +15,7 @@ import com.xcong.excoin.modules.member.entity.MemberEntity; import com.xcong.excoin.modules.member.entity.MemberSettingEntity; import com.xcong.excoin.modules.member.entity.MemberWalletContractEntity; +import com.xcong.excoin.modules.platform.dao.TradeSettingDao; import com.xcong.excoin.modules.platform.entity.PlatformTradeSettingEntity; import com.xcong.excoin.rabbit.pricequeue.OrderModel; import com.xcong.excoin.rabbit.producer.OrderProducer; @@ -269,4 +271,24 @@ return profitOrLess; } + + + /** + * 全仓模式下,维持保证金 + * 维持保证金 = 持仓价值*维持保证金率= 面值*张数*开仓价格*维持保证金率 + * @param contractHoldOrder + * @return + */ + public static BigDecimal calMemberHoldBond(ContractHoldOrderEntity contractHoldOrder) { + TradeSettingDao tradeSettingDao = SpringContextHolder.getBean(TradeSettingDao.class); + RedisUtils redisUtils = SpringContextHolder.getBean(RedisUtils.class); + PlatformTradeSettingEntity tradeSetting = tradeSettingDao.findTradeSetting(); + BigDecimal holdBondRatio = (BigDecimal) redisUtils.get(AppContants.HOLD_BOND_RATIO); + if (holdBondRatio == null) { + holdBondRatio = tradeSetting.getHoldBondRatio(); + redisUtils.set(AppContants.HOLD_BOND_RATIO, tradeSetting.getHoldBondRatio()); + } + + return contractHoldOrder.getOpeningPrice().multiply(new BigDecimal(contractHoldOrder.getSymbolCntSale())).multiply(holdBondRatio).multiply(contractHoldOrder.getSymbolSku()); + } } diff --git a/src/main/java/com/xcong/excoin/utils/ThreadPoolUtils.java b/src/main/java/com/xcong/excoin/utils/ThreadPoolUtils.java index a8129f3..9dda87b 100644 --- a/src/main/java/com/xcong/excoin/utils/ThreadPoolUtils.java +++ b/src/main/java/com/xcong/excoin/utils/ThreadPoolUtils.java @@ -1,14 +1,25 @@ package com.xcong.excoin.utils; +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSONObject; +import com.xcong.excoin.common.enumerates.CoinTypeEnum; +import com.xcong.excoin.modules.contract.dao.ContractHoldOrderDao; +import com.xcong.excoin.modules.contract.dao.ContractOrderDao; +import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity; import com.xcong.excoin.modules.contract.entity.ContractOrderEntity; import com.xcong.excoin.modules.contract.service.impl.OrderWebsocketServiceImpl; import com.xcong.excoin.modules.documentary.service.FollowOrderOperationService; +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.rabbit.pricequeue.whole.WholePriceDataModel; +import com.xcong.excoin.rabbit.producer.OrderProducer; import com.xcong.excoin.utils.dingtalk.DingTalkUtils; import lombok.extern.slf4j.Slf4j; import javax.validation.constraints.NotNull; import java.math.BigDecimal; +import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -85,4 +96,43 @@ } }); } + + /** + * 发送全仓价格操作 + * + * @param memberId + */ + public static void sendWholePrice(@NotNull Long memberId) { + EXECUTOR.execute(new Runnable() { + @Override + public void run() { + log.info("全仓操作价格"); + ContractHoldOrderDao contractHoldOrderDao = SpringContextHolder.getBean(ContractHoldOrderDao.class); + MemberWalletContractDao memberWalletContractDao = SpringContextHolder.getBean(MemberWalletContractDao.class); + + List<ContractHoldOrderEntity> holdOrders = contractHoldOrderDao.selectHoldOrderListByMemberId(memberId); + if (CollUtil.isEmpty(holdOrders)) { + return; + } + MemberWalletContractEntity wallet = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); + + WholePriceDataModel wholePriceData = new WholePriceDataModel(); + wholePriceData.setList(holdOrders); + + BigDecimal totalHoldBond = BigDecimal.ZERO; + for (ContractHoldOrderEntity holdOrder : holdOrders) { + totalHoldBond = totalHoldBond.add(holdOrder.getHoldBond() == null ? BigDecimal.ZERO : holdOrder.getHoldBond()); + } + + wholePriceData.setHoldBond(totalHoldBond); + wholePriceData.setBalance(wallet.getTotalBalance()); + wholePriceData.setMemberId(memberId); + + OrderProducer orderProducer = SpringContextHolder.getBean(OrderProducer.class); + + orderProducer.sendWholePrice(JSONObject.toJSONString(wholePriceData)); + } + }); + + } } -- Gitblit v1.9.1