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