Helius
2020-06-02 a0b6145467388f025c43a53a3d74c4e9741ec847
add target profitOrLess interface
2 files added
1 files renamed
1 files deleted
7 files modified
229 ■■■■ changed files
src/main/java/com/xcong/excoin/common/enumerates/RabbitPriceTypeEnum.java 12 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/controller/ContractOrderController.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/mapper/ContractHoldOrderEntityMapper.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/parameter/dto/OrderDetailDto.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/parameter/dto/ProfitOrLessDto.java 42 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/parameter/vo/HoldOrderListVo.java 6 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/parameter/vo/OrderDetailVo.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/service/ContractHoldOrderService.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractEntrustOrderServiceImpl.java 13 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java 117 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/rabbit/producer/OrderProducer.java 2 ●●● patch | view | raw | blame | history
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);
    }