From 43385a77303aa2295d902b5a2be9e28723d08cef Mon Sep 17 00:00:00 2001 From: zainali5120 <512061637@qq.com> Date: Mon, 12 Oct 2020 16:00:21 +0800 Subject: [PATCH] Merge branches 'cpv' and 'feature/撮合交易' of https://gitee.com/chonggaoxiao/new_excoin into cpv --- src/main/java/com/xcong/excoin/modules/coin/dao/OrderCoinsDao.java | 3 src/main/java/com/xcong/excoin/quartz/job/BlockCoinUpdateJob.java | 14 src/main/java/com/xcong/excoin/modules/blackchain/service/EthService.java | 8 src/main/java/com/xcong/excoin/websocket/TradePlateSendWebSocket.java | 16 src/main/java/com/xcong/excoin/processor/DefaultCoinProcessor.java | 6 src/main/java/com/xcong/excoin/rabbit/init/OrderProducerInit.java | 1 src/main/java/com/xcong/excoin/modules/coin/service/impl/BlockCoinServiceImpl.java | 76 ++++- src/main/resources/mapper/walletCoinOrder/OrderCoinsDao.xml | 13 src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java | 1 src/main/java/com/xcong/excoin/modules/blackchain/model/EthUsdtChargeDto.java | 25 + src/main/java/com/xcong/excoin/modules/blackchain/service/EthUsdtContract.java | 1 src/main/java/com/xcong/excoin/rabbit/producer/UsdtUpdateProducer.java | 47 +++ src/main/java/com/xcong/excoin/modules/symbols/service/SymbolsService.java | 1 src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtErc20UpdateService.java | 60 +++ src/main/java/com/xcong/excoin/quartz/job/CoinTradeInitJob.java | 3 src/main/java/com/xcong/excoin/rabbit/consumer/ExchangeConsumer.java | 26 - src/main/java/com/xcong/excoin/modules/coin/service/impl/OrderCoinServiceImpl.java | 67 +++- src/main/java/com/xcong/excoin/rabbit/producer/OrderSubmitProducer.java | 47 +++ src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java | 93 ++++++ src/main/java/com/xcong/excoin/rabbit/consumer/UsdtUpdateConsumer.java | 44 ++ src/main/resources/mapper/member/MemberCoinAddressDao.xml | 7 src/main/java/com/xcong/excoin/processor/MarketService.java | 23 + src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java | 6 src/main/java/com/xcong/excoin/modules/coin/dao/OrderCoinDealDao.java | 6 src/main/java/com/xcong/excoin/modules/coin/service/BlockCoinService.java | 3 src/main/java/com/xcong/excoin/quartz/job/NotionalPoolingJob.java | 10 src/main/resources/mapper/walletCoinOrder/OrderCoinDealDao.xml | 21 + src/main/java/com/xcong/excoin/rabbit/consumer/RocBlockUpdateConsumer.java | 6 src/main/java/com/xcong/excoin/rabbit/consumer/OperateOrderPriceConsumer.java | 1 src/main/java/com/xcong/excoin/modules/coin/controller/OrderCoinController.java | 7 src/main/java/com/xcong/excoin/rabbit/consumer/WebsocketPriceConsumer.java | 1 src/main/java/com/xcong/excoin/quartz/job/UsdtErc20InitJob.java | 31 ++ src/main/java/com/xcong/excoin/quartz/job/KLineGeneratorJob.java | 3 src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtEthService.java | 4 src/main/java/com/xcong/excoin/rabbit/consumer/OrderSubmitConsumer.java | 48 +++ src/main/resources/application-prodapp.yml | 114 +++++++ 36 files changed, 735 insertions(+), 108 deletions(-) diff --git a/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java b/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java index 3549a5f..b9d1449 100644 --- a/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java +++ b/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java @@ -29,6 +29,20 @@ public static final String EXCHANGE_A = "biue-exchange-A"; + + public static final String EXCHANGE_USDT_UPDATE = "exchange_usdt_update"; + + public static final String QUEUE_USDT_UPDATE = "queue_usdt_update"; + + public static final String ROUTING_KEY_USDT_UPDATE = "routing_key_usdt_update"; + + public static final String EXCHANGE_USDT_ADDRESS = "exchange_usdt_address"; + + public static final String QUEUE_USDT_ADDRESS= "queue_usdt_address"; + + public static final String ROUTING_KEY_USDT_ADDRESS = "routing_key_usdt_address"; + + /** * 撮合交易 */ @@ -95,6 +109,18 @@ public static final String ROUTING_KEY_ROC = "roc-transfer-routingKey"; + public static final String EXCHANGE_ROC_ORDER_SUBMIT = "roc-exchange-order-submit"; + + public static final String QUEUE_ROC_ORDER_SUBMIT = "roc-order-queue-submit"; + + 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; @@ -130,6 +156,73 @@ return BindingBuilder.bind(testQueue()).to(defaultExchange()).with(ROUTING_KEY_TEST); } + // 交易订单 + @Bean + public DirectExchange orderSubmitExchange() { + return new DirectExchange(EXCHANGE_ROC_ORDER_SUBMIT); + } + + + @Bean + public Queue ordereSubmitQueue() { + return new Queue(QUEUE_ROC_ORDER_SUBMIT, true); + } + + @Bean + public Binding bindingSubmitOrder() { + 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() { + return new DirectExchange(EXCHANGE_USDT_UPDATE); + } + + + @Bean + public Queue usdtUpdateQueue() { + return new Queue(QUEUE_USDT_UPDATE, true); + } + + @Bean + public Binding usdtUpdatebinding() { + return BindingBuilder.bind(usdtUpdateQueue()).to(usdtUpdateExchange()).with(ROUTING_KEY_USDT_UPDATE); + } + + @Bean + public DirectExchange usdtAddressExchange() { + return new DirectExchange(EXCHANGE_USDT_ADDRESS); + } + + + @Bean + public Queue usdtAddressQueue() { + return new Queue(QUEUE_USDT_ADDRESS, true); + } + + @Bean + public Binding usdtAddressbinding() { + return BindingBuilder.bind(usdtAddressQueue()).to(usdtAddressExchange()).with(ROUTING_KEY_USDT_ADDRESS); + } + /** * 交换器A 可以继续添加交换器B C diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/model/EthUsdtChargeDto.java b/src/main/java/com/xcong/excoin/modules/blackchain/model/EthUsdtChargeDto.java new file mode 100644 index 0000000..8d07d27 --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/blackchain/model/EthUsdtChargeDto.java @@ -0,0 +1,25 @@ +package com.xcong.excoin.modules.blackchain.model; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 充值扫块dto + */ +@Data +public class EthUsdtChargeDto { + + private String address; + private String hash; + private BigDecimal balance; + + public EthUsdtChargeDto() { + } + + public EthUsdtChargeDto(String address, String hash, BigDecimal balance) { + this.address = address; + this.hash = hash; + this.balance = balance; + } +} 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 5638359..c2c9379 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 @@ -10,6 +10,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import org.web3j.abi.FunctionEncoder; @@ -237,8 +238,9 @@ // log.debug("transfer hexValue:" + hexValue); - EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get(); - + CompletableFuture<EthSendTransaction> ethSendTransactionCompletableFuture = web3j.ethSendRawTransaction(hexValue).sendAsync(); + EthSendTransaction ethSendTransaction = ethSendTransactionCompletableFuture.get(); + //return "hash"; if (ethSendTransaction.hasError()) { // log.info("transfer error:", ethSendTransaction.getError().getMessage()); @@ -263,7 +265,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/blackchain/service/EthUsdtContract.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/EthUsdtContract.java index 1566e5c..891cc0b 100644 --- a/src/main/java/com/xcong/excoin/modules/blackchain/service/EthUsdtContract.java +++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/EthUsdtContract.java @@ -301,7 +301,6 @@ public TransferEventResponse apply(Log log) { EventValuesWithLog eventValues = extractEventParametersWithLog(TRANSFER_EVENT, log); TransferEventResponse typedResponse = new TransferEventResponse(); - System.out.println(eventValues); if(eventValues!=null){ typedResponse.log = log; typedResponse.from = (String) eventValues.getIndexedValues().get(0).getValue(); diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java index 4eeff4c..ee703fc 100644 --- a/src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java +++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java @@ -6,6 +6,7 @@ import javax.annotation.Resource; import com.xcong.excoin.modules.blackchain.service.*; +import com.xcong.excoin.rabbit.producer.UsdtUpdateProducer; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -29,6 +30,9 @@ MemberDao memberDao; @Resource MemberCoinAddressDao memberMapper; + + @Resource + private UsdtUpdateProducer usdtUpdateProducer; @Override public Result findBlockAddress(String symbol) { @@ -178,6 +182,8 @@ coinAddress.setLabel(uuid); memberMapper.insert(coinAddress); } + // 发送新增的地址到监听集合 + usdtUpdateProducer.sendAddressMsg(address); } break; case "CPV": diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtErc20UpdateService.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtErc20UpdateService.java index a67b220..2ad5e2c 100644 --- a/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtErc20UpdateService.java +++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtErc20UpdateService.java @@ -1,6 +1,12 @@ package com.xcong.excoin.modules.blackchain.service; +import com.alibaba.fastjson.JSONObject; +import com.xcong.excoin.common.enumerates.CoinTypeEnum; +import com.xcong.excoin.modules.blackchain.model.EthUsdtChargeDto; +import com.xcong.excoin.modules.member.dao.MemberCoinAddressDao; +import com.xcong.excoin.rabbit.producer.UsdtUpdateProducer; import com.xcong.excoin.utils.RedisUtils; +import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Service; import org.web3j.crypto.Credentials; import org.web3j.protocol.Web3j; @@ -14,15 +20,24 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Service public class UsdtErc20UpdateService { + + @Resource + private UsdtUpdateProducer usdtUpdateProducer; + + @Resource + private MemberCoinAddressDao coinWalletDao; + public final static List<String> ALL_ADDRESS_LIST = new ArrayList<>(); - public final static String USDT_BLOCK_NUM = "USDT_BLOCK_NUM"; + public final static String USDT_BLOCK_NUM_GOLDEN = "USDT_BLOCK_NUM_GOLDEN"; - private final static BigInteger DIVIDE_USDT = new BigInteger("1000000"); + private final static BigDecimal DIVIDE_USDT = new BigDecimal("1000000"); private static Web3j web3; @@ -58,26 +73,48 @@ @Resource private RedisUtils redisUtils; + + public void updateUsdt(){ + // 首先查询所有的钱包地址 + List<String> tdCoinWallets = coinWalletDao.selectAllSymbolAddress(CoinTypeEnum.USDT.toString(),"ERC20"); + if(tdCoinWallets!=null){ + ALL_ADDRESS_LIST.addAll(tdCoinWallets); + } // 获取最新区块 - String string = redisUtils.getString(USDT_BLOCK_NUM); + String string = redisUtils.getString(USDT_BLOCK_NUM_GOLDEN); + if(string==null){ + string = "11014249"; + } BigInteger blockNum = new BigInteger(string); Credentials credentials = Credentials.create(privateKey); - EthUsdtContract contract = EthUsdtContract.load(contractAddr, web3, credentials, getStaticGasProvider()); - EthFilter filter = getFilter(new BigInteger("10943021")); + EthUsdtContract contract = EthUsdtContract.load(contractAddr, getInstance(), credentials, getStaticGasProvider()); + EthFilter filter = getFilter(blockNum); + Map<String,BigInteger> map = new HashMap<String,BigInteger>(); + map.put("blockNum",blockNum); contract.transferEventFlowable(filter).subscribe(e->{ - if(e!=null){ + if(e!=null && StringUtils.isNotBlank(e.to) && e.log.getBlockNumber()!=null){ String transactionHash = e.log.getTransactionHash(); + BigInteger blockNumber1 = e.log.getBlockNumber(); String toAddress = e.to; BigInteger tokenBalance = e.tokens; - // 金额 - BigInteger divide = tokenBalance.divide(DIVIDE_USDT); - // 发送消息队列 TODO - + if(ALL_ADDRESS_LIST.contains(toAddress)){ + System.out.println("存在本地的地址:"+toAddress); + // 金额 + BigDecimal divide = new BigDecimal(tokenBalance.toString()).divide(DIVIDE_USDT); + // 发送消息队列 + EthUsdtChargeDto dto = new EthUsdtChargeDto(toAddress,transactionHash,divide); + usdtUpdateProducer.sendMsg(JSONObject.toJSONString(dto)); + } + if(map.get("blockNum").compareTo(blockNumber1)!=0){ + redisUtils.set(USDT_BLOCK_NUM_GOLDEN,blockNumber1.toString()); + map.put("blockNum",blockNumber1); + } } }); } + private static EthFilter getFilter(BigInteger startBlock) { if (startBlock != null) { @@ -88,7 +125,6 @@ return new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, contractAddr); } - - } + } diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtEthService.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtEthService.java index 057320d..17323b4 100644 --- a/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtEthService.java +++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtEthService.java @@ -59,13 +59,13 @@ } BigDecimal usdt = ethService.tokenGetBalance(address); - log.info("地址:{}, 金额:{}", address, usdt); + //log.info("地址:{}, 金额:{}", address, usdt); if (usdt != null && usdt.compareTo(LIMIT) > 0) { usdt = usdt.subtract(new BigDecimal("0.01")); // 查询eth是否足够 BigDecimal eth = EthService.getEthBlance(address); - log.info("地址:{}, ETH:{}", address, eth); + //log.info("地址:{}, ETH:{}", address, eth); if (eth != null && eth.compareTo(FEE) >= 0) { MemberCoinAddressEntity memberCoinAddressEntity = memberCoinAddressDao.selectBlockAddressWithTag(memberId, CoinTypeEnum.USDT.name(), "ERC20"); if (memberCoinAddressEntity == null) { 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 406e207..2d42a21 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 @@ -9,11 +9,7 @@ import com.xcong.excoin.modules.coin.entity.OrderCoinsEntity; import com.xcong.excoin.modules.symbols.constants.SymbolsConstats; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import com.xcong.excoin.common.response.Result; import com.xcong.excoin.modules.coin.parameter.dto.CancelEntrustWalletCoinOrderDto; @@ -39,6 +35,7 @@ @Api(value = "币币交易接口", tags = "币币交易接口") @RestController @RequestMapping(value = "/api/orderCoin") +@CrossOrigin("*") public class OrderCoinController { @Resource 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..0a9e313 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 @@ -1,5 +1,6 @@ package com.xcong.excoin.modules.coin.dao; +import java.math.BigDecimal; import java.util.Date; import java.util.List; @@ -15,7 +16,10 @@ public interface OrderCoinDealDao extends BaseMapper<OrderCoinsDealEntity>{ List<OrderCoinsDealEntity> selectAllWalletCoinOrder(@Param("memberId")Long memberId); - + BigDecimal sumTodayBuyAmount(@Param("memberId")Long memberId, @Param("symbol") String symbol); + BigDecimal sumTodayEntrustCntBuyAmount(@Param("memberId")Long memberId, @Param("symbol") String symbol); + 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/BlockCoinService.java b/src/main/java/com/xcong/excoin/modules/coin/service/BlockCoinService.java index 1567cce..5113425 100644 --- a/src/main/java/com/xcong/excoin/modules/coin/service/BlockCoinService.java +++ b/src/main/java/com/xcong/excoin/modules/coin/service/BlockCoinService.java @@ -1,5 +1,6 @@ package com.xcong.excoin.modules.coin.service; +import com.xcong.excoin.modules.blackchain.model.EthUsdtChargeDto; import com.xcong.excoin.modules.blackchain.model.RocTransferDetail; public interface BlockCoinService { @@ -20,4 +21,6 @@ public void updateRoc(RocTransferDetail transferDetail); + void updateEthUsdtNew(EthUsdtChargeDto ethUsdtChargeDto); + } diff --git a/src/main/java/com/xcong/excoin/modules/coin/service/impl/BlockCoinServiceImpl.java b/src/main/java/com/xcong/excoin/modules/coin/service/impl/BlockCoinServiceImpl.java index 52f4c3c..16118fb 100644 --- a/src/main/java/com/xcong/excoin/modules/coin/service/impl/BlockCoinServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/coin/service/impl/BlockCoinServiceImpl.java @@ -101,7 +101,7 @@ BigDecimal newBalance = balance.subtract(early); memberWalletCoinDao.updateBlockBalance(walletCoinEntity.getId(), newBalance, balance, 0); - String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.USDT.name(), "ERC20", balance,null); + String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.USDT.name(), "ERC20", balance, null); // 插入财务记录 LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", newBalance, CoinTypeEnum.USDT.name(), 1, 1); @@ -151,7 +151,7 @@ BigDecimal newBalance = balance.subtract(early); memberWalletCoinDao.updateBlockBalance(walletCoin.getId(), newBalance, balance, 0); - String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.ETH.name(), null, balance,null); + String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.ETH.name(), null, balance, null); // 插入财务记录 LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", newBalance, CoinTypeEnum.ETH.name(), 1, 1); @@ -201,7 +201,7 @@ BigDecimal newBalance = balance.subtract(early); memberWalletCoinDao.updateBlockBalance(walletCoin.getId(), newBalance, balance, 0); - String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.USDT.name(), "OMNI", balance,null); + String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.USDT.name(), "OMNI", balance, null); ThreadPoolUtils.sendDingTalk(5); MemberEntity member = memberDao.selectById(memberId); @@ -249,7 +249,7 @@ BigDecimal newBalance = balance.subtract(early); memberWalletCoinDao.updateBlockBalance(walletCoin.getId(), newBalance, balance, 0); - String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.BTC.name(), null, balance,null); + String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.BTC.name(), null, balance, null); LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", newBalance, CoinTypeEnum.BTC.name(), 1, 1); ThreadPoolUtils.sendDingTalk(5); @@ -311,7 +311,7 @@ if (memberCoinAddressEntity != null) { memberWalletCoinDao.updateBlockBalance(memberWalletCoinEntity.getId(), amount, BigDecimal.ZERO, 0); // 添加冲币记录 - String orderNo = insertCoinCharge(EosService.ACCOUNT, memberId, amount, CoinTypeEnum.EOS.name(), memo, BigDecimal.ZERO,null); + String orderNo = insertCoinCharge(EosService.ACCOUNT, memberId, amount, CoinTypeEnum.EOS.name(), memo, BigDecimal.ZERO, null); LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", amount, CoinTypeEnum.EOS.name(), 1, 1); ThreadPoolUtils.sendDingTalk(5); @@ -388,7 +388,7 @@ if (memberCoinAddressEntity != null) { memberWalletCoinDao.updateBlockBalance(memberWalletCoinEntity.getId(), amount, BigDecimal.ZERO, 0); // 添加冲币记录 - String orderNo = insertCoinCharge(XrpService.ACCOUNT, memberId, amount, CoinTypeEnum.XRP.name(), memo, BigDecimal.ZERO,null); + String orderNo = insertCoinCharge(XrpService.ACCOUNT, memberId, amount, CoinTypeEnum.XRP.name(), memo, BigDecimal.ZERO, null); LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", amount, CoinTypeEnum.XRP.name(), 1, 1); ThreadPoolUtils.sendDingTalk(5); @@ -462,7 +462,7 @@ memberWalletCoinDao.updateBlockBalance(memberWalletCoinEntity.getId(), amount, BigDecimal.ZERO, 0); // 添加冲币记录 - String orderNo = insertCoinCharge(address, memberId, amount, CoinTypeEnum.USDT.name(), "TRC20", BigDecimal.ZERO,transactionId); + String orderNo = insertCoinCharge(address, memberId, amount, CoinTypeEnum.USDT.name(), "TRC20", BigDecimal.ZERO, transactionId); LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", amount, CoinTypeEnum.USDT.name(), 1, 1); ThreadPoolUtils.sendDingTalk(5); @@ -488,23 +488,23 @@ String address = transferDetail.getAddress(); BigDecimal balance = transferDetail.getBalance(); String symbol = transferDetail.getSymbol(); - if(org.apache.commons.lang.StringUtils.isBlank(address) || org.apache.commons.lang.StringUtils.isBlank(symbol) || balance ==null ){ + if (org.apache.commons.lang.StringUtils.isBlank(address) || org.apache.commons.lang.StringUtils.isBlank(symbol) || balance == null) { return; } - if(balance.compareTo(new BigDecimal("0.0001"))<=0){ + if (balance.compareTo(new BigDecimal("0.0001")) <= 0) { return; } MemberCoinAddressEntity memberCoinAddress = memberCoinAddressDao.selectCoinAddressByAddressAndSymbol(address, symbol); - if(memberCoinAddress==null){ + if (memberCoinAddress == null) { return; } Long memberId = memberCoinAddress.getMemberId(); // 查询钱包 并更新 MemberWalletCoinEntity walletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.CPV.name()); if (walletCoinEntity == null) { - // 创建一个钱包 + // 创建一个钱包 // 创建这个钱包 walletCoinEntity = new MemberWalletCoinEntity(); walletCoinEntity.setAvailableBalance(BigDecimal.ZERO); @@ -518,23 +518,67 @@ memberWalletCoinDao.updateBlockBalance(walletCoinEntity.getId(), balance, BigDecimal.ZERO, 0); - String orderNo = insertCoinCharge(address, memberId, balance, CoinTypeEnum.CPV.name(), "", BigDecimal.ZERO,null); + String orderNo = insertCoinCharge(address, memberId, balance, CoinTypeEnum.CPV.name(), "", BigDecimal.ZERO, null); // 插入财务记录 LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", balance, CoinTypeEnum.CPV.name(), 1, 1); - try{ + try { ThreadPoolUtils.sendDingTalk(5); MemberEntity member = memberDao.selectById(memberId); if (StrUtil.isNotBlank(member.getPhone())) { - String amount = balance.toPlainString() + CoinTypeEnum.CPV.name(); + String amount = balance.toPlainString() + "ROC"; Sms106Send.sendRechargeMsg(member.getPhone(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), orderNo); } else { SubMailSend.sendRechargeMail(member.getEmail(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), orderNo); } - }catch (Exception e){ + } catch (Exception e) { //e.printStackTrace(); } + } + + @Override + @Transactional + public void updateEthUsdtNew(EthUsdtChargeDto ethUsdtChargeDto) { + String address = ethUsdtChargeDto.getAddress(); + String hash = ethUsdtChargeDto.getHash(); + // hash没有用过 + Map<String,Object> param = new HashMap<>(); + param.put("hash",hash); + param.put("address",address); + List<MemberCoinChargeEntity> memberCoinChargeEntities = memberCoinChargeDao.selectByMap(param); + if(CollectionUtils.isNotEmpty(memberCoinChargeEntities)){ + return; + } + MemberCoinAddressEntity coinAddressEntity = memberCoinAddressDao.selectCoinAddressByAddressAndSymbol(address, CoinTypeEnum.USDT.toString()); + if (coinAddressEntity == null) { + return; + } + Long memberId = coinAddressEntity.getMemberId(); + BigDecimal balance = ethUsdtChargeDto.getBalance(); + if (balance != null && balance.compareTo(new BigDecimal("0.1")) > 0) { + balance = balance.setScale(8, RoundingMode.CEILING); + BigDecimal early = BigDecimal.ZERO; + + MemberWalletCoinEntity walletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.USDT.name()); + if (walletCoinEntity == null) { + return; + } + BigDecimal newBalance = balance.subtract(early); + memberWalletCoinDao.updateBlockBalance(walletCoinEntity.getId(), newBalance, balance, 0); + String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.USDT.name(), "ERC20", balance, ethUsdtChargeDto.getHash()); + // 插入财务记录 + LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", newBalance, CoinTypeEnum.USDT.name(), 1, 1); + ThreadPoolUtils.sendDingTalk(5); + MemberEntity member = memberDao.selectById(memberId); + if (StrUtil.isNotBlank(member.getPhone())) { + String amount = newBalance.toPlainString() + "USDT-ERC20"; + Sms106Send.sendRechargeMsg(member.getPhone(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), orderNo); + } else { + SubMailSend.sendRechargeMail(member.getEmail(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), orderNo); + } + + } } private String generateNo() { @@ -545,7 +589,7 @@ return String.valueOf(timestamp).substring(2) + random; } - public String insertCoinCharge(String address, Long memberId, BigDecimal newBalance, String symbol, String tag, BigDecimal lastAmount,String hash) { + public String insertCoinCharge(String address, Long memberId, BigDecimal newBalance, String symbol, String tag, BigDecimal lastAmount, String hash) { MemberCoinChargeEntity memberCoinChargeEntity = new MemberCoinChargeEntity(); memberCoinChargeEntity.setAddress(address); memberCoinChargeEntity.setMemberId(memberId); 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 9a2c740..35ee332 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 @@ -17,6 +17,7 @@ import com.xcong.excoin.modules.platform.entity.PlatformSymbolsCoinEntity; import com.xcong.excoin.modules.symbols.constants.SymbolsConstats; +import com.xcong.excoin.rabbit.producer.OrderSubmitProducer; import com.xcong.excoin.trade.CoinTrader; import com.xcong.excoin.trade.CoinTraderFactory; import com.xcong.excoin.trade.ExchangeTrade; @@ -91,6 +92,9 @@ @Resource private MemberDao memberDao; + + @Resource + private OrderSubmitProducer orderSubmitProducer; @Override @@ -465,9 +469,11 @@ // memberWalletCoinDao.updateById(walletCoin); memberWalletCoinDao.updateWalletBalance(walletCoin.getId(),amount.negate(),amount.negate(),amount); } - // 加入到撮合 - CoinTrader trader = factory.getTrader(symbol); - trader.trade(order); + // 加入到撮合 TODO 通过消息队列发送到交易撮合 + //CoinTrader trader = factory.getTrader(symbol); + //trader.trade(order); + order.setSymbol(symbol); + orderSubmitProducer.sendMsg(JSONObject.toJSONString(order)); return Result.ok(MessageSourceUtils.getString("order_service_0011")); } @@ -512,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(MessageSourceUtils.getString("order_service_0013")); } if (orderCoinsEntity.getOrderStatus() == OrderCoinsEntity.ORDERSTATUS_CANCEL || orderCoinsEntity.getOrderStatus()==OrderCoinsEntity.ORDERSTATUS_DONE) { return Result.fail(MessageSourceUtils.getString("order_service_0012")); @@ -590,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")); } @@ -617,8 +628,6 @@ 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(); @@ -627,21 +636,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 = 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); @@ -674,6 +693,7 @@ return Result.ok(MessageSourceUtils.getString("order_service_0013")); } } + orderCoinDealDao.insert(detail); } return Result.fail(MessageSourceUtils.getString("order_service_0043")); } @@ -932,15 +952,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()); @@ -973,12 +1002,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); } } // 卖单 diff --git a/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java b/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java index a53bba9..baf9016 100644 --- a/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java +++ b/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java @@ -23,5 +23,6 @@ List<MemberCoinAddressEntity> selectAllBlockAddressBySymbol(@Param("symbol") String symbol); + List<String> selectAllSymbolAddress(@Param("symbol")String symbol,@Param("tag") String tag); } diff --git a/src/main/java/com/xcong/excoin/modules/symbols/service/SymbolsService.java b/src/main/java/com/xcong/excoin/modules/symbols/service/SymbolsService.java index e171de7..be91c71 100644 --- a/src/main/java/com/xcong/excoin/modules/symbols/service/SymbolsService.java +++ b/src/main/java/com/xcong/excoin/modules/symbols/service/SymbolsService.java @@ -18,5 +18,4 @@ public Result findKlineDetails(KlineDetailDto klineDetailDto); - } diff --git a/src/main/java/com/xcong/excoin/processor/DefaultCoinProcessor.java b/src/main/java/com/xcong/excoin/processor/DefaultCoinProcessor.java index 37f40ed..5873683 100644 --- a/src/main/java/com/xcong/excoin/processor/DefaultCoinProcessor.java +++ b/src/main/java/com/xcong/excoin/processor/DefaultCoinProcessor.java @@ -362,7 +362,11 @@ // 存储昨日K线 if("day".equals(rangeUnit)){ - redisUtils.set("CPV/USDT",kLine); + System.out.println("存储日K线"); + kLine.setOpen(kLine.getClose()); + kLine.setLow(kLine.getClose()); + kLine.setHigh(kLine.getClose()); + redisUtils.set("ROC/USDT",kLine); } } diff --git a/src/main/java/com/xcong/excoin/processor/MarketService.java b/src/main/java/com/xcong/excoin/processor/MarketService.java index d47b2c9..3f3f067 100644 --- a/src/main/java/com/xcong/excoin/processor/MarketService.java +++ b/src/main/java/com/xcong/excoin/processor/MarketService.java @@ -88,7 +88,17 @@ list = (List) data; } list.add(kLine); - redisUtils.set(key, list); + int size = list.size(); + if(size>500){ + list = list.subList(size-500,size); + } + List lines = new ArrayList(); + if(CollectionUtils.isNotEmpty(list)){ + for(Object object:list){ + lines.add(object); + } + } + redisUtils.set(key, lines); // mongoTemplate.insert(kLine,"exchange_kline_"+symbol+"_"+kLine.getPeriod()); } @@ -122,4 +132,15 @@ return totalVolume; } + + public static void main(String[] args) { + List<String> list = new ArrayList<>(); + list.add("1"); + list.add("2"); + list.add("3"); + list.add("4"); + list.add("5"); + list=list.subList(2,5); + System.out.println(list); + } } diff --git a/src/main/java/com/xcong/excoin/quartz/job/BlockCoinUpdateJob.java b/src/main/java/com/xcong/excoin/quartz/job/BlockCoinUpdateJob.java index 65e8c1e..f91418b 100644 --- a/src/main/java/com/xcong/excoin/quartz/job/BlockCoinUpdateJob.java +++ b/src/main/java/com/xcong/excoin/quartz/job/BlockCoinUpdateJob.java @@ -24,10 +24,10 @@ /** * ETH_USDT 同步 */ - @Scheduled(cron = "0 0/10 * * * ? ") - public void ethUsdtUpdate() { - blockCoinService.updateEthUsdt(); - } + //@Scheduled(cron = "0 0/10 * * * ? ") +// public void ethUsdtUpdate() { +// blockCoinService.updateEthUsdt(); +// } /** * eth 同步 @@ -40,7 +40,7 @@ /** * BTC_USDT 同步 */ - @Scheduled(cron = "0 2/10 * * * ? ") + //@Scheduled(cron = "0 2/10 * * * ? ") public void btcUsdtUpdate() { blockCoinService.updateBtcUsdt(); } @@ -63,8 +63,8 @@ /** * ETH_USDT 同步 */ - @Scheduled(cron = "0 0/5 * * * ? ") + //Scheduled(cron = "0 0/5 * * * ? ") public void rocUpdate() { - blockCoinService.updateEthUsdt(); + // blockCoinService.updateEthUsdt(); } } diff --git a/src/main/java/com/xcong/excoin/quartz/job/CoinTradeInitJob.java b/src/main/java/com/xcong/excoin/quartz/job/CoinTradeInitJob.java index 75faf2a..8c8ad32 100644 --- a/src/main/java/com/xcong/excoin/quartz/job/CoinTradeInitJob.java +++ b/src/main/java/com/xcong/excoin/quartz/job/CoinTradeInitJob.java @@ -44,7 +44,7 @@ **/ @Slf4j @Component -@ConditionalOnProperty(prefix = "app", name = "trade", havingValue = "true") +@ConditionalOnProperty(prefix = "app", name = "exchange-trade", havingValue = "true") public class CoinTradeInitJob { @Resource @@ -101,6 +101,7 @@ // 创建K线生成器 CoinProcessor processor = new DefaultCoinProcessor(symbol, "USDT"); processor.setMarketService(marketService); + processor.setRedisUtils(redisUtils); //processor.setExchangeRate(exchangeRate); processor.initializeThumb(); //processor.initializeUsdRate(); diff --git a/src/main/java/com/xcong/excoin/quartz/job/KLineGeneratorJob.java b/src/main/java/com/xcong/excoin/quartz/job/KLineGeneratorJob.java index 808ac2b..b6194ee 100644 --- a/src/main/java/com/xcong/excoin/quartz/job/KLineGeneratorJob.java +++ b/src/main/java/com/xcong/excoin/quartz/job/KLineGeneratorJob.java @@ -4,6 +4,7 @@ import com.xcong.excoin.modules.coin.service.OrderCoinService; import com.xcong.excoin.processor.CoinProcessorFactory; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -19,10 +20,12 @@ */ @Component @Slf4j +@ConditionalOnProperty(prefix = "app", name = "exchange-trade", havingValue = "true") public class KLineGeneratorJob { @Resource private CoinProcessorFactory processorFactory; + /** * 每分钟定时器,处理分钟K线 */ diff --git a/src/main/java/com/xcong/excoin/quartz/job/NotionalPoolingJob.java b/src/main/java/com/xcong/excoin/quartz/job/NotionalPoolingJob.java index 262123e..25b7fdc 100644 --- a/src/main/java/com/xcong/excoin/quartz/job/NotionalPoolingJob.java +++ b/src/main/java/com/xcong/excoin/quartz/job/NotionalPoolingJob.java @@ -38,11 +38,11 @@ } } - @Scheduled(cron = "0 2/8 * * * ? ") - public void usdtEthPoolCheck() { - log.info("USDTETH归集结果扫描开始"); - usdtEthService.usdtEthPoolCheck(); - } +// @Scheduled(cron = "0 2/8 * * * ? ") +// public void usdtEthPoolCheck() { +// log.info("USDTETH归集结果扫描开始"); +// usdtEthService.usdtEthPoolCheck(); +// } @Scheduled(cron = "0 2/30 * * * ? ") public void poolEth() { diff --git a/src/main/java/com/xcong/excoin/quartz/job/UsdtErc20InitJob.java b/src/main/java/com/xcong/excoin/quartz/job/UsdtErc20InitJob.java new file mode 100644 index 0000000..aacf3ff --- /dev/null +++ b/src/main/java/com/xcong/excoin/quartz/job/UsdtErc20InitJob.java @@ -0,0 +1,31 @@ +package com.xcong.excoin.quartz.job; + +import com.xcong.excoin.modules.blackchain.service.UsdtErc20UpdateService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; + +/** + * 开启撮合交易 + * + * @author wzy + * @date 2020-05-28 + **/ +@Slf4j +@Component +@ConditionalOnProperty(prefix = "app", name = "block-job", havingValue = "true") +public class UsdtErc20InitJob { + + + @Resource + private UsdtErc20UpdateService usdtErc20UpdateService; + + @PostConstruct + public void initCoinTrade() { + System.out.println("开启USDT同步"); + usdtErc20UpdateService.updateUsdt(); + } +} diff --git a/src/main/java/com/xcong/excoin/rabbit/consumer/ExchangeConsumer.java b/src/main/java/com/xcong/excoin/rabbit/consumer/ExchangeConsumer.java index 384f1c2..a1a2d51 100644 --- a/src/main/java/com/xcong/excoin/rabbit/consumer/ExchangeConsumer.java +++ b/src/main/java/com/xcong/excoin/rabbit/consumer/ExchangeConsumer.java @@ -15,6 +15,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -24,11 +25,11 @@ import java.util.Set; /** - * @author wzy - * @date 2020-05-25 - **/ + * websocket 只能后台撮合交易那台开启 + */ @Slf4j @Component +@ConditionalOnProperty(prefix = "app", name = "exchange-trade", havingValue = "true") public class ExchangeConsumer { @Resource @@ -115,23 +116,4 @@ orderCoinService.handleOrder(exchangeTrades); } - /** - * 更新最新K线 - * @param content - */ -// @RabbitListener(queues = RabbitMqConfig.QUEUE_TRADE_PLATE) -// public void newKling(String content) { -// log.info("#---->{}#", content); -// // 最新K线的币种 -// String key = "NEW_KINE_{}"; -// key = StrUtil.format(key, content); -// Object o = redisUtils.get(key); -// Map<String, Candlestick> currentKlineMap = (Map<String, Candlestick>)o; -// // 推送最新K线 -// Set<Map.Entry<String, Candlestick>> entries = currentKlineMap.entrySet(); -// for(Map.Entry<String, Candlestick> map : entries){ -// tradePlateSendWebSocket.sendMessageKline(content,map.getKey(),JSONObject.toJSONString(map.getValue()),null); -// } -// -// } } diff --git a/src/main/java/com/xcong/excoin/rabbit/consumer/OperateOrderPriceConsumer.java b/src/main/java/com/xcong/excoin/rabbit/consumer/OperateOrderPriceConsumer.java index bfb2d92..6e98b44 100644 --- a/src/main/java/com/xcong/excoin/rabbit/consumer/OperateOrderPriceConsumer.java +++ b/src/main/java/com/xcong/excoin/rabbit/consumer/OperateOrderPriceConsumer.java @@ -17,6 +17,7 @@ * @author helius */ @Component +@Deprecated @ConditionalOnProperty(prefix = "app", name = "newest-price-update-job-contract", havingValue = "true") public class OperateOrderPriceConsumer { diff --git a/src/main/java/com/xcong/excoin/rabbit/consumer/OrderSubmitConsumer.java b/src/main/java/com/xcong/excoin/rabbit/consumer/OrderSubmitConsumer.java new file mode 100644 index 0000000..4f20d62 --- /dev/null +++ b/src/main/java/com/xcong/excoin/rabbit/consumer/OrderSubmitConsumer.java @@ -0,0 +1,48 @@ +package com.xcong.excoin.rabbit.consumer; + +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; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 提交买卖单进入撮合系统 + */ +@Slf4j +@Component +@ConditionalOnProperty(prefix = "app", name = "exchange-trade", havingValue = "true") +public class OrderSubmitConsumer { + + @Resource + private CoinTraderFactory factory; + + @Resource + private OrderCoinService orderCoinService; + + @RabbitListener(queues = RabbitMqConfig.QUEUE_ROC_ORDER_SUBMIT) + public void doSomething(String content) { + log.info("#提交的订单---->{}#", content); + OrderCoinsEntity coinsEntity = JSONObject.parseObject(content, OrderCoinsEntity.class); + String symbol = coinsEntity.getSymbol(); + 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/consumer/RocBlockUpdateConsumer.java b/src/main/java/com/xcong/excoin/rabbit/consumer/RocBlockUpdateConsumer.java index bbf2717..e2ee354 100644 --- a/src/main/java/com/xcong/excoin/rabbit/consumer/RocBlockUpdateConsumer.java +++ b/src/main/java/com/xcong/excoin/rabbit/consumer/RocBlockUpdateConsumer.java @@ -21,12 +21,10 @@ /** - * 用户修改止损止盈价格、提价限价委托、下单爆仓价等消息 - * 后台打包开启 APP 不开启 - * @author helius + * ROC币种同步 */ @Component -//@ConditionalOnProperty(prefix = "app", name = "newest-price-update-job-contract", havingValue = "true") +@ConditionalOnProperty(prefix = "app", name = "block-job", havingValue = "true") public class RocBlockUpdateConsumer { @Resource diff --git a/src/main/java/com/xcong/excoin/rabbit/consumer/UsdtUpdateConsumer.java b/src/main/java/com/xcong/excoin/rabbit/consumer/UsdtUpdateConsumer.java new file mode 100644 index 0000000..7288fc6 --- /dev/null +++ b/src/main/java/com/xcong/excoin/rabbit/consumer/UsdtUpdateConsumer.java @@ -0,0 +1,44 @@ +package com.xcong.excoin.rabbit.consumer; + +import com.alibaba.fastjson.JSONObject; +import com.xcong.excoin.configurations.RabbitMqConfig; +import com.xcong.excoin.modules.blackchain.model.EthUsdtChargeDto; +import com.xcong.excoin.modules.blackchain.service.UsdtErc20UpdateService; +import com.xcong.excoin.modules.coin.service.BlockCoinService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * @author wzy + * @date 2020-05-25 + **/ +@Slf4j +@Component +@ConditionalOnProperty(prefix = "app", name = "block-job", havingValue = "true") +public class UsdtUpdateConsumer { + + + @Resource + private BlockCoinService blockCoinService; + + + @RabbitListener(queues = RabbitMqConfig.QUEUE_USDT_UPDATE) + public void doSomething(String content) { + log.info("#USDT同步---->{}#", content); + EthUsdtChargeDto ethUsdtChargeDto = JSONObject.parseObject(content, EthUsdtChargeDto.class); + // 更新这个用户的余额 + blockCoinService.updateEthUsdtNew(ethUsdtChargeDto); + } + + @RabbitListener(queues = RabbitMqConfig.QUEUE_USDT_ADDRESS) + public void addUsdtAddress(String content) { + if(!UsdtErc20UpdateService.ALL_ADDRESS_LIST.contains(content)){ + log.info("#添加新地址---->{}#", content); + UsdtErc20UpdateService.ALL_ADDRESS_LIST.add(content); + } + } +} diff --git a/src/main/java/com/xcong/excoin/rabbit/consumer/WebsocketPriceConsumer.java b/src/main/java/com/xcong/excoin/rabbit/consumer/WebsocketPriceConsumer.java index b959b0e..ffbc2be 100644 --- a/src/main/java/com/xcong/excoin/rabbit/consumer/WebsocketPriceConsumer.java +++ b/src/main/java/com/xcong/excoin/rabbit/consumer/WebsocketPriceConsumer.java @@ -24,6 +24,7 @@ */ @Slf4j @Component +@Deprecated @ConditionalOnProperty(prefix = "app", name = "rabbit-consumer", havingValue = "true") public class WebsocketPriceConsumer { diff --git a/src/main/java/com/xcong/excoin/rabbit/init/OrderProducerInit.java b/src/main/java/com/xcong/excoin/rabbit/init/OrderProducerInit.java index 9fb3756..662cd9a 100644 --- a/src/main/java/com/xcong/excoin/rabbit/init/OrderProducerInit.java +++ b/src/main/java/com/xcong/excoin/rabbit/init/OrderProducerInit.java @@ -28,6 +28,7 @@ @Slf4j @Component @ConditionalOnProperty(prefix = "app", name = "newest-price-update-job-contract", havingValue = "true") +@Deprecated public class OrderProducerInit { @Resource diff --git a/src/main/java/com/xcong/excoin/rabbit/producer/OrderSubmitProducer.java b/src/main/java/com/xcong/excoin/rabbit/producer/OrderSubmitProducer.java new file mode 100644 index 0000000..d873ca1 --- /dev/null +++ b/src/main/java/com/xcong/excoin/rabbit/producer/OrderSubmitProducer.java @@ -0,0 +1,47 @@ +package com.xcong.excoin.rabbit.producer; + +import cn.hutool.core.util.IdUtil; +import com.xcong.excoin.configurations.RabbitMqConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author wzy + * @date 2020-05-25 + **/ +@Slf4j +@Component +public class OrderSubmitProducer implements RabbitTemplate.ConfirmCallback { + + private RabbitTemplate rabbitTemplate; + + @Autowired + public OrderSubmitProducer(RabbitTemplate rabbitTemplate) { + this.rabbitTemplate = rabbitTemplate; + rabbitTemplate.setConfirmCallback(this); + } + + public void sendMsg(String content) { + CorrelationData correlationData = new CorrelationData(IdUtil.simpleUUID()); + 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) { + log.info("#----->{}#", correlationData); + if (ack) { + log.info("success"); + } else { + log.info("--->{}", cause); + } + } +} diff --git a/src/main/java/com/xcong/excoin/rabbit/producer/UsdtUpdateProducer.java b/src/main/java/com/xcong/excoin/rabbit/producer/UsdtUpdateProducer.java new file mode 100644 index 0000000..c89f4c9 --- /dev/null +++ b/src/main/java/com/xcong/excoin/rabbit/producer/UsdtUpdateProducer.java @@ -0,0 +1,47 @@ +package com.xcong.excoin.rabbit.producer; + +import cn.hutool.core.util.IdUtil; +import com.xcong.excoin.configurations.RabbitMqConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author wzy + * @date 2020-05-25 + **/ +@Slf4j +@Component +public class UsdtUpdateProducer implements RabbitTemplate.ConfirmCallback { + + private RabbitTemplate rabbitTemplate; + + @Autowired + public UsdtUpdateProducer(RabbitTemplate rabbitTemplate) { + this.rabbitTemplate = rabbitTemplate; + rabbitTemplate.setConfirmCallback(this); + } + + public void sendMsg(String content) { + CorrelationData correlationData = new CorrelationData(IdUtil.simpleUUID()); + rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_USDT_UPDATE, RabbitMqConfig.ROUTING_KEY_USDT_UPDATE, content, correlationData); + } + + public void sendAddressMsg(String content) { + CorrelationData correlationData = new CorrelationData(IdUtil.simpleUUID()); + rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_USDT_ADDRESS, RabbitMqConfig.ROUTING_KEY_USDT_ADDRESS, content, correlationData); + } + + + @Override + public void confirm(CorrelationData correlationData, boolean ack, String cause) { + log.info("#----->{}#", correlationData); + if (ack) { + log.info("success"); + } else { + log.info("--->{}", cause); + } + } +} diff --git a/src/main/java/com/xcong/excoin/websocket/TradePlateSendWebSocket.java b/src/main/java/com/xcong/excoin/websocket/TradePlateSendWebSocket.java index d060410..ffa7283 100644 --- a/src/main/java/com/xcong/excoin/websocket/TradePlateSendWebSocket.java +++ b/src/main/java/com/xcong/excoin/websocket/TradePlateSendWebSocket.java @@ -45,7 +45,7 @@ @OnOpen public void onOpen(Session session) { onlineCount.incrementAndGet(); // 在线数加1 - log.info("有新连接加入:{},当前在线人数为:{}", session.getId(), onlineCount.get()); + // log.info("有新连接加入:{},当前在线人数为:{}", session.getId(), onlineCount.get()); } /** @@ -67,7 +67,7 @@ map.remove(session.getId()); } } - log.info("有一连接关闭:{},当前在线人数为:{}", session.getId(), onlineCount.get()); + //log.info("有一连接关闭:{},当前在线人数为:{}", session.getId(), onlineCount.get()); } /** @@ -227,8 +227,14 @@ result.setRep(sub); if (o != null) { List<Candlestick> list = (List<Candlestick>) o; + + if(list!=null && list.size()>300){ + int size = list.size(); + list = list.subList(size-300,size); + } + CandlestickModel model = null; for (Candlestick candlestick : list) { - CandlestickModel model = new CandlestickModel(); + model = new CandlestickModel(); model.setAmount(candlestick.getAmount()); model.setClose(candlestick.getClose()); model.setCount(candlestick.getCount()); @@ -248,8 +254,8 @@ @OnError public void onError(Session session, Throwable error) { - log.error("发生错误"); - error.printStackTrace(); + // log.error("发生错误"); + //error.printStackTrace(); } /** diff --git a/src/main/resources/application-prodapp.yml b/src/main/resources/application-prodapp.yml new file mode 100644 index 0000000..0c57f69 --- /dev/null +++ b/src/main/resources/application-prodapp.yml @@ -0,0 +1,114 @@ +server: + port: 8888 + servlet: + context-path: / + +spring: + profiles: + active: dev + datasource: + url: jdbc:mysql://rm-bp1i2g5rg5dubo9s40o.mysql.rds.aliyuncs.com:3306/db_roc?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2b8 + username: roc_user + password: roc123pasd!@ + driver-class-name: com.mysql.jdbc.Driver + type: com.alibaba.druid.pool.DruidDataSource + druid: + initial-size: ${spring_datasource_druid_initial_size:10} + max-active: ${spring_datasource_druid_max_active:20} + min-idle: ${spring_datasource_druid_min_idle:3} + #配置获取连接等待超时的时间 + max-wait: 60000 + pool-prepared-statements: true + max-pool-prepared-statement-per-connection-size: 20 + validation-query: SELECT 'x' + test-on-borrow: true + test-on-return: true + test-while-idle: true + #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + time-between-eviction-runs-millis: 60000 + #配置一个连接在池中最小生存的时间,单位是毫秒 + min-evictable-idle-time-millis: 300000 + #spring.datasource.druid.max-evguide.ftlictable-idle-time-millis= + filters: stat,wall + stat-view-servlet: + # 默认true 内置监控页面首页/druid/index.html + enabled: true + url-pattern: /druid/* + # 允许清空统计数据 + reset-enable: true + login-username: root + login-password: 123456 + # IP白名单 多个逗号分隔 + allow: ${spring_datasource_stat_view_servlet_allow:} + # IP黑名单 + deny: ${spring_datasource_stat_view_servlet_deny:} + ## 国际化配置 + messages: + basename: i18n/messages + ## redis配置 + redis: + ## Redis数据库索引(默认为0) + database: 1 + ## Redis服务器地址 + host: 47.114.114.219 + ## Redis服务器连接端口 + port: 6379 + ## Redis服务器连接密码(默认为空) + password: biyi123 + jedis: + pool: + ## 连接池最大连接数(使用负值表示没有限制) + #spring.redis.pool.max-active=8 + max-active: 300 + ## 连接池最大阻塞等待时间(使用负值表示没有限制) + #spring.redis.pool.max-wait=-1 + max-wait: -1 + ## 连接池中的最大空闲连接 + #spring.redis.pool.max-idle=8 + max-idle: 100 + ## 连接池中的最小空闲连接 + #spring.redis.pool.min-idle=0 + min-idle: 8 + ## 连接超时时间(毫秒) + timeout: 30000 + rabbitmq: + host: 47.114.114.219 + port: 5672 + username: roc_user + password: roc123456 + publisher-confirm-type: correlated + + +#custom: +# rabbitmq: +# host: 120.27.238.55 +# port: 5672 +# username: ct_rabbit +# password: 123456 + +mybatis-plus: + mapper-locations: classpath:mapper/**/*.xml + + +app: + debug: false + redis_expire: 3000 + kline-update-job: false + newest-price-update-job: false + exchange-trade: false + day-line: false + other-job: false + loop-job: false + rabbit-consumer: false + block-job: false + +aliyun: + oss: + end-point: https://oss-cn-hangzhou.aliyuncs.com + bucket-name: https://excoin.oss-cn-hangzhou.aliyuncs.com + access-key-id: LTAI4GBuydqbJ5bTsDP97Lpd + access-key-secret: vbCjQtPxABWjqtUlQfzjlA0qAY96fh + +rsa: + public_key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCCf8UFZK54AiK4PRu7tNd+Z8qZ77o/QXCnk25DRmygVpOEu5mGNSAvfnWmKp2pEV2RljeXq3Rid/+LQkonaebMJeXKSF0yxL/VgyeT8JaQ5gNbOrdfdlc+mFkXJyzyJt8YkvApEdPRNSU2ENBn7mgRfD0BYPM4vZ6/rv+de38FJwIDAQAB + private_key: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIJ/xQVkrngCIrg9G7u0135nypnvuj9BcKeTbkNGbKBWk4S7mYY1IC9+daYqnakRXZGWN5erdGJ3/4tCSidp5swl5cpIXTLEv9WDJ5PwlpDmA1s6t192Vz6YWRcnLPIm3xiS8CkR09E1JTYQ0GfuaBF8PQFg8zi9nr+u/517fwUnAgMBAAECgYBhPt9NvpI4wbanvnndLczr2GJkxfzvSE+vwLCJF4C5FusFHVsxZINggQcg1V75bwRgCiXRMyYefreCSdrCditS43PzTOmE4RRrpxLlm8oubJc0C98LQ2qlN9AsUqL5IHpVGgbHDyWAwjc1GBID6nwXKpxq1/VodFqhahG9D5EZsQJBALnkb+5VTxQbiyQI4Uc9NIvAyVcNY1OisbvY6tvNgdBbJkADgAb78M1HWxxYjUqsvzggNHc7cWqWBHMgpnJaqm8CQQCztze4D7uAk7OC9MJHY5eE980J8Kk+GEZKxz4LahzU6V6dcb9GFac3wEtgilj/tOAn9y0/Q8sm9vvCIbMDzgzJAkEAqRYcqhF26LdVDOX25DHMBgLKISDQZFbsjA13M4/usHL4i+mjHrc0BcUOHu59NpuDI65HitzLAUSLr5zXSdUmiQJAW77wOg4GCejdXsB3IhzMsHwU97sdm26nC+vVV9xvJZ6Rx8zW+f9543NOx9U5BCmhuaVtOvvwDU9PTVcI3atmSQJAXAIJ5gGdtXx0DXiX4VvzNFHqgaqHMGvXyjNVkU2FYQbSAd2A6app4uRO+BkZu9dSjh14m+oXMnV2HzAN2rRnjA== diff --git a/src/main/resources/mapper/member/MemberCoinAddressDao.xml b/src/main/resources/mapper/member/MemberCoinAddressDao.xml index edb4a57..0dc07a9 100644 --- a/src/main/resources/mapper/member/MemberCoinAddressDao.xml +++ b/src/main/resources/mapper/member/MemberCoinAddressDao.xml @@ -81,4 +81,11 @@ select * from member_coin_address where symbol=#{symbol} </select> + + <select id="selectAllSymbolAddress" resultType="string" parameterType="map"> + select address from member_coin_address where symbol =#{symbol} + <if test="tag!=null and tag !=''"> + and tag = #{tag} + </if> + </select> </mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/walletCoinOrder/OrderCoinDealDao.xml b/src/main/resources/mapper/walletCoinOrder/OrderCoinDealDao.xml index aa9912f..339e355 100644 --- a/src/main/resources/mapper/walletCoinOrder/OrderCoinDealDao.xml +++ b/src/main/resources/mapper/walletCoinOrder/OrderCoinDealDao.xml @@ -12,6 +12,27 @@ order by create_time desc </select> + <select id="sumTodayBuyAmount" resultType="java.math.BigDecimal"> + select sum(symbol_cnt) from coins_order_deal + where member_id = #{memberId} and symbol=#{symbol} + and order_type =1 + and order_status=3 + and DATE_FORMAT(create_time, '%Y-%m-%d') = DATE_FORMAT(now(),'%Y-%m-%d') + </select> + <select id="sumTodayEntrustCntBuyAmount" resultType="java.math.BigDecimal"> + select sum(entrust_cnt) from coins_order + where member_id = #{memberId} and symbol=#{symbol} + and order_type =1 + and order_status=1 + and DATE_FORMAT(create_time, '%Y-%m-%d') = DATE_FORMAT(now(),'%Y-%m-%d') + </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