From 55a4f22db43ec34bc7f59103f4a94005bd613850 Mon Sep 17 00:00:00 2001 From: zainali5120 <512061637@qq.com> Date: Wed, 31 Mar 2021 15:40:04 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/activity' into activity --- src/main/resources/mapper/contract/ContractOrderDao.xml | 19 + src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java | 66 +++-- src/main/java/com/xcong/excoin/modules/documentary/service/impl/FollowOrderOperationServiceImpl.java | 51 ++++ src/main/java/com/xcong/excoin/modules/coin/service/impl/CoinServiceImpl.java | 132 +++++++++++-- src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java | 53 ++++ src/main/java/com/xcong/excoin/modules/contract/controller/ContractOrderController.java | 17 + src/main/java/com/xcong/excoin/modules/contract/dao/ContractOrderDao.java | 4 src/main/java/com/xcong/excoin/modules/contract/parameter/dto/SymbolDto.java | 3 src/main/java/com/xcong/excoin/modules/documentary/dao/FollowFollowerProfitDao.java | 4 src/main/java/com/xcong/excoin/utils/CalculateUtil.java | 43 ++++ src/main/java/com/xcong/excoin/modules/documentary/dao/FollowFollowerOrderRelationDao.java | 1 src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java | 45 +++- src/test/java/com/xcong/excoin/WholeTest.java | 19 + src/main/resources/mapper/documentary/FollowTraderProfitDetailDao.xml | 13 + src/main/resources/mapper/documentary/FollowFollowerProfitDao.xml | 26 ++ src/main/java/com/xcong/excoin/quartz/job/LoopExecutorJob.java | 1 src/main/java/com/xcong/excoin/modules/documentary/common/NoticeConstant.java | 5 src/main/java/com/xcong/excoin/modules/documentary/dao/FollowTraderProfitDetailDao.java | 7 src/main/java/com/xcong/excoin/quartz/job/FollowProfitUpdateJob.java | 27 ++ src/main/java/com/xcong/excoin/modules/contract/service/ContractHoldOrderService.java | 4 src/main/resources/mapper/member/MemberAccountMoneyChangeDao.xml | 2 src/main/resources/mapper/documentary/FollowFollowerOrderRelationDao.xml | 7 22 files changed, 474 insertions(+), 75 deletions(-) diff --git a/src/main/java/com/xcong/excoin/modules/coin/service/impl/CoinServiceImpl.java b/src/main/java/com/xcong/excoin/modules/coin/service/impl/CoinServiceImpl.java index a3e53bb..48bd01d 100644 --- a/src/main/java/com/xcong/excoin/modules/coin/service/impl/CoinServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/coin/service/impl/CoinServiceImpl.java @@ -9,7 +9,13 @@ import javax.annotation.Resource; import javax.validation.Valid; +import com.xcong.excoin.modules.contract.dao.ContractHoldOrderDao; +import com.xcong.excoin.modules.contract.entity.ContractEntrustOrderEntity; +import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity; +import com.xcong.excoin.modules.contract.entity.ContractOrderEntity; import com.xcong.excoin.modules.platform.entity.PlatformCnyUsdtExchangeEntity; +import com.xcong.excoin.modules.platform.entity.PlatformTradeSettingEntity; +import com.xcong.excoin.utils.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -48,10 +54,6 @@ import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity; import com.xcong.excoin.modules.member.entity.MemberWalletContractEntity; import com.xcong.excoin.modules.platform.dao.PlatformCnyUsdtExchangeDao; -import com.xcong.excoin.utils.CoinTypeConvert; -import com.xcong.excoin.utils.MessageSourceUtils; -import com.xcong.excoin.utils.RedisUtils; -import com.xcong.excoin.utils.ThreadPoolUtils; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; @@ -81,6 +83,10 @@ MemberCoinWithdrawDao memberCoinWithdrawDao; @Resource RedisUtils redisUtils; + @Resource + CacheSettingUtils cacheSettingUtils; + @Resource + ContractHoldOrderDao contractHoldOrderDao; @Override @@ -318,7 +324,9 @@ //更新合约全仓模式下的订单权益 MemberEntity memberEntity = memberDao.selectById(memberId); String symbols = symbol+"/USDT"; - ThreadPoolUtils.sendWholeForceClosingPrice(symbols, memberEntity); + //ThreadPoolUtils.sendWholeForceClosingPrice(symbols, memberEntity); + // 全仓爆仓 + ThreadPoolUtils.sendWholePrice(memberEntity.getId()); //添加币币资金划转历史记录 MemberAccountMoneyChange memberAccountRecord = new MemberAccountMoneyChange(); @@ -402,15 +410,53 @@ @Override @Transactional(rollbackFor = Exception.class) public Result contractTransferToWalletCoins(BigDecimal balance, String symbol) { - if (balance.compareTo(BigDecimal.ZERO) <= 0) { + //获取用户ID + Long memberId = LoginUserUtils.getAppLoginUser().getId(); + MemberEntity memberEntity = memberDao.selectById(memberId); + if (balance.compareTo(BigDecimal.ZERO) <= 0) { return Result.fail(MessageSourceUtils.getString("member_service_0004")); } - //获取用户ID - Long memberId = LoginUserUtils.getAppLoginUser().getId(); - + //获取合约当前持仓类型 + Integer contractPositionType = memberEntity.getContractPositionType(); + // 总盈利 + BigDecimal totalProfitOrLess = BigDecimal.ZERO; + if(contractPositionType == 2){ + //获取全仓模式下的所有持仓信息 + PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); + List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberEntity.getId(),""); + if (CollUtil.isNotEmpty(holdOrderEntities)) { + for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) { + // 获取最新价 + BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(holdOrderEntity.getSymbol()))); + BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(holdOrderEntity.getSymbol()); + // 单个订单盈利 + BigDecimal profitOrLess = BigDecimal.ZERO; + // 开多 + if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) { + profitOrLess = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())).multiply(lotNumber); + // 开空 + } else { + profitOrLess = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())).multiply(lotNumber); + } + if (MemberEntity.IS_PROFIT_Y == memberEntity.getIsProfit()) { + if (profitOrLess.compareTo(BigDecimal.ZERO) > 0) { + profitOrLess = profitOrLess.multiply(BigDecimal.ONE.subtract(tradeSetting.getForceParam())); + } else { + profitOrLess = profitOrLess.multiply(BigDecimal.ONE.add(tradeSetting.getForceParam())); + } + } + totalProfitOrLess = totalProfitOrLess.add(profitOrLess); + } + } + } + String walletCode = MemberWalletCoinEnum.WALLETCOINCODE.getValue(); MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberId, symbol); BigDecimal availableBalance = walletContract.getAvailableBalance(); + //可用减去盈亏 + if(totalProfitOrLess.compareTo(BigDecimal.ZERO) < 0){ + availableBalance = availableBalance.add(totalProfitOrLess); + } // 扣币 BigDecimal availableSubtract = availableBalance.subtract(balance); if (availableSubtract.compareTo(BigDecimal.ZERO) < 0) { @@ -438,11 +484,9 @@ if (updateById < 1) { return Result.fail(MessageSourceUtils.getString("member_service_0096")); } - - //更新合约全仓模式下的订单权益 - MemberEntity memberEntity = memberDao.selectById(memberId); - String symbols = symbol+"/USDT"; - ThreadPoolUtils.sendWholeForceClosingPrice(symbols, memberEntity); + + // 全仓爆仓 + ThreadPoolUtils.sendWholePrice(memberEntity.getId()); //添加资金划转历史记录 MemberAccountMoneyChange memberAccountRecord = new MemberAccountMoneyChange(); @@ -467,8 +511,52 @@ public Result findWalletContractBySymbol(String symbol) { //获取用户ID Long memberId = LoginUserUtils.getAppLoginUser().getId(); + MemberEntity memberEntity = memberDao.selectById(memberId); + //获取合约当前持仓类型 + Integer contractPositionType = memberEntity.getContractPositionType(); + // 总盈利 + BigDecimal totalProfitOrLess = BigDecimal.ZERO; + if(contractPositionType == 2){ + //获取全仓模式下的所有持仓信息 + PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); + List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberEntity.getId(),""); + if (CollUtil.isNotEmpty(holdOrderEntities)) { + for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) { + // 获取最新价 + BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(holdOrderEntity.getSymbol()))); + BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(holdOrderEntity.getSymbol()); + // 单个订单盈利 + BigDecimal profitOrLess = BigDecimal.ZERO; + // 开多 + if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) { + profitOrLess = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())).multiply(lotNumber); + // 开空 + } else { + profitOrLess = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())).multiply(lotNumber); + } + if (MemberEntity.IS_PROFIT_Y == memberEntity.getIsProfit()) { + if (profitOrLess.compareTo(BigDecimal.ZERO) > 0) { + profitOrLess = profitOrLess.multiply(BigDecimal.ONE.subtract(tradeSetting.getForceParam())); + } else { + profitOrLess = profitOrLess.multiply(BigDecimal.ONE.add(tradeSetting.getForceParam())); + } + } + totalProfitOrLess = totalProfitOrLess.add(profitOrLess); + } + } + } + MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberId, symbol); - BigDecimal availableBalance = walletContract.getAvailableBalance().setScale(4, BigDecimal.ROUND_DOWN); + BigDecimal availableBalance = walletContract.getAvailableBalance(); + //可用减去盈亏 + if(totalProfitOrLess.compareTo(BigDecimal.ZERO) < 0){ + availableBalance = availableBalance.add(totalProfitOrLess); + } + if(availableBalance.compareTo(BigDecimal.ZERO) > 0){ + availableBalance = availableBalance.setScale(4, BigDecimal.ROUND_DOWN); + }else{ + availableBalance = BigDecimal.ZERO; + } return Result.ok(availableBalance); } @@ -682,7 +770,9 @@ //更新合约全仓模式下的订单权益 MemberEntity memberEntity = memberDao.selectById(memberId); String symbols = symbol+"/USDT"; - ThreadPoolUtils.sendWholeForceClosingPrice(symbols, memberEntity); + //ThreadPoolUtils.sendWholeForceClosingPrice(symbols, memberEntity); + // 全仓爆仓 + ThreadPoolUtils.sendWholePrice(memberEntity.getId()); //添加资金划转历史记录 memberAccountRecord.setMemberId(memberId); @@ -862,7 +952,9 @@ //更新合约全仓模式下的订单权益 MemberEntity memberEntity = memberDao.selectById(memberId); String symbols = symbolOut+"/USDT"; - ThreadPoolUtils.sendWholeForceClosingPrice(symbols, memberEntity); + //ThreadPoolUtils.sendWholeForceClosingPrice(symbols, memberEntity); + // 全仓爆仓 + ThreadPoolUtils.sendWholePrice(memberEntity.getId()); // 加币 // 查询合约账户 @@ -880,9 +972,9 @@ //更新合约全仓模式下的订单权益 String symbolIns = symbolIn+"/USDT"; - ThreadPoolUtils.sendWholeForceClosingPrice(symbolIns, memberEntity); - - ThreadPoolUtils.sendWholePrice(memberId); + //ThreadPoolUtils.sendWholeForceClosingPrice(symbolIns, memberEntity); + // 全仓爆仓 + ThreadPoolUtils.sendWholePrice(memberEntity.getId()); //添加币币资金划转历史记录 MemberAccountMoneyChange memberAccountRecord = new MemberAccountMoneyChange(); diff --git a/src/main/java/com/xcong/excoin/modules/contract/controller/ContractOrderController.java b/src/main/java/com/xcong/excoin/modules/contract/controller/ContractOrderController.java index fca4232..5f74494 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/controller/ContractOrderController.java +++ b/src/main/java/com/xcong/excoin/modules/contract/controller/ContractOrderController.java @@ -2,6 +2,8 @@ import com.xcong.excoin.common.LoginUserUtils; import com.xcong.excoin.common.response.Result; +import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity; +import com.xcong.excoin.modules.contract.entity.ContractOrderEntity; import com.xcong.excoin.modules.contract.parameter.dto.*; import com.xcong.excoin.modules.contract.parameter.vo.ContractMoneyInfoVo; import com.xcong.excoin.modules.contract.parameter.vo.HoldOrderListVo; @@ -76,6 +78,14 @@ @ApiOperation(value = "一键平仓") @PostMapping(value = "/oneKeyClosing") public Result oneKeyClosing(@RequestBody SymbolDto symbolDto) { + symbolDto.setType(ContractOrderEntity.CONTRACTTYPE_NORMAL); + return contractHoldOrderService.cancelHoldOrderBatch(symbolDto); + } + + @ApiOperation(value = "带单一键平仓") + @PostMapping(value = "/oneKeyClosingForFollow") + public Result oneKeyClosingForFollow(@RequestBody SymbolDto symbolDto) { + symbolDto.setType(ContractOrderEntity.CONTRACTTYPE_DOCUMENTARY); return contractHoldOrderService.cancelHoldOrderBatch(symbolDto); } @@ -127,6 +137,13 @@ return contractHoldOrderService.cancelHoldOrder(wholeCloseOrderDto); } + @ApiOperation(value = "全仓模式 - 一键平仓") + @PostMapping(value = "/oneKeyClosingForWhole") + public Result oneKeyClosingForWhole() { + SymbolDto symbolDto = new SymbolDto(); + return contractHoldOrderService.cancelHoldOrderBatch(symbolDto); + } + @ApiOperation(value = "全仓模式 - 变更仓位类型") @GetMapping(value = "/changePositionType") public Result changePositionType() { diff --git a/src/main/java/com/xcong/excoin/modules/contract/dao/ContractOrderDao.java b/src/main/java/com/xcong/excoin/modules/contract/dao/ContractOrderDao.java index 1ef44c6..0679e99 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/dao/ContractOrderDao.java +++ b/src/main/java/com/xcong/excoin/modules/contract/dao/ContractOrderDao.java @@ -33,4 +33,8 @@ int updateOrderProfitOrLessById(@Param("rewardAmount") BigDecimal rewardAmount, @Param("rewardRatio") BigDecimal rewardRatio, @Param("id") Long id); public BigDecimal getBurstUsdtByMemberId(@Param("memberId") Long memberId); + + public List<ContractOrderEntity> selectFollowOrderListByMemberId(@Param("tradeMemberId")Long tradeMemberId); + + public String selectOrderNoByOrderIds(@Param("orderId")Long orderId); } diff --git a/src/main/java/com/xcong/excoin/modules/contract/parameter/dto/SymbolDto.java b/src/main/java/com/xcong/excoin/modules/contract/parameter/dto/SymbolDto.java index 4319d46..253f01c 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/parameter/dto/SymbolDto.java +++ b/src/main/java/com/xcong/excoin/modules/contract/parameter/dto/SymbolDto.java @@ -14,4 +14,7 @@ @ApiModelProperty(value = "币种", example = "BTC/USDT") private String symbol; + + @ApiModelProperty(hidden = true) + private Integer type; } diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/ContractHoldOrderService.java b/src/main/java/com/xcong/excoin/modules/contract/service/ContractHoldOrderService.java index bbcbbd8..9bc63b1 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/service/ContractHoldOrderService.java +++ b/src/main/java/com/xcong/excoin/modules/contract/service/ContractHoldOrderService.java @@ -4,6 +4,8 @@ import com.xcong.excoin.common.response.Result; import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity; import com.xcong.excoin.modules.contract.parameter.dto.*; +import com.xcong.excoin.modules.documentary.entity.FollowTraderInfoEntity; +import com.xcong.excoin.modules.member.entity.MemberEntity; import com.xcong.excoin.rabbit.pricequeue.OrderModel; import org.apache.ibatis.annotations.Param; @@ -49,4 +51,6 @@ public Result changePositionType(); public void calHoldFeeAmountForBondAmount(); + public void sendFollowOrder(FollowTraderInfoEntity traderInfoEntity, ContractHoldOrderEntity holdOrderEntity); + } 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 7a9967d..0532ea6 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 @@ -385,17 +385,7 @@ // 若该用户为交易员且开启带单模式,则发送带单异步 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); - - followProducer.sendAddFollowOrder(holdOrderEntity.getId()); + sendFollowOrder(tradeInfo, holdOrderEntity); // ThreadPoolUtils.sendFollowOrderTask(holdOrderEntity.getId()); } // 提交成功 @@ -405,6 +395,20 @@ return Result.fail(MessageSourceUtils.getString("member_service_0067")); } + @Override + public void sendFollowOrder(FollowTraderInfoEntity tradeInfo, ContractHoldOrderEntity holdOrderEntity) { + 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); + + followProducer.sendAddFollowOrder(holdOrderEntity.getId()); + } /** * 全仓模式--若当前已经存在持仓,则合并当前持仓 @@ -527,7 +531,7 @@ holdOrderListVo.setReturnRate(returnRate); holdOrderListVo.setProfitOrLoss(rewardRatio); if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == memberEntity.getContractPositionType()) { - BigDecimal forcePrice = CalculateUtil.getForceSetPriceForWhole(holdOrderEntity.getSymbol(), memberEntity); + BigDecimal forcePrice = CalculateUtil.calForcePriceForWhole(memberEntity, holdOrderEntity); holdOrderListVo.setForceClosingPrice(forcePrice); } resultList.add(holdOrderListVo); @@ -648,7 +652,7 @@ return Result.loading("loading_type"); } - List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectHoldOrderListByMemberIdAndSymbol(memberEntity.getId(), symbolDto.getSymbol(), 1); + List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectHoldOrderListByMemberIdAndSymbol(memberEntity.getId(), symbolDto.getSymbol(), symbolDto.getType()); if (CollUtil.isEmpty(holdOrderEntities)) { return Result.fail("订单不存在"); } @@ -859,7 +863,7 @@ BigDecimal newPriceSymbol = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(symbol))); List<ContractEntrustOrderEntity> entrustOrderEntities = contractEntrustOrderDao.selectEntrustOrderListByMemberId(memberEntity.getId()); - List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectHoldOrderListByMemberIdAndSymbolTest(memberEntity.getId(), ContractOrderEntity.CONTRACTTYPE_NORMAL); + List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectHoldOrderListByMemberIdAndSymbolTest(memberEntity.getId(), null); MemberWalletContractEntity walletContractEntity = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name()); // if (memberEntity.getContractPositionType().equals(ContractEntrustOrderEntity.POSITION_TYPE_ADD)) { // // 当前合约委托单 @@ -1135,29 +1139,35 @@ if (CollUtil.isNotEmpty(list)) { for (ContractHoldOrderEntity holdOrderEntity : list) { + BigDecimal thisTimeHold = holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount()).multiply(tradeSettingEntity.getDoingRatio()); + MemberWalletContractEntity wallet = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(holdOrderEntity.getMemberId(), CoinTypeEnum.USDT.name()); + log.info("订单编号:{}, 持仓费:{}", holdOrderEntity.getOrderNo(), thisTimeHold); + BigDecimal holdAmount = holdOrderEntity.getHoldAmount(); if (holdAmount == null) { holdAmount = BigDecimal.ZERO; } - BigDecimal thisTimeHold = holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount()).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); - - memberWalletContractDao.increaseWalletContractBalanceById(null, thisTimeHold.negate(), null, holdOrderEntity.getMemberId()); if (ContractEntrustOrderEntity.POSITION_TYPE_ADD == holdOrderEntity.getPositionType()) { + + 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); + holdOrderEntity.setBondAmount(subBond); + holdOrderEntity.setHoldAmount(holdAmount); + holdOrderEntity.setForceClosingPrice(newForcePrice); + holdOrderEntity.setOperateNo(holdOrderEntity.getOperateNo() + 1); + contractHoldOrderDao.updateById(holdOrderEntity); + + memberWalletContractDao.increaseWalletContractBalanceById(null, thisTimeHold.negate(), null, wallet.getId()); // 发送爆仓消息 sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), newForcePrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo(), holdOrderEntity.getMemberId()); + } else { + holdOrderEntity.setHoldAmount(holdAmount); + contractHoldOrderDao.updateById(holdOrderEntity); + memberWalletContractDao.increaseWalletContractBalanceById(thisTimeHold.negate(), thisTimeHold.negate(), null, wallet.getId()); + ThreadPoolUtils.sendWholePrice(holdOrderEntity.getMemberId()); } } } diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java b/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java index 06164aa..b7304af 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java @@ -19,6 +19,7 @@ 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.contract.service.RabbitOrderService; import com.xcong.excoin.modules.documentary.common.NoticeConstant; import com.xcong.excoin.modules.documentary.dao.FollowFollowerOrderRelationDao; import com.xcong.excoin.modules.documentary.dao.FollowFollowerProfitDao; @@ -39,6 +40,7 @@ import com.xcong.excoin.modules.member.service.MemberWalletContractService; import com.xcong.excoin.modules.platform.entity.PlatformTradeSettingEntity; import com.xcong.excoin.rabbit.pricequeue.OrderModel; +import com.xcong.excoin.rabbit.producer.FollowProducer; import com.xcong.excoin.rabbit.producer.OrderProducer; import com.xcong.excoin.utils.*; import lombok.extern.slf4j.Slf4j; @@ -104,6 +106,9 @@ private RedisUtils redisUtils; @Resource private FollowOrderOperationService followOrderOperationService; + + @Resource + private FollowProducer followProducer; public void dealOrderFromMq(List<OrderModel> list, Integer type) { if (CollectionUtils.isNotEmpty(list)) { @@ -171,6 +176,21 @@ if (CollUtil.isNotEmpty(entrustOrders)) { for (ContractEntrustOrderEntity entrustOrder : entrustOrders) { contractEntrustOrderDao.deleteById(entrustOrder.getId()); + } + } + } + + private void closingFollowerOrders(MemberEntity memberEntity, ContractHoldOrderEntity holdOrderEntity, ContractOrderEntity contractOrderEntity) { + // 判断当前持仓是否为跟单订单 + if (ContractOrderEntity.CONTRACTTYPE_DOCUMENTARY == holdOrderEntity.getContractType()) { + FollowTraderInfoEntity traderInfoEntity = followTraderInfoDao.selectTraderInfoByOrderId(holdOrderEntity.getId()); + updateFollowOrderRelation(holdOrderEntity.getId(), contractOrderEntity.getId()); + + // 若为交易员,则平仓跟随者订单 + if (MemberEntity.IS_TRADER_Y.equals(memberEntity.getIsTrader())) { + followOrderOperationService.closingFollowOrders(holdOrderEntity.getOrderNo()); + } else { + LogRecordUtils.insertFollowerNotice(memberEntity.getId(), NoticeConstant.CLOSE_ORDER_TITLE, StrUtil.format(NoticeConstant.CLOSE_ORDER_CONTENT, contractOrderEntity.getSymbol(), contractOrderEntity.getClosingPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString(), contractOrderEntity.getRewardAmount().setScale(2, BigDecimal.ROUND_HALF_UP).toString(), traderInfoEntity.getNickname())); } } } @@ -269,6 +289,8 @@ if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) { ThreadPoolUtils.sendWholePrice(memberId); deleteEntrustCloseOrder(order.getOrderNo()); + } else { + closingFollowerOrders(memberEntity, order, contractOrderEntity); } } } @@ -370,6 +392,8 @@ if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) { ThreadPoolUtils.sendWholePrice(memberId); deleteEntrustCloseOrder(order.getOrderNo()); + } else { + closingFollowerOrders(memberEntity, order, contractOrderEntity); } } } @@ -469,6 +493,8 @@ if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) { ThreadPoolUtils.sendWholePrice(memberId); deleteEntrustCloseOrder(order.getOrderNo()); + } else { + closingFollowerOrders(memberEntity, order, contractOrderEntity); } } } @@ -567,6 +593,8 @@ if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) { ThreadPoolUtils.sendWholePrice(memberId); deleteEntrustCloseOrder(order.getOrderNo()); + } else { + closingFollowerOrders(memberEntity, order, contractOrderEntity); } } } @@ -625,6 +653,16 @@ contractHoldOrderEntity.setOpeningType(ContractHoldOrderEntity.OPENING_TYPE_LESS); } + // 判断是否开启了带单 + boolean isOpenFollow = false; + FollowTraderInfoEntity tradeInfo = null; + if (MemberEntity.IS_TRADER_Y.equals(memberEntity.getIsTrader())) { + tradeInfo = followTraderInfoDao.selectTraderInfoByMemberId(memberEntity.getId()); + if (FollowTraderInfoEntity.ISOPEN_Y.equals(tradeInfo.getIsOpen())) { + isOpenFollow = true; + } + } + //持仓单赋值 contractHoldOrderEntity.setMemberId(memId); contractHoldOrderEntity.setIsCanClosing(ContractHoldOrderEntity.ORDER_CAN_CLOSING_Y); @@ -647,6 +685,7 @@ contractHoldOrderEntity.setTradeType(ContractHoldOrderEntity.TRADE_TYPE_LIMIT); contractHoldOrderEntity.setOperateNo(1); contractHoldOrderEntity.setSymbolCntSale(contractHoldOrderEntity.getSymbolCnt()); + contractHoldOrderEntity.setContractType(isOpenFollow ? ContractOrderEntity.CONTRACTTYPE_DOCUMENTARY : ContractOrderEntity.CONTRACTTYPE_NORMAL); contractHoldOrderService.save(contractHoldOrderEntity); // 需要一个历史插入 @@ -675,6 +714,12 @@ //返佣 ThreadPoolUtils.calReturnMoney(memberEntity.getId(), openFeePrice, contractOrderEntity, AgentReturnEntity.ORDER_TYPE_OPEN); + + // 若该用户为交易员且开启带单模式,则发送带单异步 + if (isOpenFollow) { + contractHoldOrderService.sendFollowOrder(tradeInfo, contractHoldOrderEntity); + } + } } } @@ -916,10 +961,10 @@ 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()); - } +// if(ObjectUtil.isNotEmpty(followFollowerSettingEntity)){ +// Long traderMemberId = followFollowerSettingEntity.getTraderMemberId(); +// followFollowerProfitDao.updateFollowerProfitByTradeMemberId(coinsOrder.getBondAmount().negate(), coinsOrder.getBondAmount().negate(), traderMemberId, memberEntity.getId()); +// } FollowTraderInfoEntity followTraderInfoEntity = followTraderInfoDao.selectById(followFollowerSettingEntity.getTraderId()); //更新跟随者-订单关联表 updateFollowOrderRelation(coinsOrder.getId(), contractOrderEntity.getId()); diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java b/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java index ac86e5c..a738a3d 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java @@ -6,9 +6,11 @@ import com.alibaba.fastjson.JSONObject; import com.xcong.excoin.common.contants.AppContants; import com.xcong.excoin.common.enumerates.CoinTypeEnum; +import com.xcong.excoin.common.enumerates.MemberWalletCoinEnum; import com.xcong.excoin.common.enumerates.OrderClosingTypeEnum; import com.xcong.excoin.common.system.service.CommonService; import com.xcong.excoin.modules.coin.entity.MemberAccountFlowEntity; +import com.xcong.excoin.modules.coin.entity.MemberAccountMoneyChange; import com.xcong.excoin.modules.contract.dao.ContractEntrustOrderDao; import com.xcong.excoin.modules.contract.dao.ContractHoldOrderDao; import com.xcong.excoin.modules.contract.dao.ContractOrderDao; @@ -113,7 +115,14 @@ List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectBatchIds(ids); if (CollUtil.isNotEmpty(holdOrderEntities)) { for (ContractHoldOrderEntity holdOrder : holdOrderEntities) { - cancelHoldOrderMethod(holdOrder); + // 判断仓位类型是否逐仓 + if (holdOrder.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) { + // 逐仓平仓 + cancelHoldOrderMethod(holdOrder); + } else { + // 全仓模式平仓 + closingWholeOrder(holdOrder); + } } } } @@ -186,13 +195,24 @@ memberWalletContractDao.increaseWalletContractBalanceById(returnMoney, returnMoney, null, traderWallet.getId()); insertReturnProfitDetail(traderInfoEntity.getMemberId(), memberEntity.getId(), returnMoney, holdOrderEntity.getOrderNo()); //增加返佣提醒 - String orderNo = holdOrderEntity.getOrderNo(); - LogRecordUtils.insertFollowerNotice(traderInfoEntity.getMemberId(), - NoticeConstant.RETURN_MONEY_TITLE, - StrUtil.format(NoticeConstant.RETURN_MONEY_CONTENT, - memberEntity.getInviteId(), - orderNo, - returnMoney.setScale(2, BigDecimal.ROUND_HALF_UP).toString())); +// String orderNo = holdOrderEntity.getOrderNo(); +// LogRecordUtils.insertFollowerNotice(traderInfoEntity.getMemberId(), +// NoticeConstant.RETURN_MONEY_TITLE, +// StrUtil.format(NoticeConstant.RETURN_MONEY_CONTENT, +// orderNo, +// holdOrderEntity.getSymbol(), +// returnMoney.setScale(2, BigDecimal.ROUND_HALF_UP).toString())); +// //带单返利的记录要在资产页面的其他记录 +// LogRecordUtils.insertMemberAccountMoneyChange( +// traderInfoEntity.getMemberId(), +// StrUtil.format(NoticeConstant.RETURN_MONEY_CONTENT_MAMC, +// orderNo, +// holdOrderEntity.getSymbol(), +// returnMoney.setScale(2, BigDecimal.ROUND_HALF_UP).toString()), +// returnMoney.setScale(2, BigDecimal.ROUND_HALF_UP), +// MemberWalletCoinEnum.WALLETCOINCODE.getValue(), +// MemberAccountMoneyChange.STATUS_SUCCESS_INTEGER, +// MemberAccountMoneyChange.TYPE_WALLET_AGENT); } } } @@ -226,7 +246,7 @@ if (MemberEntity.IS_TRADER_Y.equals(memberEntity.getIsTrader())) { followOrderOperationService.closingFollowOrders(holdOrderEntity.getOrderNo()); } else { - followFollowerProfitDao.updateFollowerProfitByTradeMemberId(holdOrderEntity.getBondAmount(), profitOrLoss, traderInfoEntity.getMemberId(), memberEntity.getId()); + //followFollowerProfitDao.updateFollowerProfitByTradeMemberId(holdOrderEntity.getBondAmount(), profitOrLoss, traderInfoEntity.getMemberId(), memberEntity.getId()); LogRecordUtils.insertFollowerNotice(memberEntity.getId(), NoticeConstant.CLOSE_ORDER_TITLE, StrUtil.format(NoticeConstant.CLOSE_ORDER_CONTENT, contractOrderEntity.getSymbol(), contractOrderEntity.getClosingPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString(), profitOrLoss.setScale(2, BigDecimal.ROUND_HALF_UP).toString(), traderInfoEntity.getNickname())); } } @@ -286,6 +306,11 @@ // 获取平仓张数 Integer closeCnt = (Integer) redisUtils.get(AppContants.CLOSING_ORDER_PREFIX + holdOrderEntity.getId()); + // 无法从redis中获取平仓张数,说明来自一键平仓 + if (closeCnt == null) { + closeCnt = holdOrderEntity.getSymbolCntSale(); + holdOrderEntity.setSymbolCntSale(0); + } MemberSettingEntity memberSettingEntity = memberSettingDao.selectMemberSettingByMemberId(memberEntity.getId()); // 开多 @@ -511,7 +536,7 @@ continue; } -// holdOrderEntity.setForceClosingPrice(getForceSetPrice(wholePriceData, holdOrderEntity, holdOrderDataModel.getSymbol())); + holdOrderEntity.setStopProfitPrice(CalculateUtil.calForcePriceForWhole(memberEntity, holdOrderEntity)); contractHoldOrderDao.deleteById(holdOrderDataModel.getId()); ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity); diff --git a/src/main/java/com/xcong/excoin/modules/documentary/common/NoticeConstant.java b/src/main/java/com/xcong/excoin/modules/documentary/common/NoticeConstant.java index d2d6206..dd1ab04 100644 --- a/src/main/java/com/xcong/excoin/modules/documentary/common/NoticeConstant.java +++ b/src/main/java/com/xcong/excoin/modules/documentary/common/NoticeConstant.java @@ -30,7 +30,8 @@ public static final String BOMB_ORDER_CONTENT = "因市场剧烈波动,您的{}合约已被强制平仓,交易员:{}"; - public static final String RETURN_MONEY_TITLE = "跟单-平仓返佣"; - public static final String RETURN_MONEY_CONTENT = "跟单平仓成功,收到{}的合约单号:{}的返佣金额:{}"; + public static final String RETURN_MONEY_TITLE = "跟单-平仓返利"; + public static final String RETURN_MONEY_CONTENT = "平仓成功,收到的合约{},币种{}的返利金额:{}"; + public static final String RETURN_MONEY_CONTENT_MAMC = "合约-{},订单{}的带单返利"; } diff --git a/src/main/java/com/xcong/excoin/modules/documentary/dao/FollowFollowerOrderRelationDao.java b/src/main/java/com/xcong/excoin/modules/documentary/dao/FollowFollowerOrderRelationDao.java index cbbc8ac..988db4a 100644 --- a/src/main/java/com/xcong/excoin/modules/documentary/dao/FollowFollowerOrderRelationDao.java +++ b/src/main/java/com/xcong/excoin/modules/documentary/dao/FollowFollowerOrderRelationDao.java @@ -18,6 +18,7 @@ FollowFollowerOrderRelationEntity selectNowOneByorderId(@Param("orderId")Long orderId); List<FollowFollowerOrderRelationEntity> selectFollowHoldOrderByTradeOrderNo(@Param("orderNo") String orderNo); + List<FollowFollowerOrderRelationEntity> selectFollowOrderByTradeOrderNo(@Param("orderNo") String orderNo); BigDecimal selectTraderTotalProfit(@Param("memberId") Long memberId); BigDecimal selectTraderTotalProfitSelf(@Param("memberId") Long memberId); diff --git a/src/main/java/com/xcong/excoin/modules/documentary/dao/FollowFollowerProfitDao.java b/src/main/java/com/xcong/excoin/modules/documentary/dao/FollowFollowerProfitDao.java index 928dc29..7d8c972 100644 --- a/src/main/java/com/xcong/excoin/modules/documentary/dao/FollowFollowerProfitDao.java +++ b/src/main/java/com/xcong/excoin/modules/documentary/dao/FollowFollowerProfitDao.java @@ -44,5 +44,9 @@ BigDecimal selectAllFollowerProfit(@Param("tradeMemberId") Long tradeMemberId); List<FollowFollowerProfitEntity> selectByMemberIdandIsFollow(@Param("id") Long id, @Param("isFollowY") Integer isFollowY); + + BigDecimal selectSumBondAmountBymemberId(@Param("memberId")Long memberId,@Param("tradeId") Long tradeId); + + BigDecimal selectSumRewardAmountByMemberId(@Param("memberId")Long memberId,@Param("tradeId") Long tradeId); } diff --git a/src/main/java/com/xcong/excoin/modules/documentary/dao/FollowTraderProfitDetailDao.java b/src/main/java/com/xcong/excoin/modules/documentary/dao/FollowTraderProfitDetailDao.java index ab01a2a..6e36e67 100644 --- a/src/main/java/com/xcong/excoin/modules/documentary/dao/FollowTraderProfitDetailDao.java +++ b/src/main/java/com/xcong/excoin/modules/documentary/dao/FollowTraderProfitDetailDao.java @@ -1,8 +1,15 @@ package com.xcong.excoin.modules.documentary.dao; +import java.math.BigDecimal; +import java.util.List; + +import org.apache.ibatis.annotations.Param; + import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.xcong.excoin.modules.documentary.entity.FollowTraderProfitDetailEntity; public interface FollowTraderProfitDetailDao extends BaseMapper<FollowTraderProfitDetailEntity> { + BigDecimal selectFollowHoldOrderByFollowOrderNo(@Param("orderNos")List<String> orderNos); + } diff --git a/src/main/java/com/xcong/excoin/modules/documentary/service/impl/FollowOrderOperationServiceImpl.java b/src/main/java/com/xcong/excoin/modules/documentary/service/impl/FollowOrderOperationServiceImpl.java index f51d58b..186bb73 100644 --- a/src/main/java/com/xcong/excoin/modules/documentary/service/impl/FollowOrderOperationServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/documentary/service/impl/FollowOrderOperationServiceImpl.java @@ -7,9 +7,11 @@ 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.MemberWalletCoinEnum; import com.xcong.excoin.common.enumerates.RabbitPriceTypeEnum; import com.xcong.excoin.common.response.Result; import com.xcong.excoin.common.system.service.CommonService; +import com.xcong.excoin.modules.coin.entity.MemberAccountMoneyChange; import com.xcong.excoin.modules.contract.dao.ContractHoldOrderDao; import com.xcong.excoin.modules.contract.dao.ContractOrderDao; import com.xcong.excoin.modules.contract.entity.ContractEntrustOrderEntity; @@ -18,10 +20,7 @@ import com.xcong.excoin.modules.contract.mapper.ContractHoldOrderEntityMapper; import com.xcong.excoin.modules.contract.service.RabbitOrderService; import com.xcong.excoin.modules.documentary.common.NoticeConstant; -import com.xcong.excoin.modules.documentary.dao.FollowFollowerOrderRelationDao; -import com.xcong.excoin.modules.documentary.dao.FollowFollowerProfitDao; -import com.xcong.excoin.modules.documentary.dao.FollowFollowerSettingDao; -import com.xcong.excoin.modules.documentary.dao.FollowTraderInfoDao; +import com.xcong.excoin.modules.documentary.dao.*; import com.xcong.excoin.modules.documentary.entity.FollowFollowerOrderRelationEntity; import com.xcong.excoin.modules.documentary.entity.FollowFollowerProfitEntity; import com.xcong.excoin.modules.documentary.entity.FollowFollowerSettingEntity; @@ -88,6 +87,8 @@ @Autowired private FollowProducer followProducer; + @Autowired + private FollowTraderProfitDetailDao followTraderProfitDetailDao; @Override @@ -268,6 +269,48 @@ ids.add(orderRelation.getOrderId()); rabbitOrderService.cancelHoldOrder(ids); } + //生成返利记录和资金变化记录 + List<FollowFollowerOrderRelationEntity> orderRelationDone = followFollowerOrderRelationDao.selectFollowOrderByTradeOrderNo(orderNo); + if(CollUtil.isNotEmpty(orderRelationDone)) { + List<Long> orderIds = new ArrayList<>(); + for (FollowFollowerOrderRelationEntity orderRelationd : orderRelationDone) { + orderIds.add(orderRelationd.getOrderId()); + } + + if(CollUtil.isNotEmpty(orderIds)){ + //获取对应的平仓记录单号 + List<String> orderNosList = new ArrayList<>(); + for(Long orderId : orderIds) { + String orderNos = contractOrderDao.selectOrderNoByOrderIds(orderId); + orderNosList.add(orderNos); + } + //获取总返佣 + BigDecimal totalAmount = followTraderProfitDetailDao.selectFollowHoldOrderByFollowOrderNo(orderNosList); + totalAmount = (totalAmount == null?BigDecimal.ZERO:totalAmount.setScale(2, BigDecimal.ROUND_DOWN)); + if(totalAmount.compareTo(BigDecimal.ZERO) > 0){ + //增加返佣提醒 + String symbol = contractOrderDao.selectById(orderIds.get(0)).getSymbol(); + String orderNoTrader = orderRelationDone.get(0).getTradeOrderNo(); + Long traderMemberId = orderRelationDone.get(0).getTradeMemberId(); + LogRecordUtils.insertFollowerNotice(traderMemberId, + NoticeConstant.RETURN_MONEY_TITLE, + StrUtil.format(NoticeConstant.RETURN_MONEY_CONTENT, + orderNoTrader, + symbol, + totalAmount)); + //带单返利的记录要在资产页面的其他记录 + LogRecordUtils.insertMemberAccountMoneyChange( + traderMemberId, + StrUtil.format(NoticeConstant.RETURN_MONEY_CONTENT_MAMC, + symbol, + orderNoTrader.substring(8)), + totalAmount, + MemberWalletCoinEnum.WALLETCOINCODE.getValue(), + MemberAccountMoneyChange.STATUS_SUCCESS_INTEGER, + MemberAccountMoneyChange.TYPE_WALLET_AGENT); + } + } + } } } } diff --git a/src/main/java/com/xcong/excoin/quartz/job/FollowProfitUpdateJob.java b/src/main/java/com/xcong/excoin/quartz/job/FollowProfitUpdateJob.java index 1addfdb..aa2e1cb 100644 --- a/src/main/java/com/xcong/excoin/quartz/job/FollowProfitUpdateJob.java +++ b/src/main/java/com/xcong/excoin/quartz/job/FollowProfitUpdateJob.java @@ -7,6 +7,7 @@ import com.xcong.excoin.modules.documentary.dao.FollowFollowerProfitDao; import com.xcong.excoin.modules.documentary.dao.FollowTraderInfoDao; import com.xcong.excoin.modules.documentary.dao.FollowTraderProfitInfoDao; +import com.xcong.excoin.modules.documentary.entity.FollowFollowerProfitEntity; import com.xcong.excoin.modules.documentary.entity.FollowTraderInfoEntity; import com.xcong.excoin.modules.documentary.entity.FollowTraderProfitInfoEntity; import lombok.extern.slf4j.Slf4j; @@ -17,7 +18,9 @@ import javax.annotation.Resource; import java.math.BigDecimal; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @@ -51,6 +54,27 @@ if (CollUtil.isNotEmpty(allTraders)) { for (FollowTraderInfoEntity trader : allTraders) { Long tradeMemberId = trader.getMemberId(); + //获取交易员的当前跟随者 + Map<String, Object> hashMap = new HashMap<>(); + hashMap.put("trade_member_id", tradeMemberId); + hashMap.put("is_follow", FollowFollowerProfitEntity.IS_FOLLOW_Y); + List<FollowFollowerProfitEntity> followFollowerProfitEntityList = followFollowerProfitDao.selectByMap(hashMap); + if(CollUtil.isNotEmpty(followFollowerProfitEntityList)) { + for(FollowFollowerProfitEntity followFollowerProfitEntity : followFollowerProfitEntityList) { + //获取当前跟随者的跟随本金 + Long memberId = followFollowerProfitEntity.getMemberId(); + BigDecimal sumBondAmountBigDecimal = followFollowerProfitDao.selectSumBondAmountBymemberId(memberId,trader.getId()); + sumBondAmountBigDecimal = (sumBondAmountBigDecimal == null?BigDecimal.ZERO:sumBondAmountBigDecimal.setScale(2, BigDecimal.ROUND_DOWN)); + followFollowerProfitEntity.setTotalPrincipal(sumBondAmountBigDecimal); + //获取当前的盈亏 + BigDecimal sumRewardAmountBigDecimal = followFollowerProfitDao.selectSumRewardAmountByMemberId(memberId,trader.getId()); + sumRewardAmountBigDecimal = (sumRewardAmountBigDecimal == null?BigDecimal.ZERO:sumRewardAmountBigDecimal.setScale(2, BigDecimal.ROUND_DOWN)); + followFollowerProfitEntity.setTotalProfit(sumRewardAmountBigDecimal); + followFollowerProfitDao.updateById(followFollowerProfitEntity); + } + } + + FollowTraderProfitInfoEntity traderInfoProfit = followTraderProfitInfoDao.selectTraderInfoProfitByMemberId(tradeMemberId); // 累计收益率 BigDecimal ljsyl = contractOrderDao.selectFollowOrderTotalProfitByMemberId(tradeMemberId); @@ -61,7 +85,8 @@ //BigDecimal totalProfit = followFollowerOrderRelationDao.selectTraderTotalProfit(tradeMemberId); traderInfoProfit.setTotalProfit(totalProfit); // 交易笔数 - List<ContractOrderEntity> orders = contractOrderDao.selectFollowOrderByMemberId(tradeMemberId); +// List<ContractOrderEntity> orders = contractOrderDao.selectFollowOrderByMemberId(tradeMemberId); + List<ContractOrderEntity> orders = contractOrderDao.selectFollowOrderListByMemberId(tradeMemberId); traderInfoProfit.setTotalOrderCnt(CollUtil.isNotEmpty(orders) ? orders.size() : 0); // 近三周胜率 Integer winCnt = contractOrderDao.selectFollowOrderCntForWinRate(tradeMemberId, 1); diff --git a/src/main/java/com/xcong/excoin/quartz/job/LoopExecutorJob.java b/src/main/java/com/xcong/excoin/quartz/job/LoopExecutorJob.java index 9fc7240..6b1981f 100644 --- a/src/main/java/com/xcong/excoin/quartz/job/LoopExecutorJob.java +++ b/src/main/java/com/xcong/excoin/quartz/job/LoopExecutorJob.java @@ -47,6 +47,7 @@ * 持仓费计算 */ @Scheduled(cron = "0 0 0/8 * * ?") +// @Scheduled(cron = "0 0/5 * * * ?") public void updateDoingPrice() { log.info("#持仓费计算#"); try { diff --git a/src/main/java/com/xcong/excoin/utils/CalculateUtil.java b/src/main/java/com/xcong/excoin/utils/CalculateUtil.java index 935f1f3..deed491 100644 --- a/src/main/java/com/xcong/excoin/utils/CalculateUtil.java +++ b/src/main/java/com/xcong/excoin/utils/CalculateUtil.java @@ -163,6 +163,47 @@ return result; } + /** + * 开仓价 +/- (权益 - 其他币种成本 - 当前币种维持保证金)/(规格*张数) + * + * @param memberEntity + * @param contractHoldOrderEntity + * @return + */ + public static BigDecimal calForcePriceForWhole(MemberEntity memberEntity, ContractHoldOrderEntity contractHoldOrderEntity) { + ContractHoldOrderDao holdOrderDao = SpringContextHolder.getBean(ContractHoldOrderDao.class); + MemberWalletContractDao walletContractDao = SpringContextHolder.getBean(MemberWalletContractDao.class); + + Long memberId = memberEntity.getId(); + MemberWalletContractEntity walletContract = walletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); + List<ContractHoldOrderEntity> holdOrderEntities = holdOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberId, null); + BigDecimal forcePrice = BigDecimal.ZERO; + if (CollUtil.isNotEmpty(holdOrderEntities)) { + BigDecimal totalBondAmount = BigDecimal.ZERO; + BigDecimal totalProfitOrLoss = BigDecimal.ZERO; + for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) { + if (holdOrderEntity.getId().equals(contractHoldOrderEntity.getId())) { +// totalBondAmount = totalBondAmount.add(holdOrderEntity.getHoldBond()); + } else { + totalBondAmount = totalBondAmount.add(holdOrderEntity.getBondAmount()); + } + totalProfitOrLoss = totalProfitOrLoss.add(calProfitOrLoss(holdOrderEntity, memberEntity)); + } + + BigDecimal divideChild = walletContract.getTotalBalance().subtract(totalBondAmount).add(totalProfitOrLoss); + BigDecimal divideParent = contractHoldOrderEntity.getSymbolSku().multiply(new BigDecimal(contractHoldOrderEntity.getSymbolCntSale())); + + BigDecimal divide = divideChild.divide(divideParent, 8, BigDecimal.ROUND_DOWN); + + if (ContractHoldOrderEntity.OPENING_TYPE_MORE == contractHoldOrderEntity.getOpeningType()) { + forcePrice = contractHoldOrderEntity.getOpeningPrice().subtract(divide); + } else { + forcePrice = contractHoldOrderEntity.getOpeningPrice().add(divide); + } + } + return forcePrice; + } + public static BigDecimal calProfitOrLoss(ContractHoldOrderEntity holdOrderEntity, MemberEntity memberEntity) { CacheSettingUtils cacheSettingUtils = SpringContextHolder.getBean(CacheSettingUtils.class); RedisUtils redisUtils = SpringContextHolder.getBean(RedisUtils.class); @@ -286,6 +327,6 @@ redisUtils.set(AppContants.HOLD_BOND_RATIO, tradeSetting.getHoldBondRatio()); } - return contractHoldOrder.getOpeningPrice().multiply(new BigDecimal(contractHoldOrder.getSymbolCntSale())).multiply(holdBondRatio).multiply(contractHoldOrder.getSymbolSku()); + return contractHoldOrder.getOpeningPrice().multiply(new BigDecimal(contractHoldOrder.getSymbolCntSale())).multiply(holdBondRatio.multiply(new BigDecimal(100))).multiply(contractHoldOrder.getSymbolSku()).divide(new BigDecimal(contractHoldOrder.getLeverRatio()), 8, BigDecimal.ROUND_DOWN); } } diff --git a/src/main/resources/mapper/contract/ContractOrderDao.xml b/src/main/resources/mapper/contract/ContractOrderDao.xml index ff042eb..4e8d023 100644 --- a/src/main/resources/mapper/contract/ContractOrderDao.xml +++ b/src/main/resources/mapper/contract/ContractOrderDao.xml @@ -2,6 +2,25 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.xcong.excoin.modules.contract.dao.ContractOrderDao"> + <select id="selectOrderNoByOrderIds" resultType="java.lang.String"> + SELECT + order_no + FROM + contract_order + WHERE + id = #{orderId} + </select> + + <select id="selectFollowOrderListByMemberId" resultType="com.xcong.excoin.modules.contract.entity.ContractOrderEntity"> + SELECT + * + FROM + contract_order + WHERE + member_id = #{tradeMemberId} + AND contract_type = 2 + AND closing_price IS NOT NULL; + </select> <select id="selectContractOrderInPage" resultType="com.xcong.excoin.modules.contract.entity.ContractOrderEntity"> select diff --git a/src/main/resources/mapper/documentary/FollowFollowerOrderRelationDao.xml b/src/main/resources/mapper/documentary/FollowFollowerOrderRelationDao.xml index 374d8e0..72cbfe5 100644 --- a/src/main/resources/mapper/documentary/FollowFollowerOrderRelationDao.xml +++ b/src/main/resources/mapper/documentary/FollowFollowerOrderRelationDao.xml @@ -33,6 +33,13 @@ and a.order_type=1 </select> + <select id="selectFollowOrderByTradeOrderNo" resultType="com.xcong.excoin.modules.documentary.entity.FollowFollowerOrderRelationEntity"> + select a.* + from follow_follower_order_relation a, follow_follower_profit b + where a.trade_member_id=b.trade_member_id and a.trade_order_no=#{orderNo} and b.is_follow=1 + and a.order_type=2 + </select> + <select id="selectTraderTotalProfit" resultType="java.math.BigDecimal"> select sum(b.reward_amount) from follow_follower_order_relation a, contract_order b diff --git a/src/main/resources/mapper/documentary/FollowFollowerProfitDao.xml b/src/main/resources/mapper/documentary/FollowFollowerProfitDao.xml index bfca65f..3a2147d 100644 --- a/src/main/resources/mapper/documentary/FollowFollowerProfitDao.xml +++ b/src/main/resources/mapper/documentary/FollowFollowerProfitDao.xml @@ -1,7 +1,31 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.xcong.excoin.modules.documentary.dao.FollowFollowerProfitDao"> - + + <select id="selectSumRewardAmountByMemberId" resultType="java.math.BigDecimal"> + SELECT + SUM(a.reward_amount) + FROM + contract_order a + LEFT JOIN follow_follower_order_relation b ON a.id = b.order_id + WHERE + a.member_id = #{memberId} + AND b.order_type = 2 + and b.trade_id = #{tradeId}; + </select> + + <select id="selectSumBondAmountBymemberId" resultType="java.math.BigDecimal"> + SELECT + SUM(a.bond_amount) + FROM + contract_order a + LEFT JOIN follow_follower_order_relation b ON a.id = b.order_id + WHERE + a.member_id = #{memberId} + AND b.order_type = 2 + and b.trade_id = #{tradeId}; + </select> + <select id="selectByMemberIdandIsFollow" resultType="com.xcong.excoin.modules.documentary.entity.FollowFollowerProfitEntity"> SELECT * diff --git a/src/main/resources/mapper/documentary/FollowTraderProfitDetailDao.xml b/src/main/resources/mapper/documentary/FollowTraderProfitDetailDao.xml index a6e586a..c397480 100644 --- a/src/main/resources/mapper/documentary/FollowTraderProfitDetailDao.xml +++ b/src/main/resources/mapper/documentary/FollowTraderProfitDetailDao.xml @@ -1,6 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.xcong.excoin.modules.documentary.dao.FollowTraderProfitDetailDao"> - + + <select id="selectFollowHoldOrderByFollowOrderNo" resultType="java.math.BigDecimal"> + SELECT + sum(amount) + FROM + follow_trader_profit_detail + WHERE + order_no in + <foreach collection="orderNos" item="item" index="" open="(" separator="," close=")"> + #{item} + </foreach> + </select> </mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/member/MemberAccountMoneyChangeDao.xml b/src/main/resources/mapper/member/MemberAccountMoneyChangeDao.xml index 90a0164..d3c6b83 100644 --- a/src/main/resources/mapper/member/MemberAccountMoneyChangeDao.xml +++ b/src/main/resources/mapper/member/MemberAccountMoneyChangeDao.xml @@ -64,7 +64,7 @@ <if test="record != null"> <where> type = 3 - and (content like '%佣金到账%' or content like '%活动%') + and (content like '%佣金到账%' or content like '%活动%' or content like '%返利%') <if test="record.memberId != null" > and member_id=#{record.memberId} </if> diff --git a/src/test/java/com/xcong/excoin/WholeTest.java b/src/test/java/com/xcong/excoin/WholeTest.java index 708ff9d..1123b19 100644 --- a/src/test/java/com/xcong/excoin/WholeTest.java +++ b/src/test/java/com/xcong/excoin/WholeTest.java @@ -115,8 +115,15 @@ */ @Test public void forceSetPriceTest() { - MemberEntity memberEntity = memberDao.selectById(21L); - CalculateUtil.getForceSetPriceForWhole("BTC/USDT", memberEntity); + MemberEntity memberEntity = memberDao.selectById(15L); + System.out.println(CalculateUtil.getForceSetPriceForWhole("BTC/USDT", memberEntity)); + } + + @Test + public void profitOrLessTest() { + MemberEntity memberEntity = memberDao.selectById(15L); + ContractHoldOrderEntity contractHoldOrderEntity = contractHoldOrderDao.selectById(144L); + System.out.println(CalculateUtil.calProfitOrLoss(contractHoldOrderEntity, memberEntity)); } @Resource @@ -191,4 +198,12 @@ // 29157.72306836 -- } + @Test + public void wholeForceNewTest() { + MemberEntity memberEntity = memberDao.selectById(15L); + ContractHoldOrderEntity holdOrder = contractHoldOrderDao.selectById(400L); + + System.out.println(CalculateUtil.calForcePriceForWhole(memberEntity, holdOrder)); + } + } -- Gitblit v1.9.1