From 71b049a8efeb7c887138e51a04259e32e72a8db2 Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Sun, 13 Sep 2020 03:47:59 +0800 Subject: [PATCH] modify --- src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java | 79 +++++++++++++++++++++++++++++++++++---- 1 files changed, 71 insertions(+), 8 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 0fac134..3f590f4 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 @@ -24,11 +24,9 @@ import com.xcong.excoin.modules.contract.service.ContractHoldOrderService; 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.dao.TradeSettingDao; import com.xcong.excoin.modules.platform.entity.PlatformTradeSettingEntity; import com.xcong.excoin.rabbit.producer.OrderProducer; @@ -82,6 +80,8 @@ @Resource private MemberDao memberDao; + @Resource + private MemberSettingDao memberSettingDao; @Transactional(rollbackFor = Exception.class) @Override @@ -95,9 +95,8 @@ PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); - Long id = memberEntity.getId(); - MemberEntity selectById = memberDao.selectById(id); - BigDecimal spread = selectById.getSpread(); + MemberSettingEntity memberSetting = memberSettingDao.selectMemberSettingByMemberId(memberEntity.getId()); + BigDecimal spread = memberSetting.getSpread(); // 规格 BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(submitOrderDto.getSymbol()); @@ -252,6 +251,10 @@ // canAddMaxBond = BigDecimal.ZERO; // } BigDecimal canReduceMaxBond = holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getPrePaymentAmount()); + if (rewardRatio.compareTo(BigDecimal.ZERO) < 0) { + canReduceMaxBond = canReduceMaxBond.add(rewardRatio); + } + if (canReduceMaxBond.compareTo(BigDecimal.ZERO) < 0) { canReduceMaxBond = BigDecimal.ZERO; } @@ -437,6 +440,33 @@ if (holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getPrePaymentAmount()).subtract(changeBondDto.getAmount()).compareTo(BigDecimal.ZERO) < 0) { return Result.fail("超出保证金最大减少金额"); } + BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(holdOrderEntity.getSymbol()))); + + BigDecimal rewardRatio = BigDecimal.ZERO; + // 开多 + if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) { + // (最新价-开仓价)*规格*张数 + rewardRatio = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(holdOrderEntity.getSymbolSku()).multiply(new BigDecimal(holdOrderEntity.getSymbolCnt())); + // 开空 + } else { + // (开仓价-最新价)*规格*张数 + rewardRatio = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(holdOrderEntity.getSymbolSku()).multiply(new BigDecimal(holdOrderEntity.getSymbolCnt())); + } + + if (memberEntity.getIsProfit() == MemberEntity.IS_PROFIT_Y) { + PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); + if (rewardRatio.compareTo(BigDecimal.ZERO) > -1) { + rewardRatio = rewardRatio.multiply(BigDecimal.ONE.subtract(tradeSettingEntity.getProfitParam())); + } + } + + if (rewardRatio.compareTo(BigDecimal.ZERO) < 0) { + BigDecimal canReduceMax = holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getPrePaymentAmount()).add(rewardRatio); + if (canReduceMax.subtract(changeBondDto.getAmount()).compareTo(BigDecimal.ZERO) < 0) { + return Result.fail("超出保证金最大减少金额"); + } + } + memberWalletContractDao.increaseWalletContractBalanceById(changeBondDto.getAmount(), null, null, walletContract.getId()); holdOrderEntity.setBondAmount(holdOrderEntity.getBondAmount().subtract(changeBondDto.getAmount())); } @@ -612,7 +642,7 @@ } else { BigDecimal available = walletContractEntity.getAvailableBalance(); BigDecimal lessAmount = thisTimeHold.subtract(available); - MemberEntity memberEntity = memberDao.selectById(holdOrderEntity.getId()); + MemberEntity memberEntity = memberDao.selectById(holdOrderEntity.getMemberId()); memberWalletContractDao.increaseWalletContractBalanceById(available.negate(), available.negate(), null, walletContractEntity.getId()); BigDecimal newBondAmount = holdOrderEntity.getBondAmount().subtract(lessAmount); @@ -643,4 +673,37 @@ } producer.sendPriceOperate(JSONObject.toJSONString(model)); } + + @Transactional(rollbackFor = Exception.class) + @Override + public void calHoldFeeAmountForBondAmount() { + List<ContractHoldOrderEntity> list = contractHoldOrderDao.selectAllHoldOrder(); + PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); + + if (CollUtil.isNotEmpty(list)) { + for (ContractHoldOrderEntity holdOrderEntity : list) { + BigDecimal holdAmount = holdOrderEntity.getHoldAmount(); + if (holdAmount == null) { + holdAmount = BigDecimal.ZERO; + } + + BigDecimal thisTimeHold = holdOrderEntity.getBondAmount().multiply(tradeSettingEntity.getDoingRatio()); + log.info("订单编号:{}, 持仓费:{}", holdOrderEntity.getOrderNo(), thisTimeHold); + + MemberEntity memberEntity = memberDao.selectById(holdOrderEntity.getMemberId()); + BigDecimal subBond = holdOrderEntity.getBondAmount().subtract(thisTimeHold); + + BigDecimal newForcePrice = CalculateUtil.getForceSetPrice(subBond.subtract(holdOrderEntity.getOpeningFeeAmount()), holdOrderEntity.getOpeningPrice(), holdOrderEntity.getSymbolCnt(), holdOrderEntity.getSymbolSku(), holdOrderEntity.getOpeningType(), memberEntity); + holdAmount = holdAmount.add(thisTimeHold); + holdOrderEntity.setBondAmount(subBond); + holdOrderEntity.setHoldAmount(holdAmount); + holdOrderEntity.setForceClosingPrice(newForcePrice); + holdOrderEntity.setOperateNo(holdOrderEntity.getOperateNo() + 1); + contractHoldOrderDao.updateById(holdOrderEntity); + + // 发送爆仓消息 + sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), newForcePrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo()); + } + } + } } -- Gitblit v1.9.1