Helius
2020-08-28 385eb4e47f9e2d89131f276129c1f8e6988edf23
src/main/java/com/xcong/excoin/modules/documentary/service/impl/FollowOrderOperationServiceImpl.java
@@ -13,6 +13,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.service.RabbitOrderService;
import com.xcong.excoin.modules.documentary.common.NoticeConstant;
import com.xcong.excoin.modules.documentary.dao.FollowFollowerOrderRelationDao;
import com.xcong.excoin.modules.documentary.dao.FollowFollowerProfitDao;
@@ -24,9 +25,11 @@
import com.xcong.excoin.modules.documentary.entity.FollowTraderInfoEntity;
import com.xcong.excoin.modules.documentary.service.FollowOrderOperationService;
import com.xcong.excoin.modules.member.dao.MemberDao;
import com.xcong.excoin.modules.member.dao.MemberLevelRateDao;
import com.xcong.excoin.modules.member.dao.MemberWalletContractDao;
import com.xcong.excoin.modules.member.entity.AgentReturnEntity;
import com.xcong.excoin.modules.member.entity.MemberEntity;
import com.xcong.excoin.modules.member.entity.MemberLevelRateEntity;
import com.xcong.excoin.modules.member.entity.MemberWalletContractEntity;
import com.xcong.excoin.modules.platform.entity.PlatformTradeSettingEntity;
import com.xcong.excoin.rabbit.pricequeue.OrderModel;
@@ -41,6 +44,7 @@
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -71,6 +75,10 @@
    private OrderProducer producer;
    @Resource
    private FollowTraderInfoDao followTraderInfoDao;
    @Resource
    private RabbitOrderService rabbitOrderService;
    @Resource
    private MemberLevelRateDao memberLevelRateDao;
    @Override
@@ -80,7 +88,6 @@
        ContractHoldOrderEntity holdOrderEntity = contractHoldOrderDao.selectById(id);
        List<FollowFollowerSettingEntity> followerSettings = followFollowerSettingDao.selectAllFollowerSettingByTradeMemberId(holdOrderEntity.getMemberId());
        log.info("---->{}, {}", followerSettings.size(), holdOrderEntity.getMemberId());
        // 开仓价
        BigDecimal openPrice = holdOrderEntity.getOpeningPrice();
        PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting();
@@ -93,7 +100,12 @@
        Long tradeMemberId = holdOrderEntity.getMemberId();
        if (CollUtil.isNotEmpty(followerSettings)) {
            for (FollowFollowerSettingEntity followerSetting : followerSettings) {
                log.info("循环开始");
                if (!followerSetting.getSymbols().contains(holdOrderEntity.getSymbol().replace("/USDT", ""))) {
                    log.info("不在跟单币种内,不跟单:{},{}", followerSetting.getSymbols(), holdOrderEntity.getSymbol());
                    continue;
                }
                // 当前持仓张数
                Integer holdingCnt = followFollowerOrderRelationDao.selectFollowerHoldingSymbolCnt(tradeMemberId, followerSetting.getMemberId());
@@ -105,16 +117,14 @@
                    symbolCnt = followerSetting.getFollowCnt() * holdOrderEntity.getSymbolCnt();
                }
                log.info("--->>>{}, {}", symbolCnt, followerSetting.getMaxFollowCnt());
                if (followerSetting.getMaxFollowCnt() != null && followerSetting.getMaxFollowCnt() !=0) {
                    // 若张数+当前持仓张数大于最大持仓张数,则取最大持仓减去当前持仓,若差值小于等于0,则不下单
                    if (symbolCnt + holdingCnt > followerSetting.getMaxFollowCnt()) {
                        symbolCnt = followerSetting.getMaxFollowCnt() - holdingCnt;
                    }
                    log.info("--->{}, {}, {}", symbolCnt, followerSetting.getMaxFollowCnt(), holdingCnt);
                    if (symbolCnt <= 0) {
//                        LogRecordUtils.insertFollowerNotice(memberEntity.getId(), NoticeConstant.OPEN_ORDER_TITLE, StrUtil.format(NoticeConstant.OPEN_ORDER_CONTENT, holdOrderEntity.getSymbol() + "开空", openPrice, followTraderInfoEntity.getNickname()));
                        LogRecordUtils.insertFollowerNotice(followerSetting.getMemberId(), NoticeConstant.OPEN_ORDER_FOLLOW_FAIL_TITLE, StrUtil.format(NoticeConstant.OPEN_ORDER_FOLLOW_FAIL_CONTENT, followTraderInfoEntity.getNickname()));
                        continue;
                    }
                }
@@ -124,6 +134,7 @@
                    log.info("钱包地址不存在:{}", followerSetting.getMemberId());
                    continue;
                }
                MemberLevelRateEntity levelRateEntity = memberLevelRateDao.selectLeverRateByMemberIdAndSymbol(followerSetting.getMemberId(), holdOrderEntity.getSymbol());
                // 开仓手续费 建仓价*规格*手数*手续费率
                BigDecimal openFeePrice = openPrice.multiply(lotNumber)
@@ -133,20 +144,20 @@
                // 保证金
                BigDecimal bondAmount = openPrice.multiply(lotNumber).multiply(new BigDecimal(symbolCnt))
                        .multiply(BigDecimal.ONE.divide(new BigDecimal(holdOrderEntity.getLeverRatio())))
                        .multiply(BigDecimal.ONE.divide(new BigDecimal(levelRateEntity.getLevelRateUp())))
                        .setScale(8, BigDecimal.ROUND_DOWN);
                // 预付款
                BigDecimal prePaymentAmount = bondAmount.add(openFeePrice).add(openFeePrice);
                if (prePaymentAmount.compareTo(walletContract.getAvailableBalance()) > -1) {
                    log.info("可用金额不足");
                    LogRecordUtils.insertFollowerNotice(followerSetting.getMemberId(), NoticeConstant.MONEY_NOT_ENOUGH_TITLE, StrUtil.format(NoticeConstant.MONEY_NOT_ENOUGH_CONTENT, followTraderInfoEntity.getNickname()));
                    continue;
                }
                MemberEntity memberEntity = memberDao.selectById(followerSetting.getMemberId());
                // 强平价
                BigDecimal forceClosingPrice = CalculateUtil.getForceSetPrice(bondAmount, openPrice, symbolCnt, lotNumber, holdOrderEntity.getOpeningType(), memberEntity);
                ContractHoldOrderEntity followHoldOrder = new ContractHoldOrderEntity();
                followHoldOrder.setMemberId(memberEntity.getId());
                followHoldOrder.setOrderNo(commonService.generateOrderNo(memberEntity.getId()));
@@ -155,7 +166,7 @@
                followHoldOrder.setSymbol(holdOrderEntity.getSymbol());
                followHoldOrder.setSymbolCnt(symbolCnt);
                followHoldOrder.setSymbolSku(lotNumber);
                followHoldOrder.setLeverRatio(holdOrderEntity.getLeverRatio());
                followHoldOrder.setLeverRatio(levelRateEntity.getLevelRateUp());
                followHoldOrder.setForceClosingPrice(forceClosingPrice);
                followHoldOrder.setOpeningFeeAmount(openFeePrice);
                followHoldOrder.setOpeningPrice(openPrice);
@@ -172,7 +183,6 @@
                contractOrderEntity.setOpeningTime(new Date());
                contractHoldOrderDao.insert(followHoldOrder);
                int i = contractOrderDao.insert(contractOrderEntity);
                log.info("----->{}", i);
                if (i > 0) {
                    memberWalletContractDao.increaseWalletContractBalanceById(prePaymentAmount.negate(), openFeePrice.negate(), null, walletContract.getId());
@@ -183,7 +193,7 @@
                    relationEntity.setOrderType(FollowFollowerOrderRelationEntity.ORDER_TYPE_HOLD);
                    relationEntity.setTradeId(followTraderInfoEntity.getId());
                    relationEntity.setTradeMemberId(followTraderInfoEntity.getMemberId());
                    relationEntity.setTradeOrderId(id);
                    relationEntity.setTradeOrderNo(holdOrderEntity.getOrderNo());
                    followFollowerOrderRelationDao.insert(relationEntity);
                    // 发送爆仓消息
@@ -216,4 +226,17 @@
        }
        producer.sendPriceOperate(JSONObject.toJSONString(model));
    }
    @Override
    public void closingFollowOrders(String orderNo) {
        List<FollowFollowerOrderRelationEntity> orderRelations = followFollowerOrderRelationDao.selectFollowHoldOrderByTradeOrderNo(orderNo);
        if (CollUtil.isNotEmpty(orderRelations)) {
            for (FollowFollowerOrderRelationEntity orderRelation : orderRelations) {
                List<Long> ids= new ArrayList<>();
                ids.add(orderRelation.getOrderId());
                rabbitOrderService.cancelHoldOrder(ids);
            }
        }
    }
}