From 59baf780dc74b95b65c453a9cb6bd8e1d9f3a2b1 Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Wed, 03 Jun 2020 15:09:46 +0800 Subject: [PATCH] Merge branch 'master' of https://gitee.com/chonggaoxiao/new_excoin.git --- src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java | 83 +++++++++++ src/main/resources/mapper/contract/ContractEntrustOrderDao.xml | 4 src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java | 4 src/main/resources/logback-spring.xml | 2 src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java | 2 src/main/java/com/xcong/excoin/modules/contract/controller/ContractOrderController.java | 10 + src/main/java/com/xcong/excoin/rabbit/init/OrderProducerInit.java | 135 +++++++++++++++++++ src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java | 110 +++++++-------- src/main/java/com/xcong/excoin/common/LoginUserUtils.java | 4 src/main/resources/mapper/contract/ContractHoldOrderDao.xml | 4 src/main/java/com/xcong/excoin/modules/contract/dao/ContractEntrustOrderDao.java | 2 src/main/java/com/xcong/excoin/modules/contract/dao/ContractHoldOrderDao.java | 2 src/main/java/com/xcong/excoin/modules/contract/parameter/vo/ContractMoneyInfoVo.java | 43 ++++++ src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractEntrustOrderServiceImpl.java | 4 src/main/java/com/xcong/excoin/quartz/job/NewestPriceUpdateJob.java | 4 src/main/java/com/xcong/excoin/modules/contract/service/ContractHoldOrderService.java | 2 16 files changed, 344 insertions(+), 71 deletions(-) diff --git a/src/main/java/com/xcong/excoin/common/LoginUserUtils.java b/src/main/java/com/xcong/excoin/common/LoginUserUtils.java index 64c0aa2..0c24019 100644 --- a/src/main/java/com/xcong/excoin/common/LoginUserUtils.java +++ b/src/main/java/com/xcong/excoin/common/LoginUserUtils.java @@ -34,6 +34,10 @@ * @return MemberEntity */ public static MemberEntity getUser() { + if (SecurityContextHolder.getContext().getAuthentication() == null) { + return null; + } + if (SecurityContextHolder.getContext().getAuthentication().getPrincipal().equals(ANON)) { return null; } else { diff --git a/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java b/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java index 29cae2e..7be7a45 100644 --- a/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java +++ b/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java @@ -40,7 +40,7 @@ public static final String QUEUE_LESSLOSS = "QUEUE_LESSLOSS"; // 限价委托 - public static final String QUEUE_LIMIT = "QUEUE_LIMIT"; + public static final String QUEUE_LIMIT = "QUEUE_LIMIT_NEW"; // 爆仓队列 public static final String QUEUE_COINOUT = "QUEUE_COINOUT"; diff --git a/src/main/java/com/xcong/excoin/modules/contract/controller/ContractOrderController.java b/src/main/java/com/xcong/excoin/modules/contract/controller/ContractOrderController.java index 51c965e..1449ba9 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/controller/ContractOrderController.java +++ b/src/main/java/com/xcong/excoin/modules/contract/controller/ContractOrderController.java @@ -4,6 +4,7 @@ import com.xcong.excoin.modules.contract.parameter.dto.ChangeBondDto; import com.xcong.excoin.modules.contract.parameter.dto.ProfitOrLessDto; import com.xcong.excoin.modules.contract.parameter.dto.SubmitOrderDto; +import com.xcong.excoin.modules.contract.parameter.vo.ContractMoneyInfoVo; import com.xcong.excoin.modules.contract.parameter.vo.HoldOrderListVo; import com.xcong.excoin.modules.contract.service.ContractHoldOrderService; import com.xcong.excoin.modules.contract.service.ContractOrderService; @@ -82,4 +83,13 @@ return null; } + @ApiOperation(value = "获取合约页面资产信息") + @ApiResponses({ + @ApiResponse(code = 0, message = "success", response = ContractMoneyInfoVo.class) + }) + @GetMapping(value = "/findContractMoneyInfo") + public Result findContractMoneyInfo(@ApiParam(name = "symbol", value = "币种", required = true, example = "BTC/USDT") @RequestParam(value = "symbol") String symbol) { + return contractHoldOrderService.findContractMoneyInfo(symbol); + } + } diff --git a/src/main/java/com/xcong/excoin/modules/contract/dao/ContractEntrustOrderDao.java b/src/main/java/com/xcong/excoin/modules/contract/dao/ContractEntrustOrderDao.java index 7f6d128..f52382e 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/dao/ContractEntrustOrderDao.java +++ b/src/main/java/com/xcong/excoin/modules/contract/dao/ContractEntrustOrderDao.java @@ -16,4 +16,6 @@ public List<ContractEntrustOrderEntity> selectEntrustOrderListByMemberId(@Param("memberId") Long memberId); public List<ContractEntrustOrderEntity> selectEntrustOrderListByIds(@Param("list") List<Long> list); + + public List<ContractEntrustOrderEntity> selectAllEntrustOrder(); } diff --git a/src/main/java/com/xcong/excoin/modules/contract/dao/ContractHoldOrderDao.java b/src/main/java/com/xcong/excoin/modules/contract/dao/ContractHoldOrderDao.java index adaab0b..e4e4b23 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/dao/ContractHoldOrderDao.java +++ b/src/main/java/com/xcong/excoin/modules/contract/dao/ContractHoldOrderDao.java @@ -40,4 +40,6 @@ public int updateHoldOrderIsCanClosingById(@Param("isCanClosing") int isCanClosing, @Param("id") Long id); + public List<ContractHoldOrderEntity> selectAllHoldOrder(); + } diff --git a/src/main/java/com/xcong/excoin/modules/contract/parameter/vo/ContractMoneyInfoVo.java b/src/main/java/com/xcong/excoin/modules/contract/parameter/vo/ContractMoneyInfoVo.java new file mode 100644 index 0000000..3986cfd --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/contract/parameter/vo/ContractMoneyInfoVo.java @@ -0,0 +1,43 @@ +package com.xcong.excoin.modules.contract.parameter.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @Author wzy + * @Date 2020/6/2 + **/ +@Data +@ApiModel(value = "ContractMoneyInfoVo", description = "合约资产信息接口返回参数类") +public class ContractMoneyInfoVo { + + @ApiModelProperty(value = "占用保证金") + private BigDecimal beUsedBondAmount; + + @ApiModelProperty(value = "冻结保证金") + private BigDecimal frozenBondAmount; + + @ApiModelProperty(value = "手续费率") + private BigDecimal feeRatio; + + @ApiModelProperty(value = "权益") + private BigDecimal equity; + + @ApiModelProperty(value = "合约杠杆") + private Integer leverRate; + + @ApiModelProperty(value = "倍率") + private BigDecimal leverAgeRatio; + + @ApiModelProperty(value = "可用余额") + private BigDecimal availableBalance; + + @ApiModelProperty(value = "最新价") + private BigDecimal newPrice; + + @ApiModelProperty(value = "规格") + private BigDecimal symbolSku; +} diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/ContractHoldOrderService.java b/src/main/java/com/xcong/excoin/modules/contract/service/ContractHoldOrderService.java index 117cc19..5ac43ea 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/service/ContractHoldOrderService.java +++ b/src/main/java/com/xcong/excoin/modules/contract/service/ContractHoldOrderService.java @@ -34,4 +34,6 @@ public Result changeBond(ChangeBondDto changeBondDto); + public Result findContractMoneyInfo(String symbol); + } diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractEntrustOrderServiceImpl.java b/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractEntrustOrderServiceImpl.java index 3b30010..0cc3d15 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractEntrustOrderServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractEntrustOrderServiceImpl.java @@ -128,10 +128,10 @@ // 发送委托单队列消息 if (submitEntrustDto.getEntrustType() == ContractEntrustOrderEntity.ENTRUST_TYPE_OPEN_MORE) { - OrderModel model = new OrderModel(entrustOrderEntity.getId(), RabbitPriceTypeEnum.ENTRUST_OPEN_MORE.getValue(), submitEntrustDto.getEntrustPrice().toPlainString(), submitEntrustDto.getSymbol()); + OrderModel model = new OrderModel(entrustOrderEntity.getId(), RabbitPriceTypeEnum.ENTRUST_OPEN_MORE.getValue(), submitEntrustDto.getEntrustPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), submitEntrustDto.getSymbol()); producer.sendPriceOperate(JSONObject.toJSONString(model)); } else { - OrderModel model = new OrderModel(entrustOrderEntity.getId(), RabbitPriceTypeEnum.ENTRUST_OPEN_LESS.getValue(), submitEntrustDto.getEntrustPrice().toPlainString(), submitEntrustDto.getSymbol()); + OrderModel model = new OrderModel(entrustOrderEntity.getId(), RabbitPriceTypeEnum.ENTRUST_OPEN_LESS.getValue(), submitEntrustDto.getEntrustPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), submitEntrustDto.getSymbol()); producer.sendPriceOperate(JSONObject.toJSONString(model)); } return Result.ok("委托成功"); diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java b/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java index 10e2f85..2c5e3f0 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java @@ -9,6 +9,7 @@ import com.xcong.excoin.common.enumerates.RabbitPriceTypeEnum; import com.xcong.excoin.common.response.Result; import com.xcong.excoin.common.system.service.CommonService; +import com.xcong.excoin.modules.contract.dao.ContractEntrustOrderDao; import com.xcong.excoin.modules.contract.dao.ContractHoldOrderDao; import com.xcong.excoin.modules.contract.dao.ContractOrderDao; import com.xcong.excoin.modules.contract.entity.ContractEntrustOrderEntity; @@ -18,6 +19,7 @@ import com.xcong.excoin.modules.contract.parameter.dto.ChangeBondDto; import com.xcong.excoin.modules.contract.parameter.dto.ProfitOrLessDto; import com.xcong.excoin.modules.contract.parameter.dto.SubmitOrderDto; +import com.xcong.excoin.modules.contract.parameter.vo.ContractMoneyInfoVo; import com.xcong.excoin.modules.contract.parameter.vo.HoldOrderListVo; import com.xcong.excoin.modules.contract.service.ContractHoldOrderService; import com.xcong.excoin.modules.member.dao.MemberWalletContractDao; @@ -56,6 +58,9 @@ @Resource private ContractOrderDao contractOrderDao; + + @Resource + private ContractEntrustOrderDao contractEntrustOrderDao; @Resource private CommonService commonService; @@ -367,10 +372,10 @@ } else { // 开空止盈 if (ProfitOrLessDto.TYPE_PROFIT == profitOrLessDto.getType()) { - model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_LESS_STOP_PROFIT.getValue(), price.toPlainString(), holdOrderEntity.getSymbol()); + model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_LESS_STOP_PROFIT.getValue(), price.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol()); // 开空止损 } else { - model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_LESS_STOP_LESS.getValue(), price.toPlainString(), holdOrderEntity.getSymbol()); + model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_LESS_STOP_LESS.getValue(), price.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol()); } } producer.sendPriceOperate(JSONObject.toJSONString(model)); @@ -419,10 +424,10 @@ OrderModel model = null; // 开多 if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) { - model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_MORE_BOMB.getValue(), forceClosingPrice.toPlainString(), holdOrderEntity.getSymbol()); + model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_MORE_BOMB.getValue(), forceClosingPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol()); // 开空 } else { - model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_LESS_BOMB.getValue(), forceClosingPrice.toPlainString(), holdOrderEntity.getSymbol()); + model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_LESS_BOMB.getValue(), forceClosingPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol()); } producer.sendPriceOperate(JSONObject.toJSONString(model)); @@ -431,4 +436,74 @@ } return Result.fail("调整失败"); } + + @Override + public Result findContractMoneyInfo(String symbol) { + MemberEntity memberEntity = LoginUserUtils.getAppLoginUser(); + + PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); + // 获取最新价 + BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(symbol))); + + // 当前合约委托单 + List<ContractEntrustOrderEntity> entrustOrderEntities = contractEntrustOrderDao.selectEntrustOrderListByMemberId(memberEntity.getId()); + + // 当前持仓列表 + List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectHoldOrderListByMemberId(memberEntity.getId()); + + // 冻结保证金 -- 即委托单中的保证金之和 + BigDecimal frozenBondAmount = BigDecimal.ZERO; + if (CollUtil.isNotEmpty(entrustOrderEntities)) { + for (ContractEntrustOrderEntity entrustOrderEntity : entrustOrderEntities) { + frozenBondAmount = frozenBondAmount.add(entrustOrderEntity.getBondAmount()); + } + } + + // 占用保证金 -- 即持仓单中的保证金之和 + BigDecimal beUsedBondAmount = BigDecimal.ZERO; + // 总盈利 + BigDecimal totalProfitOrLess = BigDecimal.ZERO; + if (CollUtil.isNotEmpty(holdOrderEntities)) { + BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(symbol); + for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) { + beUsedBondAmount = beUsedBondAmount.add(holdOrderEntity.getBondAmount()); + + // 单个订单盈利 + BigDecimal profitOrLess = BigDecimal.ZERO; + // 开多 + if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) { + profitOrLess = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(new BigDecimal(holdOrderEntity.getSymbolCnt())).multiply(lotNumber).multiply(holdOrderEntity.getSymbolSku()); + // 开空 + } else { + profitOrLess = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(new BigDecimal(holdOrderEntity.getSymbolCnt())).multiply(lotNumber).multiply(holdOrderEntity.getSymbolSku()); + } + + if (MemberEntity.IS_PROFIT_Y == memberEntity.getIsProfit()) { + if (profitOrLess.compareTo(BigDecimal.ZERO) > 0) { + profitOrLess = profitOrLess.multiply(BigDecimal.ONE.subtract(tradeSetting.getForceParam())); + } else { + profitOrLess = profitOrLess.multiply(BigDecimal.ONE.add(tradeSetting.getForceParam())); + } + } + + totalProfitOrLess = totalProfitOrLess.add(profitOrLess); + } + } + + MemberWalletContractEntity walletContractEntity = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name()); + + // 权益 + BigDecimal equity = walletContractEntity.getTotalBalance().add(totalProfitOrLess); + + ContractMoneyInfoVo contractMoneyInfoVo = new ContractMoneyInfoVo(); + contractMoneyInfoVo.setAvailableBalance(walletContractEntity.getAvailableBalance()); + contractMoneyInfoVo.setBeUsedBondAmount(beUsedBondAmount); + contractMoneyInfoVo.setFrozenBondAmount(frozenBondAmount); + contractMoneyInfoVo.setEquity(equity); + contractMoneyInfoVo.setFeeRatio(tradeSetting.getFeeRatio()); + contractMoneyInfoVo.setLeverAgeRatio(tradeSetting.getLeverageRatio()); + contractMoneyInfoVo.setNewPrice(newPrice); + contractMoneyInfoVo.setSymbolSku(cacheSettingUtils.getSymbolSku(symbol)); + return Result.ok(contractMoneyInfoVo); + } } diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java b/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java index 050f2e4..367a0bd 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java @@ -544,11 +544,11 @@ // 市价 if (coinsCoinsOrder.getEntrustType() == 1) { // 开多 - OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 6, contractHoldOrderEntity.getForceClosingPrice().toPlainString(), coinsCoinsOrder.getSymbol(), 1); + OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 6, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1); producer.sendPriceOperate(JSONObject.toJSONString(model)); } else { // 开空 - OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 7, contractHoldOrderEntity.getForceClosingPrice().toPlainString(), coinsCoinsOrder.getSymbol(), 1); + OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 7, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1); producer.sendPriceOperate(JSONObject.toJSONString(model)); } // 扣除手续费 diff --git a/src/main/java/com/xcong/excoin/quartz/job/NewestPriceUpdateJob.java b/src/main/java/com/xcong/excoin/quartz/job/NewestPriceUpdateJob.java index d78830b..39ddc25 100644 --- a/src/main/java/com/xcong/excoin/quartz/job/NewestPriceUpdateJob.java +++ b/src/main/java/com/xcong/excoin/quartz/job/NewestPriceUpdateJob.java @@ -52,8 +52,8 @@ // TODO 测试环境关闭这个插入redis redisUtils.set(CoinTypeConvert.convertToKey(symbol), price); // 比较 - websocketPriceService.comparePriceAsc(symbol, price); - websocketPriceService.comparePriceDesc(symbol, price); + websocketPriceService.comparePriceAsc(symbol, price); + websocketPriceService.comparePriceDesc(symbol, price); //System.out.println("比较完毕:"+symbol+"-"+price); } diff --git a/src/main/java/com/xcong/excoin/rabbit/init/OrderProducerInit.java b/src/main/java/com/xcong/excoin/rabbit/init/OrderProducerInit.java new file mode 100644 index 0000000..25638d8 --- /dev/null +++ b/src/main/java/com/xcong/excoin/rabbit/init/OrderProducerInit.java @@ -0,0 +1,135 @@ +package com.xcong.excoin.rabbit.init; + +import com.alibaba.fastjson.JSONObject; +import com.xcong.excoin.common.enumerates.RabbitPriceTypeEnum; +import com.xcong.excoin.modules.contract.dao.ContractEntrustOrderDao; +import com.xcong.excoin.modules.contract.dao.ContractHoldOrderDao; +import com.xcong.excoin.modules.contract.entity.ContractEntrustOrderEntity; +import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity; +import com.xcong.excoin.rabbit.pricequeue.OrderModel; +import com.xcong.excoin.rabbit.producer.OrderProducer; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; + +/** + * 后台开启 APP不开启 + * + * @author helius + */ +@Slf4j +@Component +@ConditionalOnProperty(prefix = "app", name = "newest-price-update-job", havingValue = "true") +public class OrderProducerInit { + + @Resource + private ContractEntrustOrderDao contractEntrustOrderDao; + + @Resource + private ContractHoldOrderDao contractHoldOrderDao; + + @Resource + private OrderProducer producer; + + @PostConstruct + public void initOrder() { + log.info("=======初始化未完成订单信息======="); + + // 查询所有未平仓的单 + List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectAllHoldOrder(); + // 查询所有未完成的委托单 + List<ContractEntrustOrderEntity> entrustOrderEntities = contractEntrustOrderDao.selectAllEntrustOrder(); + + if (CollectionUtils.isNotEmpty(holdOrderEntities)) { + for (ContractHoldOrderEntity order : holdOrderEntities) { + // 开多1,开空 2 + int openingType = order.getOpeningType(); + // 1:买入委托2:开多3:开空4:平多5:平空6:爆仓平多7:爆仓平空 + // 9:止盈平多10:止盈平空11:止损平多12:止损平空 + if (ContractHoldOrderEntity.OPENING_TYPE_MORE == openingType) { + // 开多 发送开多止损 止盈 爆仓 + // 爆仓价 + BigDecimal forceSetPrice = order.getForceClosingPrice(); + if (forceSetPrice != null) { + OrderModel model = new OrderModel(order.getId(), RabbitPriceTypeEnum.CLOSE_MORE_BOMB.getValue(), forceSetPrice.toPlainString(), + order.getSymbol(), order.getOperateNo()); + producer.sendPriceOperate(JSONObject.toJSONString(model)); + } + // 止损 + BigDecimal stopLossPrice = order.getStopLossPrice(); + if (stopLossPrice != null && stopLossPrice.compareTo(BigDecimal.ZERO) > 0) { + OrderModel model = new OrderModel(order.getId(), RabbitPriceTypeEnum.CLOSE_MORE_STOP_LESS.getValue(), + stopLossPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), + order.getSymbol()); + producer.sendPriceOperate(JSONObject.toJSONString(model)); + } + // 止盈 + BigDecimal stopProfitPrice = order.getStopProfitPrice(); + if (stopProfitPrice != null && stopProfitPrice.compareTo(BigDecimal.ZERO) > 0) { + OrderModel model = new OrderModel(order.getId(), RabbitPriceTypeEnum.CLOSE_MORE_STOP_PROFIT.getValue(), + stopProfitPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), + order.getSymbol()); + producer.sendPriceOperate(JSONObject.toJSONString(model)); + } + + } else { + // 开空 发送开空止损 止盈 爆仓 + // 爆仓价 + BigDecimal forceSetPrice = order.getForceClosingPrice(); + if (forceSetPrice != null) { + OrderModel model = new OrderModel(order.getId(), RabbitPriceTypeEnum.CLOSE_LESS_BOMB.getValue(), forceSetPrice.toPlainString(), + order.getSymbol(), order.getOperateNo()); + producer.sendPriceOperate(JSONObject.toJSONString(model)); + } + // 止损 + BigDecimal stopLossPrice = order.getStopLossPrice(); + if (stopLossPrice != null && stopLossPrice.compareTo(BigDecimal.ZERO) > 0) { + OrderModel model = new OrderModel(order.getId(), RabbitPriceTypeEnum.CLOSE_LESS_STOP_LESS.getValue(), + stopLossPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), + order.getSymbol()); + producer.sendPriceOperate(JSONObject.toJSONString(model)); + } + // 止盈 + BigDecimal stopProfitPrice = order.getStopProfitPrice(); + if (stopProfitPrice != null && stopProfitPrice.compareTo(BigDecimal.ZERO) > 0) { + OrderModel model = new OrderModel(order.getId(), RabbitPriceTypeEnum.CLOSE_LESS_STOP_PROFIT.getValue(), + stopProfitPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), + order.getSymbol()); + producer.sendPriceOperate(JSONObject.toJSONString(model)); + } + } + + } + } + + if (CollectionUtils.isNotEmpty(entrustOrderEntities)) { + for (ContractEntrustOrderEntity order : entrustOrderEntities) { + // 开多1,开空 2 + int entrustType = order.getEntrustType(); + // 开多 + BigDecimal entrustPrice = order.getEntrustPrice(); + OrderModel model; + if (ContractEntrustOrderEntity.ENTRUST_TYPE_OPEN_MORE == entrustType) { + // 开多委托 + model = new OrderModel(order.getId(), RabbitPriceTypeEnum.ENTRUST_OPEN_MORE.getValue(), + entrustPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), + order.getSymbol()); + + } else { + model = new OrderModel(order.getId(), RabbitPriceTypeEnum.ENTRUST_OPEN_LESS.getValue(), + entrustPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), + order.getSymbol()); + } + producer.sendPriceOperate(JSONObject.toJSONString(model)); + } + } + } +} diff --git a/src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java b/src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java index 7282d61..f0e24fc 100644 --- a/src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java +++ b/src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONObject; import com.xcong.excoin.rabbit.producer.OrderProducer; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -12,6 +13,7 @@ import java.util.Map; import java.util.concurrent.PriorityBlockingQueue; +@Slf4j @Component public class WebsocketPriceService { @@ -22,7 +24,7 @@ * @param symbol * @param price */ - public void comparePriceAsc(String symbol, String price) { + public void comparePriceAsc(String symbol, String price) { // 比较价格 正序的 最小元素在头部 开多止盈 开空止损等 PriorityBlockingQueue<AscBigDecimal> queue = PricePriorityQueue.getQueueAsc(symbol); // 最小的 @@ -33,20 +35,20 @@ // 找到所有比当前价格大的 是需要操作的 if (b != null && b.compareTo(now) <= 0) { // 可以操作 - System.out.println("当前价格:" + price + "---正序---" + "队列价格:" + b.getValue().toPlainString()+" time:"+new Date()); + System.out.println("当前价格:" + price + "---正序---" + "队列价格:" + b.getValue().toPlainString() + " time:" + new Date()); while (queue.peek() != null && queue.peek().compareTo(now) <= 0) { // 可以发送消息操作 list.add(queue.remove()); } } - if(CollectionUtils.isNotEmpty(list)){ - dealAscPriceOrderAndSenMq(list,symbol); + if (CollectionUtils.isNotEmpty(list)) { + dealAscPriceOrderAndSenMq(list, symbol); } - + } - public void comparePriceDesc(String symbol, String price) { + public void comparePriceDesc(String symbol, String price) { // 比较价格 倒叙的 开多止损 开空止盈 PriorityBlockingQueue<DescBigDecimal> queue = PricePriorityQueue.getQueueDesc(symbol); // 最大价格 @@ -58,15 +60,16 @@ // 即最大的币当前价大 那么需要开多止损 if (b != null && b.compareTo(now) <= 0) { // 可以操作 - System.out.println("当前价格:" + price + "---倒序操作---" + "队列:" + b.getValue().toPlainString()+" time:"+new Date()); + System.out.println("当前价格:" + price + "---倒序操作---" + "队列:" + b.getValue().toPlainString() + " time:" + new Date()); while (queue.peek() != null && queue.peek().compareTo(now) <= 0) { // 可以发送消息操作 list.add(queue.remove()); + log.info("#{}#", JSONObject.toJSONString(list)); } } - if(CollectionUtils.isNotEmpty(list)){ - dealDescPriceOrderAndSenMq(list,symbol); + if (CollectionUtils.isNotEmpty(list)) { + dealDescPriceOrderAndSenMq(list, symbol); } } @@ -82,14 +85,14 @@ // 根据价格查询到对应的订单 for (AscBigDecimal asc : list) { String key = asc.getValue().toPlainString(); - if(orderMap.containsKey(key)){ + assert orderMap != null; + if (orderMap.containsKey(key)) { orderModelList.addAll(orderMap.get(key)); orderMap.remove(key); } } - - if(CollectionUtils.isEmpty(orderModelList)){ + if (CollectionUtils.isEmpty(orderModelList)) { return; } System.out.println("本次执行的列表ASC"); @@ -98,52 +101,46 @@ // 3:开空 7:爆仓平空 // 9:止盈平多 12:止损平空 for (OrderModel model : orderModelList) { - List<OrderModel> kkzsList = null; - List<OrderModel> kdzyList = null; - List<OrderModel> bcList = null; - List<OrderModel> wtkkList = null; + // 止损平空 + List<OrderModel> kkzsList = new ArrayList<OrderModel>(); + // 止盈平多 + List<OrderModel> kdzyList = new ArrayList<OrderModel>(); + // 爆仓平空 + List<OrderModel> bcList = new ArrayList<OrderModel>(); + // 开空 + List<OrderModel> wtkkList = new ArrayList<OrderModel>(); switch (model.getType()) { case 3: - if (wtkkList == null) { - wtkkList = new ArrayList<OrderModel>(); - } wtkkList.add(model); break; case 7: - if (bcList == null) { - bcList = new ArrayList<OrderModel>(); - } bcList.add(model); break; case 9: - if (kdzyList == null) { - kdzyList = new ArrayList<OrderModel>(); - } kdzyList.add(model); break; case 12: - if (kkzsList == null) { - kkzsList = new ArrayList<OrderModel>(); - } kkzsList.add(model); + break; + default: + log.info("#price-service unknown type#"); break; } // 发送消息 - if(CollectionUtils.isNotEmpty(kkzsList)){ - String kkzs= JSONObject.toJSONString(kkzsList); + if (CollectionUtils.isNotEmpty(kkzsList)) { + String kkzs = JSONObject.toJSONString(kkzsList); orderProducer.sendLessLoss(kkzs); } - if(CollectionUtils.isNotEmpty(kdzyList)){ - String kdzy = JSONObject.toJSONString(kdzyList); + if (CollectionUtils.isNotEmpty(kdzyList)) { + String kdzy = JSONObject.toJSONString(kdzyList); orderProducer.sendMorePro(kdzy); } - if(CollectionUtils.isNotEmpty(bcList)){ + if (CollectionUtils.isNotEmpty(bcList)) { orderProducer.sendCoinout(JSONObject.toJSONString(bcList)); } - if(CollectionUtils.isNotEmpty(wtkkList)){ + if (CollectionUtils.isNotEmpty(wtkkList)) { orderProducer.sendLimit(JSONObject.toJSONString(wtkkList)); - } } } @@ -159,14 +156,15 @@ // 根据价格查询到对应的订单 for (DescBigDecimal desc : list) { String key = desc.getValue().toPlainString(); - if(orderMap.containsKey(key)){ + assert orderMap != null; + if (orderMap.containsKey(key)) { orderModelList.addAll(orderMap.get(key)); orderMap.remove(key); } } - if(CollectionUtils.isEmpty(orderModelList)){ + if (CollectionUtils.isEmpty(orderModelList)) { return; } System.out.println("本次执行的列表Desc"); @@ -175,50 +173,44 @@ // 2:开多6:爆仓平多 // 10:止盈平空11:止损平多 for (OrderModel model : orderModelList) { - List<OrderModel> kkzyList = null; - List<OrderModel> kdzsList = null; - List<OrderModel> bcList = null; - List<OrderModel> wtkdList = null; + // 开空止盈 + List<OrderModel> kkzyList = new ArrayList<OrderModel>(); + // 开多止损 + List<OrderModel> kdzsList = new ArrayList<OrderModel>(); + // 爆仓 + List<OrderModel> bcList = new ArrayList<OrderModel>(); + // 开多委托 + List<OrderModel> wtkdList = new ArrayList<OrderModel>(); switch (model.getType()) { case 2: - if (wtkdList == null) { - wtkdList = new ArrayList<OrderModel>(); - } wtkdList.add(model); break; case 6: - if (bcList == null) { - bcList = new ArrayList<OrderModel>(); - } bcList.add(model); break; case 10: - if (kkzyList == null) { - kkzyList = new ArrayList<OrderModel>(); - } kkzyList.add(model); break; case 11: - if (kdzsList == null) { - kdzsList = new ArrayList<OrderModel>(); - } kdzsList.add(model); + break; + default: break; } // 发送消息 - if(CollectionUtils.isNotEmpty(kkzyList)){ - String kkzy= JSONObject.toJSONString(kkzyList); + if (CollectionUtils.isNotEmpty(kkzyList)) { + String kkzy = JSONObject.toJSONString(kkzyList); orderProducer.sendLessPro(kkzy); } - if(CollectionUtils.isNotEmpty(kdzsList)){ - String kdzs = JSONObject.toJSONString(kdzsList); + if (CollectionUtils.isNotEmpty(kdzsList)) { + String kdzs = JSONObject.toJSONString(kdzsList); orderProducer.sendMoreLoss(kdzs); } - if(CollectionUtils.isNotEmpty(bcList)){ + if (CollectionUtils.isNotEmpty(bcList)) { orderProducer.sendCoinout(JSONObject.toJSONString(bcList)); } - if(CollectionUtils.isNotEmpty(wtkdList)){ + if (CollectionUtils.isNotEmpty(wtkdList)) { orderProducer.sendLimit(JSONObject.toJSONString(wtkdList)); } diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index f8d251e..4389c64 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -2,7 +2,7 @@ <configuration> <contextName>logback</contextName> <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 --> - <property name="log.path" value="/home/javaweb/log/new-excoin" /> + <property name="log.path" value="logs" /> <!-- <springProperty scope="context" name="log.path" source="logging.file.path"/>--> <!-- 彩色日志 --> diff --git a/src/main/resources/mapper/contract/ContractEntrustOrderDao.xml b/src/main/resources/mapper/contract/ContractEntrustOrderDao.xml index be44bef..8b31fb1 100644 --- a/src/main/resources/mapper/contract/ContractEntrustOrderDao.xml +++ b/src/main/resources/mapper/contract/ContractEntrustOrderDao.xml @@ -18,4 +18,8 @@ #{item} </foreach> </select> + + <select id="selectAllEntrustOrder" resultType="com.xcong.excoin.modules.contract.entity.ContractEntrustOrderEntity"> + select * from contract_entrust_order + </select> </mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/contract/ContractHoldOrderDao.xml b/src/main/resources/mapper/contract/ContractHoldOrderDao.xml index ae43110..024fe90 100644 --- a/src/main/resources/mapper/contract/ContractHoldOrderDao.xml +++ b/src/main/resources/mapper/contract/ContractHoldOrderDao.xml @@ -32,4 +32,8 @@ update contract_hold_order set is_can_closing=#{isCanClosing} where id=#{id} </update> + + <select id="selectAllHoldOrder" resultType="com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity"> + select * from contract_hold_order + </select> </mapper> \ No newline at end of file -- Gitblit v1.9.1