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