From 48e20b2b0f03c52a904271b177678f9f8818754d Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Tue, 06 Apr 2021 15:20:50 +0800
Subject: [PATCH] add follow change bond
---
src/main/java/com/xcong/excoin/modules/documentary/service/FollowOrderOperationService.java | 4 +
src/main/java/com/xcong/excoin/rabbit/producer/FollowProducer.java | 22 +++++++
src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java | 4 +
src/main/java/com/xcong/excoin/modules/documentary/service/impl/FollowOrderOperationServiceImpl.java | 68 ++++++++++++++++++++++
src/main/java/com/xcong/excoin/modules/documentary/common/NoticeConstant.java | 5 +
src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java | 4
src/main/java/com/xcong/excoin/rabbit/consumer/FollowConsumer.java | 16 +++++
src/test/java/com/xcong/excoin/FollowTest.java | 11 ++-
8 files changed, 128 insertions(+), 6 deletions(-)
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 f999aac..3f547ce 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
@@ -104,12 +104,12 @@
}
break;
case "EOS":
- address = "biyicteos123";
+ address = "hibitdeposit";
map.put("address", address);
map.put("lable", uuid);
break;
case "XRP":
- address = "biyicteos123";
+ address = "rUzWJkXyEtT8ekSSxkBYPqCvHpngcy6Fks";
map.put("address", address);
map.put("lable", uuid);
break;
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 8a8b96f..1c3431f 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
@@ -851,6 +851,10 @@
if (i > 0) {
// 发送爆仓消息
sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), forceClosingPrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo(), holdOrderEntity.getMemberId());
+
+ if (ContractOrderEntity.CONTRACTTYPE_DOCUMENTARY == holdOrderEntity.getContractType()) {
+ followProducer.sendChangeFollowOrderBond(holdOrderEntity.getId(), changeBondDto.getAmount(), changeBondDto.getType());
+ }
return Result.ok("调整成功");
}
return Result.fail("调整失败");
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/common/NoticeConstant.java b/src/main/java/com/xcong/excoin/modules/documentary/common/NoticeConstant.java
index dd1ab04..c44da35 100644
--- a/src/main/java/com/xcong/excoin/modules/documentary/common/NoticeConstant.java
+++ b/src/main/java/com/xcong/excoin/modules/documentary/common/NoticeConstant.java
@@ -34,4 +34,9 @@
public static final String RETURN_MONEY_CONTENT = "平仓成功,收到的合约{},币种{}的返利金额:{}";
public static final String RETURN_MONEY_CONTENT_MAMC = "合约-{},订单{}的带单返利";
+ public static final String CHANGE_BOND_TITLE = "跟单-调整保证金";
+ public static final String CHANGE_BOND_ADD_CONTENT_FAIL = "金额不足无法跟随交易员调整保证金";
+ public static final String CHANGE_BOND_CONTENT_SUCCESS = "跟随交易员调整保证金成功,金额为{}, 交易员:{}";
+
+ public static final String CHANGE_BOND_REDUCE_CONTENT_FAIL = "超出保证金最大减少金额,无法跟随交易员调整保证金";
}
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/service/FollowOrderOperationService.java b/src/main/java/com/xcong/excoin/modules/documentary/service/FollowOrderOperationService.java
index bde0247..401a228 100644
--- a/src/main/java/com/xcong/excoin/modules/documentary/service/FollowOrderOperationService.java
+++ b/src/main/java/com/xcong/excoin/modules/documentary/service/FollowOrderOperationService.java
@@ -3,6 +3,8 @@
import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity;
+import java.math.BigDecimal;
+
/**
* @author helius
*/
@@ -23,4 +25,6 @@
* @param newOrderId 交易员平仓后历史ID
*/
public void closingFollowOrders(String orderNo);
+
+ public void changeFollowOrdersBond(Long id, BigDecimal bond, Integer type);
}
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/service/impl/FollowOrderOperationServiceImpl.java b/src/main/java/com/xcong/excoin/modules/documentary/service/impl/FollowOrderOperationServiceImpl.java
index f218e29..eae5138 100644
--- a/src/main/java/com/xcong/excoin/modules/documentary/service/impl/FollowOrderOperationServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/documentary/service/impl/FollowOrderOperationServiceImpl.java
@@ -10,6 +10,7 @@
import com.xcong.excoin.common.enumerates.CoinTypeEnum;
import com.xcong.excoin.common.enumerates.MemberWalletCoinEnum;
import com.xcong.excoin.common.enumerates.RabbitPriceTypeEnum;
+import com.xcong.excoin.common.exception.GlobalException;
import com.xcong.excoin.common.response.Result;
import com.xcong.excoin.common.system.service.CommonService;
import com.xcong.excoin.modules.coin.entity.MemberAccountMoneyChange;
@@ -19,6 +20,7 @@
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.ChangeBondDto;
import com.xcong.excoin.modules.contract.service.RabbitOrderService;
import com.xcong.excoin.modules.documentary.common.NoticeConstant;
import com.xcong.excoin.modules.documentary.dao.*;
@@ -368,4 +370,70 @@
}
}
}
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void changeFollowOrdersBond(Long id, BigDecimal bond, Integer type) {
+ log.info("==跟单调整保证金:{}, {}, {}==", id, bond, type);
+ ContractHoldOrderEntity contractHoldOrderEntity = contractHoldOrderDao.selectById(id);
+ if (contractHoldOrderEntity == null) {
+ log.info("持仓不存在:{}", id);
+ return;
+ }
+
+ // 交易员信息
+ FollowTraderInfoEntity followTraderInfoEntity = followTraderInfoDao.selectTraderInfoByMemberId(contractHoldOrderEntity.getMemberId());
+
+ List<FollowFollowerOrderRelationEntity> relations = followFollowerOrderRelationDao.selectFollowHoldOrderByTradeOrderNo(contractHoldOrderEntity.getOrderNo());
+ if (CollUtil.isNotEmpty(relations)) {
+ for (FollowFollowerOrderRelationEntity relation : relations) {
+ ContractHoldOrderEntity followHoldOrder = contractHoldOrderDao.selectById(relation.getOrderId());
+ MemberEntity memberEntity = memberDao.selectById(relation.getMemberId());
+ MemberWalletContractEntity wallet = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name());
+
+ // 增加保证金
+ if (type == ChangeBondDto.TYPE_ADD) {
+ if (bond.compareTo(wallet.getAvailableBalance()) > 0) {
+ log.info("可用金额不足:{}, {}", memberEntity.getId(), followHoldOrder.getOrderNo());
+ LogRecordUtils.insertFollowerNotice(memberEntity.getId(), NoticeConstant.CHANGE_BOND_TITLE, NoticeConstant.CHANGE_BOND_ADD_CONTENT_FAIL);
+ continue;
+ }
+
+ memberWalletContractDao.increaseWalletContractBalanceById(bond.negate(), null, null, wallet.getId());
+ followHoldOrder.setBondAmount(followHoldOrder.getBondAmount().add(bond));
+ LogRecordUtils.insertFollowerNotice(memberEntity.getId(), NoticeConstant.CHANGE_BOND_TITLE, StrUtil.format(NoticeConstant.CHANGE_BOND_CONTENT_SUCCESS, bond, followTraderInfoEntity.getNickname()));
+ } else {
+ if (followHoldOrder.getBondAmount().subtract(followHoldOrder.getPrePaymentAmount()).subtract(bond).compareTo(BigDecimal.ZERO) < 0) {
+ log.info("超出保证金最大减少金额-1");
+ LogRecordUtils.insertFollowerNotice(memberEntity.getId(), NoticeConstant.CHANGE_BOND_TITLE, NoticeConstant.CHANGE_BOND_ADD_CONTENT_FAIL);
+ continue;
+ }
+
+ BigDecimal profitOrLoss = CalculateUtil.calProfitOrLoss(followHoldOrder, memberEntity);
+ if (profitOrLoss.compareTo(BigDecimal.ZERO) < 0) {
+ BigDecimal canReduceMax = followHoldOrder.getBondAmount().subtract(followHoldOrder.getPrePaymentAmount()).add(profitOrLoss);
+ if (canReduceMax.subtract(bond).compareTo(BigDecimal.ZERO) < 0) {
+ log.info("超出保证金最大减少金额-2");
+ LogRecordUtils.insertFollowerNotice(memberEntity.getId(), NoticeConstant.CHANGE_BOND_TITLE, NoticeConstant.CHANGE_BOND_ADD_CONTENT_FAIL);
+ continue;
+ }
+ }
+
+ memberWalletContractDao.increaseWalletContractBalanceById(bond, null, null, wallet.getId());
+ followHoldOrder.setBondAmount(followHoldOrder.getBondAmount().subtract(bond));
+ LogRecordUtils.insertFollowerNotice(memberEntity.getId(), NoticeConstant.CHANGE_BOND_TITLE, StrUtil.format(NoticeConstant.CHANGE_BOND_CONTENT_SUCCESS, bond.negate(), followTraderInfoEntity.getNickname()));
+ }
+
+ BigDecimal forceClosingPrice = CalculateUtil.getForceSetPrice(followHoldOrder.getBondAmount(), followHoldOrder.getOpeningPrice(), followHoldOrder.getSymbolCnt(), followHoldOrder.getSymbolSku(), followHoldOrder.getOpeningType(), memberEntity);
+ followHoldOrder.setForceClosingPrice(forceClosingPrice);
+ followHoldOrder.setOperateNo(followHoldOrder.getOperateNo() + 1);
+ int i = contractHoldOrderDao.updateById(followHoldOrder);
+ if (i > 0) {
+ sendOrderBombMsg(followHoldOrder.getId(), followHoldOrder.getOpeningType(), forceClosingPrice, followHoldOrder.getSymbol(), followHoldOrder.getOperateNo(), followHoldOrder.getMemberId());
+ } else {
+ throw new GlobalException("更新失败");
+ }
+ }
+ }
+ }
}
diff --git a/src/main/java/com/xcong/excoin/rabbit/consumer/FollowConsumer.java b/src/main/java/com/xcong/excoin/rabbit/consumer/FollowConsumer.java
index b5db176..d206b1b 100644
--- a/src/main/java/com/xcong/excoin/rabbit/consumer/FollowConsumer.java
+++ b/src/main/java/com/xcong/excoin/rabbit/consumer/FollowConsumer.java
@@ -1,5 +1,6 @@
package com.xcong.excoin.rabbit.consumer;
+import com.alibaba.fastjson.JSONObject;
import com.rabbitmq.client.Channel;
import com.xcong.excoin.configurations.RabbitMqConfig;
import com.xcong.excoin.modules.documentary.service.FollowOrderOperationService;
@@ -9,6 +10,10 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
+import org.web3j.abi.datatypes.Int;
+
+import java.math.BigDecimal;
+import java.util.Map;
/**
* @author wzy
@@ -29,4 +34,15 @@
followOrderOperationService.addFollowerOrder(Long.parseLong(content));
}
+
+// @RabbitListener(queues = RabbitMqConfig.QUEUE_FOLLOW_CHANGE_BOND)
+ public void changeFollowOrderBond(Message message, Channel channel) {
+ String content = new String(message.getBody());
+ log.info("==收到跟单保证金调整消息 : {}", content);
+ Map map = JSONObject.parseObject(content, Map.class);
+ Integer id = (Integer) map.get("id");
+ BigDecimal bond = (BigDecimal) map.get("bond");
+ Integer type = (Integer) map.get("type");
+ followOrderOperationService.changeFollowOrdersBond(id.longValue(), bond, type);
+ }
}
diff --git a/src/main/java/com/xcong/excoin/rabbit/producer/FollowProducer.java b/src/main/java/com/xcong/excoin/rabbit/producer/FollowProducer.java
index cecb098..1c5e466 100644
--- a/src/main/java/com/xcong/excoin/rabbit/producer/FollowProducer.java
+++ b/src/main/java/com/xcong/excoin/rabbit/producer/FollowProducer.java
@@ -1,13 +1,19 @@
package com.xcong.excoin.rabbit.producer;
+import com.alibaba.fastjson.JSONObject;
import com.xcong.excoin.configurations.RabbitMqConfig;
import lombok.extern.slf4j.Slf4j;
+import net.sf.json.JSON;
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;
+import org.web3j.abi.datatypes.Int;
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
import java.util.UUID;
/**
@@ -41,4 +47,20 @@
log.info("发送跟单下单消息: {}, {}", id, correlationData.getId());
rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_A, RabbitMqConfig.ROUTINGKEY_FOLLOW_ORDER, id.toString(), correlationData);
}
+
+ /**
+ * 发送跟单调整保证金信息
+ *
+ * @param id
+ */
+ public void sendChangeFollowOrderBond(Long id, BigDecimal changeBond, Integer type) {
+ CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
+ Map<String, Object> map = new HashMap<>();
+ map.put("id", id);
+ map.put("bond", changeBond);
+ map.put("type", type);
+ String msg = JSONObject.toJSONString(map);
+ log.info("发送跟单保证金调整消息: {}, {}", msg, correlationData.getId());
+ rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_A, RabbitMqConfig.ROUTINGKEY_FOLLOW_CHANGE_BOND, msg, correlationData);
+ }
}
diff --git a/src/test/java/com/xcong/excoin/FollowTest.java b/src/test/java/com/xcong/excoin/FollowTest.java
index 7cf737a..3a2f865 100644
--- a/src/test/java/com/xcong/excoin/FollowTest.java
+++ b/src/test/java/com/xcong/excoin/FollowTest.java
@@ -2,12 +2,15 @@
import com.xcong.excoin.modules.documentary.service.FollowOrderOperationService;
import com.xcong.excoin.quartz.job.FollowProfitUpdateJob;
+import com.xcong.excoin.rabbit.producer.FollowProducer;
import com.xcong.excoin.utils.ThreadPoolUtils;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
+import java.math.BigDecimal;
/**
* @author wzy
@@ -35,11 +38,11 @@
System.out.println(symbols.contains(symbol.replace("/USDT", "")));
}
- @Resource
- private FollowProfitUpdateJob followProfitUpdateJob;
+ @Autowired
+ private FollowProducer followProducer;
@Test
- public void updateJobTest() {
- followProfitUpdateJob.traderProfitUpdate();
+ public void sendMsgTest() {
+// followProducer.sendChangeFollowOrderBond(11L, new BigDecimal("1234.1234"));
}
}
--
Gitblit v1.9.1