Helius
2021-03-04 f04f4244ba77210f2303703ad085ae325e59cb15
src/main/java/com/xcong/excoin/modules/documentary/service/impl/FollowOrderOperationServiceImpl.java
@@ -1,8 +1,11 @@
package com.xcong.excoin.modules.documentary.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xcong.excoin.common.enumerates.CoinTypeEnum;
import com.xcong.excoin.common.enumerates.RabbitPriceTypeEnum;
import com.xcong.excoin.common.response.Result;
@@ -26,11 +29,9 @@
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.MemberSettingDao;
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.member.entity.*;
import com.xcong.excoin.modules.platform.entity.PlatformTradeSettingEntity;
import com.xcong.excoin.rabbit.pricequeue.OrderModel;
import com.xcong.excoin.rabbit.producer.OrderProducer;
@@ -40,6 +41,7 @@
import com.xcong.excoin.utils.ThreadPoolUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
@@ -79,15 +81,29 @@
    private RabbitOrderService rabbitOrderService;
    @Resource
    private MemberLevelRateDao memberLevelRateDao;
    @Resource
    private MemberSettingDao memberSettingDao;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addFollowerOrder(Long id) {
        log.info("进入跟单处理逻辑");
        log.info("进入跟单处理逻辑 : {}", id);
        // 查询交易员订单
        ContractHoldOrderEntity holdOrderEntity = contractHoldOrderDao.selectById(id);
        while (holdOrderEntity == null) {
            try {
                log.info("等待事务提交:{}", id);
                Thread.sleep(200);
                holdOrderEntity = contractHoldOrderDao.selectById(id);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        List<FollowFollowerSettingEntity> followerSettings = followFollowerSettingDao.selectAllFollowerSettingByTradeMemberId(holdOrderEntity.getMemberId());
        log.info("进入跟单处理逻辑---跟单人数"+followerSettings.size());
        // 开仓价
        BigDecimal openPrice = holdOrderEntity.getOpeningPrice();
        PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting();
@@ -151,6 +167,7 @@
                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;
                }
@@ -164,6 +181,7 @@
                followHoldOrder.setTradeType(ContractHoldOrderEntity.TRADE_TYPE_MARK);
                followHoldOrder.setSymbol(holdOrderEntity.getSymbol());
                followHoldOrder.setSymbolCnt(symbolCnt);
                followHoldOrder.setSymbolCntSale(symbolCnt);
                followHoldOrder.setSymbolSku(lotNumber);
                followHoldOrder.setLeverRatio(levelRateEntity.getLevelRateUp());
                followHoldOrder.setForceClosingPrice(forceClosingPrice);
@@ -196,7 +214,7 @@
                    followFollowerOrderRelationDao.insert(relationEntity);
                    // 发送爆仓消息
                    sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), forceClosingPrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo());
                    sendOrderBombMsg(followHoldOrder.getId(), followHoldOrder.getOpeningType(), forceClosingPrice, followHoldOrder.getSymbol(), followHoldOrder.getOperateNo(), followHoldOrder.getMemberId());
                    // 计算佣金
                    ThreadPoolUtils.calReturnMoney(memberEntity.getId(), contractOrderEntity.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_OPEN);
@@ -209,19 +227,26 @@
                        LogRecordUtils.insertMemberAccountFlow(memberEntity.getId(), prePaymentAmount, walletContract.getAvailableBalance().subtract(prePaymentAmount), holdOrderEntity.getSymbol(), "买跌持仓", "买跌:" + holdOrderEntity.getSymbol());
                        LogRecordUtils.insertFollowerNotice(memberEntity.getId(), NoticeConstant.OPEN_ORDER_TITLE, StrUtil.format(NoticeConstant.OPEN_ORDER_CONTENT, holdOrderEntity.getSymbol() + "开空", openPrice, followTraderInfoEntity.getNickname()));
                    }
                    //更新更新消息提醒的状态
                    MemberSettingEntity memberSettingEntity = memberSettingDao.selectMemberSettingByMemberId(memberEntity.getId());
                    if(ObjectUtil.isNotEmpty(memberSettingEntity)){
                       log.info("更新更新消息提醒的状态");
                       memberSettingEntity.setMessageReminder(1);
                       memberSettingDao.updateById(memberSettingEntity);
                    }
                }
            }
        }
    }
    public void sendOrderBombMsg(Long id, int type, BigDecimal forceClosingPrice, String symbol, int operateNo) {
    public void sendOrderBombMsg(Long id, int type, BigDecimal forceClosingPrice, String symbol, int operateNo, Long memberId) {
        OrderModel model = null;
        // 开多
        if (ContractHoldOrderEntity.OPENING_TYPE_MORE == type) {
            model = new OrderModel(id, RabbitPriceTypeEnum.CLOSE_MORE_BOMB.getValue(), forceClosingPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), symbol, operateNo);
            model = new OrderModel(id, RabbitPriceTypeEnum.CLOSE_MORE_BOMB.getValue(), forceClosingPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), symbol, operateNo, memberId);
            // 开空
        } else {
            model = new OrderModel(id, RabbitPriceTypeEnum.CLOSE_LESS_BOMB.getValue(), forceClosingPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), symbol, operateNo);
            model = new OrderModel(id, RabbitPriceTypeEnum.CLOSE_LESS_BOMB.getValue(), forceClosingPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), symbol, operateNo, memberId);
        }
        producer.sendPriceOperate(JSONObject.toJSONString(model));
    }