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