From 6dbdd5b82a5361d90c08246664252e50ac626cbf Mon Sep 17 00:00:00 2001 From: zainali5120 <512061637@qq.com> Date: Wed, 16 Sep 2020 17:40:24 +0800 Subject: [PATCH] 撮合交易代码提交 --- src/main/java/com/xcong/excoin/modules/coin/service/impl/OrderCoinServiceImpl.java | 112 +++++++++++++++++++++++++++---------- src/main/java/com/xcong/excoin/modules/coin/controller/OrderCoinController.java | 1 src/main/java/com/xcong/excoin/modules/coin/service/OrderCoinService.java | 7 ++ src/main/java/com/xcong/excoin/trade/CoinTrader.java | 17 ++--- 4 files changed, 97 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/xcong/excoin/modules/coin/controller/OrderCoinController.java b/src/main/java/com/xcong/excoin/modules/coin/controller/OrderCoinController.java index cc06661..f630d34 100644 --- a/src/main/java/com/xcong/excoin/modules/coin/controller/OrderCoinController.java +++ b/src/main/java/com/xcong/excoin/modules/coin/controller/OrderCoinController.java @@ -99,6 +99,7 @@ @PostMapping(value="/cancelEntrustWalletCoinOrder") public Result cancelEntrustWalletCoinOrder(@RequestBody @Valid CancelEntrustWalletCoinOrderDto cancelEntrustWalletCoinOrderDto) { String orderId = cancelEntrustWalletCoinOrderDto.getOrderId(); + // 根据不同币种 return orderCoinService.cancelEntrustWalletCoinOrder(orderId); } diff --git a/src/main/java/com/xcong/excoin/modules/coin/service/OrderCoinService.java b/src/main/java/com/xcong/excoin/modules/coin/service/OrderCoinService.java index 779e375..51a199f 100644 --- a/src/main/java/com/xcong/excoin/modules/coin/service/OrderCoinService.java +++ b/src/main/java/com/xcong/excoin/modules/coin/service/OrderCoinService.java @@ -54,4 +54,11 @@ void initOrders(String symbol, Integer type, Integer tradeType, BigDecimal price, BigDecimal amount,BigDecimal entrustAmount); + /** + * 撮合交易单的撤销方法 + * @param orderId + * @return + */ + public Result cancelEntrustWalletCoinOrderForMatch(String orderId); + } 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 2ddead0..37caea9 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 @@ -437,37 +437,7 @@ } // 加入到撮合 CoinTrader trader = factory.getTrader(symbol); -// if(trader==null){ -// -// trader = new CoinTrader("NEKK"); -// //newTrader.setKafkaTemplate(kafkaTemplate); -// //newTrader.setBaseCoinScale(coin.getBaseCoinScale()); -// //newTrader.setCoinScale(coin.getCoinScale()); -// // newTrader.setPublishType(coin.getPublishType()); -// //newTrader.setClearTime(coin.getClearTime()); -// -// // 创建成功以后需要对未处理订单预处理 -// //log.info("======CoinTrader Process: " + symbol + "======"); -// List<OrderCoinsEntity> orders = orderCoinsDao.selectAllEntrustingCoinOrderList(); -// if(CollectionUtils.isNotEmpty(orders)){ -// List<OrderCoinsEntity> tradingOrders = new ArrayList<>(); -// List<OrderCoinsEntity> completedOrders = new ArrayList<>(); -// orders.forEach(order1 -> { -// tradingOrders.add(order1); -// }); -// try { -// trader.trade(tradingOrders); -// } catch (ParseException e) { -// e.printStackTrace(); -// // log.info("异常:trader.trade(tradingOrders);"); -// } -// } -// -// trader.setReady(true); -// factory.addTrader(symbol, trader); -// } trader.trade(order); - // // 流水记录 TODO // MemberAccountFlowEntity record = new MemberAccountFlowEntity(); @@ -601,6 +571,88 @@ } @Override + @Transactional + public Result cancelEntrustWalletCoinOrderForMatch(String orderId) { + //获取用户ID + Long memberId = LoginUserUtils.getAppLoginUser().getId(); + OrderCoinsEntity orderCoinsEntity = orderCoinsDao.selectById(orderId); + // 取消撮合订单的单 + CoinTrader trader = factory.getTrader(orderCoinsEntity.getSymbol()); + trader.cancelOrder(orderCoinsEntity); + if (ObjectUtil.isNotEmpty(orderCoinsEntity) && orderCoinsEntity.getMemberId() == memberId) { + if (orderCoinsEntity.getOrderStatus() == OrderCoinsEntity.ORDERSTATUS_CANCEL) { + return Result.fail(MessageSourceUtils.getString("order_service_0012")); + } + orderCoinsEntity.setOrderStatus(OrderCoinsEntity.ORDERSTATUS_CANCEL); + orderCoinsDao.updateById(orderCoinsEntity); + + String symbol = orderCoinsEntity.getSymbol(); + + OrderCoinsDealEntity detail = new OrderCoinsDealEntity(); + detail.setMemberId(memberId); + detail.setOrderId(orderCoinsEntity.getId()); + detail.setOrderNo(generateSimpleSerialno(memberId.toString())); + detail.setOrderType(orderCoinsEntity.getOrderType()); + detail.setTradeType(orderCoinsEntity.getTradeType()); + detail.setSymbol(symbol); + detail.setOrderStatus(OrderCoinsDealEntity.ORDERSTATUS_CANCEL); + detail.setSymbolCnt(orderCoinsEntity.getEntrustCnt()); + detail.setEntrustPrice(orderCoinsEntity.getEntrustPrice()); + detail.setDealPrice(orderCoinsEntity.getDealPrice()); + detail.setDealAmount(orderCoinsEntity.getDealAmount()); + detail.setFeeAmount(orderCoinsEntity.getFeeAmount()); + orderCoinDealDao.insert(detail); + + if (OrderCoinsEntity.ORDERTYPE_BUY.equals(orderCoinsEntity.getOrderType())) { + //如果是限价买入,撤单将USDT账户冻结金额返回 + String walletCode = MemberWalletCoinEnum.WALLETCOINCODE.getValue(); + MemberWalletCoinEntity walletCoin = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, walletCode); + + if (ObjectUtil.isNotEmpty(walletCoin)) { + //手续费 = 开仓价*数量*手续费率 + //返还金额=开仓价*未成交数量+手续费 + BigDecimal returnBalance = orderCoinsEntity.getDealAmount(); + + walletCoin.setAvailableBalance(walletCoin.getAvailableBalance().add(returnBalance)); + walletCoin.setFrozenBalance(walletCoin.getFrozenBalance().subtract(returnBalance)); + memberWalletCoinDao.updateById(walletCoin); + // 流水记录 + MemberAccountFlowEntity record = new MemberAccountFlowEntity(); + record.setSource(MemberAccountFlowEntity.SOURCE_CANCEL); + record.setRemark(MemberAccountFlowEntity.REMARK_CANCEL + symbol + MemberAccountFlowEntity.REMARK_RETURNBALANCE + returnBalance); + record.setBalance(walletCoin.getAvailableBalance()); + record.setMemberId(memberId); + record.setSymbol(symbol); + record.setPrice(returnBalance); + memberAccountFlowEntityDao.insert(record); + return Result.ok(MessageSourceUtils.getString("order_service_0013")); + } + } else { + //如果是限价卖出,撤单将对应的钱包冻结金额返回 + MemberWalletCoinEntity walletCoin = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, symbol); + if (ObjectUtil.isNotEmpty(walletCoin)) { + + BigDecimal returnBalance = orderCoinsEntity.getEntrustCnt(); + walletCoin.setAvailableBalance(walletCoin.getAvailableBalance().add(returnBalance)); + walletCoin.setFrozenBalance(walletCoin.getFrozenBalance().subtract(returnBalance)); + memberWalletCoinDao.updateById(walletCoin); + // 流水记录 + MemberAccountFlowEntity record = new MemberAccountFlowEntity(); + record.setSource(MemberAccountFlowEntity.SOURCE_CANCEL); + record.setRemark(MemberAccountFlowEntity.REMARK_CANCEL + symbol + MemberAccountFlowEntity.REMARK_RETURNBALANCE + returnBalance); + record.setBalance(walletCoin.getAvailableBalance()); + record.setMemberId(memberId); + record.setSymbol(symbol); + record.setPrice(walletCoin.getFrozenBalance()); + memberAccountFlowEntityDao.insert(record); + return Result.ok(MessageSourceUtils.getString("order_service_0013")); + } + } + } + return Result.fail(MessageSourceUtils.getString("order_service_0043")); + } + + @Override public Result findAllWalletCoinOrder(FindAllWalletCoinOrderDto findAllWalletCoinOrderDto) { //获取用户ID Long memberId = LoginUserUtils.getAppLoginUser().getId(); diff --git a/src/main/java/com/xcong/excoin/trade/CoinTrader.java b/src/main/java/com/xcong/excoin/trade/CoinTrader.java index fd62c5f..e4d34f0 100644 --- a/src/main/java/com/xcong/excoin/trade/CoinTrader.java +++ b/src/main/java/com/xcong/excoin/trade/CoinTrader.java @@ -37,8 +37,7 @@ //是否暂停交易 private boolean tradingHalt = false; private boolean ready = false; - //交易对信息 - //private ExchangeCoinPublishType publishType; + private String clearTime; private SimpleDateFormat dateTimeFormat; @@ -493,7 +492,6 @@ //orderCoinService.handleOrder(trades); // kafkaTemplate.send("exchange-trade", JSON.toJSONString(trades)); } - // 更新最新K线 TODO } } @@ -578,10 +576,10 @@ if (buyTradePlate != null && buyTradePlate.getItems() != null) { plate = new ArrayList<>(); LinkedList<TradePlateItem> items = buyTradePlate.getItems(); - for (TradePlateItem item : items) { + for (int i = items.size() - 1; i >= 0; i--) { plateItem = new ArrayList<>(2); - BigDecimal price = item.getPrice(); - BigDecimal amount = item.getAmount(); + BigDecimal price = items.get(i).getPrice(); + BigDecimal amount = items.get(i).getAmount(); plateItem.add(price); plateItem.add(amount); plate.add(plateItem); @@ -592,10 +590,10 @@ if (sellTradePlate != null && sellTradePlate.getItems() != null) { plate = new ArrayList<>(); LinkedList<TradePlateItem> items = sellTradePlate.getItems(); - for (TradePlateItem item : items) { + for (int i = items.size() - 1; i >= 0; i--) { plateItem = new ArrayList<>(2); - BigDecimal price = item.getPrice(); - BigDecimal amount = item.getAmount(); + BigDecimal price = items.get(i).getPrice(); + BigDecimal amount = items.get(i).getAmount(); plateItem.add(price); plateItem.add(amount); plate.add(plateItem); @@ -603,7 +601,6 @@ tradePlateModel.setSell(plate); } - // 盘口发生变化通知TODO return JSON.toJSONString(tradePlateModel); } -- Gitblit v1.9.1