From d5b1ec5dca1aefb6425d2e12b1b2804714019c27 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Thu, 28 Jan 2021 16:31:21 +0800
Subject: [PATCH] whole bomb finish
---
src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java | 46 +++++++++++
src/test/java/com/xcong/excoin/WholeTest.java | 48 ++++++++----
src/main/resources/mapper/contract/ContractHoldOrderDao.xml | 9 +-
src/main/java/com/xcong/excoin/modules/contract/mapper/ContractHoldOrderEntityMapper.java | 7 +
src/main/java/com/xcong/excoin/modules/contract/dao/ContractHoldOrderDao.java | 2
src/main/java/com/xcong/excoin/rabbit/consumer/OperateOrderPriceConsumer.java | 3
src/main/java/com/xcong/excoin/utils/ThreadPoolUtils.java | 5 +
src/main/java/com/xcong/excoin/rabbit/init/OrderProducerInit.java | 14 --
src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/HoldOrderDataModel.java | 29 +++++++
src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/WholePriceDataModel.java | 2
src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java | 25 ++++--
11 files changed, 145 insertions(+), 45 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/modules/contract/dao/ContractHoldOrderDao.java b/src/main/java/com/xcong/excoin/modules/contract/dao/ContractHoldOrderDao.java
index a16a8b9..113ef5c 100644
--- a/src/main/java/com/xcong/excoin/modules/contract/dao/ContractHoldOrderDao.java
+++ b/src/main/java/com/xcong/excoin/modules/contract/dao/ContractHoldOrderDao.java
@@ -53,7 +53,7 @@
public List<ContractHoldOrderEntity> selectHoldOrderListForWholeByMemberIdAndSymbol(@Param("memberId") Long memberId, @Param("symbol") String symbol);
- public List<HashMap<String, Object>> selectAllWholeOrderMemberIdAndSymbol();
+ public List<Long> selectAllWholeOrderMemberId();
public List<String> selectWholeHoldOrderSymbolsByMemberId(@Param("memberId") Long memberId);
diff --git a/src/main/java/com/xcong/excoin/modules/contract/mapper/ContractHoldOrderEntityMapper.java b/src/main/java/com/xcong/excoin/modules/contract/mapper/ContractHoldOrderEntityMapper.java
index b2ad5e4..390dca2 100644
--- a/src/main/java/com/xcong/excoin/modules/contract/mapper/ContractHoldOrderEntityMapper.java
+++ b/src/main/java/com/xcong/excoin/modules/contract/mapper/ContractHoldOrderEntityMapper.java
@@ -4,9 +4,12 @@
import com.xcong.excoin.modules.contract.entity.ContractOrderEntity;
import com.xcong.excoin.modules.contract.parameter.vo.HoldOrderDetailVo;
import com.xcong.excoin.modules.contract.parameter.vo.HoldOrderListVo;
+import com.xcong.excoin.rabbit.pricequeue.whole.HoldOrderDataModel;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
+
+import java.util.List;
/**
* @author wzy
@@ -24,4 +27,8 @@
@Mapping(target = "openingTime", source = "createTime")
public abstract HoldOrderDetailVo holdOrderToOrderDetailVo(ContractHoldOrderEntity holdOrderEntity);
+
+ public abstract HoldOrderDataModel entityToDataModel(ContractHoldOrderEntity holdOrderEntity);
+
+ public abstract List<HoldOrderDataModel> entitiesToDataModels(List<ContractHoldOrderEntity> holdOrderEntities);
}
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 08df59a..61a73e7 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.HoldOrderDataModel;
import com.xcong.excoin.rabbit.pricequeue.whole.WholePriceDataModel;
import com.xcong.excoin.utils.*;
import lombok.extern.slf4j.Slf4j;
@@ -472,9 +473,54 @@
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());
+
+ 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());
+ 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());
+ contractOrderEntity.setClosingFeeAmount(holdOrderEntity.getOpeningFeeAmount());
+
+ 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)
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 d6f28ba..e17b469 100644
--- a/src/main/java/com/xcong/excoin/rabbit/consumer/OperateOrderPriceConsumer.java
+++ b/src/main/java/com/xcong/excoin/rabbit/consumer/OperateOrderPriceConsumer.java
@@ -45,11 +45,10 @@
@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);
+ log.info("我收到了用户的全仓价格消息 : {}", content);
OrderOperatePriceService.wholePriceDataOperation(wholePriceData);
}
diff --git a/src/main/java/com/xcong/excoin/rabbit/init/OrderProducerInit.java b/src/main/java/com/xcong/excoin/rabbit/init/OrderProducerInit.java
index 7733528..529878d 100644
--- a/src/main/java/com/xcong/excoin/rabbit/init/OrderProducerInit.java
+++ b/src/main/java/com/xcong/excoin/rabbit/init/OrderProducerInit.java
@@ -129,18 +129,10 @@
}
// 全仓持仓
- List<HashMap<String, Object>> wholeHoldOrders = contractHoldOrderDao.selectAllWholeOrderMemberIdAndSymbol();
+ List<Long> wholeHoldOrders = contractHoldOrderDao.selectAllWholeOrderMemberId();
if (CollUtil.isNotEmpty(wholeHoldOrders)) {
- MemberEntity memberEntity = null;
- for (HashMap<String, Object> wholeHoldOrder : wholeHoldOrders) {
- Long memberId = (Long) wholeHoldOrder.get("member_id");
- String symbol = (String) wholeHoldOrder.get("symbol");
- if (memberEntity == null || !memberId.equals(memberEntity.getId())) {
- memberEntity = memberDao.selectById(memberId);
- }
-
-// ThreadPoolUtils.sendWholeForceClosingPrice(symbol, memberEntity);
- CalculateUtil.getForceSetPriceForWhole(null, memberEntity);
+ for (Long memberId : wholeHoldOrders) {
+ ThreadPoolUtils.sendWholePrice(memberId);
}
}
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 bdc4fba..3d1a49a 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,7 @@
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.HoldOrderDataModel;
import com.xcong.excoin.rabbit.pricequeue.whole.WholeDataQueue;
import com.xcong.excoin.rabbit.pricequeue.whole.WholePriceDataModel;
import com.xcong.excoin.rabbit.producer.OrderProducer;
@@ -289,25 +290,30 @@
for (Map.Entry<String, WholePriceDataModel> entry : dataModelMap.entrySet()) {
WholePriceDataModel wholePriceData = entry.getValue();
- List<ContractHoldOrderEntity> list = wholePriceData.getList();
+ List<HoldOrderDataModel> 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()));
+ for (HoldOrderDataModel holdOrderData : list) {
+ String price = redisUtils.getString(CoinTypeConvert.convertToKey(holdOrderData.getSymbol()));
+// BigDecimal newPrice = new BigDecimal(price);
+ BigDecimal newPrice = new BigDecimal("29958.46627789");
+
BigDecimal rewardRatio = null;
- if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) {
+ if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderData.getOpeningType()) {
// (最新价-开仓价)*规格*张数
- rewardRatio = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(holdOrderEntity.getSymbolSku()).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale()));
+ rewardRatio = newPrice.subtract(holdOrderData.getOpeningPrice()).multiply(holdOrderData.getSymbolSku()).multiply(new BigDecimal(holdOrderData.getSymbolCntSale()));
// 开空
} else {
// (开仓价-最新价)*规格*张数
- rewardRatio = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(holdOrderEntity.getSymbolSku()).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale()));
+ rewardRatio = holdOrderData.getOpeningPrice().subtract(newPrice).multiply(holdOrderData.getSymbolSku()).multiply(new BigDecimal(holdOrderData.getSymbolCntSale()));
}
- totalProfitOrLoss = totalProfitOrLoss.add(rewardRatio);
- prices.put(holdOrderEntity.getSymbol(), newPrice);
+ holdOrderData.setRewardAmount(rewardRatio);
+ holdOrderData.setClosingPrice(newPrice);
+ totalProfitOrLoss = totalProfitOrLoss.add(rewardRatio).setScale(8, BigDecimal.ROUND_DOWN);
+ prices.put(holdOrderData.getSymbol(), newPrice);
}
BigDecimal holdBond = wholePriceData.getHoldBond();
@@ -316,7 +322,10 @@
continue;
}
+ dataModelMap.remove(entry.getKey());
+ System.out.println("触发");
wholePriceData.setPrices(prices);
+ contractHoldOrderDao.updateMemberAllHoldOrderClosingStatus(wholePriceData.getMemberId());
orderProducer.sendWholeBomb(JSONObject.toJSONString(wholePriceData));
}
}
diff --git a/src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/HoldOrderDataModel.java b/src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/HoldOrderDataModel.java
new file mode 100644
index 0000000..4460c4c
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/HoldOrderDataModel.java
@@ -0,0 +1,29 @@
+package com.xcong.excoin.rabbit.pricequeue.whole;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2021-01-28
+ **/
+@Data
+public class HoldOrderDataModel {
+
+ private Long id;
+
+ private String symbol;
+
+ private BigDecimal openingPrice;
+
+ private BigDecimal symbolSku;
+
+ private Integer symbolCntSale;
+
+ private BigDecimal rewardAmount;
+
+ private BigDecimal closingPrice;
+
+ private int openingType;
+}
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
index 330d4b5..6ea6437 100644
--- a/src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/WholePriceDataModel.java
+++ b/src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/WholePriceDataModel.java
@@ -25,7 +25,7 @@
/**
* 当前持仓列表
*/
- private List<ContractHoldOrderEntity> list;
+ private List<HoldOrderDataModel> list;
/**
* 维持保证金
diff --git a/src/main/java/com/xcong/excoin/utils/ThreadPoolUtils.java b/src/main/java/com/xcong/excoin/utils/ThreadPoolUtils.java
index 9dda87b..1f89588 100644
--- a/src/main/java/com/xcong/excoin/utils/ThreadPoolUtils.java
+++ b/src/main/java/com/xcong/excoin/utils/ThreadPoolUtils.java
@@ -7,11 +7,13 @@
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.mapper.ContractHoldOrderEntityMapper;
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.HoldOrderDataModel;
import com.xcong.excoin.rabbit.pricequeue.whole.WholePriceDataModel;
import com.xcong.excoin.rabbit.producer.OrderProducer;
import com.xcong.excoin.utils.dingtalk.DingTalkUtils;
@@ -117,7 +119,8 @@
MemberWalletContractEntity wallet = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name());
WholePriceDataModel wholePriceData = new WholePriceDataModel();
- wholePriceData.setList(holdOrders);
+ List<HoldOrderDataModel> holdOrderDataModels = ContractHoldOrderEntityMapper.INSTANCE.entitiesToDataModels(holdOrders);
+ wholePriceData.setList(holdOrderDataModels);
BigDecimal totalHoldBond = BigDecimal.ZERO;
for (ContractHoldOrderEntity holdOrder : holdOrders) {
diff --git a/src/main/resources/mapper/contract/ContractHoldOrderDao.xml b/src/main/resources/mapper/contract/ContractHoldOrderDao.xml
index 45c0994..5120343 100644
--- a/src/main/resources/mapper/contract/ContractHoldOrderDao.xml
+++ b/src/main/resources/mapper/contract/ContractHoldOrderDao.xml
@@ -68,13 +68,12 @@
order by create_time desc
</select>
- <select id="selectAllWholeOrderMemberIdAndSymbol" resultType="java.util.HashMap">
+ <select id="selectAllWholeOrderMemberId" resultType="java.lang.Long">
select
- member_id,
- symbol
+ member_id
from contract_hold_order
- where position_type=2
- group by member_id, symbol
+ where position_type=2 and is_can_closing=1
+ group by member_id
</select>
<select id="selectWholeHoldOrderSymbolsByMemberId" resultType="java.lang.String">
diff --git a/src/test/java/com/xcong/excoin/WholeTest.java b/src/test/java/com/xcong/excoin/WholeTest.java
index a58c732..9d52d39 100644
--- a/src/test/java/com/xcong/excoin/WholeTest.java
+++ b/src/test/java/com/xcong/excoin/WholeTest.java
@@ -18,6 +18,7 @@
import com.xcong.excoin.utils.CalculateUtil;
import com.xcong.excoin.utils.RedisUtils;
import com.xcong.excoin.utils.ThreadPoolUtils;
+import lombok.SneakyThrows;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -28,6 +29,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
/**
* @author wzy
@@ -116,22 +118,6 @@
CalculateUtil.getForceSetPriceForWhole("BTC/USDT", memberEntity);
}
- @Test
- public void initOrderTest() {
- List<HashMap<String, Object>> wholeHoldOrders = contractHoldOrderDao.selectAllWholeOrderMemberIdAndSymbol();
- if (CollUtil.isNotEmpty(wholeHoldOrders)) {
- MemberEntity memberEntity = null;
- for (HashMap<String, Object> wholeHoldOrder : wholeHoldOrders) {
- Long memberId = (Long) wholeHoldOrder.get("member_id");
- String symbol = (String) wholeHoldOrder.get("symbol");
- if (memberEntity == null || !memberId.equals(memberEntity.getId())) {
- memberEntity = memberDao.selectById(memberId);
- }
- System.out.println(memberId + "-----" + symbol);
- }
- }
- }
-
@Resource
private RedisUtils redisUtils;
@@ -156,6 +142,36 @@
CalculateUtil.getForceSetPriceForWhole(null, memberEntity);
}
+ public static void main(String[] args) {
+ Map<String, String> map = new ConcurrentHashMap<>();
+ map.put("1", "1");
+ map.put("2", "2");
+ map.put("3", "3");
+ map.put("4", "4");
+ map.put("5", "5");
+ new Thread(new Runnable() {
+ @SneakyThrows
+ @Override
+ public void run() {
+ for (Map.Entry<String, String> entry : map.entrySet()) {
+ System.out.println(entry.getKey() + " - " + entry.getValue());
+ if (entry.getKey().equals("3")) {
+ System.out.println(11);
+ map.remove("3");
+ }
+ Thread.sleep(1000);
+ }
+
+ System.out.println(map.get("3"));
+ }
+ }).start();
+
+ }
+
+ @Test
+ public void mapTest() {
+ websocketPriceService.wholeBomb();
+ }
}
--
Gitblit v1.9.1