From def723a6fa9cbe05734afe9011a6f90d2fa32196 Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Wed, 03 Jun 2020 17:07:23 +0800 Subject: [PATCH] interface tiaozheng --- src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java | 1576 +++++++++++++++++++++++++++------------------------------- 1 files changed, 734 insertions(+), 842 deletions(-) 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 8d7bc73..c6c2f49 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 @@ -1,842 +1,734 @@ -//package com.xcong.excoin.modules.contract.service.impl; -// -//import cn.hutool.core.bean.BeanUtil; -//import com.alibaba.fastjson.JSONObject; -//import com.kebex.app.dao.member.AgentReturnMapper; -//import com.kebex.app.dao.member.MemberMapper; -//import com.kebex.app.dao.member.WalletDao; -//import com.kebex.app.dao.order.OrderMapper; -//import com.kebex.app.dao.trade.TradeMapper; -//import com.kebex.app.entity.member.*; -//import com.kebex.app.entity.order.CoinsCoinsOrder; -//import com.kebex.app.entity.trade.TradeSetting; -//import com.kebex.app.entity.trade.TradeSymbolSku; -//import com.kebex.app.service.member.MemberService; -//import com.kebex.common.cache.TradeSettingCache; -//import com.kebex.pricequeue.OrderModel; -//import com.kebex.rabbit.producer.ExampleProducer; -//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.contract.mapper.ContractHoldOrderEntityMapper; -//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.member.entity.MemberEntity; -//import com.xcong.excoin.modules.member.entity.MemberWalletContractEntity; -//import com.xcong.excoin.modules.member.service.MemberService; -//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.OrderProducer; -//import com.xcong.excoin.utils.CacheSettingUtils; -//import com.xcong.excoin.utils.CalculateUtil; -//import org.apache.commons.collections.CollectionUtils; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.stereotype.Component; -//import org.springframework.stereotype.Service; -// -//import javax.annotation.Resource; -//import java.math.BigDecimal; -//import java.math.RoundingMode; -//import java.util.*; -// -//@Service -//public class OrderWebsocketServiceImpl { -// -// @Resource -// ContractHoldOrderService contractHoldOrderService; -// -// -// @Resource -// ContractOrderService contractOrderService; -// -// @Resource -// ContractEntrustOrderService contractEntrustOrderService; -// -// -// @Resource -// MemberWalletContractService memberWalletContractService; -// -// -// @Resource -// CacheSettingUtils cacheSettingUtils; -// -// @Resource -// OrderProducer producer; -// -// @Resource -// MemberService memberService; -// -// -// -// public void dealOrderFromMq(List<OrderModel> list, Integer type) { -// if (CollectionUtils.isNotEmpty(list)) { -// String batchno = UUID.randomUUID().toString(); -// // 更新订单状态 -// // 更新为不可平仓状态 -// int count = contractHoldOrderService.updateContractHoldOrderCanNotClosingByIds(list, batchno); -// // 查询 -// if (count > 0) { -// // 查询 -// List<ContractHoldOrderEntity> coinsCoinsOrders = contractHoldOrderService.selectContractHoldOrderByBatchNo(batchno); -// // 根据状态调用不同的方法 -// // 1:买入委托2:开多3:开空4:平多5:平空6:爆仓平多7:爆仓平空8:撤单9:止盈平多10:止盈平空11:止损平多12:止损平空 -// // 6在这里是爆仓 包括爆空和暴多 -// switch (type) { -// case 6: -// this.dealCoinOut(coinsCoinsOrders,list); -// break; -// case 9: -// this.dealForMoreStopPro(coinsCoinsOrders,list); -// break; -// case 10: -// this.dealForLessStopPro(coinsCoinsOrders,list); -// break; -// case 11: -// this.dealForMoreLoss(coinsCoinsOrders,list); -// break; -// case 12: -// this.dealForLessLoss(coinsCoinsOrders,list); -// break; -// } -// -// } -// -// -// } -// } -// -// public void dealForLimitMq(List<OrderModel> list){ -// if(CollectionUtils.isNotEmpty(list)){ -// //查询限价委托的单 -// String batchno =UUID.randomUUID().toString(); -// List<Long> ids = new ArrayList<>(); -// list.forEach(model->ids.add(model.getOrderId())); -// List<ContractEntrustOrderEntity> contractEntrustOrderEntities = contractEntrustOrderService.selectEntrustOrderListByIds(ids); -// -// if(CollectionUtils.isNotEmpty(contractEntrustOrderEntities)){ -// this.dealLimitBuyOrder(contractEntrustOrderEntities); -// } -// -// } -// } -// -// /** -// * 开多止盈 -// */ -// public void dealForMoreStopPro(List<ContractHoldOrderEntity> orderList,List<OrderModel> list) { -// if (CollectionUtils.isNotEmpty(orderList)) { -// Map<Long,BigDecimal> modelMap = new HashMap<Long,BigDecimal>(); -// for(OrderModel model : list){ -// modelMap.put(model.getOrderId(),new BigDecimal(model.getPrice())); -// } -// for (ContractHoldOrderEntity order : orderList) { -// Long orderId = order.getId(); -// System.out.println("开多止盈订单号:" + order.getOrderNo()); -// System.out.println("传来的止盈价格:"+modelMap.get(order.getId())); -// if (null != order.getStopProfitPrice()) { -// BigDecimal closePrice = order.getStopProfitPrice(); -// BigDecimal queuePrice = modelMap.get(order.getId()); -// System.out.println("订单的止盈价格:"+closePrice); -// // 判断 保留七位是为了忽略以为小数 防止不精确导致的不相等 -// if(queuePrice.compareTo(closePrice)!=0){ -// -// // 不能止盈 -// System.out.println("数据库价格:"+queuePrice.toPlainString()+"--价格不能止盈:"+closePrice); -// //更新数据 -// contractHoldOrderService.updateOrderIsCanClosingAndBatchNoById(orderId); -// continue; -// } -// System.out.println("执行操作"); -// // 止盈价 -// String symbol = order.getSymbol(); -// // 本次需要退回的预付款 -// BigDecimal prePrice = order.getPrePaymentAmount(); -// Long memberId = order.getMemberId(); -// MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); -// if (wallet != null) { -// // 历史订单 -// ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(order); -// contractOrderEntity.setClosingType(6); -// contractOrderEntity.setClosingTime(new Date()); -// contractOrderEntity.setId(null); -// -// // 本次平仓数量 -// int currentFlat = order.getSymbolCnt(); -// BigDecimal symbolSku = cacheSettingUtils.getSymbolSku(order.getSymbol()); -// // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 -// BigDecimal profitLossPrice = (closePrice -// .subtract(order.getOpeningPrice())) -// .multiply(new BigDecimal(currentFlat+"")) -// .multiply(symbolSku).setScale(8, BigDecimal.ROUND_DOWN); -// MemberEntity memberEntity = memberService.getById(memberId); -// -// if(memberEntity.getIsProfit() == 1) { -// PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); -// if(profitLossPrice.compareTo(BigDecimal.ZERO)>0) { -// profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(tradeSetting.getProfitParam())); -// }else { -// profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); -// } -// } -// //回报率 -// BigDecimal returnRate = profitLossPrice.divide((order.getPrePaymentAmount().subtract(contractOrderEntity.getClosingFeeAmount())), 8, BigDecimal.ROUND_DOWN); -// contractOrderEntity.setRewardAmount(profitLossPrice); -// contractOrderEntity.setRewardRatio(returnRate); -// contractOrderEntity.setClosingFeeAmount(order.getOpeningFeeAmount()); -// contractOrderEntity.setClosingPrice(closePrice); -// contractOrderEntity.setClosingType(9); -// BigDecimal totalReturn = BigDecimal.ZERO; -// contractOrderService.save(contractOrderEntity); -// // 将需要退回的减去手续费 -// BigDecimal needReturn = prePrice.add(profitLossPrice); -// //总退回金额=保证金+收益-手续费 -// totalReturn = needReturn.subtract(contractOrderEntity.getClosingFeeAmount()); -// // 更新钱包 -// // 总的是收益-平仓手续费 -// BigDecimal totalBalance = profitLossPrice.subtract(contractOrderEntity.getClosingFeeAmount()); -// memberWalletContractService.increaseWalletContractBalanceById(totalBalance,totalReturn,null,wallet.getId()); -// -// // 流水记录 TODO 531 -//// MemberAccountFlowRecord record = new MemberAccountFlowRecord(); -//// record.setCreateTime(new Date()); -//// record.setDirectionSource("止盈平仓"); -//// record.setRemark("止盈平仓"); -//// record.setMemberBalance(wallet.getAvailableBalance()); -//// record.setMemberid(order.getMemberId()); -//// record.setSymbolName(order.getSymbol()); -//// record.setMemberName(wallet.getMemberName()); -//// record.setMemberPhone(order.getMemberPhone()); -//// record.setPrice(profitLossPrice + order.getPrePrice()); -//// memberService.addFlowRecord(record); -//// -//// //返佣 TODO 531 -//// calYj(order.getMemberId(), new BigDecimal(order.getClosingPrice()), order, 2); -// } -// } -// } -// } -// -// } -// -// /** -// * 开空止盈 -// */ -// public void dealForLessStopPro(List<ContractHoldOrderEntity> orderList,List<OrderModel> list) { -// //List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno); -// //System.out.println("开空止盈订单batchno:" + batchno); -// if (CollectionUtils.isNotEmpty(orderList)) { -// Map<Long,BigDecimal> modelMap = new HashMap<Long,BigDecimal>(); -// for(OrderModel model : list){ -// modelMap.put(model.getOrderId(),new BigDecimal(model.getPrice())); -// } -// for (ContractHoldOrderEntity order : orderList) { -// System.out.println("开空止盈订单号:" + order.getOrderNo()); -// System.out.println("传来的止盈价格:"+modelMap.get(order.getId()).toPlainString()); -// BigDecimal closePrice = order.getStopProfitPrice(); -// if (null != closePrice) { -// -// // 止盈价 -// BigDecimal closePrice = new BigDecimal(order.getStopProfitPrice()).setScale(7, RoundingMode.HALF_UP); -// System.out.println("订单的止盈价格:"+closePrice); -// System.out.println(closePrice.compareTo(modelMap.get(order.getId()))); -// BigDecimal queuePrice = modelMap.get(order.getId()).setScale(7, RoundingMode.HALF_UP); -// if(closePrice.compareTo(queuePrice)!=0){ -// System.out.println("数据库价格:"+queuePrice.toPlainString()+"--价格不能开空止盈:"+closePrice); -// orderMapper.updateOrderIsExitAndBatchno(order.getId()); -// continue; -// } -// System.out.println("执行操作"); -// String symbol = order.getSymbol(); -// // 本次需要退回的预付款 -// BigDecimal prePrice = new BigDecimal(order.getPrePrice()); -// Wallet wallet = memberService.findWalletByMemberIdAndSymbol(order.getMemberId(), "USDT"); -// -// if (wallet != null) { -// // 更新订单 -// order.setIsEixt(0); -// orderMapper.updateOrder(order); -// order.setExitPrice(order.getStopProfitPrice());// 平仓价格 -// order.setExitType(2);// 平仓类型,1:表示手动平仓,2:止盈平仓,3:止损平仓,4:爆仓 -// order.setExitTime(new Date());// 平仓时间 -// order.setEntrustStatus(7);// 平仓状态 -// // 本次平仓数量 -// Long currentFlat = order.getSymbolSkuNumber(); -// TradeSymbolSku symbolSku = tradeMapper.findSymbolSkubySymbol(symbol); -// // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 -// Double profitLossPrice = (new BigDecimal(order.getTradePrice()).subtract(closePrice)) -// .multiply(new BigDecimal(currentFlat)) -// .multiply(symbolSku.getLotNumber()) -// .setScale(8, BigDecimal.ROUND_DOWN).doubleValue(); -// -// Member member = memberService.selectMemberById(order.getMemberId()); -// if(member.getIsProfit() == 1) { -// TradeSetting tradeSetting = tradeSettingCache.getTradeSetting(); -// if(profitLossPrice>0) { -// profitLossPrice = profitLossPrice*(1-tradeSetting.getProfitParam()); -// }else { -// profitLossPrice = profitLossPrice*(1+tradeSetting.getProfitParam());; -// } -// } -// //回报率 -// double returnRate = new BigDecimal(profitLossPrice).divide((new BigDecimal(order.getPrePrice()).subtract(new BigDecimal(order.getClosingPrice()))), 8, BigDecimal.ROUND_DOWN) -// .doubleValue(); -// order.setRewardRatio(profitLossPrice);// 盈亏 -// order.setReturnRate(returnRate); -// -// BigDecimal totalReturn = BigDecimal.ZERO; -// // 查询交易设置 -// //TradeSetting tradeSetting = tradeMapper.findTradeSetting(); -// // 计算手续费 -//// Double closingPrice = closePrice -//// .multiply(new BigDecimal(tradeSetting.getClosingRatio()).divide(new BigDecimal(100), 8, BigDecimal.ROUND_DOWN)) -//// .multiply(symbolSku.getLotNumber())// 规格 -//// .multiply(new BigDecimal(currentFlat)).setScale(8, BigDecimal.ROUND_DOWN) -//// .doubleValue(); -// order.setSellClosingPrice(order.getClosingPrice()); -// -// //添加止盈订单 -// order.setId(null); -// //10:止盈平空 -// order.setStatus(10); -// orderMapper.addCoinsCoinsOrder(order); -// // 将需要退回的减去手续费 -// BigDecimal needReturn = prePrice.add(new BigDecimal(profitLossPrice)); -// //总退回金额=保证金+收益-手续费 -// totalReturn = needReturn.subtract(new BigDecimal(order.getClosingPrice())); -// // 更新钱包 -// // Double availableBalance = totalReturn.add(new BigDecimal(wallet.getAvailableBalance())) -// // .doubleValue(); -// -// Double availableBalance = totalReturn.doubleValue(); -// -// Double totalBalance = - order.getClosingPrice() + profitLossPrice; -//// wallet.setAvailableBalance(availableBalance); -//// wallet.setTotalBalance(totalBalance); -//// int i = memberService.updateWallet(wallet); -// walletDao.updateWallet(wallet.getId(),totalBalance,availableBalance,null); -// // 流水记录 -// MemberAccountFlowRecord record = new MemberAccountFlowRecord(); -// record.setCreateTime(new Date()); -// record.setDirectionSource("止盈平仓"); -// record.setRemark("止盈平仓"); -// record.setMemberBalance(wallet.getAvailableBalance()); -// record.setMemberid(order.getMemberId()); -// record.setSymbolName(order.getSymbol()); -// record.setMemberName(wallet.getMemberName()); -// record.setMemberPhone(order.getMemberPhone()); -// record.setPrice(profitLossPrice + order.getPrePrice()); -// memberService.addFlowRecord(record); -// -// //返佣 TODO -// calYj(order.getMemberId(), new BigDecimal(order.getClosingPrice()), order, 2); -// } -// } -// } -// } -// -// } -// -// /** -// * 开多止损 -// * -// * @param -// */ -// public void dealForMoreLoss(List<CoinsCoinsOrder> orderList,List<OrderModel> list) { -// //List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno); -// //System.out.println("开多止损批次号batchno:" + batchno); -// if (CollectionUtils.isNotEmpty(orderList)) { -// Map<Long,BigDecimal> modelMap = new HashMap<Long,BigDecimal>(); -// for(OrderModel model : list){ -// modelMap.put(model.getOrderId(),new BigDecimal(model.getPrice())); -// } -// for (CoinsCoinsOrder order : orderList) { -// System.out.println("开多止损订单号:" + order.getSerialno()); -// System.out.println("传来的止损价格:"+modelMap.get(order.getId())); -// -// if (null != order.getStopLossPrice()) { -// // 止损价 -// BigDecimal closePrice = new BigDecimal(order.getStopLossPrice()).setScale(7,RoundingMode.HALF_UP); -// System.out.println("订单止损价格:"+closePrice.toPlainString()); -// BigDecimal queuePrice = modelMap.get(order.getId()).setScale(7, RoundingMode.HALF_UP); -// if(closePrice.compareTo(queuePrice)!=0){ -// System.out.println("数据库价格:"+queuePrice.toPlainString()+"--价格不能开多止损:"+closePrice); -// orderMapper.updateOrderIsExitAndBatchno(order.getId()); -// continue; -// } -// System.out.println("执行操作"); -// String symbol = order.getSymbol(); -// // 本次需要退回的预付款 -// BigDecimal prePrice = new BigDecimal(order.getPrePrice()); -// Wallet wallet = memberService.findWalletByMemberIdAndSymbol(order.getMemberId(), "USDT"); -// -// if (wallet != null) { -// // 更新订单 -// order.setIsEixt(0); -// orderMapper.updateOrder(order); -// order.setExitPrice(order.getStopLossPrice());// 平仓价格 -// order.setExitType(3);// 平仓类型,1:表示手动平仓,2:止盈平仓,3:止损平仓,4:爆仓 -// order.setExitTime(new Date());// 平仓时间 -// order.setEntrustStatus(8);// 平仓状态 -// -// TradeSymbolSku symbolSku = tradeMapper.findSymbolSkubySymbol(symbol); -// -// Double profitLossPrice = (closePrice -// .subtract(new BigDecimal(order.getTradePrice()))) -// .multiply(new BigDecimal(order.getSymbolSkuNumber())) -// .multiply(symbolSku.getLotNumber()) -// .setScale(8, BigDecimal.ROUND_DOWN).doubleValue(); -// -// Member member = memberService.selectMemberById(order.getMemberId()); -// if(member.getIsProfit() == 1) { -// TradeSetting tradeSetting = tradeSettingCache.getTradeSetting(); -// if(profitLossPrice>0) { -// profitLossPrice = profitLossPrice*(1-tradeSetting.getProfitParam()); -// }else { -// profitLossPrice = profitLossPrice*(1+tradeSetting.getProfitParam());; -// } -// } -// //回报率 -// double returnRate = new BigDecimal(profitLossPrice).divide((new BigDecimal(order.getPrePrice()).subtract(new BigDecimal(order.getClosingPrice()))), 8, BigDecimal.ROUND_DOWN) -// .doubleValue(); -// // 查询交易设置 -// TradeSetting tradeSetting = tradeSettingCache.getTradeSetting(); -// // 计算手续费 -//// Double closingPrice = closePrice -//// .multiply(new BigDecimal(tradeSetting.getClosingRatio()).divide(new BigDecimal(100), 8, BigDecimal.ROUND_DOWN)) -//// .multiply(symbolSku.getLotNumber())// 规格 -//// .multiply(new BigDecimal(currentFlat)).setScale(8, BigDecimal.ROUND_DOWN) -//// .doubleValue(); -// order.setRewardRatio(profitLossPrice);// 盈亏 -// order.setReturnRate(returnRate); -// order.setSellClosingPrice(order.getClosingPrice()); -// -// //添加止损 -// order.setId(null); -// order.setStatus(11); -// orderMapper.addCoinsCoinsOrder(order); -// BigDecimal totalReturn = BigDecimal.ZERO; -// // 将需要退回的减去手续费 -// BigDecimal needReturn = prePrice.add(new BigDecimal(profitLossPrice)); -// //总退回金额=保证金+收益-手续费 -// totalReturn = needReturn.subtract(new BigDecimal(order.getClosingPrice())); -// // 更新钱包 -// // Double availableBalance = totalReturn.add(new BigDecimal(wallet.getAvailableBalance())) -// // .doubleValue(); -// Double availableBalance = totalReturn.doubleValue(); -// -// //Double totalBalance = wallet.getTotalBalance() - order.getClosingPrice() + profitLossPrice; -// Double totalBalance = -order.getClosingPrice() + profitLossPrice; -// -//// wallet.setAvailableBalance(availableBalance); -//// wallet.setTotalBalance(totalBalance); -//// int i = memberService.updateWallet(wallet); -// walletDao.updateWallet(wallet.getId(),totalBalance,availableBalance,null); -// // 流水记录 -// MemberAccountFlowRecord record = new MemberAccountFlowRecord(); -// record.setCreateTime(new Date()); -// record.setDirectionSource("开多止损平仓"); -// record.setRemark("开多止损平仓"); -// record.setMemberBalance(wallet.getAvailableBalance()); -// record.setMemberid(order.getMemberId()); -// record.setSymbolName(order.getSymbol()); -// record.setMemberName(wallet.getMemberName()); -// record.setMemberPhone(order.getMemberPhone()); -// record.setPrice(profitLossPrice + order.getPrePrice()); -// memberService.addFlowRecord(record); -// -// //返佣 TODO -// calYj(order.getMemberId(), new BigDecimal(order.getClosingPrice()), order, 2); -// } -// } -// } -// } -// } -// -// /** -// * 开空止损 -// * -// * @param -// */ -// public void dealForLessLoss(List<CoinsCoinsOrder> orderList,List<OrderModel> list) { -// // List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno); -// //System.out.println("开空止损批次号batchno:" + batchno); -// if (CollectionUtils.isNotEmpty(orderList)) { -// Map<Long,BigDecimal> modelMap = new HashMap<Long,BigDecimal>(); -// for(OrderModel model : list){ -// modelMap.put(model.getOrderId(),new BigDecimal(model.getPrice())); -// } -// for (CoinsCoinsOrder order : orderList) { -// System.out.println("传来的止损价格:"+modelMap.get(order.getId()).toPlainString()); -// System.out.println("开空止损订单号:" + order.getSerialno()); -// if (null != order.getStopLossPrice()) { -// // 止损价 -// BigDecimal closePrice = new BigDecimal(order.getStopLossPrice()).setScale(7,RoundingMode.HALF_UP); -// -// System.out.println("订单止损价格:"+closePrice.toPlainString()); -// BigDecimal queuePrice = modelMap.get(order.getId()).setScale(7, RoundingMode.HALF_UP); -// if(closePrice.compareTo(queuePrice)!=0){ -// System.out.println("数据库价格:"+queuePrice.toPlainString()+"--价格不能开空止损:"+closePrice); -// -// orderMapper.updateOrderIsExitAndBatchno(order.getId()); -// continue; -// } -// System.out.println("执行操作"); -// String symbol = order.getSymbol(); -// // 本次需要退回的预付款 -// BigDecimal prePrice = new BigDecimal(order.getPrePrice()); -// Wallet wallet = memberService.findWalletByMemberIdAndSymbol(order.getMemberId(), "USDT"); -// -// if (wallet != null) { -// // 更新订单 -// order.setIsEixt(0); -// orderMapper.updateOrder(order); -// order.setExitPrice(order.getStopLossPrice());// 平仓价格 -// order.setExitType(3);// 平仓类型,1:表示手动平仓,2:止盈平仓,3:止损平仓,4:爆仓 -// order.setExitTime(new Date());// 平仓时间 -// order.setEntrustStatus(8);// 平仓状态 -// -// TradeSymbolSku symbolSku = tradeMapper.findSymbolSkubySymbol(symbol); -// // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数 -// Double profitLossPrice = (new BigDecimal(order.getTradePrice())) -// .subtract(closePrice) -// .multiply(new BigDecimal(order.getSymbolSkuNumber())) -// .multiply(symbolSku.getLotNumber()) -// .setScale(8, BigDecimal.ROUND_DOWN).doubleValue(); -// Member member = memberService.selectMemberById(order.getMemberId()); -// if(member.getIsProfit() == 1) { -// TradeSetting tradeSetting=tradeSettingCache.getTradeSetting(); -// if(profitLossPrice>0) { -// profitLossPrice = profitLossPrice*(1-tradeSetting.getProfitParam()); -// }else { -// profitLossPrice = profitLossPrice*(1+tradeSetting.getProfitParam());; -// } -// } -// //回报率 -// double returnRate = new BigDecimal(profitLossPrice).divide((new BigDecimal(order.getPrePrice()).subtract(new BigDecimal(order.getClosingPrice()))), 8, BigDecimal.ROUND_DOWN) -// .doubleValue(); -// order.setRewardRatio(profitLossPrice);// 盈亏 -// order.setReturnRate(returnRate); -// -// BigDecimal totalReturn = BigDecimal.ZERO; -//// TradeSymbolSku symbolSku = tradeMapper.findSymbolSkubySymbol(symbol); -// // 本次平仓数量 -// // Long currentFlat = order.getSymbolSkuNumber(); -// // 查询交易设置 -// // TradeSetting tradeSetting = tradeMapper.findTradeSetting(); -// // 计算手续费 -//// Double closingPrice = new BigDecimal(order.getStopLossPrice()) -//// .multiply(new BigDecimal(tradeSetting.getClosingRatio()).divide(new BigDecimal(100), 8, BigDecimal.ROUND_DOWN)) -//// .multiply(symbolSku.getLotNumber())// 规格 -//// .multiply(new BigDecimal(currentFlat)).setScale(8, BigDecimal.ROUND_DOWN) -//// .doubleValue(); -// order.setSellClosingPrice(order.getClosingPrice()); -// -// //添加止盈订单 -// order.setId(null); -// order.setStatus(12); -// orderMapper.addCoinsCoinsOrder(order); -// // 将需要退回的减去手续费 -// BigDecimal needReturn = prePrice.add(new BigDecimal(profitLossPrice)); -// //总退回金额=保证金+收益-手续费 -// totalReturn = needReturn.subtract(new BigDecimal(order.getClosingPrice())); -// // 更新钱包 -// // Double availableBalance = totalReturn.add(new BigDecimal(wallet.getAvailableBalance())) -// // .doubleValue(); -// -// Double availableBalance = totalReturn.doubleValue(); -// -// //Double totalBalance = wallet.getTotalBalance() - order.getClosingPrice() + profitLossPrice; -// Double totalBalance = profitLossPrice- order.getClosingPrice() ; -// -//// wallet.setAvailableBalance(availableBalance); -//// wallet.setTotalBalance(totalBalance); -//// int i = memberService.updateWallet(wallet); -// walletDao.updateWallet(wallet.getId(),totalBalance,availableBalance,null); -// -// // 流水记录 -// MemberAccountFlowRecord record = new MemberAccountFlowRecord(); -// record.setCreateTime(new Date()); -// record.setDirectionSource("开空止损平仓"); -// record.setRemark("开空止损平仓"); -// record.setMemberBalance(wallet.getAvailableBalance()); -// record.setMemberid(order.getMemberId()); -// record.setSymbolName(order.getSymbol()); -// record.setMemberName(wallet.getMemberName()); -// record.setMemberPhone(order.getMemberPhone()); -// record.setPrice(profitLossPrice + order.getPrePrice()); -// memberService.addFlowRecord(record); -// -// //返佣 TODO -// calYj(order.getMemberId(), new BigDecimal(order.getClosingPrice()), order, 2); -// } -// } -// } -// } -// } -// -// -// /** -// * 限价委托 -// * -// * @param -// */ -// public void dealLimitBuyOrder(List<ContractEntrustOrderEntity> orderList) { -// -// //List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno); -// if (CollectionUtils.isNotEmpty(orderList)) { -// ContractHoldOrderEntity contractHoldOrderEntity=null; -// for (ContractEntrustOrderEntity coinsCoinsOrder : orderList) { -// MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(coinsCoinsOrder.getMemberId(), "USDT"); -// if (wallet == null) { -// continue; -// } -// -// contractHoldOrderEntity = new ContractHoldOrderEntity(); -// Long memId = coinsCoinsOrder.getMemberId(); -// MemberEntity memberEntity = memberService.getById(memId); -// BigDecimal entrustPrice = coinsCoinsOrder.getEntrustPrice(); -// int symbolCnt = coinsCoinsOrder.getSymbolCnt(); -// int type = coinsCoinsOrder.getEntrustType(); -// //开仓价 -// // Double openPrice = coinsCoinsOrder.getOpenPrice().doubleValue(); -// //委托价 -// // Double markPrice = coinsCoinsOrder.getMarkPrice(); -// if (type == 1) { -// // 开多 -// contractHoldOrderEntity.setOpeningType(ContractHoldOrderEntity.ORDER_OPENING_TYPE_MORE); -// } else { -// // 开空 -// contractHoldOrderEntity.setOpeningType(ContractHoldOrderEntity.ORDER_OPENING_TYPE_LESS); -// -// } -// -// //持仓单赋值 -// contractHoldOrderEntity.setMemberId(memId); -// contractHoldOrderEntity.setIsCanClosing(ContractHoldOrderEntity.ORDER_CAN_CLOSING_Y); -// contractHoldOrderEntity.setMarkPrice(coinsCoinsOrder.getEntrustPrice()); -// contractHoldOrderEntity.setBondPrice(coinsCoinsOrder.getBondAmount()); -// // 开仓手续费 建仓价*规格*手数*手续费率 -// BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(coinsCoinsOrder.getSymbol()); -// PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); -// BigDecimal openFeePrice = coinsCoinsOrder.getEntrustPrice().multiply(lotNumber) -// .multiply(new BigDecimal(coinsCoinsOrder.getSymbolCnt())) -// .multiply(tradeSettingEntity.getFeeRatio().divide(new BigDecimal(100))) -// .setScale(8, BigDecimal.ROUND_DOWN); -// contractHoldOrderEntity.setOpeningFeeAmount(openFeePrice); -// contractHoldOrderEntity.setVersion(1); -// BigDecimal forceSetPrice = CalculateUtil.getForceSetPrice(coinsCoinsOrder.getBondAmount(), entrustPrice, symbolCnt, lotNumber, type, memberEntity); -// -// contractHoldOrderEntity.setForceClosingPrice(forceSetPrice); -// contractHoldOrderEntity.setLeverRatio(coinsCoinsOrder.getLeverRatio()); -// contractHoldOrderEntity.setOpeningPrice(entrustPrice); -// contractHoldOrderService.save(contractHoldOrderEntity); -// -// // 需要一个历史插入 -// ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(contractHoldOrderEntity); -// contractOrderEntity.setId(null); -// contractOrderService.save(contractOrderEntity); -// // 发送爆仓的队列 -// // 市价 -// if (coinsCoinsOrder.getEntrustType() == 1) { -// // 开多 -// OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 6, contractHoldOrderEntity.getForceClosingPrice().toPlainString(), coinsCoinsOrder.getSymbol(),1); -// producer.sendPriceOperate(JSONObject.toJSONString(model)); -// } else { -// // 开空 -// OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 7, contractHoldOrderEntity.getForceClosingPrice().toPlainString(), coinsCoinsOrder.getSymbol(),1); -// producer.sendPriceOperate(JSONObject.toJSONString(model)); -// } -// // 扣除手续费 -// //double totalBalance = wallet.getTotalBalance() - coinsCoinsOrder.getClosingPrice(); -// BigDecimal totalBalance = openFeePrice.negate(); -// -// /** TradeSetting tradeSetting = tradeSettingCache.getTradeSetting(); -// -// Double totalPayPrice = new BigDecimal(coinsCoinsOrder.getPrePrice()).add(new BigDecimal(coinsCoinsOrder.getClosingPrice())).add(new BigDecimal(coinsCoinsOrder.getClosingPrice())) -// .setScale(8, BigDecimal.ROUND_HALF_UP).doubleValue(); -// totalBalance = totalBalance+(-totalPayPrice*(Double.valueOf(tradeSetting.getSpread())/10000));*/ -// -// memberWalletContractService.increaseWalletContractBalanceById(null,totalBalance,null,wallet.getId()); -// // TODO 531 待写 -// //calYj(memId, new BigDecimal(coinsCoinsOrder.getClosingPrice()), coinsCoinsOrder, 1); -// } -// } -// } -// -// /** -// * 爆仓 -// * -// * @param -// */ -// public void dealCoinOut(List<ContractHoldOrderEntity> orderList,List<OrderModel> orderModels) { -// // 需要比较查询到的和消息发来的单的爆仓操作次序号是否相同 -// // 构建map -// -// if (CollectionUtils.isNotEmpty(orderList)) { -// Map<Long,Integer> modelMap = new HashMap<Long,Integer>(); -// for(OrderModel model : orderModels){ -// modelMap.put(model.getOrderId(),model.getOperateNo()); -// } -// // TradeSetting tradeSetting = tradeMapper.findTradeSetting(); -// for (ContractHoldOrderEntity coinsOrder : orderList) { -// Long orderId = coinsOrder.getId(); -// Integer operateNo = coinsOrder.getOperateNo(); -// //判断当前订单是否是最新的爆仓价 不相等时直接进入下一个订单 -// if(!modelMap.get(orderId).equals(operateNo)){ -// // 将订单更新为可平仓并删除批次号 -// contractHoldOrderService.updateOrderIsCanClosingAndBatchNoById(orderId); -// continue; -// } -// boolean isDone = false; -// Long memId = coinsOrder.getMemberId(); -// MemberEntity byId = memberService.getById(memId); -// String symbol = coinsOrder.getSymbol(); -// //TradeSymbolSku symbolSku = tradeMapper.findSymbolSkubySymbol(symbol); -// BigDecimal nowPrice = coinsOrder.getForceClosingPrice(); -// // 创建订单(加入历史表的订单) -// ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(coinsOrder); -// -// //查询是否满足爆仓条件 -// if (coinsOrder.getOpeningType() == ContractHoldOrderEntity.ORDER_OPENING_TYPE_MORE) { -// //如果是开多,当前价小于预估强平价即为爆仓 -// // 设置平仓类型 // 爆仓平多 -// contractOrderEntity.setClosingType(4); -// //更新用户钱包数据 -// isDone = true; -// } else { -// //如果是开空,当前价大于预估强平价即为爆仓 -// contractOrderEntity.setClosingType(5); -// //更新主表订单状态位为“已平仓” -// isDone = true; -// -// } -// if (isDone) { -// //删除次仓订单 -// contractHoldOrderService.removeById(orderId); -// -// //系统自动平仓(爆仓) -//// Double closingPrice = nowPrice -//// .multiply(new BigDecimal(tradeSetting.getClosingRatio()).divide(new BigDecimal(100), 8, BigDecimal.ROUND_DOWN)) -//// .multiply(symbolSku.getLotNumber())// 规格 -//// .multiply(new BigDecimal(coinsOrder.getSymbolSkuNumber())) -//// .setScale(8, BigDecimal.ROUND_DOWN).doubleValue(); -// //更新主表订单状态位为“已平仓” -// contractOrderEntity.setId(null); -// contractOrderEntity.setClosingPrice(BigDecimal.ZERO); -// //order.setPayTotalPrice(coinsOrder.getPrePrice()+coinsOrder.getClosingPrice());// 总支付金额(预付款) -// -// contractOrderEntity.setClosingPrice(nowPrice); -// contractOrderEntity.setClosingTime(new Date()); -// contractOrderEntity.setRewardAmount((coinsOrder.getOpeningFeeAmount().multiply(new BigDecimal("2")).subtract(coinsOrder.getPrePaymentAmount()))); -// //order.setRewardRatio(-(coinsOrder.getPrePrice() - (2*coinsOrder.getClosingPrice()))); -// contractOrderService.save(contractOrderEntity); -// -// //更新用户钱包数据 -// MemberWalletContractEntity usdt = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memId, "USDT"); -// -// // Double totalPrice = wallet.getTotalBalance() - coinsOrder.getPrePrice(); -// // 减去的时候用负数 -// BigDecimal totalPrice = coinsOrder.getPrePaymentAmount().negate(); -// //Double totalPrice = - coinsOrder.getPrePrice(); -// memberWalletContractService.increaseWalletContractBalanceById(null,totalPrice,null,usdt.getId()); -// -// // 流水记录 TODO -//// MemberAccountFlowRecord record = new MemberAccountFlowRecord(); -//// record.setCreateTime(new Date()); -//// record.setDirectionSource("系统自动平仓"); -//// record.setRemark("系统自动平仓"); -//// record.setMemberBalance(coinsOrder.getPrePrice()); -//// record.setMemberid(memId); -//// record.setSymbolName(null); -//// record.setMemberName(null); -//// record.setMemberPhone(null); -//// record.setPrice(coinsOrder.getPrePrice()); -//// memberService.addFlowRecord(record); -// -// } -// } -// } -// } -// -// -// public void calYj(Long mid, BigDecimal money, CoinsCoinsOrder order, int type) { -// if(money!=null) { -// money = money.multiply(new BigDecimal(0.7868)); -// } -// Member member = memberService.selectMemberById(mid); -// String[] referenceIds = member.getReferenceIds().split(","); -// List<String> ids = Arrays.asList(referenceIds); -// -// // 判断该用户是否为代理商 -// NeedMoneyMember needMoneyMember = memberMapper.selectFriendRelationUserByMid(mid); -// -// // 查询该用户下所有需要返佣的代理商 -// List<NeedMoneyMember> list = memberMapper.selectAllNeedMoneyMember(ids); -// TreeMap<String, NeedMoneyMember> treeMap = new TreeMap<>(new Comparator<String>() { -// @Override -// public int compare(String o1, String o2) { -// return o2.compareTo(o1); -// } -// }); -// // 建立层级关系 -// for (int i = 0; i < list.size(); i++) { -// treeMap.put(list.get(i).getLevelId(), list.get(i)); -// } -// -// // 该用户为代理商则判断is_self字段,判断是否保留其手续费 -// // 该用户为代理商则判断is_self字段,判断是否保留其手续费 -// if (needMoneyMember != null && needMoneyMember.getIsSelf() == 1) { -// treeMap.put(needMoneyMember.getLevelId(), needMoneyMember); -// } -// -// -// // 存放uid以及对应uid用户的佣金 -// Map<String, BigDecimal> map = new HashMap<>(); -// Iterator<Map.Entry<String, NeedMoneyMember>> it = treeMap.entrySet().iterator(); -// BigDecimal lastRate = BigDecimal.ZERO; -// BigDecimal lastYj = BigDecimal.ZERO; -// while (it.hasNext()) { -// Map.Entry<String, NeedMoneyMember> entry = it.next(); -// NeedMoneyMember member1 = entry.getValue(); -// // 上下级佣金比率相减后乘以手续费 -- 即用户所得佣金 -// lastYj = (member1.getReturnRate().subtract(lastRate)).multiply(money); -// lastRate = member1.getReturnRate(); -// map.put(member1.getUid(), lastYj); -// } -// -// // 输出对应佣金是否正确 -// Iterator<Map.Entry<String, BigDecimal>> it1 = map.entrySet().iterator(); -// List<AgentReturn> agentList = new ArrayList<AgentReturn>(); -// while (it1.hasNext()) { -// Map.Entry<String, BigDecimal> entry = it1.next(); -// // System.out.println(entry.getKey() + "-----" + entry.getValue()); -// Member agentMember = memberMapper.findMemberByUID(entry.getKey()); -// AgentReturn agent = new AgentReturn(); -// agent.setMemId(mid); -// agent.setOrderId(order.getId()); -// agent.setOrderNo(order.getSerialno()); -// agent.setAgentId(agentMember.getmId()); -// agent.setReturnType(order.getStatus()); -// agent.setReturnTime(new Date()); -// agent.setReturnSymbol(order.getSymbol()); -// agent.setIsReturn(0); -// agent.setReturnMoney(entry.getValue()); -// if (type == 1) {//开仓 -// agent.setOpenPrice(new BigDecimal(order.getClosingPrice())); -// } else if (type == 2) {//平仓 -// agent.setClosePrice(new BigDecimal(order.getClosingPrice())); -// } else {//持仓费 -// agent.setDoingPrice(order.getDoingPrice()); -// } -// agent.setReturnMenId(agentMember.getmId()); -// agent.setUid(entry.getKey()); -// agent.setOrderType(order.getStatus()); -// agentReturnMapper.insert(agent); -// } -// -// -// } -// -//} +package com.xcong.excoin.modules.contract.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.xcong.excoin.modules.coin.dao.MemberAccountFlowEntityDao; +import com.xcong.excoin.modules.coin.entity.MemberAccountFlowEntity; +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.contract.mapper.ContractEntrustOrderEntityMapper; +import com.xcong.excoin.modules.contract.mapper.ContractHoldOrderEntityMapper; +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.member.dao.AgentReturnDao; +import com.xcong.excoin.modules.member.entity.AgentReturnEntity; +import com.xcong.excoin.modules.member.entity.MemberEntity; +import com.xcong.excoin.modules.member.entity.MemberWalletContractEntity; +import com.xcong.excoin.modules.member.parameter.vo.NeedMoneyMemberVo; +import com.xcong.excoin.modules.member.service.MemberService; +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.OrderProducer; +import com.xcong.excoin.utils.CacheSettingUtils; +import com.xcong.excoin.utils.CalculateUtil; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; + +/** + * @author helius + */ +@Service +public class OrderWebsocketServiceImpl { + + @Resource + ContractHoldOrderService contractHoldOrderService; + + @Resource + ContractOrderService contractOrderService; + + @Resource + ContractEntrustOrderService contractEntrustOrderService; + + @Resource + MemberWalletContractService memberWalletContractService; + + @Resource + CacheSettingUtils cacheSettingUtils; + + @Resource + OrderProducer producer; + + @Resource + MemberService memberService; + + @Resource + private AgentReturnDao agentReturnDao; + + @Resource + private MemberAccountFlowEntityDao memberAccountFlowEntityDao; + + + public void dealOrderFromMq(List<OrderModel> list, Integer type) { + if (CollectionUtils.isNotEmpty(list)) { + String batchno = UUID.randomUUID().toString(); + // 更新订单状态 + // 更新为不可平仓状态 + int count = contractHoldOrderService.updateContractHoldOrderCanNotClosingByIds(list, batchno); + // 查询 + if (count > 0) { + // 查询 + List<ContractHoldOrderEntity> coinsCoinsOrders = contractHoldOrderService.selectContractHoldOrderByBatchNo(batchno); + // 根据状态调用不同的方法 + // 1:买入委托2:开多3:开空4:平多5:平空6:爆仓平多7:爆仓平空8:撤单9:止盈平多10:止盈平空11:止损平多12:止损平空 + // 6在这里是爆仓 包括爆空和暴多 + switch (type) { + case 6: + this.dealCoinOut(coinsCoinsOrders, list); + break; + case 9: + this.dealForMoreStopPro(coinsCoinsOrders, list); + break; + case 10: + this.dealForLessStopPro(coinsCoinsOrders, list); + break; + case 11: + this.dealForMoreLoss(coinsCoinsOrders, list); + break; + case 12: + this.dealForLessLoss(coinsCoinsOrders, list); + break; + default: + break; + } + + } + + + } + } + + public void dealForLimitMq(List<OrderModel> list) { + if (CollectionUtils.isNotEmpty(list)) { + //查询限价委托的单 + String batchno = UUID.randomUUID().toString(); + List<Long> ids = new ArrayList<>(); + list.forEach(model -> ids.add(model.getOrderId())); + List<ContractEntrustOrderEntity> contractEntrustOrderEntities = contractEntrustOrderService.selectEntrustOrderListByIds(ids); + + if (CollectionUtils.isNotEmpty(contractEntrustOrderEntities)) { + this.dealLimitBuyOrder(contractEntrustOrderEntities); + } + + } + } + + /** + * 开多止盈 + */ + public void dealForMoreStopPro(List<ContractHoldOrderEntity> orderList, List<OrderModel> list) { + if (CollectionUtils.isNotEmpty(orderList)) { + Map<Long, BigDecimal> modelMap = new HashMap<Long, BigDecimal>(); + for (OrderModel model : list) { + modelMap.put(model.getOrderId(), new BigDecimal(model.getPrice())); + } + for (ContractHoldOrderEntity order : orderList) { + Long orderId = order.getId(); + System.out.println("开多止盈订单号:" + order.getOrderNo()); + System.out.println("传来的止盈价格:" + modelMap.get(order.getId())); + if (null != order.getStopProfitPrice()) { + BigDecimal closePrice = order.getStopProfitPrice(); + BigDecimal queuePrice = modelMap.get(order.getId()); + System.out.println("订单的止盈价格:" + closePrice); + // 判断 保留七位是为了忽略以为小数 防止不精确导致的不相等 + if (queuePrice.compareTo(closePrice) != 0) { + + // 不能止盈 + System.out.println("数据库价格:" + queuePrice.toPlainString() + "--价格不能止盈:" + closePrice); + //更新数据 + contractHoldOrderService.updateOrderIsCanClosingAndBatchNoById(orderId); + continue; + } + System.out.println("执行操作"); + // 止盈价 + String symbol = order.getSymbol(); + // 本次需要退回的预付款 + BigDecimal prePrice = order.getPrePaymentAmount(); + Long memberId = order.getMemberId(); + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); + if (wallet != null) { + // 历史订单 + ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(order); + contractOrderEntity.setClosingTime(new Date()); + contractOrderEntity.setId(null); + + // 本次平仓数量 + int currentFlat = order.getSymbolCnt(); + BigDecimal symbolSku = cacheSettingUtils.getSymbolSku(order.getSymbol()); + // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 + BigDecimal profitLossPrice = (closePrice + .subtract(order.getOpeningPrice())) + .multiply(new BigDecimal(currentFlat + "")) + .multiply(symbolSku).setScale(8, BigDecimal.ROUND_DOWN); + MemberEntity memberEntity = memberService.getById(memberId); + + if (memberEntity.getIsProfit() == 1) { + PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); + if (profitLossPrice.compareTo(BigDecimal.ZERO) > 0) { + profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(tradeSetting.getProfitParam())); + } else { + profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); + } + } + //回报率 + BigDecimal returnRate = profitLossPrice.divide((order.getPrePaymentAmount().subtract(contractOrderEntity.getClosingFeeAmount())), 8, BigDecimal.ROUND_DOWN); + contractOrderEntity.setRewardAmount(profitLossPrice); + contractOrderEntity.setRewardRatio(returnRate); + contractOrderEntity.setClosingFeeAmount(order.getOpeningFeeAmount()); + contractOrderEntity.setClosingPrice(closePrice); + contractOrderEntity.setClosingType(6); + BigDecimal totalReturn = BigDecimal.ZERO; + contractOrderService.save(contractOrderEntity); + // 将需要退回的减去手续费 + BigDecimal needReturn = prePrice.add(profitLossPrice); + //总退回金额=保证金+收益-手续费 + totalReturn = needReturn.subtract(contractOrderEntity.getClosingFeeAmount()); + // 更新钱包 + // 总的是收益-平仓手续费 + BigDecimal totalBalance = profitLossPrice.subtract(contractOrderEntity.getClosingFeeAmount()); + memberWalletContractService.increaseWalletContractBalanceById(totalBalance, totalReturn, null, wallet.getId()); + + // 流水记录 TODO 531e + insertAccountFlow(order, wallet, profitLossPrice, "止盈平仓"); + + //返佣 + calYj(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, 2); + } + } + } + } + + } + + /** + * 开空止盈 + */ + public void dealForLessStopPro(List<ContractHoldOrderEntity> orderList, List<OrderModel> list) { + //List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno); + //System.out.println("开空止盈订单batchno:" + batchno); + if (CollectionUtils.isNotEmpty(orderList)) { + Map<Long, BigDecimal> modelMap = new HashMap<Long, BigDecimal>(); + for (OrderModel model : list) { + modelMap.put(model.getOrderId(), new BigDecimal(model.getPrice())); + } + for (ContractHoldOrderEntity order : orderList) { + System.out.println("开空止盈订单号:" + order.getOrderNo()); + System.out.println("传来的止盈价格:" + modelMap.get(order.getId()).toPlainString()); + BigDecimal closePrice = order.getStopProfitPrice(); + Long orderId = order.getId(); + if (null != closePrice) { + + // 止盈价 + System.out.println("订单的止盈价格:" + closePrice); + System.out.println(closePrice.compareTo(modelMap.get(order.getId()))); + BigDecimal queuePrice = modelMap.get(order.getId()).setScale(7, RoundingMode.HALF_UP); + if (closePrice.compareTo(queuePrice) != 0) { + System.out.println("数据库价格:" + queuePrice.toPlainString() + "--价格不能开空止盈:" + closePrice); + contractHoldOrderService.updateOrderIsCanClosingAndBatchNoById(orderId); + continue; + } + System.out.println("执行操作"); + String symbol = order.getSymbol(); + // 本次需要退回的预付款 + BigDecimal prePrice = order.getPrePaymentAmount(); + Long memberId = order.getMemberId(); + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); + if (wallet != null) { + // 历史订单 + ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(order); + contractOrderEntity.setClosingTime(new Date()); + contractOrderEntity.setId(null); + + // 本次平仓数量 + int currentFlat = order.getSymbolCnt(); + BigDecimal symbolSku = cacheSettingUtils.getSymbolSku(order.getSymbol()); + // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 + BigDecimal profitLossPrice = (order.getOpeningPrice() + .subtract(closePrice)) + .multiply(new BigDecimal(currentFlat + "")) + .multiply(symbolSku).setScale(8, BigDecimal.ROUND_DOWN); + MemberEntity memberEntity = memberService.getById(memberId); + + if (memberEntity.getIsProfit() == 1) { + PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); + if (profitLossPrice.compareTo(BigDecimal.ZERO) > 0) { + profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(tradeSetting.getProfitParam())); + } else { + profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); + } + } + //回报率 + BigDecimal returnRate = profitLossPrice.divide((order.getPrePaymentAmount().subtract(contractOrderEntity.getClosingFeeAmount())), 8, BigDecimal.ROUND_DOWN); + contractOrderEntity.setRewardAmount(profitLossPrice); + contractOrderEntity.setRewardRatio(returnRate); + contractOrderEntity.setClosingFeeAmount(order.getOpeningFeeAmount()); + contractOrderEntity.setClosingPrice(closePrice); + contractOrderEntity.setClosingType(7); + BigDecimal totalReturn = BigDecimal.ZERO; + contractOrderService.save(contractOrderEntity); + // 将需要退回的减去手续费 + BigDecimal needReturn = prePrice.add(profitLossPrice); + //总退回金额=保证金+收益-手续费 + totalReturn = needReturn.subtract(contractOrderEntity.getClosingFeeAmount()); + // 更新钱包 + // 总的是收益-平仓手续费 + BigDecimal totalBalance = profitLossPrice.subtract(contractOrderEntity.getClosingFeeAmount()); + memberWalletContractService.increaseWalletContractBalanceById(totalBalance, totalReturn, null, wallet.getId()); + + + insertAccountFlow(order, wallet, profitLossPrice, "止盈平仓"); + + //返佣 + calYj(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, 2); + } + } + } + } + + } + + /** + * 开多止损 + * + * @param + */ + public void dealForMoreLoss(List<ContractHoldOrderEntity> orderList, List<OrderModel> list) { + //List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno); + //System.out.println("开多止损批次号batchno:" + batchno); + if (CollectionUtils.isNotEmpty(orderList)) { + Map<Long, BigDecimal> modelMap = new HashMap<Long, BigDecimal>(); + for (OrderModel model : list) { + modelMap.put(model.getOrderId(), new BigDecimal(model.getPrice())); + } + for (ContractHoldOrderEntity order : orderList) { + System.out.println("开多止损订单号:" + order.getOrderNo()); + Long orderId = order.getId(); + System.out.println("传来的止损价格:" + modelMap.get(orderId)); + + if (null != order.getStopLossPrice()) { + // 止损价 + BigDecimal closePrice = order.getStopLossPrice(); + System.out.println("订单止损价格:" + closePrice.toPlainString()); + BigDecimal queuePrice = modelMap.get(orderId); + if (closePrice.compareTo(queuePrice) != 0) { + System.out.println("数据库价格:" + queuePrice.toPlainString() + "--价格不能开多止损:" + closePrice); + contractHoldOrderService.updateOrderIsCanClosingAndBatchNoById(orderId); + continue; + } + System.out.println("执行操作"); + String symbol = order.getSymbol(); + Long memberId = order.getMemberId(); + // 本次需要退回的预付款 + BigDecimal prePrice = order.getPrePaymentAmount(); + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); + + if (wallet != null) { + // 历史订单 + ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(order); + contractOrderEntity.setClosingTime(new Date()); + contractOrderEntity.setId(null); + + // 本次平仓数量 + int currentFlat = order.getSymbolCnt(); + BigDecimal symbolSku = cacheSettingUtils.getSymbolSku(order.getSymbol()); + // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 + BigDecimal profitLossPrice = (closePrice + .subtract(order.getOpeningPrice())) + .multiply(new BigDecimal(currentFlat + "")) + .multiply(symbolSku).setScale(8, BigDecimal.ROUND_DOWN); + MemberEntity memberEntity = memberService.getById(memberId); + + if (memberEntity.getIsProfit() == 1) { + PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); + if (profitLossPrice.compareTo(BigDecimal.ZERO) > 0) { + profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(tradeSetting.getProfitParam())); + } else { + profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); + } + } + //回报率 + BigDecimal returnRate = profitLossPrice.divide((order.getPrePaymentAmount().subtract(contractOrderEntity.getClosingFeeAmount())), 8, BigDecimal.ROUND_DOWN); + contractOrderEntity.setRewardAmount(profitLossPrice); + contractOrderEntity.setRewardRatio(returnRate); + contractOrderEntity.setClosingFeeAmount(order.getOpeningFeeAmount()); + contractOrderEntity.setClosingPrice(closePrice); + contractOrderEntity.setClosingType(8); + BigDecimal totalReturn = BigDecimal.ZERO; + contractOrderService.save(contractOrderEntity); + // 将需要退回的减去手续费 + BigDecimal needReturn = prePrice.add(profitLossPrice); + //总退回金额=保证金+收益-手续费 + totalReturn = needReturn.subtract(contractOrderEntity.getClosingFeeAmount()); + // 更新钱包 + // 总的是收益-平仓手续费 + BigDecimal totalBalance = profitLossPrice.subtract(contractOrderEntity.getClosingFeeAmount()); + memberWalletContractService.increaseWalletContractBalanceById(totalBalance, totalReturn, null, wallet.getId()); + + insertAccountFlow(order, wallet, profitLossPrice, "开多止损平仓"); + + //返佣 + calYj(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, 2); + } + } + } + } + } + + /** + * 开空止损 + * + * @param + */ + public void dealForLessLoss(List<ContractHoldOrderEntity> orderList, List<OrderModel> list) { + // List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno); + //System.out.println("开空止损批次号batchno:" + batchno); + if (CollectionUtils.isNotEmpty(orderList)) { + Map<Long, BigDecimal> modelMap = new HashMap<Long, BigDecimal>(); + for (OrderModel model : list) { + modelMap.put(model.getOrderId(), new BigDecimal(model.getPrice())); + } + for (ContractHoldOrderEntity order : orderList) { + Long orderId = order.getId(); + System.out.println("传来的止损价格:" + modelMap.get(orderId).toPlainString()); + System.out.println("开空止损订单号:" + order.getOrderNo()); + if (null != order.getStopLossPrice()) { + // 止损价 + BigDecimal closePrice = order.getStopLossPrice(); + + System.out.println("订单止损价格:" + closePrice.toPlainString()); + BigDecimal queuePrice = modelMap.get(orderId); + if (closePrice.compareTo(queuePrice) != 0) { + System.out.println("数据库价格:" + queuePrice.toPlainString() + "--价格不能开空止损:" + closePrice); + contractHoldOrderService.updateOrderIsCanClosingAndBatchNoById(orderId); + continue; + } + System.out.println("执行操作"); + String symbol = order.getSymbol(); + Long memberId = order.getMemberId(); + // 本次需要退回的预付款 + BigDecimal prePrice = order.getPrePaymentAmount(); + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); + + if (wallet != null) { + // 历史订单 + ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(order); + contractOrderEntity.setClosingTime(new Date()); + contractOrderEntity.setId(null); + + // 本次平仓数量 + int currentFlat = order.getSymbolCnt(); + BigDecimal symbolSku = cacheSettingUtils.getSymbolSku(order.getSymbol()); + // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 + BigDecimal profitLossPrice = (order.getOpeningPrice() + .subtract(closePrice)) + .multiply(new BigDecimal(currentFlat + "")) + .multiply(symbolSku).setScale(8, BigDecimal.ROUND_DOWN); + MemberEntity memberEntity = memberService.getById(memberId); + + if (memberEntity.getIsProfit() == 1) { + PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); + if (profitLossPrice.compareTo(BigDecimal.ZERO) > 0) { + profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(tradeSetting.getProfitParam())); + } else { + profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); + } + } + //回报率 + BigDecimal returnRate = profitLossPrice.divide((order.getPrePaymentAmount().subtract(contractOrderEntity.getClosingFeeAmount())), 8, BigDecimal.ROUND_DOWN); + contractOrderEntity.setRewardAmount(profitLossPrice); + contractOrderEntity.setRewardRatio(returnRate); + contractOrderEntity.setClosingFeeAmount(order.getOpeningFeeAmount()); + contractOrderEntity.setClosingPrice(closePrice); + contractOrderEntity.setClosingType(9); + BigDecimal totalReturn = BigDecimal.ZERO; + contractOrderService.save(contractOrderEntity); + // 将需要退回的减去手续费 + BigDecimal needReturn = prePrice.add(profitLossPrice); + //总退回金额=保证金+收益-手续费 + totalReturn = needReturn.subtract(contractOrderEntity.getClosingFeeAmount()); + // 更新钱包 + // 总的是收益-平仓手续费 + BigDecimal totalBalance = profitLossPrice.subtract(contractOrderEntity.getClosingFeeAmount()); + memberWalletContractService.increaseWalletContractBalanceById(totalBalance, totalReturn, null, wallet.getId()); + + insertAccountFlow(order, wallet, profitLossPrice, "开空止损平仓"); + + //返佣 + calYj(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, 2); + + } + } + } + } + } + + private void insertAccountFlow(ContractHoldOrderEntity order, MemberWalletContractEntity wallet, BigDecimal profitLossPrice, String source) { + MemberAccountFlowEntity record = new MemberAccountFlowEntity(); + record.setCreateTime(new Date()); + record.setSource(source); + record.setRemark(source); + record.setBalance(wallet.getAvailableBalance()); + record.setMemberId(order.getMemberId()); + record.setSymbol(order.getSymbol()); + record.setPrice(profitLossPrice.add(order.getPrePaymentAmount())); + memberAccountFlowEntityDao.insert(record); + } + + + /** + * 限价委托 + * + * @param + */ + public void dealLimitBuyOrder(List<ContractEntrustOrderEntity> orderList) { + //List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno); + if (CollectionUtils.isNotEmpty(orderList)) { + ContractHoldOrderEntity contractHoldOrderEntity = null; + for (ContractEntrustOrderEntity coinsCoinsOrder : orderList) { + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(coinsCoinsOrder.getMemberId(), "USDT"); + if (wallet == null) { + continue; + } + + // 委托单bean转换为持仓单bean + contractHoldOrderEntity = ContractEntrustOrderEntityMapper.INSTANCE.entrustOrderToHoldOrder(coinsCoinsOrder); + contractHoldOrderEntity.setId(null); + Long memId = coinsCoinsOrder.getMemberId(); + MemberEntity memberEntity = memberService.getById(memId); + BigDecimal entrustPrice = coinsCoinsOrder.getEntrustPrice(); + int symbolCnt = coinsCoinsOrder.getSymbolCnt(); + int type = coinsCoinsOrder.getEntrustType(); + + if (type == 1) { + // 开多 + contractHoldOrderEntity.setOpeningType(ContractHoldOrderEntity.OPENING_TYPE_MORE); + } else { + // 开空 + contractHoldOrderEntity.setOpeningType(ContractHoldOrderEntity.OPENING_TYPE_LESS); + } + + //持仓单赋值 + contractHoldOrderEntity.setMemberId(memId); + contractHoldOrderEntity.setIsCanClosing(ContractHoldOrderEntity.ORDER_CAN_CLOSING_Y); + contractHoldOrderEntity.setMarkPrice(coinsCoinsOrder.getEntrustPrice()); + contractHoldOrderEntity.setBondAmount(coinsCoinsOrder.getBondAmount()); + // 开仓手续费 建仓价*规格*手数*手续费率 + BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(coinsCoinsOrder.getSymbol()); + PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); + BigDecimal openFeePrice = coinsCoinsOrder.getEntrustPrice().multiply(lotNumber) + .multiply(new BigDecimal(coinsCoinsOrder.getSymbolCnt())) + .multiply(tradeSettingEntity.getFeeRatio().divide(new BigDecimal(100))) + .setScale(8, BigDecimal.ROUND_DOWN); + contractHoldOrderEntity.setOpeningFeeAmount(openFeePrice); + contractHoldOrderEntity.setVersion(1); + BigDecimal forceSetPrice = CalculateUtil.getForceSetPrice(coinsCoinsOrder.getBondAmount().subtract(openFeePrice), entrustPrice, symbolCnt, lotNumber, type, memberEntity); + + contractHoldOrderEntity.setForceClosingPrice(forceSetPrice); + contractHoldOrderEntity.setLeverRatio(coinsCoinsOrder.getLeverRatio()); + contractHoldOrderEntity.setOpeningPrice(entrustPrice); + contractHoldOrderEntity.setTradeType(ContractHoldOrderEntity.TRADE_TYPE_LIMIT); + contractHoldOrderService.save(contractHoldOrderEntity); + + // 需要一个历史插入 + ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(contractHoldOrderEntity); + contractOrderEntity.setEntrustOpeningPrice(coinsCoinsOrder.getEntrustPrice()); + contractOrderEntity.setEntrustTime(coinsCoinsOrder.getCreateTime()); + contractOrderEntity.setOpeningTime(new Date()); + contractOrderEntity.setId(null); + contractOrderService.save(contractOrderEntity); + // 发送爆仓的队列 + // 市价 + if (coinsCoinsOrder.getEntrustType() == 1) { + // 开多 + OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 6, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1); + producer.sendPriceOperate(JSONObject.toJSONString(model)); + } else { + // 开空 + OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 7, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1); + producer.sendPriceOperate(JSONObject.toJSONString(model)); + } + // 扣除手续费 + BigDecimal totalBalance = wallet.getTotalBalance().subtract(openFeePrice); + contractEntrustOrderService.removeById(coinsCoinsOrder.getId()); + memberWalletContractService.increaseWalletContractBalanceById(null, totalBalance, null, wallet.getId()); + // TODO 531 待写 + calYj(memId, openFeePrice, contractOrderEntity, 1); + } + } + } + + /** + * 爆仓 + * + * @param + */ + public void dealCoinOut(List<ContractHoldOrderEntity> orderList, List<OrderModel> orderModels) { + // 需要比较查询到的和消息发来的单的爆仓操作次序号是否相同 + // 构建map + + if (CollectionUtils.isNotEmpty(orderList)) { + Map<Long, Integer> modelMap = new HashMap<Long, Integer>(); + for (OrderModel model : orderModels) { + modelMap.put(model.getOrderId(), model.getOperateNo()); + } + // TradeSetting tradeSetting = tradeMapper.findTradeSetting(); + for (ContractHoldOrderEntity coinsOrder : orderList) { + Long orderId = coinsOrder.getId(); + Integer operateNo = coinsOrder.getOperateNo(); + //判断当前订单是否是最新的爆仓价 不相等时直接进入下一个订单 + if (!modelMap.get(orderId).equals(operateNo)) { + // 将订单更新为可平仓并删除批次号 + contractHoldOrderService.updateOrderIsCanClosingAndBatchNoById(orderId); + continue; + } + boolean isDone = false; + Long memId = coinsOrder.getMemberId(); + MemberEntity byId = memberService.getById(memId); + String symbol = coinsOrder.getSymbol(); + //TradeSymbolSku symbolSku = tradeMapper.findSymbolSkubySymbol(symbol); + 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); + + //系统自动平仓(爆仓) +// Double closingPrice = nowPrice +// .multiply(new BigDecimal(tradeSetting.getClosingRatio()).divide(new BigDecimal(100), 8, BigDecimal.ROUND_DOWN)) +// .multiply(symbolSku.getLotNumber())// 规格 +// .multiply(new BigDecimal(coinsOrder.getSymbolSkuNumber())) +// .setScale(8, BigDecimal.ROUND_DOWN).doubleValue(); + //更新主表订单状态位为“已平仓” + contractOrderEntity.setId(null); + contractOrderEntity.setClosingPrice(BigDecimal.ZERO); + //order.setPayTotalPrice(coinsOrder.getPrePrice()+coinsOrder.getClosingPrice());// 总支付金额(预付款) + + contractOrderEntity.setClosingPrice(nowPrice); + contractOrderEntity.setClosingTime(new Date()); + contractOrderEntity.setRewardAmount((coinsOrder.getOpeningFeeAmount().multiply(new BigDecimal("2")).subtract(coinsOrder.getPrePaymentAmount()))); + //order.setRewardRatio(-(coinsOrder.getPrePrice() - (2*coinsOrder.getClosingPrice()))); + contractOrderService.save(contractOrderEntity); + + //更新用户钱包数据 + MemberWalletContractEntity usdt = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memId, "USDT"); + + // Double totalPrice = wallet.getTotalBalance() - coinsOrder.getPrePrice(); + // 减去的时候用负数 + BigDecimal totalPrice = coinsOrder.getPrePaymentAmount().negate(); + //Double totalPrice = - coinsOrder.getPrePrice(); + 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.getPrePaymentAmount()); + memberAccountFlowEntityDao.insert(record); + } + } + } + } + + + public void calYj(Long mid, BigDecimal money, ContractOrderEntity order, int type) { + if (money != null) { + money = money.multiply(new BigDecimal(0.7868)); + } + MemberEntity member = memberService.getById(mid); + String[] referenceIds = member.getRefererIds().split(","); + List<String> ids = Arrays.asList(referenceIds); + + // 判断该用户是否为代理商 + NeedMoneyMemberVo needMoneyMember = memberService.selectFriendRelationUserByMemberId(mid); + + // 查询该用户下所有需要返佣的代理商 + List<NeedMoneyMemberVo> list = memberService.selectAllNeedMoneyMember(ids); + TreeMap<Integer, NeedMoneyMemberVo> treeMap = new TreeMap<>(new Comparator<Integer>() { + @Override + public int compare(Integer o1, Integer o2) { + return o2.compareTo(o1); + } + }); + // 建立层级关系 + for (int i = 0; i < list.size(); i++) { + treeMap.put(list.get(i).getLevelId(), list.get(i)); + } + + // 该用户为代理商则判断is_self字段,判断是否保留其手续费 + // 该用户为代理商则判断is_self字段,判断是否保留其手续费 + if (needMoneyMember != null && needMoneyMember.getFeeIsSelf() == 1) { + treeMap.put(needMoneyMember.getLevelId(), needMoneyMember); + } + + + // 存放uid以及对应uid用户的佣金 + Map<String, BigDecimal> map = new HashMap<>(); + Iterator<Map.Entry<Integer, NeedMoneyMemberVo>> it = treeMap.entrySet().iterator(); + BigDecimal lastRate = BigDecimal.ZERO; + BigDecimal lastYj = BigDecimal.ZERO; + while (it.hasNext()) { + Map.Entry<Integer, NeedMoneyMemberVo> entry = it.next(); + NeedMoneyMemberVo member1 = entry.getValue(); + // 上下级佣金比率相减后乘以手续费 -- 即用户所得佣金 + lastYj = (member1.getReturnRatio().subtract(lastRate)).multiply(money); + lastRate = member1.getReturnRatio(); + map.put(member1.getInviteId(), lastYj); + } + + // 输出对应佣金是否正确 + Iterator<Map.Entry<String, BigDecimal>> it1 = map.entrySet().iterator(); + List<AgentReturnEntity> agentList = new ArrayList<AgentReturnEntity>(); + while (it1.hasNext()) { + Map.Entry<String, BigDecimal> entry = it1.next(); + // System.out.println(entry.getKey() + "-----" + entry.getValue()); + MemberEntity agentMember = memberService.selectMemberInfoByInviteId(entry.getKey()); + AgentReturnEntity agent = new AgentReturnEntity(); + agent.setMemberId(mid); + agent.setOrderId(order.getId()); + agent.setOrderNo(order.getOrderNo()); + agent.setRefererId(agentMember.getId()); + agent.setOrderType(order.getOrderType()); + agent.setReturnSymbol(order.getSymbol()); + agent.setIsReturn(0); + agent.setReturnAmount(entry.getValue()); + agent.setClosingType(order.getClosingType()); + if (type == 1) {//开仓 + agent.setOpeningFeeAmount(order.getOpeningFeeAmount()); + } else if (type == 2) {//平仓 + agent.setClosingFeeAmount(order.getClosingFeeAmount()); + } else {//持仓费 + agent.setHoldingFeeAmount(order.getHoldAmount()); + } + agent.setInviteId(entry.getKey()); + agentReturnDao.insert(agent); + } + + + } + +} -- Gitblit v1.9.1