From f28d8076108296c387ed7e8f1bf819c060a6c8a2 Mon Sep 17 00:00:00 2001 From: zainali5120 <512061637@qq.com> Date: Sat, 10 Oct 2020 22:56:57 +0800 Subject: [PATCH] golden交易所分布式支持 --- src/main/java/com/xcong/excoin/modules/coin/dao/OrderCoinsDao.java | 3 + src/main/java/com/xcong/excoin/modules/coin/service/impl/OrderCoinServiceImpl.java | 109 ++++++++++++------------------------ src/main/java/com/xcong/excoin/rabbit/producer/OrderSubmitProducer.java | 5 + src/main/java/com/xcong/excoin/modules/blackchain/service/EthService.java | 4 src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java | 23 +++++++ src/main/resources/mapper/walletCoinOrder/OrderCoinsDao.xml | 13 ++++ src/main/java/com/xcong/excoin/modules/coin/dao/OrderCoinDealDao.java | 3 src/main/resources/mapper/walletCoinOrder/OrderCoinDealDao.xml | 6 ++ src/main/java/com/xcong/excoin/rabbit/consumer/OrderSubmitConsumer.java | 14 ++++ 9 files changed, 104 insertions(+), 76 deletions(-) diff --git a/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java b/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java index 80f17cb..9a4d13c 100644 --- a/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java +++ b/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java @@ -109,6 +109,12 @@ public static final String ROUTING_KEY_ROC_ORDER_SUBMIT = "roc-order-routingKey-submit"; + public static final String EXCHANGE_ROC_ORDER_CANCEL = "roc-exchange-order-cancel"; + + public static final String QUEUE_ROC_ORDER_CANCEL = "roc-order-queue-cancel"; + + public static final String ROUTING_KEY_ROC_ORDER_CANCEL = "roc-order-routingKey-cancel"; + @Resource private ConnectionFactory connectionFactory; @@ -161,6 +167,23 @@ return BindingBuilder.bind(ordereSubmitQueue()).to(orderSubmitExchange()).with(ROUTING_KEY_ROC_ORDER_SUBMIT); } + // 交易订单 + @Bean + public DirectExchange orderCancelExchange() { + return new DirectExchange(EXCHANGE_ROC_ORDER_CANCEL); + } + + + @Bean + public Queue ordereCancelQueue() { + return new Queue(QUEUE_ROC_ORDER_CANCEL, true); + } + + @Bean + public Binding bindingCancelOrder() { + return BindingBuilder.bind(ordereCancelQueue()).to(orderCancelExchange()).with(ROUTING_KEY_ROC_ORDER_CANCEL); + } + @Bean public DirectExchange usdtUpdateExchange() { diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/EthService.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/EthService.java index c532035..c52b39b 100644 --- a/src/main/java/com/xcong/excoin/modules/blackchain/service/EthService.java +++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/EthService.java @@ -228,7 +228,7 @@ String encodedFunction = FunctionEncoder.encode(function); RawTransaction rawTransaction = RawTransaction.createTransaction(nonce, - Convert.toWei("60", Convert.Unit.GWEI).toBigInteger(),// 给矿工开的转账单价 单价越高越快 + Convert.toWei("70", Convert.Unit.GWEI).toBigInteger(),// 给矿工开的转账单价 单价越高越快 Convert.toWei("60000", Convert.Unit.WEI).toBigInteger(), contractAddress, encodedFunction);//里程上限 // 10*80000/1000000000=0.0008 手续费 @@ -263,7 +263,7 @@ BigInteger nonce = ethGetTransactionCount.getTransactionCount(); BigInteger value = Convert.toWei(amount, Convert.Unit.ETHER).toBigInteger(); RawTransaction rawTransaction = RawTransaction.createEtherTransaction(nonce, - Convert.toWei("50", Convert.Unit.GWEI).toBigInteger(), + Convert.toWei("70", Convert.Unit.GWEI).toBigInteger(), Convert.toWei("60000", Convert.Unit.WEI).toBigInteger(), toAddress, value); byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials); String hexValue = Numeric.toHexString(signedMessage); diff --git a/src/main/java/com/xcong/excoin/modules/coin/dao/OrderCoinDealDao.java b/src/main/java/com/xcong/excoin/modules/coin/dao/OrderCoinDealDao.java index 20bb608..989d4bc 100644 --- a/src/main/java/com/xcong/excoin/modules/coin/dao/OrderCoinDealDao.java +++ b/src/main/java/com/xcong/excoin/modules/coin/dao/OrderCoinDealDao.java @@ -15,7 +15,8 @@ public interface OrderCoinDealDao extends BaseMapper<OrderCoinsDealEntity>{ List<OrderCoinsDealEntity> selectAllWalletCoinOrder(@Param("memberId")Long memberId); - + List<OrderCoinsDealEntity> selectCoinOrderDealByOrderId(@Param("orderId")Long orderId); + List<OrderCoinsDealEntity> selectAllWalletCoinOrderBySymbol(@Param("memberId")Long memberId,@Param("symbol")String symbol); List<OrderCoinsDealEntity> selectAllCoinDealsOrderBySymbol(@Param("symbol")String symbol); diff --git a/src/main/java/com/xcong/excoin/modules/coin/dao/OrderCoinsDao.java b/src/main/java/com/xcong/excoin/modules/coin/dao/OrderCoinsDao.java index 12f59a0..dd71072 100644 --- a/src/main/java/com/xcong/excoin/modules/coin/dao/OrderCoinsDao.java +++ b/src/main/java/com/xcong/excoin/modules/coin/dao/OrderCoinsDao.java @@ -1,5 +1,6 @@ package com.xcong.excoin.modules.coin.dao; +import java.math.BigDecimal; import java.util.List; import org.apache.ibatis.annotations.Param; @@ -18,4 +19,6 @@ List<OrderCoinsEntity> selectAllEntrustingCoinOrderList(List<String> list); List<OrderCoinsEntity> selectCoinOrderOnTrade(List<String> list); + + void updateDeal(@Param("id") Long id, @Param("dealCnt")BigDecimal dealCnt,@Param("dealAmount")BigDecimal dealAmount); } diff --git a/src/main/java/com/xcong/excoin/modules/coin/service/impl/OrderCoinServiceImpl.java b/src/main/java/com/xcong/excoin/modules/coin/service/impl/OrderCoinServiceImpl.java index a8e174e..712312f 100644 --- a/src/main/java/com/xcong/excoin/modules/coin/service/impl/OrderCoinServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/coin/service/impl/OrderCoinServiceImpl.java @@ -518,7 +518,9 @@ if (ObjectUtil.isNotEmpty(orderCoinsEntity) && orderCoinsEntity.getMemberId().equals(memberId) ) { // 如果是撮合交易单 if (SymbolsConstats.EXCHANGE_SYMBOLS.contains(orderCoinsEntity.getSymbol())) { - return this.cancelEntrustWalletCoinOrderForMatch(orderId); + orderSubmitProducer.sendCancelMsg(orderId); + // return this.cancelEntrustWalletCoinOrderForMatch(orderId); + return Result.ok("order_service_0013"); } if (orderCoinsEntity.getOrderStatus() == OrderCoinsEntity.ORDERSTATUS_CANCEL || orderCoinsEntity.getOrderStatus()==OrderCoinsEntity.ORDERSTATUS_DONE) { return Result.fail(MessageSourceUtils.getString("order_service_0012")); @@ -596,12 +598,15 @@ @Transactional public Result cancelEntrustWalletCoinOrderForMatch(String orderId) { //获取用户ID - Long memberId = LoginUserUtils.getAppLoginUser().getId(); OrderCoinsEntity orderCoinsEntity = orderCoinsDao.selectById(orderId); + if(orderCoinsEntity==null){ + return Result.ok(""); + } + Long memberId = orderCoinsEntity.getMemberId(); // 取消撮合订单的单 CoinTrader trader = factory.getTrader(orderCoinsEntity.getSymbol()); trader.cancelOrder(orderCoinsEntity); - if (ObjectUtil.isNotEmpty(orderCoinsEntity) && orderCoinsEntity.getMemberId().equals(memberId)) { + if (ObjectUtil.isNotEmpty(orderCoinsEntity) ) { if (orderCoinsEntity.getOrderStatus() == OrderCoinsEntity.ORDERSTATUS_CANCEL || orderCoinsEntity.getOrderStatus()==OrderCoinsEntity.ORDERSTATUS_DONE) { return Result.fail(MessageSourceUtils.getString("order_service_0012")); } @@ -633,21 +638,31 @@ if (ObjectUtil.isNotEmpty(walletCoin)) { //手续费 = 开仓价*数量*手续费率 //返还金额=开仓价*未成交数量+手续费 - + // 这里根据成交的单计算 + List<OrderCoinsDealEntity> orderCoinsDealEntities = orderCoinDealDao.selectCoinOrderDealByOrderId(Long.valueOf(orderId)); + BigDecimal dealAmount = BigDecimal.ZERO; + if(CollectionUtils.isNotEmpty(orderCoinsDealEntities)){ + for (OrderCoinsDealEntity orderCoinsDealEntity : orderCoinsDealEntities) { + dealAmount = dealAmount.add(orderCoinsDealEntity.getDealAmount()); + } + } // 市价的按成交额退款 - BigDecimal returnBalance = orderCoinsEntity.getEntrustAmount().subtract(orderCoinsEntity.getDealAmount()); + BigDecimal returnBalance = orderCoinsEntity.getEntrustAmount().subtract(dealAmount); + // 需要退回的手续费 BigDecimal returnFee = BigDecimal.ZERO; if (returnBalance.compareTo(orderCoinsEntity.getEntrustAmount()) == 0) { returnFee = orderCoinsEntity.getFeeAmount(); } else { // 按比例退回 - BigDecimal needFee = orderCoinsEntity.getDealAmount().divide(orderCoinsEntity.getEntrustAmount(), 8, BigDecimal.ROUND_DOWN).multiply(orderCoinsEntity.getFeeAmount()); + BigDecimal needFee = orderCoinsEntity.getFeeAmount().multiply(dealAmount.divide(orderCoinsEntity.getEntrustAmount(), 8, BigDecimal.ROUND_DOWN)); returnFee = orderCoinsEntity.getFeeAmount().subtract(needFee); } + BigDecimal avi = walletCoin.getAvailableBalance().add(returnBalance).add(returnFee); + memberWalletCoinDao.updateWalletBalance(walletCoin.getId(),avi,null,returnBalance.negate()); walletCoin.setAvailableBalance(walletCoin.getAvailableBalance().add(returnBalance).add(returnFee)); walletCoin.setFrozenBalance(walletCoin.getFrozenBalance().subtract(returnBalance)); - memberWalletCoinDao.updateById(walletCoin); + //memberWalletCoinDao.updateById(walletCoin); // 流水记录 MemberAccountFlowEntity record = new MemberAccountFlowEntity(); record.setSource(MemberAccountFlowEntity.SOURCE_CANCEL); @@ -938,15 +953,24 @@ } Long memberId = buyOrderCoinsEntity.getMemberId(); if (buyOrderCoinsEntity != null) { + List<OrderCoinsDealEntity> orderCoinsDealEntities = orderCoinDealDao.selectCoinOrderDealByOrderId(buyOrderId); // 比较剩余的量 - BigDecimal dealAmount = buyOrderCoinsEntity.getDealAmount(); + BigDecimal dealAmount = BigDecimal.ZERO; + BigDecimal dealCnt = BigDecimal.ZERO; + if(CollectionUtils.isNotEmpty(orderCoinsDealEntities)){ + for (OrderCoinsDealEntity orderCoinsDealEntity : orderCoinsDealEntities) { + dealAmount=dealAmount.add(orderCoinsDealEntity.getDealAmount()); + dealCnt = dealCnt.add(orderCoinsDealEntity.getSymbolCnt()); + } + } + // 单的总金额 BigDecimal entrustAmount = buyOrderCoinsEntity.getEntrustAmount(); BigDecimal add = dealAmount.add(buyTurnover); BigDecimal closingPrice = buyTurnover.multiply(new BigDecimal("0.002")); - //成交量 - BigDecimal dealCnt = buyOrderCoinsEntity.getDealCnt().add(amount); + //成交总量 + dealCnt = dealCnt.add(amount); // 创建一个完成的单 OrderCoinsDealEntity detail = new OrderCoinsDealEntity(); detail.setMemberId(buyOrderCoinsEntity.getMemberId()); @@ -979,12 +1003,8 @@ memberWalletCoinDao.updateWalletBalance(coinsEntity.getId(),subtract,subtract,subtract.negate()); } } else { - OrderCoinsEntity update = new OrderCoinsEntity(); - update.setId(buyOrderId); - update.setDealAmount(add); - update.setDealCnt(buyOrderCoinsEntity.getDealCnt().add(amount)); - update.setUpdateTime(new Date()); - orderCoinsDao.updateById(update); + // 更新买单 + orderCoinsDao.updateDeal(buyOrderId,amount,buyTurnover); } } // 卖单 @@ -1078,64 +1098,7 @@ @Override public void initOrders(String symbol, Integer type, Integer tradeType, BigDecimal price, BigDecimal amount, BigDecimal entrustAmount) { - //获取用户ID - Long memberId = 10L; - BigDecimal nowPriceinBigDecimal = price; - //查询当前价 - //BigDecimal nowPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(symbol + "/USDT"))); - // 获取交易管理的杠杠倍率,手续费率等信息,由平台进行设置 - symbol = symbol.toUpperCase(); - - // 手续费用(手续费=建仓价X数量X手续费率) - BigDecimal closingPrice = BigDecimal.ZERO; - - // BigDecimal totalPayPricCoin = nowPrice.multiply(amount).add(closingPrice); - // 首先将单插入到数据库主表(委托表) - // 创建订单 - OrderCoinsEntity order = new OrderCoinsEntity(); - //根据委托类型生成不同数据 - // 如果是限价交易直接插入主表数据 - order.setMemberId(memberId); - order.setOrderNo(generateSimpleSerialno(memberId.toString())); - order.setOrderType(type); - order.setSymbol(symbol); - //order.setMarkPrice(nowPrice); - - // 成交量 先设置为0 - order.setDealCnt(BigDecimal.ZERO); - // 成交价 - //order.setDealPrice(price); - // 成交金额 - order.setDealAmount(BigDecimal.ZERO); - order.setOrderStatus(OrderCoinsEntity.ORDERSTATUS_DODING); - order.setTradeType(tradeType); - // 手续费 - order.setFeeAmount(closingPrice); - if (OrderCoinsEntity.TRADETYPE_FIXEDPRICE.equals(tradeType)) { - // 限价 是需要价格和数量 可以得到成交金额 - // 下单量 - order.setEntrustCnt(amount); - // 下单价格 - order.setEntrustPrice(price); - order.setEntrustAmount(amount.multiply(price)); - } else { - if (OrderCoinsEntity.ORDERTYPE_BUY.equals(type)) { - // 市价 只有金额 - order.setEntrustAmount(entrustAmount); - } else { - // 下单量 - order.setEntrustCnt(amount); - // 下单价格 - order.setEntrustPrice(price); - order.setEntrustAmount(amount.multiply(price)); - } - - } - orderCoinsDao.insert(order); - // 加入到撮合 - CoinTrader trader = factory.getTrader(symbol); - trader.trade(order); } diff --git a/src/main/java/com/xcong/excoin/rabbit/consumer/OrderSubmitConsumer.java b/src/main/java/com/xcong/excoin/rabbit/consumer/OrderSubmitConsumer.java index 1f7b33b..4f20d62 100644 --- a/src/main/java/com/xcong/excoin/rabbit/consumer/OrderSubmitConsumer.java +++ b/src/main/java/com/xcong/excoin/rabbit/consumer/OrderSubmitConsumer.java @@ -3,6 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.xcong.excoin.configurations.RabbitMqConfig; import com.xcong.excoin.modules.coin.entity.OrderCoinsEntity; +import com.xcong.excoin.modules.coin.service.OrderCoinService; import com.xcong.excoin.trade.CoinTrader; import com.xcong.excoin.trade.CoinTraderFactory; import lombok.extern.slf4j.Slf4j; @@ -23,6 +24,9 @@ @Resource private CoinTraderFactory factory; + @Resource + private OrderCoinService orderCoinService; + @RabbitListener(queues = RabbitMqConfig.QUEUE_ROC_ORDER_SUBMIT) public void doSomething(String content) { log.info("#提交的订单---->{}#", content); @@ -31,4 +35,14 @@ CoinTrader trader = factory.getTrader(symbol); trader.trade(coinsEntity); } + + /** + * 取消订单 + * @param content + */ + @RabbitListener(queues = RabbitMqConfig.QUEUE_ROC_ORDER_CANCEL) + public void doCancel(String content) { + log.info("#取消的订单---->{}#", content); + orderCoinService.cancelEntrustWalletCoinOrderForMatch(content); + } } diff --git a/src/main/java/com/xcong/excoin/rabbit/producer/OrderSubmitProducer.java b/src/main/java/com/xcong/excoin/rabbit/producer/OrderSubmitProducer.java index 060711c..d873ca1 100644 --- a/src/main/java/com/xcong/excoin/rabbit/producer/OrderSubmitProducer.java +++ b/src/main/java/com/xcong/excoin/rabbit/producer/OrderSubmitProducer.java @@ -29,6 +29,11 @@ rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_ROC_ORDER_SUBMIT, RabbitMqConfig.ROUTING_KEY_ROC_ORDER_SUBMIT, content, correlationData); } + public void sendCancelMsg(String content) { + CorrelationData correlationData = new CorrelationData(IdUtil.simpleUUID()); + rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_ROC_ORDER_CANCEL, RabbitMqConfig.ROUTING_KEY_ROC_ORDER_CANCEL, content, correlationData); + } + @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { diff --git a/src/main/resources/mapper/walletCoinOrder/OrderCoinDealDao.xml b/src/main/resources/mapper/walletCoinOrder/OrderCoinDealDao.xml index aa9912f..fc2d73d 100644 --- a/src/main/resources/mapper/walletCoinOrder/OrderCoinDealDao.xml +++ b/src/main/resources/mapper/walletCoinOrder/OrderCoinDealDao.xml @@ -12,6 +12,12 @@ order by create_time desc </select> + <select id="selectCoinOrderDealByOrderId" resultType="com.xcong.excoin.modules.coin.entity.OrderCoinsDealEntity"> + select * from coins_order_deal where order_id = #{orderId} + order by create_time desc + </select> + + <select id="selectOrderCoinDealByTime" resultType="com.xcong.excoin.trade.ExchangeTrade"> SELECT symbol symbol, diff --git a/src/main/resources/mapper/walletCoinOrder/OrderCoinsDao.xml b/src/main/resources/mapper/walletCoinOrder/OrderCoinsDao.xml index aa02fee..16190bd 100644 --- a/src/main/resources/mapper/walletCoinOrder/OrderCoinsDao.xml +++ b/src/main/resources/mapper/walletCoinOrder/OrderCoinsDao.xml @@ -44,4 +44,17 @@ </foreach> </if> </select> + + <update id="updateDeal" parameterType="map"> + update coins_order + <set> + <if test="dealCnt!=null"> + deal_cnt = deal_cnt+#{dealCnt}, + </if> + <if test="dealAmount!=null"> + deal_amount = deal_amount+#{dealAmount}, + </if> + </set> + where id = #{id} + </update> </mapper> -- Gitblit v1.9.1