src/main/java/com/xcong/excoin/common/enumerates/RabbitPriceTypeEnum.java
@@ -1,17 +1,25 @@ package com.xcong.excoin.common.enumerates; import lombok.Getter; /** * rabbit 价格操作类型枚举 * 1:买入委托2:开多3:开空4:平多5:平空6:爆仓平多7:爆仓平空8:撤单9:止盈平多10:止盈平空11:止损平多12:止损平空 * * @author helius */ @Getter public enum RabbitPriceTypeEnum { /** * 开多 * 委托开多 */ OPEN_MORE(2); ENTRUST_OPEN_MORE(2) , ENTRUST_OPEN_LESS(3) , CLOSE_MORE_STOP_PROFIT(9) , CLOSE_LESS_STOP_PROFIT(10) , CLOSE_MORE_STOP_LESS(11) , CLOSE_LESS_STOP_LESS(12); private int value; src/main/java/com/xcong/excoin/modules/contract/controller/ContractOrderController.java
@@ -1,13 +1,15 @@ package com.xcong.excoin.modules.contract.controller; import com.xcong.excoin.common.response.Result; import com.xcong.excoin.modules.contract.parameter.dto.HoldOrderListDto; 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.HoldOrderListVo; import com.xcong.excoin.modules.contract.service.ContractHoldOrderService; import com.xcong.excoin.modules.contract.service.ContractOrderService; import com.xcong.excoin.rabbit.producer.OrderProducer; import io.swagger.annotations.*; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -36,7 +38,7 @@ @ApiOperation(value = "查询当前持仓订单列表 -- 轮询") @ApiResponses({ @ApiResponse(code = 0, message = "success", response = HoldOrderListDto.class) @ApiResponse(code = 0, message = "success", response = HoldOrderListVo.class) }) @GetMapping(value = "/findHoldOrderList") public Result findHoldOrderList() { @@ -63,7 +65,7 @@ @ApiOperation(value = "未完成--设置止盈止损") @PostMapping(value = "/setTargetProfitOrLoss") public Result setTargetProfitOrLoss() { public Result setTargetProfitOrLoss(@RequestBody @Validated ProfitOrLessDto profitOrLessDto) { return null; } src/main/java/com/xcong/excoin/modules/contract/mapper/ContractHoldOrderEntityMapper.java
@@ -2,7 +2,7 @@ import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity; import com.xcong.excoin.modules.contract.entity.ContractOrderEntity; import com.xcong.excoin.modules.contract.parameter.dto.HoldOrderListDto; import com.xcong.excoin.modules.contract.parameter.vo.HoldOrderListVo; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; @@ -18,5 +18,5 @@ @Mapping(target = "orderType", source = "openingType") public abstract ContractOrderEntity holdOrderToOrder(ContractHoldOrderEntity holdOrderEntity); public abstract HoldOrderListDto holdOrderToDto(ContractHoldOrderEntity holdOrderEntity); public abstract HoldOrderListVo holdOrderToDto(ContractHoldOrderEntity holdOrderEntity); } src/main/java/com/xcong/excoin/modules/contract/parameter/dto/OrderDetailDto.java
File was deleted src/main/java/com/xcong/excoin/modules/contract/parameter/dto/ProfitOrLessDto.java
New file @@ -0,0 +1,42 @@ package com.xcong.excoin.modules.contract.parameter.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.DecimalMin; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import java.math.BigDecimal; /** * @author wzy * @date 2020-06-02 **/ @Data @ApiModel(value = "ProfitOrLessDto", description = "设置止盈止损接口参数类") public class ProfitOrLessDto { /** * 类型 止盈 */ public static final int TYPE_PROFIT = 1; /** * 类型 止损 */ public static final int TYPE_LESS = 2; @NotNull @ApiModelProperty(value = "订单ID", example = "1") private Long id; @NotNull @ApiModelProperty(value = "类型 1-止盈2-止损", example = "1") private Integer type; @NotNull @Min(0) @ApiModelProperty(value = "目标价格", example = "9000.00") private BigDecimal price; } src/main/java/com/xcong/excoin/modules/contract/parameter/vo/HoldOrderListVo.java
File was renamed from src/main/java/com/xcong/excoin/modules/contract/parameter/dto/HoldOrderListDto.java @@ -1,4 +1,4 @@ package com.xcong.excoin.modules.contract.parameter.dto; package com.xcong.excoin.modules.contract.parameter.vo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModel; @@ -12,8 +12,8 @@ * @date 2020-06-01 **/ @Data @ApiModel(value = "HoldOrderListDto", description = "获取当前持仓列表接口返回数据类") public class HoldOrderListDto { @ApiModel(value = "HoldOrderListVo", description = "获取当前持仓列表接口返回数据类") public class HoldOrderListVo { @ApiModelProperty(value = "订单ID", example = "1") private Long id; src/main/java/com/xcong/excoin/modules/contract/parameter/vo/OrderDetailVo.java
New file @@ -0,0 +1,11 @@ package com.xcong.excoin.modules.contract.parameter.vo; import lombok.Data; /** * @author wzy * @date 2020-06-01 **/ @Data public class OrderDetailVo { } src/main/java/com/xcong/excoin/modules/contract/service/ContractHoldOrderService.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.xcong.excoin.common.response.Result; import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity; import com.xcong.excoin.modules.contract.parameter.dto.ProfitOrLessDto; import com.xcong.excoin.modules.contract.parameter.dto.SubmitOrderDto; import com.xcong.excoin.rabbit.pricequeue.OrderModel; import org.apache.ibatis.annotations.Param; @@ -28,4 +29,6 @@ public Result cancelHoldOrderBatch(); public Result setTargetProfitOrLess(ProfitOrLessDto profitOrLessDto); } src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractEntrustOrderServiceImpl.java
@@ -1,8 +1,10 @@ package com.xcong.excoin.modules.contract.service.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xcong.excoin.common.LoginUserUtils; import com.xcong.excoin.common.enumerates.MemberWalletCoinEnum; 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; @@ -17,6 +19,7 @@ import com.xcong.excoin.modules.member.entity.MemberEntity; import com.xcong.excoin.modules.member.entity.MemberWalletContractEntity; import com.xcong.excoin.modules.platform.entity.PlatformTradeSettingEntity; import com.xcong.excoin.rabbit.pricequeue.OrderModel; import com.xcong.excoin.rabbit.producer.OrderProducer; import com.xcong.excoin.utils.CacheSettingUtils; import com.xcong.excoin.utils.CoinTypeConvert; @@ -27,6 +30,7 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.List; /** @@ -121,6 +125,15 @@ walletContract.setAvailableBalance(walletContract.getAvailableBalance().subtract(entrustTotalAmount)); memberWalletContractDao.updateById(walletContract); if (i > 0) { // 发送委托单队列消息 if (submitEntrustDto.getEntrustType() == ContractEntrustOrderEntity.ENTRUST_TYPE_OPEN_MORE) { OrderModel model = new OrderModel(entrustOrderEntity.getId(), RabbitPriceTypeEnum.ENTRUST_OPEN_MORE.getValue(), submitEntrustDto.getEntrustPrice().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()); producer.sendPriceOperate(JSONObject.toJSONString(model)); } return Result.ok("委托成功"); } else { return Result.fail("委托失败"); src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java
@@ -1,10 +1,12 @@ package com.xcong.excoin.modules.contract.service.impl; import cn.hutool.core.collection.CollUtil; import com.alibaba.druid.sql.visitor.functions.If; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xcong.excoin.common.LoginUserUtils; import com.xcong.excoin.common.enumerates.CoinTypeEnum; 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.ContractHoldOrderDao; @@ -13,8 +15,9 @@ import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity; import com.xcong.excoin.modules.contract.entity.ContractOrderEntity; import com.xcong.excoin.modules.contract.mapper.ContractHoldOrderEntityMapper; import com.xcong.excoin.modules.contract.parameter.dto.HoldOrderListDto; 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.HoldOrderListVo; import com.xcong.excoin.modules.contract.service.ContractHoldOrderService; import com.xcong.excoin.modules.member.dao.MemberWalletContractDao; import com.xcong.excoin.modules.member.entity.AgentReturnEntity; @@ -25,6 +28,7 @@ import com.xcong.excoin.rabbit.producer.OrderProducer; import com.xcong.excoin.utils.*; import com.xcong.excoin.rabbit.pricequeue.OrderModel; import jnr.a64asm.Mem; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -32,6 +36,7 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -179,9 +184,9 @@ List<ContractHoldOrderEntity> list = contractHoldOrderDao.selectHoldOrderListByMemberId(memberEntity.getId()); if (CollUtil.isNotEmpty(list)) { BigDecimal totalProfitOrLoss = BigDecimal.ZERO; List<HoldOrderListDto> resultList = new ArrayList<>(); List<HoldOrderListVo> resultList = new ArrayList<>(); for (ContractHoldOrderEntity holdOrderEntity : list) { HoldOrderListDto holdOrderListDto = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToDto(holdOrderEntity); HoldOrderListVo holdOrderListVo = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToDto(holdOrderEntity); String symbol = holdOrderEntity.getSymbol(); // 获取最新价 BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(symbol))); @@ -222,10 +227,10 @@ canAddMaxBond = BigDecimal.ZERO; } holdOrderListDto.setCanAddMaxBond(canAddMaxBond); holdOrderListDto.setReturnRate(returnRate); holdOrderListDto.setProfitOrLoss(rewardRatio); resultList.add(holdOrderListDto); holdOrderListVo.setCanAddMaxBond(canAddMaxBond); holdOrderListVo.setReturnRate(returnRate); holdOrderListVo.setProfitOrLoss(rewardRatio); resultList.add(holdOrderListVo); totalProfitOrLoss = totalProfitOrLoss.add(rewardRatio); } @@ -275,4 +280,102 @@ producer.sendCloseTrade(JSONObject.toJSONString(ids)); return Result.ok("平仓成功"); } @Override public Result setTargetProfitOrLess(ProfitOrLessDto profitOrLessDto) { MemberEntity memberEntity = LoginUserUtils.getAppLoginUser(); ContractHoldOrderEntity holdOrderEntity = contractHoldOrderDao.selectHoldOrderByMemberIdAndId(memberEntity.getId(), profitOrLessDto.getId()); if (holdOrderEntity == null) { return Result.fail("订单不存在"); } // 获取最新价 BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(holdOrderEntity.getSymbol()))); // 开仓价 BigDecimal openPrice = holdOrderEntity.getOpeningPrice(); // 设置的止盈止损价 BigDecimal price = profitOrLessDto.getPrice(); // 开多 if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) { if (ProfitOrLessDto.TYPE_PROFIT == profitOrLessDto.getType()) { // 当前价大于开仓价 if (newPrice.compareTo(openPrice) > 0) { // 如果止盈价小于当前价 if (price.compareTo(newPrice) < 0) { return Result.fail("止盈价必须高于当前价"); } } else { if (price.compareTo(openPrice) < 0) { return Result.fail("止盈价必须高于开仓价"); } } } else { if (newPrice.compareTo(openPrice) > 0) { if (price.compareTo(openPrice) > 0) { return Result.fail("止损价必须低于开仓价"); } } else { if (price.compareTo(newPrice) > 0) { return Result.fail("止损价必须低于当前价"); } } } // 开空 } else { if (ProfitOrLessDto.TYPE_PROFIT == profitOrLessDto.getType()) { if (newPrice.compareTo(openPrice) > 0) { if (price.compareTo(openPrice) > 0) { return Result.fail("止损价必须低于开仓价"); } } else { if (price.compareTo(newPrice) > 0) { return Result.fail("止损价必须低于当前价"); } } } else { if (newPrice.compareTo(openPrice) > 0) { if (price.compareTo(newPrice) < 0) { return Result.fail("止损价必须高于当前价"); } } else { if (price.compareTo(openPrice) < 0) { return Result.fail("止损价必须高于开仓价"); } } } } if (ProfitOrLessDto.TYPE_PROFIT == profitOrLessDto.getType()) { holdOrderEntity.setStopProfitPrice(price); } else { holdOrderEntity.setStopLossPrice(price); } int i = contractHoldOrderDao.updateById(holdOrderEntity); if (i > 0) { OrderModel model = null; if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) { // 开多止盈 if (ProfitOrLessDto.TYPE_PROFIT == profitOrLessDto.getType()) { model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_MORE_STOP_PROFIT.getValue(), price.toPlainString(), holdOrderEntity.getSymbol()); // 开多止损 } else { model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_MORE_STOP_LESS.getValue(), price.toPlainString(), holdOrderEntity.getSymbol()); } } else { // 开空止盈 if (ProfitOrLessDto.TYPE_PROFIT == profitOrLessDto.getType()) { model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_LESS_STOP_PROFIT.getValue(), price.toPlainString(), holdOrderEntity.getSymbol()); // 开空止损 } else { model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_LESS_STOP_LESS.getValue(), price.toPlainString(), holdOrderEntity.getSymbol()); } } producer.sendPriceOperate(JSONObject.toJSONString(model)); return Result.ok("设置成功"); } return Result.fail("设置失败"); } } src/main/java/com/xcong/excoin/rabbit/producer/OrderProducer.java
@@ -107,7 +107,7 @@ */ public void sendPriceOperate(String content) { CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); System.out.println("发送价格操作:" + content + "==pid:" + correlationData.getId()); log.info("发送价格操作 : {}==pid : {}", content, correlationData.getId()); rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_A, RabbitMqConfig.ROUTINGKEY_PRICEOPERATE, content, correlationData); }