Helius
2020-08-29 5c96a980c662796045c1b741015e58790409e191
modify
1 files modified
151 ■■■■■ changed files
src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java 151 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java
@@ -738,69 +738,17 @@
                    contractHoldOrderService.updateOrderIsCanClosingAndBatchNoById(orderId);
                    continue;
                }
                boolean isDone = false;
                Long memId = coinsOrder.getMemberId();
                BigDecimal nowPrice = coinsOrder.getForceClosingPrice();
                // 创建订单(加入历史表的订单)
                ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(coinsOrder);
                //查询是否满足爆仓条件
                if (coinsOrder.getOpeningType() == ContractHoldOrderEntity.OPENING_TYPE_MORE) {
                    //如果是开多,当前价小于预估强平价即为爆仓
                    // 设置平仓类型 // 爆仓平多
                    contractOrderEntity.setClosingType(4);
                    //更新用户钱包数据
                    isDone = true;
                if (ContractEntrustOrderEntity.POSITION_TYPE_ADD == coinsOrder.getPositionType()) {
                    bombOrder(coinsOrder);
                } else {
                    //如果是开空,当前价大于预估强平价即为爆仓
                    contractOrderEntity.setClosingType(5);
                    //更新主表订单状态位为“已平仓”
                    isDone = true;
                    List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(coinsOrder.getMemberId(), coinsOrder.getSymbol());
                    if (CollectionUtils.isNotEmpty(holdOrderEntities)) {
                        for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) {
                            bombOrder(holdOrderEntity);
                        }
                }
                if (isDone) {
                    //删除次仓订单
                    contractHoldOrderService.removeById(orderId);
                    // 订单状态转换
                    if (ContractOrderEntity.ORDER_TYPE_OPEN_MORE == contractOrderEntity.getOrderType()) {
                        contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_MORE);
                    } else {
                        contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_LESS);
                    }
                    //更新主表订单状态位为“已平仓”
                    contractOrderEntity.setId(null);
                    contractOrderEntity.setClosingPrice(nowPrice);
                    contractOrderEntity.setClosingTime(new Date());
                    contractOrderEntity.setClosingFeeAmount(coinsOrder.getOpeningFeeAmount());
                    if (coinsOrder.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) {
                        contractOrderEntity.setRewardAmount(coinsOrder.getBondAmount().subtract(contractOrderEntity.getOpeningFeeAmount()).negate());
                        contractOrderService.save(contractOrderEntity);
                        //更新用户钱包数据
                        MemberWalletContractEntity usdt = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memId, "USDT");
                        // 减去的时候用负数
                        BigDecimal totalPrice = coinsOrder.getBondAmount().negate();
                        memberWalletContractService.increaseWalletContractBalanceById(null, totalPrice, null, usdt.getId());
                        // 流水记录 TODO
                        MemberAccountFlowEntity record = new MemberAccountFlowEntity();
                        record.setCreateTime(new Date());
                        record.setSource("系统自动平仓");
                        record.setRemark("系统自动平仓");
                        record.setBalance(usdt.getAvailableBalance());
                        record.setMemberId(memId);
                        record.setSymbol(coinsOrder.getSymbol());
                        record.setPrice(coinsOrder.getBondAmount());
                        memberAccountFlowEntityDao.insert(record);
                    } else {
                        MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memId, CoinTypeConvert.convertContractTypeToCoin(coinsOrder.getSymbol()));
                        contractOrderEntity.setRewardAmount(wallet.getTotalBalance().subtract(coinsOrder.getOpeningFeeAmount()).negate());
                        contractOrderService.save(contractOrderEntity);
                        memberWalletContractService.increaseWalletContractBalanceById(wallet.getAvailableBalance().negate(), wallet.getTotalBalance().negate(), null, wallet.getId());
                        MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(coinsOrder.getMemberId(), CoinTypeConvert.convertContractTypeToCoin(coinsOrder.getSymbol()));
                        // 流水记录 TODO
                        MemberAccountFlowEntity record = new MemberAccountFlowEntity();
@@ -808,12 +756,93 @@
                        record.setSource("系统自动平仓");
                        record.setRemark("系统自动平仓");
                        record.setBalance(BigDecimal.ZERO);
                        record.setMemberId(memId);
                        record.setMemberId(coinsOrder.getMemberId());
                        record.setSymbol(coinsOrder.getSymbol());
                        record.setPrice(wallet.getTotalBalance().subtract(coinsOrder.getOpeningFeeAmount()));
                        memberAccountFlowEntityDao.insert(record);
                    }
                }
            }
        }
    }
    private void bombOrder(ContractHoldOrderEntity coinsOrder) {
        Long orderId = coinsOrder.getId();
        boolean isDone = false;
        Long memId = coinsOrder.getMemberId();
        BigDecimal nowPrice = coinsOrder.getForceClosingPrice();
        // 创建订单(加入历史表的订单)
        ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(coinsOrder);
        //查询是否满足爆仓条件
        if (coinsOrder.getOpeningType() == ContractHoldOrderEntity.OPENING_TYPE_MORE) {
            //如果是开多,当前价小于预估强平价即为爆仓
            // 设置平仓类型 // 爆仓平多
            contractOrderEntity.setClosingType(4);
            //更新用户钱包数据
            isDone = true;
        } else {
            //如果是开空,当前价大于预估强平价即为爆仓
            contractOrderEntity.setClosingType(5);
            //更新主表订单状态位为“已平仓”
            isDone = true;
        }
        if (isDone) {
            //删除次仓订单
            contractHoldOrderService.removeById(orderId);
            // 订单状态转换
            if (ContractOrderEntity.ORDER_TYPE_OPEN_MORE == contractOrderEntity.getOrderType()) {
                contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_MORE);
            } else {
                contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_LESS);
            }
            //更新主表订单状态位为“已平仓”
            contractOrderEntity.setId(null);
            contractOrderEntity.setClosingPrice(nowPrice);
            contractOrderEntity.setClosingTime(new Date());
            contractOrderEntity.setClosingFeeAmount(coinsOrder.getOpeningFeeAmount());
            if (coinsOrder.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) {
                contractOrderEntity.setRewardAmount(coinsOrder.getBondAmount().subtract(contractOrderEntity.getOpeningFeeAmount()).negate());
                contractOrderService.save(contractOrderEntity);
                //更新用户钱包数据
                MemberWalletContractEntity usdt = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memId, "USDT");
                // 减去的时候用负数
                BigDecimal totalPrice = coinsOrder.getBondAmount().negate();
                memberWalletContractService.increaseWalletContractBalanceById(null, totalPrice, null, usdt.getId());
                // 流水记录 TODO
                MemberAccountFlowEntity record = new MemberAccountFlowEntity();
                record.setCreateTime(new Date());
                record.setSource("系统自动平仓");
                record.setRemark("系统自动平仓");
                record.setBalance(usdt.getAvailableBalance());
                record.setMemberId(memId);
                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()));
                }
                contractOrderEntity.setRewardAmount(rewardRatio);
                contractOrderService.save(contractOrderEntity);
                memberWalletContractService.increaseWalletContractBalanceById(wallet.getAvailableBalance().negate(), wallet.getTotalBalance().negate(), null, wallet.getId());
            }
        }
    }