xiaoyong931011
2021-03-25 349589ac13f62c44ceb7638adf16973cc5fb07d5
src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java
@@ -1,8 +1,11 @@
package com.xcong.excoin.modules.contract.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xcong.excoin.common.contants.AppContants;
import com.xcong.excoin.common.enumerates.CoinTypeEnum;
import com.xcong.excoin.modules.coin.dao.MemberAccountFlowEntityDao;
import com.xcong.excoin.modules.coin.entity.MemberAccountFlowEntity;
import com.xcong.excoin.modules.contract.dao.ContractEntrustOrderDao;
@@ -15,6 +18,10 @@
import com.xcong.excoin.modules.contract.service.ContractEntrustOrderService;
import com.xcong.excoin.modules.contract.service.ContractHoldOrderService;
import com.xcong.excoin.modules.contract.service.ContractOrderService;
import com.xcong.excoin.modules.documentary.dao.FollowFollowerProfitDao;
import com.xcong.excoin.modules.documentary.dao.FollowFollowerSettingDao;
import com.xcong.excoin.modules.documentary.entity.FollowFollowerSettingEntity;
import com.xcong.excoin.modules.documentary.service.FollowOrderOperationService;
import com.xcong.excoin.modules.member.dao.AgentReturnDao;
import com.xcong.excoin.modules.member.dao.MemberSettingDao;
import com.xcong.excoin.modules.member.entity.AgentReturnEntity;
@@ -58,6 +65,12 @@
    MemberWalletContractService memberWalletContractService;
    @Resource
    FollowFollowerProfitDao followFollowerProfitDao;
    @Resource
    FollowFollowerSettingDao followFollowerSettingDao;
    @Resource
    CacheSettingUtils cacheSettingUtils;
    @Resource
@@ -79,7 +92,8 @@
    private ContractEntrustOrderDao contractEntrustOrderDao;
    @Resource
    private RedisUtils redisUtils;
    @Resource
    private FollowOrderOperationService followOrderOperationService;
    public void dealOrderFromMq(List<OrderModel> list, Integer type) {
        if (CollectionUtils.isNotEmpty(list)) {
@@ -185,12 +199,7 @@
                    // 本次需要退回的保证金
                    BigDecimal prePrice = order.getBondAmount();
                    Long memberId = order.getMemberId();
                    MemberWalletContractEntity wallet;
                    if (order.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) {
                        wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT");
                    } else {
                        wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeConvert.convertContractTypeToCoin(order.getSymbol()));
                    }
                    MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name());
                    if (wallet != null) {
                        // 历史订单
@@ -199,7 +208,7 @@
                        contractOrderEntity.setId(null);
                        // 本次平仓数量
                        int currentFlat = order.getSymbolCnt();
                        int currentFlat = order.getSymbolCntSale();
                        BigDecimal symbolSku = cacheSettingUtils.getSymbolSku(order.getSymbol());
                        // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率
                        BigDecimal profitLossPrice = (closePrice
@@ -248,6 +257,7 @@
                        // 全仓模式,止盈/止损 删除委托平仓
                        if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) {
                            ThreadPoolUtils.sendWholePrice(memberId);
                            deleteEntrustCloseOrder(order.getOrderNo());
                        }
                    }
@@ -290,12 +300,8 @@
                    // 本次需要退回的预付款
                    BigDecimal prePrice = order.getBondAmount();
                    Long memberId = order.getMemberId();
                    MemberWalletContractEntity wallet;
                    if (order.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) {
                        wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT");
                    } else {
                        wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeConvert.convertContractTypeToCoin(order.getSymbol()));
                    }
                    MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name());
                    if (wallet != null) {
                        // 历史订单
                        ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(order);
@@ -303,7 +309,7 @@
                        contractOrderEntity.setId(null);
                        // 本次平仓数量
                        int currentFlat = order.getSymbolCnt();
                        int currentFlat = order.getSymbolCntSale();
                        BigDecimal symbolSku = cacheSettingUtils.getSymbolSku(order.getSymbol());
                        // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率
                        BigDecimal profitLossPrice = (order.getOpeningPrice()
@@ -352,6 +358,7 @@
                        // 全仓模式,止盈/止损 删除委托平仓
                        if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) {
                            ThreadPoolUtils.sendWholePrice(memberId);
                            deleteEntrustCloseOrder(order.getOrderNo());
                        }
                    }
@@ -395,12 +402,7 @@
                    Long memberId = order.getMemberId();
                    // 本次需要退回的预付款
                    BigDecimal prePrice = order.getBondAmount();
                    MemberWalletContractEntity wallet;
                    if (order.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) {
                        wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT");
                    } else {
                        wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeConvert.convertContractTypeToCoin(order.getSymbol()));
                    }
                    MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name());
                    if (wallet != null) {
                        // 历史订单
@@ -409,7 +411,7 @@
                        contractOrderEntity.setId(null);
                        // 本次平仓数量
                        int currentFlat = order.getSymbolCnt();
                        int currentFlat = order.getSymbolCntSale();
                        BigDecimal symbolSku = cacheSettingUtils.getSymbolSku(order.getSymbol());
                        // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率
                        BigDecimal profitLossPrice = (closePrice
@@ -455,6 +457,7 @@
                        // 全仓模式,止盈/止损 删除委托平仓
                        if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) {
                            ThreadPoolUtils.sendWholePrice(memberId);
                            deleteEntrustCloseOrder(order.getOrderNo());
                        }
                    }
@@ -497,12 +500,7 @@
                    Long memberId = order.getMemberId();
                    // 本次需要退回的预付款
                    BigDecimal prePrice = order.getBondAmount();
                    MemberWalletContractEntity wallet;
                    if (order.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) {
                        wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT");
                    } else {
                        wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeConvert.convertContractTypeToCoin(order.getSymbol()));
                    }
                    MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name());
                    if (wallet != null) {
                        // 历史订单
@@ -511,7 +509,7 @@
                        contractOrderEntity.setId(null);
                        // 本次平仓数量
                        int currentFlat = order.getSymbolCnt();
                        int currentFlat = order.getSymbolCntSale();
                        BigDecimal symbolSku = cacheSettingUtils.getSymbolSku(order.getSymbol());
                        // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率
                        BigDecimal profitLossPrice = (order.getOpeningPrice()
@@ -557,6 +555,7 @@
                        // 全仓模式,止盈/止损 删除委托平仓
                        if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) {
                            ThreadPoolUtils.sendWholePrice(memberId);
                            deleteEntrustCloseOrder(order.getOrderNo());
                        }
                    }
@@ -637,6 +636,7 @@
                contractHoldOrderEntity.setOpeningPrice(entrustPrice);
                contractHoldOrderEntity.setTradeType(ContractHoldOrderEntity.TRADE_TYPE_LIMIT);
                contractHoldOrderEntity.setOperateNo(1);
                contractHoldOrderEntity.setSymbolCntSale(contractHoldOrderEntity.getSymbolCnt());
                contractHoldOrderService.save(contractHoldOrderEntity);
                // 需要一个历史插入
@@ -651,11 +651,11 @@
                // 市价
                if (coinsCoinsOrder.getEntrustType() == 1) {
                    // 开多
                    OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 6, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1);
                    OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 6, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1, coinsCoinsOrder.getMemberId());
                    producer.sendPriceOperate(JSONObject.toJSONString(model));
                } else {
                    // 开空
                    OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 7, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1);
                    OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 7, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1, coinsCoinsOrder.getMemberId());
                    producer.sendPriceOperate(JSONObject.toJSONString(model));
                }
                // 扣除手续费
@@ -671,7 +671,22 @@
    private void wholeEntrustOrder(ContractEntrustOrderEntity entrustOrder) {
        log.info("全仓委托逻辑处理:{}", entrustOrder.getOrderNo());
        MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(entrustOrder.getMemberId(), CoinTypeConvert.convertContractTypeToCoin(entrustOrder.getSymbol()));
        int i = 1;
        while (true) {
            List<Object> types = redisUtils.lGet(AppContants.MEMBER_TYPE + entrustOrder.getMemberId(), 0, -1);
            if (CollUtil.isEmpty(types)) {
                break;
            }
            log.info("存在止盈/止损/爆仓/委托平仓,等待 -- {}", i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            i++;
        }
        MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(entrustOrder.getMemberId(), CoinTypeEnum.USDT.name());
        PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting();
        MemberEntity member = memberService.getById(entrustOrder.getMemberId());
@@ -703,6 +718,7 @@
            holdOrderEntity.setOperateNo(1);
            // 设置合约类型
            holdOrderEntity.setContractType(ContractOrderEntity.CONTRACTTYPE_NORMAL);
            holdOrderEntity.setHoldBond(CalculateUtil.calMemberHoldBond(holdOrderEntity));
            ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity);
            contractOrderEntity.setOpeningTime(new Date());
@@ -713,6 +729,8 @@
            if (isSuccess) {
                contractEntrustOrderService.removeById(entrustOrder.getId());
                memberWalletContractService.increaseWalletContractBalanceById(null, openFeePrice.negate(), entrustOrder.getBondAmount().negate(), wallet.getId());
                ThreadPoolUtils.sendWholePrice(member.getId());
                // 发送强平价
                ThreadPoolUtils.sendWholeForceClosingPrice(entrustOrder.getSymbol(), member);
@@ -767,6 +785,7 @@
     *
     * @param
     */
    @Transactional(rollbackFor = Exception.class)
    public void dealCoinOut(List<ContractHoldOrderEntity> orderList, List<OrderModel> orderModels) {
        if (CollectionUtils.isNotEmpty(orderList)) {
            Map<Long, Integer> modelMap = new HashMap<Long, Integer>();
@@ -788,6 +807,7 @@
                    continue;
                }
                // 仅逐仓有用
                if (ContractEntrustOrderEntity.POSITION_TYPE_ADD == coinsOrder.getPositionType()) {
                    bombOrder(coinsOrder);
                } else {
@@ -797,7 +817,7 @@
                            bombOrder(holdOrderEntity);
                        }
                        MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(coinsOrder.getMemberId(), CoinTypeConvert.convertContractTypeToCoin(coinsOrder.getSymbol()));
                        MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(coinsOrder.getMemberId(), CoinTypeEnum.USDT.name());
                        // 流水记录 TODO
                        MemberAccountFlowEntity record = new MemberAccountFlowEntity();
@@ -858,7 +878,7 @@
                contractOrderService.save(contractOrderEntity);
                //更新用户钱包数据
                MemberWalletContractEntity usdt = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memId, "USDT");
                MemberWalletContractEntity usdt = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memId, CoinTypeEnum.USDT.name());
                // 减去的时候用负数
                BigDecimal totalPrice = coinsOrder.getBondAmount().negate();
@@ -874,24 +894,50 @@
                record.setSymbol(coinsOrder.getSymbol());
                record.setPrice(coinsOrder.getBondAmount());
                memberAccountFlowEntityDao.insert(record);
            } else {
                MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memId, CoinTypeConvert.convertContractTypeToCoin(coinsOrder.getSymbol()));
                BigDecimal rewardRatio = BigDecimal.ZERO;
                // 开多
                if (ContractHoldOrderEntity.OPENING_TYPE_MORE == coinsOrder.getOpeningType()) {
                    // (最新价-开仓价)*规格*张数
                    rewardRatio = nowPrice.subtract(coinsOrder.getOpeningPrice()).multiply(coinsOrder.getSymbolSku()).multiply(new BigDecimal(coinsOrder.getSymbolCntSale()));
                    // 开空
                } else {
                    // (开仓价-最新价)*规格*张数
                    rewardRatio = coinsOrder.getOpeningPrice().subtract(nowPrice).multiply(coinsOrder.getSymbolSku()).multiply(new BigDecimal(coinsOrder.getSymbolCntSale()));
                MemberEntity memberEntity = memberService.getById(memId);
                // 如果订单为交易员的订单,爆仓了,则旗下的所有跟单都进行平仓
                if (ContractOrderEntity.CONTRACTTYPE_DOCUMENTARY == coinsOrder.getContractType() && MemberEntity.IS_TRADER_Y.equals(memberEntity.getIsTrader())) {
                    followOrderOperationService.closingFollowOrders(coinsOrder.getOrderNo());
                }
                // 如果不是交易员,那么需要更新他的个人跟随者收益记录
                if (ContractOrderEntity.CONTRACTTYPE_DOCUMENTARY == coinsOrder.getContractType() && !MemberEntity.IS_TRADER_Y.equals(memberEntity.getIsTrader())) {
                    //获取当前的跟单设置(一次只允许跟单一个人),获取交易员MemberId
                    QueryWrapper<FollowFollowerSettingEntity> queryWrapper = new QueryWrapper<>();
                    queryWrapper.eq("member_id",coinsOrder.getMemberId());
                    FollowFollowerSettingEntity followFollowerSettingEntity = followFollowerSettingDao.selectOne(queryWrapper);
                    if(ObjectUtil.isNotEmpty(followFollowerSettingEntity)){
                        Long traderMemberId = followFollowerSettingEntity.getTraderMemberId();
                        followFollowerProfitDao.updateFollowerProfitByTradeMemberId(coinsOrder.getBondAmount().negate(), coinsOrder.getBondAmount().negate(), traderMemberId, memberEntity.getId());
                    }
                }
            } else {
                MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memId, "USDT");
//                BigDecimal rewardRatio = BigDecimal.ZERO;
//                // 开多
//                if (ContractHoldOrderEntity.OPENING_TYPE_MORE == coinsOrder.getOpeningType()) {
//                    // (最新价-开仓价)*规格*张数
//                    rewardRatio = nowPrice.subtract(coinsOrder.getOpeningPrice()).multiply(coinsOrder.getSymbolSku()).multiply(new BigDecimal(coinsOrder.getSymbolCntSale()));
//                    // 开空
//                } else {
//                    // (开仓价-最新价)*规格*张数
//                    rewardRatio = coinsOrder.getOpeningPrice().subtract(nowPrice).multiply(coinsOrder.getSymbolSku()).multiply(new BigDecimal(coinsOrder.getSymbolCntSale()));
//                }
                // 委托单总委托金额
                BigDecimal totalPrePayment = BigDecimal.ZERO;
                List<ContractEntrustOrderEntity> entrustOrderEntities = contractEntrustOrderDao.selectEntrustOrderListByMemberId(memId);
                if (CollUtil.isNotEmpty(entrustOrderEntities)) {
                    for (ContractEntrustOrderEntity entrustOrderEntity : entrustOrderEntities) {
                        totalPrePayment = totalPrePayment.add(entrustOrderEntity.getEntrustAmount());
                    }
                }
                contractOrderEntity.setRewardAmount(rewardRatio);
                contractOrderEntity.setRewardAmount(wallet.getTotalBalance().subtract(totalPrePayment).subtract(contractOrderEntity.getOpeningFeeAmount()).negate());
                contractOrderService.save(contractOrderEntity);
                memberWalletContractService.increaseWalletContractBalanceById(wallet.getAvailableBalance().negate(), wallet.getTotalBalance().negate(), null, wallet.getId());
                memberWalletContractService.increaseWalletContractBalanceById(wallet.getAvailableBalance().negate(), wallet.getTotalBalance().subtract(totalPrePayment).negate(), null, wallet.getId());
            }
        }
    }