From cdf75ee88f261d7c1344cd856c03e8c9611f032c Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Wed, 05 Aug 2020 16:19:51 +0800 Subject: [PATCH] modify --- src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java | 107 ++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 80 insertions(+), 27 deletions(-) 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 309274f..8627d17 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 @@ -22,6 +22,10 @@ import com.xcong.excoin.modules.contract.parameter.dto.*; import com.xcong.excoin.modules.contract.parameter.vo.*; import com.xcong.excoin.modules.contract.service.ContractHoldOrderService; +import com.xcong.excoin.modules.documentary.dao.FollowFollowerOrderRelationDao; +import com.xcong.excoin.modules.documentary.dao.FollowTraderInfoDao; +import com.xcong.excoin.modules.documentary.entity.FollowFollowerOrderRelationEntity; +import com.xcong.excoin.modules.documentary.entity.FollowTraderInfoEntity; import com.xcong.excoin.modules.member.dao.MemberDao; import com.xcong.excoin.modules.member.dao.MemberLevelRateDao; import com.xcong.excoin.modules.member.dao.MemberWalletContractDao; @@ -82,6 +86,11 @@ @Resource private MemberDao memberDao; + + @Resource + private FollowTraderInfoDao followTraderInfoDao; + @Resource + private FollowFollowerOrderRelationDao followFollowerOrderRelationDao; @Transactional(rollbackFor = Exception.class) @Override @@ -94,7 +103,7 @@ MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name()); PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); - + Long id = memberEntity.getId(); MemberEntity selectById = memberDao.selectById(id); BigDecimal spread = selectById.getSpread(); @@ -143,6 +152,16 @@ BigDecimal forceClosingPrice = CalculateUtil.getForceSetPrice(bondAmount, openingPrice, submitOrderDto.getSymbolCnt(), lotNumber, submitOrderDto.getOrderType(), memberEntity); log.info("强平价:{}", forceClosingPrice); + // 判断是否开启了带单 + boolean isOpenFollow = false; + FollowTraderInfoEntity tradeInfo = null; + if (MemberEntity.IS_TRADER_Y.equals(memberEntity.getIsTrader())) { + tradeInfo = followTraderInfoDao.selectTraderInfoByMemberId(memberEntity.getId()); + if (tradeInfo.getIsOpen().equals(FollowTraderInfoEntity.ISOPEN_Y)) { + isOpenFollow = true; + } + } + ContractHoldOrderEntity holdOrderEntity = new ContractHoldOrderEntity(); holdOrderEntity.setMemberId(memberEntity.getId()); holdOrderEntity.setOrderNo(commonService.generateOrderNo(memberEntity.getId())); @@ -160,15 +179,45 @@ holdOrderEntity.setIsCanClosing(ContractHoldOrderEntity.ORDER_CAN_CLOSING_Y); holdOrderEntity.setPrePaymentAmount(prePaymentAmount); holdOrderEntity.setBondAmount(bondAmount.add(openFeePrice)); + holdOrderEntity.setOperateNo(1); + // 设置合约类型 + holdOrderEntity.setContractType(isOpenFollow ? ContractOrderEntity.CONTRACTTYPE_DOCUMENTARY : ContractOrderEntity.CONTRACTTYPE_NORMAL); ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity); contractOrderEntity.setOpeningTime(new Date()); contractHoldOrderDao.insert(holdOrderEntity); int i = contractOrderDao.insert(contractOrderEntity); + if (i > 0) { memberWalletContractDao.increaseWalletContractBalanceById(prePaymentAmount.negate(), openFeePrice.negate(), null, walletContract.getId()); + + // 发送爆仓消息 + sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), forceClosingPrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo()); + // 计算佣金 ThreadPoolUtils.calReturnMoney(memberEntity.getId(), contractOrderEntity.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_OPEN); + + // 插入财务流水 + if (submitOrderDto.getOrderType() == ContractHoldOrderEntity.OPENING_TYPE_MORE) { + LogRecordUtils.insertMemberAccountFlow(memberEntity.getId(), prePaymentAmount, walletContract.getAvailableBalance().subtract(prePaymentAmount), submitOrderDto.getSymbol(), "买涨持仓", "买涨:" + submitOrderDto.getSymbol()); + } else { + LogRecordUtils.insertMemberAccountFlow(memberEntity.getId(), prePaymentAmount, walletContract.getAvailableBalance().subtract(prePaymentAmount), submitOrderDto.getSymbol(), "买跌持仓", "买跌:" + submitOrderDto.getSymbol()); + } + + // 若该用户为交易员且开启带单模式,则发送带单异步 + if (isOpenFollow) { + FollowFollowerOrderRelationEntity relationEntity = new FollowFollowerOrderRelationEntity(); + relationEntity.setIsShow(FollowFollowerOrderRelationEntity.IS_SHOW_Y); + relationEntity.setMemberId(holdOrderEntity.getMemberId()); + relationEntity.setOrderId(holdOrderEntity.getId()); + relationEntity.setOrderType(FollowFollowerOrderRelationEntity.ORDER_TYPE_HOLD); + relationEntity.setTradeId(tradeInfo.getId()); + relationEntity.setTradeMemberId(tradeInfo.getMemberId()); + relationEntity.setTradeOrderNo(holdOrderEntity.getOrderNo()); + followFollowerOrderRelationDao.insert(relationEntity); + + ThreadPoolUtils.sendFollowOrderTask(holdOrderEntity.getId()); + } return Result.ok("提交成功"); } return Result.fail("提交失败"); @@ -220,7 +269,7 @@ if (rewardRatio.compareTo(BigDecimal.ZERO) > -1) { rewardRatio = rewardRatio.multiply(BigDecimal.ONE.subtract(tradeSettingEntity.getProfitParam())); } else { - rewardRatio = rewardRatio.multiply(BigDecimal.ONE.add(tradeSettingEntity.getProfitParam())); +// rewardRatio = rewardRatio.multiply(BigDecimal.ONE.add(tradeSettingEntity.getProfitParam())); } } @@ -253,7 +302,7 @@ Map<String, Object> result = new HashMap<>(); result.put("hold", resultList); - result.put("totalProfitOrLoss", totalProfitOrLoss); + result.put("totalProfitOrLoss", totalProfitOrLoss.setScale(4, BigDecimal.ROUND_DOWN).toPlainString()); return Result.ok(result); } return Result.ok("success"); @@ -377,22 +426,25 @@ // 开多止盈 if (stopProfitPrice != null) { model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_MORE_STOP_PROFIT.getValue(), stopProfitPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol()); + producer.sendPriceOperate(JSONObject.toJSONString(model)); } // 开多止损 if (stopLessPrice != null) { model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_MORE_STOP_LESS.getValue(), stopLessPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol()); + producer.sendPriceOperate(JSONObject.toJSONString(model)); } } else { // 开空止盈 if (stopProfitPrice != null) { model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_LESS_STOP_PROFIT.getValue(), stopProfitPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol()); + producer.sendPriceOperate(JSONObject.toJSONString(model)); } // 开空止损 if (stopLessPrice != null) { model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_LESS_STOP_LESS.getValue(), stopLessPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol()); + producer.sendPriceOperate(JSONObject.toJSONString(model)); } } - producer.sendPriceOperate(JSONObject.toJSONString(model)); return Result.ok("设置成功"); } return Result.fail("设置失败"); @@ -414,14 +466,14 @@ if (changeBondDto.getAmount().compareTo(walletContract.getAvailableBalance()) > 0) { return Result.fail("可用余额不足"); } - memberWalletContractDao.increaseWalletContractBalanceById(changeBondDto.getAmount().negate(), null, changeBondDto.getAmount(), walletContract.getId()); + memberWalletContractDao.increaseWalletContractBalanceById(changeBondDto.getAmount().negate(), null, null, walletContract.getId()); holdOrderEntity.setBondAmount(holdOrderEntity.getBondAmount().add(changeBondDto.getAmount())); // 减少保证金 } else { if (holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getPrePaymentAmount()).subtract(changeBondDto.getAmount()).compareTo(BigDecimal.ZERO) < 0) { return Result.fail("超出保证金最大减少金额"); } - memberWalletContractDao.increaseWalletContractBalanceById(changeBondDto.getAmount(), null, changeBondDto.getAmount().negate(), walletContract.getId()); + memberWalletContractDao.increaseWalletContractBalanceById(changeBondDto.getAmount(), null, null, walletContract.getId()); holdOrderEntity.setBondAmount(holdOrderEntity.getBondAmount().subtract(changeBondDto.getAmount())); } @@ -432,15 +484,8 @@ int i = contractHoldOrderDao.updateById(holdOrderEntity); if (i > 0) { - OrderModel model = null; - // 开多 - if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) { - model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_MORE_BOMB.getValue(), forceClosingPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol()); - // 开空 - } else { - model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_LESS_BOMB.getValue(), forceClosingPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol()); - } - producer.sendPriceOperate(JSONObject.toJSONString(model)); + // 发送爆仓消息 + sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), forceClosingPrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo()); return Result.ok("调整成功"); } return Result.fail("调整失败"); @@ -543,7 +588,8 @@ HoldOrderDetailVo holdOrderDetailVo = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrderDetailVo(holdOrderEntity); BigDecimal feeSpread = cacheSettingUtils.getTradeSetting().getFeeSpreadRatio(); - holdOrderDetailVo.setOpeningFeeAmount(holdOrderDetailVo.getOpeningFeeAmount().multiply(feeSpread).setScale(8, BigDecimal.ROUND_DOWN)); +// holdOrderDetailVo.setOpeningFeeAmount(holdOrderDetailVo.getOpeningFeeAmount().multiply(feeSpread).setScale(8, BigDecimal.ROUND_DOWN)); + holdOrderDetailVo.setOpeningFeeAmount(holdOrderEntity.getOpeningFeeAmount(), feeSpread); return Result.ok(holdOrderDetailVo); } @@ -569,8 +615,10 @@ OrderDetailVo orderDetailVo = ContractOrderEntityMapper.INSTANCE.entityToDetailVo(contractOrderEntity); BigDecimal feeSpread = cacheSettingUtils.getTradeSetting().getFeeSpreadRatio(); - orderDetailVo.setClosingFeeAmount(orderDetailVo.getClosingFeeAmount() == null ? orderDetailVo.getClosingFeeAmount() : orderDetailVo.getClosingFeeAmount().multiply(feeSpread).setScale(8, BigDecimal.ROUND_DOWN)); - orderDetailVo.setOpeningFeeAmount(orderDetailVo.getOpeningFeeAmount().multiply(feeSpread).setScale(8, BigDecimal.ROUND_DOWN)); +// orderDetailVo.setClosingFeeAmount(orderDetailVo.getClosingFeeAmount() == null ? orderDetailVo.getClosingFeeAmount() : orderDetailVo.getClosingFeeAmount().multiply(feeSpread).setScale(8, BigDecimal.ROUND_DOWN)); +// orderDetailVo.setOpeningFeeAmount(orderDetailVo.getOpeningFeeAmount() == null ? orderDetailVo.getOpeningFeeAmount() : orderDetailVo.getOpeningFeeAmount().multiply(feeSpread).setScale(8, BigDecimal.ROUND_DOWN)); + orderDetailVo.setOpeningFeeAmount(contractOrderEntity.getOpeningFeeAmount(), feeSpread); + orderDetailVo.setClosingFeeAmount(contractOrderEntity.getClosingFeeAmount(), feeSpread); return Result.ok(orderDetailVo); } @@ -613,17 +661,22 @@ holdOrderEntity.setOperateNo(holdOrderEntity.getOperateNo() + 1); contractHoldOrderDao.updateById(holdOrderEntity); - OrderModel model = null; - // 开多 - if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) { - model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_MORE_BOMB.getValue(), newForcePrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol()); - // 开空 - } else { - model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_LESS_BOMB.getValue(), newForcePrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol()); - } - producer.sendPriceOperate(JSONObject.toJSONString(model)); + // 发送爆仓消息 + sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), newForcePrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo()); } } } } + + public void sendOrderBombMsg(Long id, int type, BigDecimal forceClosingPrice, String symbol, int operateNo) { + 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); + // 开空 + } else { + model = new OrderModel(id, RabbitPriceTypeEnum.CLOSE_LESS_BOMB.getValue(), forceClosingPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), symbol, operateNo); + } + producer.sendPriceOperate(JSONObject.toJSONString(model)); + } } -- Gitblit v1.9.1