From 3ffaa6bf323862a3770897d4e934baf98d324c47 Mon Sep 17 00:00:00 2001 From: zainali5120 <512061637@qq.com> Date: Sun, 20 Sep 2020 23:39:55 +0800 Subject: [PATCH] 撮合交易代码提交 --- src/main/java/com/xcong/excoin/modules/coin/service/impl/OrderCoinServiceImpl.java | 335 +++++++++++++++++++++++++++++++++---------------------- 1 files changed, 199 insertions(+), 136 deletions(-) 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 37caea9..37490b2 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 @@ -7,14 +7,18 @@ import javax.annotation.Resource; +import com.alibaba.fastjson.JSONObject; +import com.xcong.excoin.modules.blackchain.service.RocService; import com.xcong.excoin.modules.coin.mapper.OrderCoinsDealMapper; import com.xcong.excoin.modules.platform.entity.PlatformCnyUsdtExchangeEntity; import com.xcong.excoin.modules.platform.entity.PlatformSymbolsCoinEntity; +import com.xcong.excoin.modules.symbols.constants.SymbolsConstats; import com.xcong.excoin.trade.CoinTrader; import com.xcong.excoin.trade.CoinTraderFactory; import com.xcong.excoin.trade.ExchangeTrade; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -161,7 +165,7 @@ @Override @Transactional - public Result submitSalesWalletCoinOrder(String symbol, Integer type, Integer tradeType, BigDecimal price, BigDecimal amount,BigDecimal entrustAmount) { + public Result submitSalesWalletCoinOrder(String symbol, Integer type, Integer tradeType, BigDecimal price, BigDecimal amount, BigDecimal entrustAmount) { //获取用户ID @@ -169,8 +173,10 @@ BigDecimal nowPriceinBigDecimal = price; //查询当前价 BigDecimal nowPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(symbol + "/USDT"))); - if(OrderCoinsEntity.ORDERTYPE_BUY.equals(type) && OrderCoinsEntity.TRADETYPE_MARKETPRICE.equals(tradeType)){ - amount = entrustAmount.divide(nowPrice,BigDecimal.ROUND_DOWN); + System.out.println(symbol + "当前价:" + nowPrice); + if (OrderCoinsEntity.ORDERTYPE_BUY.equals(type) && OrderCoinsEntity.TRADETYPE_MARKETPRICE.equals(tradeType)) { + amount = entrustAmount.divide(nowPrice, 8, BigDecimal.ROUND_DOWN); + System.out.println(symbol + "市价量:" + amount); } // 处理市价 // 获取交易管理的杠杠倍率,手续费率等信息,由平台进行设置 @@ -209,7 +215,7 @@ // 创建订单 OrderCoinsEntity order = new OrderCoinsEntity(); if ((OrderCoinsEntity.TRADETYPE_FIXEDPRICE.equals(tradeType) && type.equals(1) && price.compareTo(nowPrice) < 0) - || (OrderCoinsEntity.TRADETYPE_FIXEDPRICE.equals(tradeType) && type.equals(2) && price.compareTo(nowPrice) > 0)) { + || (OrderCoinsEntity.TRADETYPE_FIXEDPRICE.equals(tradeType) && type.equals(2) && price.compareTo(nowPrice) > 0)) { // 如果是限价交易直接插入主表数据 order.setMemberId(memberId); order.setOrderNo(generateSimpleSerialno(memberId.toString())); @@ -253,9 +259,10 @@ order.setEntrustCnt(amount); order.setEntrustPrice(price); order.setDealCnt(amount); + order.setEntrustAmount(entrustAmount); if ((OrderCoinsEntity.TRADETYPE_FIXEDPRICE.equals(tradeType) && type.equals(1) && price.compareTo(nowPrice) >= 0) - || (OrderCoinsEntity.TRADETYPE_FIXEDPRICE.equals(tradeType) && type.equals(2) && price.compareTo(nowPrice) <= 0)) { - // 手续费用(手续费=建仓价X数量X手续费率) + || (OrderCoinsEntity.TRADETYPE_FIXEDPRICE.equals(tradeType) && type.equals(2) && price.compareTo(nowPrice) <= 0)) { + // 手续费用(手续费=建仓价X数量X手续费率) closingPrice = nowPrice.multiply(amount).multiply(tradeSetting.getCoinFeeRatio()); //总费用 = 成交价*数量+手续费 totalPayPrice = nowPrice.multiply(amount).add(closingPrice); @@ -333,7 +340,15 @@ symbol = symbol.toUpperCase(); MemberWalletCoinEntity walletCoin = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, symbol); if (ObjectUtil.isEmpty(walletCoin)) { - return Result.fail(MessageSourceUtils.getString("order_service_0003")); + // 创建这个钱包 + walletCoin = new MemberWalletCoinEntity(); + walletCoin.setAvailableBalance(BigDecimal.ZERO); + walletCoin.setFrozenBalance(BigDecimal.ZERO); + walletCoin.setTotalBalance(BigDecimal.ZERO); + walletCoin.setBorrowedFund(BigDecimal.ZERO); + walletCoin.setMemberId(memberId); + walletCoin.setWalletCode(symbol); + memberWalletCoinDao.insert(walletCoin); } // 查询交易设置 PlatformTradeSettingEntity tradeSetting = platformTradeSettingDao.findTradeSetting(); @@ -341,20 +356,23 @@ return Result.fail(MessageSourceUtils.getString("order_service_0009")); } // 手续费用(手续费=建仓价X数量X手续费率) - BigDecimal closingPrice ; + BigDecimal closingPrice = BigDecimal.ZERO; // 总费用分两种 1,限价交易 是价格*数量+手续费 2,市价交易 用户输入的金额+手续费 //总费用 = 成交价*数量+手续费 - BigDecimal totalPayPrice ; - if(OrderCoinsEntity.TRADETYPE_FIXEDPRICE.equals(tradeType) ){ + BigDecimal totalPayPrice = BigDecimal.ZERO; + if (OrderCoinsEntity.TRADETYPE_FIXEDPRICE.equals(tradeType)) { // 限价 closingPrice = price.multiply(amount).multiply(tradeSetting.getCoinFeeRatio()); totalPayPrice = price.multiply(amount).add(closingPrice); - }else{ + entrustAmount = price.multiply(amount); + } else { // 市价 - closingPrice = entrustAmount.multiply(tradeSetting.getCoinFeeRatio()); - totalPayPrice = entrustAmount.add(closingPrice); + if(OrderCoinsEntity.ORDERTYPE_BUY==type){ + closingPrice = entrustAmount.multiply(tradeSetting.getCoinFeeRatio()); + totalPayPrice = entrustAmount.add(closingPrice); + } } - // BigDecimal totalPayPricCoin = nowPrice.multiply(amount).add(closingPrice); + // BigDecimal totalPayPricCoin = nowPrice.multiply(amount).add(closingPrice); String walletCode = MemberWalletCoinEnum.WALLETCOINCODE.getValue(); MemberWalletCoinEntity walletCoinUsdt = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, walletCode); @@ -385,6 +403,8 @@ // 成交量 先设置为0 order.setDealCnt(BigDecimal.ZERO); + order.setEntrustCnt(BigDecimal.ZERO); + order.setEntrustPrice(BigDecimal.ZERO); // 成交价 //order.setDealPrice(price); // 成交金额 @@ -393,28 +413,25 @@ 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)){ + 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{ + } else { + // 市价卖单 // 下单量 order.setEntrustCnt(amount); // 下单价格 - order.setEntrustPrice(price); - order.setEntrustAmount(amount.multiply(price)); + order.setEntrustPrice(BigDecimal.ZERO); + order.setEntrustAmount(BigDecimal.ZERO); } - } orderCoinsDao.insert(order); @@ -422,40 +439,24 @@ //冻结相应的资产 if (OrderCoinsEntity.ORDERTYPE_BUY.equals(type)) { //如果是买入,所对应的币种增加,USDT账户减少金额 - BigDecimal availableBalance = walletCoinUsdt.getAvailableBalance().subtract(totalPayPrice); - BigDecimal frozenBalance = walletCoinUsdt.getFrozenBalance().add(totalPayPrice); - walletCoinUsdt.setAvailableBalance(availableBalance); - walletCoinUsdt.setFrozenBalance(frozenBalance); - memberWalletCoinDao.updateById(walletCoinUsdt); +// BigDecimal availableBalance = walletCoinUsdt.getAvailableBalance().subtract(totalPayPrice); +// BigDecimal frozenBalance = walletCoinUsdt.getFrozenBalance().add(totalPayPrice); +// walletCoinUsdt.setAvailableBalance(availableBalance); +// walletCoinUsdt.setFrozenBalance(frozenBalance); +// memberWalletCoinDao.updateById(walletCoinUsdt); + memberWalletCoinDao.updateWalletBalance(walletCoinUsdt.getId(),totalPayPrice.negate(),totalPayPrice.negate(),entrustAmount); } else { //如果是卖出,币种减少,USDT增加 - BigDecimal availableBalance = walletCoin.getAvailableBalance().subtract(amount); - BigDecimal frozenBalance = walletCoin.getFrozenBalance().add(amount); - walletCoin.setAvailableBalance(availableBalance); - walletCoin.setFrozenBalance(frozenBalance); - memberWalletCoinDao.updateById(walletCoin); +// BigDecimal availableBalance = walletCoin.getAvailableBalance().subtract(amount); +// BigDecimal frozenBalance = walletCoin.getFrozenBalance().add(amount); +// walletCoin.setAvailableBalance(availableBalance); +// walletCoin.setFrozenBalance(frozenBalance); +// memberWalletCoinDao.updateById(walletCoin); + memberWalletCoinDao.updateWalletBalance(walletCoin.getId(),amount.negate(),amount.negate(),amount); } // 加入到撮合 CoinTrader trader = factory.getTrader(symbol); trader.trade(order); - -// // 流水记录 TODO -// MemberAccountFlowEntity record = new MemberAccountFlowEntity(); -// record.setMemberId(memberId); -// if (OrderCoinsEntity.ORDERTYPE_BUY.equals(type)) { -// record.setPrice(totalPayPrice.setScale(4, BigDecimal.ROUND_DOWN)); -// record.setSource(MemberAccountFlowEntity.SOURCE_BUY + symbol); -// record.setRemark(MemberAccountFlowEntity.REMARK_BUY + symbol + ":" + amount); -// } else { -// record.setPrice(totalPayPrice.negate().setScale(4, BigDecimal.ROUND_DOWN)); -// record.setSource(MemberAccountFlowEntity.SOURCE_SALE + symbol); -// record.setRemark(MemberAccountFlowEntity.REMARK_SALE + symbol + ":" + amount); -// } -// record.setSymbol(symbol); -// record.setBalance(walletCoinUsdt.getAvailableBalance()); -// -// memberAccountFlowEntityDao.insert(record); - return Result.ok(MessageSourceUtils.getString("order_service_0011")); } @@ -470,20 +471,20 @@ if (CollUtil.isNotEmpty(findCoinOrderListByMemberIdAndSysmbol)) { for (OrderCoinsEntity orderCoinsEntity : findCoinOrderListByMemberIdAndSysmbol) { OrderWalletCoinVo entityToVo = OrderWalletCoinMapper.INSTANCE.entityToVo(orderCoinsEntity); - entityToVo.setFeeAmount(entityToVo.getFeeAmount()== null - ? BigDecimal.ZERO : entityToVo.getFeeAmount().setScale(4, BigDecimal.ROUND_DOWN)); - entityToVo.setMarkPrice(entityToVo.getMarkPrice()== null - ? BigDecimal.ZERO : entityToVo.getMarkPrice().setScale(4, BigDecimal.ROUND_DOWN)); - entityToVo.setEntrustCnt(entityToVo.getEntrustCnt()== null - ? BigDecimal.ZERO : entityToVo.getEntrustCnt().setScale(4, BigDecimal.ROUND_DOWN)); - entityToVo.setEntrustPrice(entityToVo.getEntrustPrice()== null - ? BigDecimal.ZERO : entityToVo.getEntrustPrice().setScale(4, BigDecimal.ROUND_DOWN)); - entityToVo.setDealCnt(entityToVo.getDealCnt()== null - ? BigDecimal.ZERO : entityToVo.getDealCnt().setScale(4, BigDecimal.ROUND_DOWN)); - entityToVo.setDealPrice(entityToVo.getDealPrice()== null - ? BigDecimal.ZERO : entityToVo.getDealPrice().setScale(4, BigDecimal.ROUND_DOWN)); - entityToVo.setDealAmount(entityToVo.getDealAmount()== null - ? BigDecimal.ZERO : entityToVo.getDealAmount().setScale(4, BigDecimal.ROUND_DOWN)); + entityToVo.setFeeAmount(entityToVo.getFeeAmount() == null + ? BigDecimal.ZERO : entityToVo.getFeeAmount().setScale(4, BigDecimal.ROUND_DOWN)); + entityToVo.setMarkPrice(entityToVo.getMarkPrice() == null + ? BigDecimal.ZERO : entityToVo.getMarkPrice().setScale(4, BigDecimal.ROUND_DOWN)); + entityToVo.setEntrustCnt(entityToVo.getEntrustCnt() == null + ? BigDecimal.ZERO : entityToVo.getEntrustCnt().setScale(4, BigDecimal.ROUND_DOWN)); + entityToVo.setEntrustPrice(entityToVo.getEntrustPrice() == null + ? BigDecimal.ZERO : entityToVo.getEntrustPrice().setScale(4, BigDecimal.ROUND_DOWN)); + entityToVo.setDealCnt(entityToVo.getDealCnt() == null + ? BigDecimal.ZERO : entityToVo.getDealCnt().setScale(4, BigDecimal.ROUND_DOWN)); + entityToVo.setDealPrice(entityToVo.getDealPrice() == null + ? BigDecimal.ZERO : entityToVo.getDealPrice().setScale(4, BigDecimal.ROUND_DOWN)); + entityToVo.setDealAmount(entityToVo.getDealAmount() == null + ? BigDecimal.ZERO : entityToVo.getDealAmount().setScale(4, BigDecimal.ROUND_DOWN)); arrayList.add(entityToVo); } } @@ -498,7 +499,11 @@ Long memberId = LoginUserUtils.getAppLoginUser().getId(); OrderCoinsEntity orderCoinsEntity = orderCoinsDao.selectById(orderId); if (ObjectUtil.isNotEmpty(orderCoinsEntity) && orderCoinsEntity.getMemberId() == memberId) { - if (orderCoinsEntity.getOrderStatus() == OrderCoinsEntity.ORDERSTATUS_CANCEL) { + // 如果是撮合交易单 + if (SymbolsConstats.EXCHANGE_SYMBOLS.contains(orderCoinsEntity.getSymbol())) { + return this.cancelEntrustWalletCoinOrderForMatch(orderId); + } + if (orderCoinsEntity.getOrderStatus() == OrderCoinsEntity.ORDERSTATUS_CANCEL || orderCoinsEntity.getOrderStatus()==OrderCoinsEntity.ORDERSTATUS_DONE) { return Result.fail(MessageSourceUtils.getString("order_service_0012")); } orderCoinsEntity.setOrderStatus(OrderCoinsEntity.ORDERSTATUS_CANCEL); @@ -580,7 +585,7 @@ CoinTrader trader = factory.getTrader(orderCoinsEntity.getSymbol()); trader.cancelOrder(orderCoinsEntity); if (ObjectUtil.isNotEmpty(orderCoinsEntity) && orderCoinsEntity.getMemberId() == memberId) { - if (orderCoinsEntity.getOrderStatus() == OrderCoinsEntity.ORDERSTATUS_CANCEL) { + if (orderCoinsEntity.getOrderStatus() == OrderCoinsEntity.ORDERSTATUS_CANCEL || orderCoinsEntity.getOrderStatus()==OrderCoinsEntity.ORDERSTATUS_DONE) { return Result.fail(MessageSourceUtils.getString("order_service_0012")); } orderCoinsEntity.setOrderStatus(OrderCoinsEntity.ORDERSTATUS_CANCEL); @@ -611,15 +616,23 @@ if (ObjectUtil.isNotEmpty(walletCoin)) { //手续费 = 开仓价*数量*手续费率 //返还金额=开仓价*未成交数量+手续费 - BigDecimal returnBalance = orderCoinsEntity.getDealAmount(); - - walletCoin.setAvailableBalance(walletCoin.getAvailableBalance().add(returnBalance)); + BigDecimal returnBalance = orderCoinsEntity.getEntrustAmount().subtract(orderCoinsEntity.getDealAmount()); + // 需要退回的手续费 + 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()); + returnFee = orderCoinsEntity.getFeeAmount().subtract(needFee); + } + walletCoin.setAvailableBalance(walletCoin.getAvailableBalance().add(returnBalance).add(returnFee)); 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.setRemark(MemberAccountFlowEntity.REMARK_CANCEL + symbol + MemberAccountFlowEntity.REMARK_RETURNBALANCE + returnBalance.add(returnFee)); record.setBalance(walletCoin.getAvailableBalance()); record.setMemberId(memberId); record.setSymbol(symbol); @@ -631,8 +644,8 @@ //如果是限价卖出,撤单将对应的钱包冻结金额返回 MemberWalletCoinEntity walletCoin = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, symbol); if (ObjectUtil.isNotEmpty(walletCoin)) { - - BigDecimal returnBalance = orderCoinsEntity.getEntrustCnt(); + // 卖出按卖出的数量计算手续费 + BigDecimal returnBalance = orderCoinsEntity.getEntrustCnt().subtract(orderCoinsEntity.getDealCnt()); walletCoin.setAvailableBalance(walletCoin.getAvailableBalance().add(returnBalance)); walletCoin.setFrozenBalance(walletCoin.getFrozenBalance().subtract(returnBalance)); memberWalletCoinDao.updateById(walletCoin); @@ -664,25 +677,25 @@ IPage<OrderCoinsDealEntity> list = orderCoinDealDao.findAllWalletCoinOrderInPage(page, orderCoinsDealEntity); Page<OrderWalletCoinDealVo> pageEntityToPageVo = OrderWalletCoinDealMapper.INSTANCE.pageEntityToPageVo(list); List<OrderWalletCoinDealVo> records = pageEntityToPageVo.getRecords(); - if(CollUtil.isNotEmpty(records)) { - for(OrderWalletCoinDealVo orderWalletCoinDealVo : records) { - orderWalletCoinDealVo.setFeeAmount(orderWalletCoinDealVo.getFeeAmount() == null - ? BigDecimal.ZERO : orderWalletCoinDealVo.getFeeAmount().setScale(4, BigDecimal.ROUND_DOWN)); - - orderWalletCoinDealVo.setDealAmount(orderWalletCoinDealVo.getDealAmount() == null - ? BigDecimal.ZERO : orderWalletCoinDealVo.getDealAmount().setScale(4, BigDecimal.ROUND_DOWN)); - - orderWalletCoinDealVo.setSymbolCnt(orderWalletCoinDealVo.getSymbolCnt() == null - ? BigDecimal.ZERO : orderWalletCoinDealVo.getSymbolCnt().setScale(4, BigDecimal.ROUND_DOWN)); - - orderWalletCoinDealVo.setEntrustPrice(orderWalletCoinDealVo.getEntrustPrice() == null - ? BigDecimal.ZERO : orderWalletCoinDealVo.getEntrustPrice().setScale(4, BigDecimal.ROUND_DOWN)); - - orderWalletCoinDealVo.setDealPrice(orderWalletCoinDealVo.getDealPrice() == null - ? BigDecimal.ZERO : orderWalletCoinDealVo.getDealPrice().setScale(4, BigDecimal.ROUND_DOWN)); - } + if (CollUtil.isNotEmpty(records)) { + for (OrderWalletCoinDealVo orderWalletCoinDealVo : records) { + orderWalletCoinDealVo.setFeeAmount(orderWalletCoinDealVo.getFeeAmount() == null + ? BigDecimal.ZERO : orderWalletCoinDealVo.getFeeAmount().setScale(4, BigDecimal.ROUND_DOWN)); + + orderWalletCoinDealVo.setDealAmount(orderWalletCoinDealVo.getDealAmount() == null + ? BigDecimal.ZERO : orderWalletCoinDealVo.getDealAmount().setScale(4, BigDecimal.ROUND_DOWN)); + + orderWalletCoinDealVo.setSymbolCnt(orderWalletCoinDealVo.getSymbolCnt() == null + ? BigDecimal.ZERO : orderWalletCoinDealVo.getSymbolCnt().setScale(4, BigDecimal.ROUND_DOWN)); + + orderWalletCoinDealVo.setEntrustPrice(orderWalletCoinDealVo.getEntrustPrice() == null + ? BigDecimal.ZERO : orderWalletCoinDealVo.getEntrustPrice().setScale(4, BigDecimal.ROUND_DOWN)); + + orderWalletCoinDealVo.setDealPrice(orderWalletCoinDealVo.getDealPrice() == null + ? BigDecimal.ZERO : orderWalletCoinDealVo.getDealPrice().setScale(4, BigDecimal.ROUND_DOWN)); + } } - + return Result.ok(pageEntityToPageVo); } @@ -693,21 +706,21 @@ Long memberId = LoginUserUtils.getAppLoginUser().getId(); OrderCoinsDealEntity selectWalletCoinOrder = orderCoinDealDao.selectWalletCoinOrder(orderId, memberId); OrderWalletCoinDealVo entityToVo = OrderWalletCoinDealMapper.INSTANCE.entityToVoOrder(selectWalletCoinOrder); - if(ObjectUtil.isNotEmpty(entityToVo)) { - entityToVo.setFeeAmount(entityToVo.getFeeAmount() == null - ? BigDecimal.ZERO : entityToVo.getFeeAmount().setScale(4, BigDecimal.ROUND_DOWN)); - - entityToVo.setDealAmount(entityToVo.getDealAmount() == null - ? BigDecimal.ZERO : entityToVo.getDealAmount().setScale(4, BigDecimal.ROUND_DOWN)); - - entityToVo.setSymbolCnt(entityToVo.getSymbolCnt() == null - ? BigDecimal.ZERO : entityToVo.getSymbolCnt().setScale(4, BigDecimal.ROUND_DOWN)); - - entityToVo.setEntrustPrice(entityToVo.getEntrustPrice() == null - ? BigDecimal.ZERO : entityToVo.getEntrustPrice().setScale(4, BigDecimal.ROUND_DOWN)); - - entityToVo.setDealPrice(entityToVo.getDealPrice() == null - ? BigDecimal.ZERO : entityToVo.getDealPrice().setScale(4, BigDecimal.ROUND_DOWN)); + if (ObjectUtil.isNotEmpty(entityToVo)) { + entityToVo.setFeeAmount(entityToVo.getFeeAmount() == null + ? BigDecimal.ZERO : entityToVo.getFeeAmount().setScale(4, BigDecimal.ROUND_DOWN)); + + entityToVo.setDealAmount(entityToVo.getDealAmount() == null + ? BigDecimal.ZERO : entityToVo.getDealAmount().setScale(4, BigDecimal.ROUND_DOWN)); + + entityToVo.setSymbolCnt(entityToVo.getSymbolCnt() == null + ? BigDecimal.ZERO : entityToVo.getSymbolCnt().setScale(4, BigDecimal.ROUND_DOWN)); + + entityToVo.setEntrustPrice(entityToVo.getEntrustPrice() == null + ? BigDecimal.ZERO : entityToVo.getEntrustPrice().setScale(4, BigDecimal.ROUND_DOWN)); + + entityToVo.setDealPrice(entityToVo.getDealPrice() == null + ? BigDecimal.ZERO : entityToVo.getDealPrice().setScale(4, BigDecimal.ROUND_DOWN)); } return Result.ok(entityToVo); } @@ -802,7 +815,7 @@ @Transactional(rollbackFor = Exception.class) public void dealEntrustCoinOrder() { List<String> ignoreTypes = new ArrayList<>(); - ignoreTypes.add("NEKK"); + ignoreTypes.add(SymbolsConstats.ROC); List<OrderCoinsEntity> list = orderCoinsDao.selectAllEntrustingCoinOrderList(ignoreTypes); if (CollUtil.isNotEmpty(list)) { for (OrderCoinsEntity orderCoinsEntity : list) { @@ -869,10 +882,12 @@ } } - public void handleOrder(List<ExchangeTrade> trades){ + @Transactional + public void handleOrder(List<ExchangeTrade> trades) { + // 处理撮合交易的订单 - for(ExchangeTrade exchangeTrade : trades){ - if(exchangeTrade==null){ + for (ExchangeTrade exchangeTrade : trades) { + if (exchangeTrade == null) { continue; } // 量 @@ -889,16 +904,28 @@ // 买卖单都需要处理 // 买单 OrderCoinsEntity buyOrderCoinsEntity = orderCoinsDao.selectById(buyOrderId); - if(buyOrderCoinsEntity!=null){ + if(buyOrderCoinsEntity==null){ + return; + } + BigDecimal buyEntrustCnt = buyOrderCoinsEntity.getEntrustCnt(); + if(buyEntrustCnt==null){ + buyEntrustCnt = BigDecimal.ZERO; + } + Long memberId = buyOrderCoinsEntity.getMemberId(); + if (buyOrderCoinsEntity != null) { // 比较剩余的量 BigDecimal dealAmount = buyOrderCoinsEntity.getDealAmount(); // 单的总金额 BigDecimal entrustAmount = buyOrderCoinsEntity.getEntrustAmount(); BigDecimal add = dealAmount.add(buyTurnover); + BigDecimal closingPrice = buyTurnover.multiply(new BigDecimal("0.002")); + + //成交量 + BigDecimal dealCnt = buyOrderCoinsEntity.getDealCnt().add(amount); // 创建一个完成的单 OrderCoinsDealEntity detail = new OrderCoinsDealEntity(); detail.setMemberId(buyOrderCoinsEntity.getMemberId()); - //detail.setOrderId(order.getId()); + detail.setOrderId(buyOrderCoinsEntity.getId()); detail.setOrderNo(buyOrderCoinsEntity.getOrderNo()); detail.setOrderType(buyOrderCoinsEntity.getOrderType()); detail.setTradeType(buyOrderCoinsEntity.getTradeType()); @@ -907,11 +934,11 @@ detail.setEntrustPrice(buyOrderCoinsEntity.getEntrustPrice()); detail.setDealPrice(price); detail.setDealAmount(buyTurnover); - //detail.setFeeAmount(closingPrice); + detail.setFeeAmount(closingPrice); detail.setOrderStatus(OrderCoinsDealEntity.ORDERSTATUS_DONE); orderCoinDealDao.insert(detail); // 如果这个单成交完 更改状态 - if(add.compareTo(entrustAmount)>=0){ + if (add.compareTo(entrustAmount) >= 0 ||(buyEntrustCnt.compareTo(BigDecimal.ZERO)>0 &&dealCnt.compareTo(buyEntrustCnt)>=0) ) { OrderCoinsEntity update = new OrderCoinsEntity(); update.setId(buyOrderId); update.setDealAmount(entrustAmount); @@ -919,7 +946,7 @@ update.setOrderStatus(OrderCoinsEntity.ORDERSTATUS_DONE); update.setUpdateTime(new Date()); orderCoinsDao.updateById(update); - }else{ + } else { OrderCoinsEntity update = new OrderCoinsEntity(); update.setId(buyOrderId); update.setDealAmount(add); @@ -930,7 +957,7 @@ } // 卖单 OrderCoinsEntity sellOrderCoinsEntity = orderCoinsDao.selectById(sellOrderId); - if(sellOrderCoinsEntity!=null){ + if (sellOrderCoinsEntity != null) { // 比较剩余的量 BigDecimal dealAmount = sellOrderCoinsEntity.getDealCnt(); // 单的总数量 @@ -939,7 +966,7 @@ // 创建一个完成的单 OrderCoinsDealEntity detail = new OrderCoinsDealEntity(); detail.setMemberId(sellOrderCoinsEntity.getMemberId()); - //detail.setOrderId(order.getId()); + detail.setOrderId(sellOrderCoinsEntity.getId()); detail.setOrderNo(sellOrderCoinsEntity.getOrderNo()); detail.setOrderType(sellOrderCoinsEntity.getOrderType()); detail.setTradeType(sellOrderCoinsEntity.getTradeType()); @@ -952,7 +979,7 @@ detail.setOrderStatus(OrderCoinsDealEntity.ORDERSTATUS_DONE); orderCoinDealDao.insert(detail); // 如果这个单成交完 更改状态 - if(add.compareTo(entrustCnt)>=0){ + if (add.compareTo(entrustCnt) >= 0) { OrderCoinsEntity update = new OrderCoinsEntity(); update.setId(sellOrderId); // 总成交额 @@ -961,7 +988,7 @@ update.setDealCnt(entrustCnt); update.setUpdateTime(new Date()); orderCoinsDao.updateById(update); - }else{ + } else { // 未完成 OrderCoinsEntity update = new OrderCoinsEntity(); update.setId(sellOrderId); @@ -971,19 +998,54 @@ update.setUpdateTime(new Date()); orderCoinsDao.updateById(update); } - // 卖币得到的usdt - MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(sellOrderCoinsEntity.getMemberId(), sellOrderCoinsEntity.getSymbol()); - if(memberWalletCoinEntity!=null){ - memberWalletCoinDao.updateWalletBalance(memberWalletCoinEntity.getId(),buyTurnover,buyTurnover,null); + // 买币扣除冻结usdt 增加币种的可用 + MemberWalletCoinEntity usdtWallet = memberWalletCoinDao.selectWalletCoinBymIdAndCode(buyOrderCoinsEntity.getMemberId(), MemberWalletCoinEnum.WALLETCOINCODE.getValue()); + if (usdtWallet != null) { + // 减少usdt冻结 + memberWalletCoinDao.updateWalletBalance(usdtWallet.getId(), null, null, buyTurnover.negate()); } + // 增加买的币 + MemberWalletCoinEntity buySymbolWallet = memberWalletCoinDao.selectWalletCoinBymIdAndCode(buyOrderCoinsEntity.getMemberId(), buyOrderCoinsEntity.getSymbol()); + if (buySymbolWallet != null) { + memberWalletCoinDao.updateWalletBalance(buySymbolWallet.getId(), amount, amount, null); + } + // 流水记录 + MemberAccountFlowEntity record = new MemberAccountFlowEntity(); + record.setMemberId(buyOrderCoinsEntity.getMemberId()); + record.setPrice(buyTurnover.setScale(4, BigDecimal.ROUND_DOWN).negate()); + record.setSource(MemberAccountFlowEntity.SOURCE_BUY + buyOrderCoinsEntity.getSymbol()); + record.setRemark(MemberAccountFlowEntity.REMARK_BUY + buyOrderCoinsEntity.getSymbol() + ":" + amount); + record.setSymbol(buyOrderCoinsEntity.getSymbol()); + record.setBalance(usdtWallet.getAvailableBalance().subtract(buyTurnover)); + memberAccountFlowEntityDao.insert(record); + // 卖家需要减少冻结的币种 增加usdt + MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(sellOrderCoinsEntity.getMemberId(), sellOrderCoinsEntity.getSymbol()); + if (memberWalletCoinEntity != null) { + // 更新卖币减少的币种 + memberWalletCoinDao.updateWalletBalance(memberWalletCoinEntity.getId(), null, null, amount.negate()); + } + // 更新卖币得到的usdt + MemberWalletCoinEntity sellWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(sellOrderCoinsEntity.getMemberId(), MemberWalletCoinEnum.WALLETCOINCODE.getValue()); + if (sellOrderCoinsEntity != null) { + memberWalletCoinDao.updateWalletBalance(sellWalletCoinEntity.getId(), buyTurnover, buyTurnover, null); + } + // 流水记录 + MemberAccountFlowEntity recordSell = new MemberAccountFlowEntity(); + recordSell.setMemberId(sellOrderCoinsEntity.getMemberId()); + recordSell.setPrice(buyTurnover.setScale(4, BigDecimal.ROUND_DOWN)); + recordSell.setSource(MemberAccountFlowEntity.SOURCE_SALE + buyOrderCoinsEntity.getSymbol()); + recordSell.setRemark(MemberAccountFlowEntity.REMARK_SALE + buyOrderCoinsEntity.getSymbol() + ":" + amount.toPlainString()); + recordSell.setSymbol(buyOrderCoinsEntity.getSymbol()); + recordSell.setBalance(sellWalletCoinEntity.getAvailableBalance().add(buyTurnover)); + memberAccountFlowEntityDao.insert(recordSell); } } } @Override public void initOrders(String symbol, Integer type, Integer tradeType, BigDecimal price, - BigDecimal amount,BigDecimal entrustAmount) { + BigDecimal amount, BigDecimal entrustAmount) { //获取用户ID Long memberId = 10L; BigDecimal nowPriceinBigDecimal = price; @@ -994,7 +1056,7 @@ symbol = symbol.toUpperCase(); // 手续费用(手续费=建仓价X数量X手续费率) - BigDecimal closingPrice = BigDecimal.ZERO ; + BigDecimal closingPrice = BigDecimal.ZERO; // BigDecimal totalPayPricCoin = nowPrice.multiply(amount).add(closingPrice); // 首先将单插入到数据库主表(委托表) @@ -1018,18 +1080,18 @@ order.setTradeType(tradeType); // 手续费 order.setFeeAmount(closingPrice); - if(OrderCoinsEntity.TRADETYPE_FIXEDPRICE.equals(tradeType)){ + if (OrderCoinsEntity.TRADETYPE_FIXEDPRICE.equals(tradeType)) { // 限价 是需要价格和数量 可以得到成交金额 // 下单量 order.setEntrustCnt(amount); // 下单价格 order.setEntrustPrice(price); order.setEntrustAmount(amount.multiply(price)); - }else{ - if(OrderCoinsEntity.ORDERTYPE_BUY.equals(type)){ + } else { + if (OrderCoinsEntity.ORDERTYPE_BUY.equals(type)) { // 市价 只有金额 order.setEntrustAmount(entrustAmount); - }else{ + } else { // 下单量 order.setEntrustCnt(amount); // 下单价格 @@ -1043,4 +1105,5 @@ CoinTrader trader = factory.getTrader(symbol); trader.trade(order); } + } -- Gitblit v1.9.1