|  |  |  | 
|---|
|  |  |  | 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.rabbit.producer.OrderProducer; | 
|---|
|  |  |  | import com.xcong.excoin.utils.CacheSettingUtils; | 
|---|
|  |  |  | import com.xcong.excoin.utils.CalculateUtil; | 
|---|
|  |  |  | import com.xcong.excoin.utils.ThreadPoolUtils; | 
|---|
|  |  |  | import lombok.extern.slf4j.Slf4j; | 
|---|
|  |  |  | import org.apache.commons.collections.CollectionUtils; | 
|---|
|  |  |  | import org.springframework.stereotype.Service; | 
|---|
|  |  |  | import org.springframework.transaction.annotation.Transactional; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import javax.annotation.Resource; | 
|---|
|  |  |  | import java.math.BigDecimal; | 
|---|
|  |  |  | import java.math.RoundingMode; | 
|---|
|  |  |  | import java.util.*; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * @author helius | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Slf4j | 
|---|
|  |  |  | @Service | 
|---|
|  |  |  | public class OrderWebsocketServiceImpl { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | ContractHoldOrderService contractHoldOrderService; | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | ContractOrderService contractOrderService; | 
|---|
|  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | ContractEntrustOrderService contractEntrustOrderService; | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | MemberWalletContractService memberWalletContractService; | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | CacheSettingUtils cacheSettingUtils; | 
|---|
|  |  |  | 
|---|
|  |  |  | private MemberAccountFlowEntityDao memberAccountFlowEntityDao; | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void dealOrderFromMq(List<OrderModel> list, Integer type) { | 
|---|
|  |  |  | if (CollectionUtils.isNotEmpty(list)) { | 
|---|
|  |  |  | String batchno = UUID.randomUUID().toString(); | 
|---|
|  |  |  | 
|---|
|  |  |  | // 6在这里是爆仓 包括爆空和暴多 | 
|---|
|  |  |  | switch (type) { | 
|---|
|  |  |  | case 6: | 
|---|
|  |  |  | this.dealCoinOut(coinsCoinsOrders,list); | 
|---|
|  |  |  | this.dealCoinOut(coinsCoinsOrders, list); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case 9: | 
|---|
|  |  |  | this.dealForMoreStopPro(coinsCoinsOrders,list); | 
|---|
|  |  |  | this.dealForMoreStopPro(coinsCoinsOrders, list); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case 10: | 
|---|
|  |  |  | this.dealForLessStopPro(coinsCoinsOrders,list); | 
|---|
|  |  |  | this.dealForLessStopPro(coinsCoinsOrders, list); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case 11: | 
|---|
|  |  |  | this.dealForMoreLoss(coinsCoinsOrders,list); | 
|---|
|  |  |  | this.dealForMoreLoss(coinsCoinsOrders, list); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case 12: | 
|---|
|  |  |  | this.dealForLessLoss(coinsCoinsOrders,list); | 
|---|
|  |  |  | this.dealForLessLoss(coinsCoinsOrders, list); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | default: | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void dealForLimitMq(List<OrderModel> list){ | 
|---|
|  |  |  | if(CollectionUtils.isNotEmpty(list)){ | 
|---|
|  |  |  | public void dealForLimitMq(List<OrderModel> list) { | 
|---|
|  |  |  | if (CollectionUtils.isNotEmpty(list)) { | 
|---|
|  |  |  | //查询限价委托的单 | 
|---|
|  |  |  | String batchno =UUID.randomUUID().toString(); | 
|---|
|  |  |  | String batchno = UUID.randomUUID().toString(); | 
|---|
|  |  |  | List<Long> ids = new ArrayList<>(); | 
|---|
|  |  |  | list.forEach(model->ids.add(model.getOrderId())); | 
|---|
|  |  |  | list.forEach(model -> ids.add(model.getOrderId())); | 
|---|
|  |  |  | List<ContractEntrustOrderEntity> contractEntrustOrderEntities = contractEntrustOrderService.selectEntrustOrderListByIds(ids); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(CollectionUtils.isNotEmpty(contractEntrustOrderEntities)){ | 
|---|
|  |  |  | if (CollectionUtils.isNotEmpty(contractEntrustOrderEntities)) { | 
|---|
|  |  |  | this.dealLimitBuyOrder(contractEntrustOrderEntities); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 开多止盈 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void dealForMoreStopPro(List<ContractHoldOrderEntity> orderList,List<OrderModel> list) { | 
|---|
|  |  |  | @Transactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | 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())); | 
|---|
|  |  |  | 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())); | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | System.out.println("订单的止盈价格:" + closePrice); | 
|---|
|  |  |  | // 判断 保留七位是为了忽略以为小数 防止不精确导致的不相等 | 
|---|
|  |  |  | if(queuePrice.compareTo(closePrice)!=0){ | 
|---|
|  |  |  | if (queuePrice.compareTo(closePrice) != 0) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 不能止盈 | 
|---|
|  |  |  | System.out.println("数据库价格:"+queuePrice.toPlainString()+"--价格不能止盈:"+closePrice); | 
|---|
|  |  |  | System.out.println("数据库价格:" + queuePrice.toPlainString() + "--价格不能止盈:" + closePrice); | 
|---|
|  |  |  | //更新数据 | 
|---|
|  |  |  | contractHoldOrderService.updateOrderIsCanClosingAndBatchNoById(orderId); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | 
|---|
|  |  |  | System.out.println("执行操作"); | 
|---|
|  |  |  | // 止盈价 | 
|---|
|  |  |  | String symbol = order.getSymbol(); | 
|---|
|  |  |  | // 本次需要退回的预付款 | 
|---|
|  |  |  | BigDecimal prePrice = order.getPrePaymentAmount(); | 
|---|
|  |  |  | // 本次需要退回的保证金 | 
|---|
|  |  |  | BigDecimal prePrice = order.getBondAmount(); | 
|---|
|  |  |  | Long memberId = order.getMemberId(); | 
|---|
|  |  |  | MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); | 
|---|
|  |  |  | if (wallet != null) { | 
|---|
|  |  |  | 
|---|
|  |  |  | // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 | 
|---|
|  |  |  | BigDecimal profitLossPrice = (closePrice | 
|---|
|  |  |  | .subtract(order.getOpeningPrice())) | 
|---|
|  |  |  | .multiply(new BigDecimal(currentFlat+"")) | 
|---|
|  |  |  | .multiply(new BigDecimal(currentFlat)) | 
|---|
|  |  |  | .multiply(symbolSku).setScale(8, BigDecimal.ROUND_DOWN); | 
|---|
|  |  |  | MemberEntity memberEntity = memberService.getById(memberId); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(memberEntity.getIsProfit() == 1) { | 
|---|
|  |  |  | if (memberEntity.getIsProfit() == 1) { | 
|---|
|  |  |  | PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); | 
|---|
|  |  |  | if(profitLossPrice.compareTo(BigDecimal.ZERO)>0) { | 
|---|
|  |  |  | profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(tradeSetting.getProfitParam())); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | BigDecimal returnRate = profitLossPrice.divide((order.getBondAmount().subtract(contractOrderEntity.getOpeningFeeAmount())), 8, BigDecimal.ROUND_DOWN); | 
|---|
|  |  |  | contractOrderEntity.setRewardAmount(profitLossPrice); | 
|---|
|  |  |  | contractOrderEntity.setRewardRatio(returnRate); | 
|---|
|  |  |  | contractOrderEntity.setClosingFeeAmount(order.getOpeningFeeAmount()); | 
|---|
|  |  |  | contractOrderEntity.setClosingPrice(closePrice); | 
|---|
|  |  |  | contractOrderEntity.setClosingType(6); | 
|---|
|  |  |  | contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_MORE); | 
|---|
|  |  |  | BigDecimal totalReturn = BigDecimal.ZERO; | 
|---|
|  |  |  | contractOrderService.save(contractOrderEntity); | 
|---|
|  |  |  | contractOrderService.save(contractOrderEntity); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | contractHoldOrderService.removeById(order.getId()); | 
|---|
|  |  |  | // 将需要退回的减去手续费 | 
|---|
|  |  |  | BigDecimal needReturn = prePrice.add(profitLossPrice); | 
|---|
|  |  |  | //总退回金额=保证金+收益-手续费 | 
|---|
|  |  |  | totalReturn = needReturn.subtract(contractOrderEntity.getClosingFeeAmount()); | 
|---|
|  |  |  | // 更新钱包 | 
|---|
|  |  |  | // 总的是收益-平仓手续费 | 
|---|
|  |  |  | BigDecimal totalBalance = profitLossPrice.subtract(contractOrderEntity.getClosingFeeAmount()); | 
|---|
|  |  |  | memberWalletContractService.increaseWalletContractBalanceById(totalBalance,totalReturn,null,wallet.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | memberWalletContractService.increaseWalletContractBalanceById(totalReturn, totalBalance, null, wallet.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 流水记录 TODO 531e | 
|---|
|  |  |  | insertAccountFlow(order, wallet, profitLossPrice, "止盈平仓"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //返佣 | 
|---|
|  |  |  | calYj(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, 2); | 
|---|
|  |  |  | ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 开空止盈 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void dealForLessStopPro(List<ContractHoldOrderEntity> orderList,List<OrderModel> list) { | 
|---|
|  |  |  | 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())); | 
|---|
|  |  |  | 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()); | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | 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(); | 
|---|
|  |  |  | BigDecimal prePrice = order.getBondAmount(); | 
|---|
|  |  |  | Long memberId = order.getMemberId(); | 
|---|
|  |  |  | MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); | 
|---|
|  |  |  | if (wallet != null) { | 
|---|
|  |  |  | 
|---|
|  |  |  | // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 | 
|---|
|  |  |  | BigDecimal profitLossPrice = (order.getOpeningPrice() | 
|---|
|  |  |  | .subtract(closePrice)) | 
|---|
|  |  |  | .multiply(new BigDecimal(currentFlat+"")) | 
|---|
|  |  |  | .multiply(new BigDecimal(currentFlat + "")) | 
|---|
|  |  |  | .multiply(symbolSku).setScale(8, BigDecimal.ROUND_DOWN); | 
|---|
|  |  |  | MemberEntity memberEntity = memberService.getById(memberId); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(memberEntity.getIsProfit() == 1) { | 
|---|
|  |  |  | if (memberEntity.getIsProfit() == 1) { | 
|---|
|  |  |  | PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); | 
|---|
|  |  |  | if(profitLossPrice.compareTo(BigDecimal.ZERO)>0) { | 
|---|
|  |  |  | if (profitLossPrice.compareTo(BigDecimal.ZERO) > 0) { | 
|---|
|  |  |  | profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(tradeSetting.getProfitParam())); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //回报率 | 
|---|
|  |  |  | BigDecimal returnRate = profitLossPrice.divide((order.getPrePaymentAmount().subtract(contractOrderEntity.getClosingFeeAmount())), 8, BigDecimal.ROUND_DOWN); | 
|---|
|  |  |  | BigDecimal returnRate = profitLossPrice.divide((order.getBondAmount().subtract(contractOrderEntity.getOpeningFeeAmount())), 8, BigDecimal.ROUND_DOWN); | 
|---|
|  |  |  | contractOrderEntity.setRewardAmount(profitLossPrice); | 
|---|
|  |  |  | contractOrderEntity.setRewardRatio(returnRate); | 
|---|
|  |  |  | contractOrderEntity.setClosingFeeAmount(order.getOpeningFeeAmount()); | 
|---|
|  |  |  | contractOrderEntity.setClosingPrice(closePrice); | 
|---|
|  |  |  | contractOrderEntity.setClosingType(7); | 
|---|
|  |  |  | contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_MORE); | 
|---|
|  |  |  | BigDecimal totalReturn = BigDecimal.ZERO; | 
|---|
|  |  |  | contractOrderService.save(contractOrderEntity); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | contractHoldOrderService.removeById(order.getId()); | 
|---|
|  |  |  | // 将需要退回的减去手续费 | 
|---|
|  |  |  | BigDecimal needReturn = prePrice.add(profitLossPrice); | 
|---|
|  |  |  | //总退回金额=保证金+收益-手续费 | 
|---|
|  |  |  | 
|---|
|  |  |  | // 更新钱包 | 
|---|
|  |  |  | // 总的是收益-平仓手续费 | 
|---|
|  |  |  | BigDecimal totalBalance = profitLossPrice.subtract(contractOrderEntity.getClosingFeeAmount()); | 
|---|
|  |  |  | memberWalletContractService.increaseWalletContractBalanceById(totalBalance,totalReturn,null,wallet.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | memberWalletContractService.increaseWalletContractBalanceById(totalReturn, totalBalance, null, wallet.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | insertAccountFlow(order, wallet, profitLossPrice, "止盈平仓"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //返佣 | 
|---|
|  |  |  | calYj(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, 2); | 
|---|
|  |  |  | ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void dealForMoreLoss(List<ContractHoldOrderEntity> orderList,List<OrderModel> list) { | 
|---|
|  |  |  | 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())); | 
|---|
|  |  |  | 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)); | 
|---|
|  |  |  | System.out.println("传来的止损价格:" + modelMap.get(orderId)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (null != order.getStopLossPrice()) { | 
|---|
|  |  |  | // 止损价 | 
|---|
|  |  |  | BigDecimal closePrice = order.getStopLossPrice(); | 
|---|
|  |  |  | System.out.println("订单止损价格:"+closePrice.toPlainString()); | 
|---|
|  |  |  | System.out.println("订单止损价格:" + closePrice.toPlainString()); | 
|---|
|  |  |  | BigDecimal queuePrice = modelMap.get(orderId); | 
|---|
|  |  |  | if(closePrice.compareTo(queuePrice)!=0){ | 
|---|
|  |  |  | System.out.println("数据库价格:"+queuePrice.toPlainString()+"--价格不能开多止损:"+closePrice); | 
|---|
|  |  |  | if (closePrice.compareTo(queuePrice) != 0) { | 
|---|
|  |  |  | System.out.println("数据库价格:" + queuePrice.toPlainString() + "--价格不能开多止损:" + closePrice); | 
|---|
|  |  |  | contractHoldOrderService.updateOrderIsCanClosingAndBatchNoById(orderId); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | String symbol = order.getSymbol(); | 
|---|
|  |  |  | Long memberId = order.getMemberId(); | 
|---|
|  |  |  | // 本次需要退回的预付款 | 
|---|
|  |  |  | BigDecimal prePrice =order.getPrePaymentAmount(); | 
|---|
|  |  |  | BigDecimal prePrice = order.getBondAmount(); | 
|---|
|  |  |  | MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (wallet != null) { | 
|---|
|  |  |  | 
|---|
|  |  |  | // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 | 
|---|
|  |  |  | BigDecimal profitLossPrice = (closePrice | 
|---|
|  |  |  | .subtract(order.getOpeningPrice())) | 
|---|
|  |  |  | .multiply(new BigDecimal(currentFlat+"")) | 
|---|
|  |  |  | .multiply(new BigDecimal(currentFlat + "")) | 
|---|
|  |  |  | .multiply(symbolSku).setScale(8, BigDecimal.ROUND_DOWN); | 
|---|
|  |  |  | MemberEntity memberEntity = memberService.getById(memberId); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(memberEntity.getIsProfit() == 1) { | 
|---|
|  |  |  | if (memberEntity.getIsProfit() == 1) { | 
|---|
|  |  |  | PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); | 
|---|
|  |  |  | if(profitLossPrice.compareTo(BigDecimal.ZERO)>0) { | 
|---|
|  |  |  | if (profitLossPrice.compareTo(BigDecimal.ZERO) > 0) { | 
|---|
|  |  |  | profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(tradeSetting.getProfitParam())); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //回报率 | 
|---|
|  |  |  | BigDecimal returnRate = profitLossPrice.divide((order.getPrePaymentAmount().subtract(contractOrderEntity.getClosingFeeAmount())), 8, BigDecimal.ROUND_DOWN); | 
|---|
|  |  |  | BigDecimal returnRate = profitLossPrice.divide((order.getBondAmount().subtract(contractOrderEntity.getOpeningFeeAmount())), 8, BigDecimal.ROUND_DOWN); | 
|---|
|  |  |  | contractOrderEntity.setRewardAmount(profitLossPrice); | 
|---|
|  |  |  | contractOrderEntity.setRewardRatio(returnRate); | 
|---|
|  |  |  | contractOrderEntity.setClosingFeeAmount(order.getOpeningFeeAmount()); | 
|---|
|  |  |  | contractOrderEntity.setClosingPrice(closePrice); | 
|---|
|  |  |  | contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_MORE); | 
|---|
|  |  |  | contractOrderEntity.setClosingType(8); | 
|---|
|  |  |  | BigDecimal totalReturn = BigDecimal.ZERO; | 
|---|
|  |  |  | contractOrderService.save(contractOrderEntity); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | contractHoldOrderService.removeById(order.getId()); | 
|---|
|  |  |  | // 将需要退回的减去手续费 | 
|---|
|  |  |  | BigDecimal needReturn = prePrice.add(profitLossPrice); | 
|---|
|  |  |  | //总退回金额=保证金+收益-手续费 | 
|---|
|  |  |  | 
|---|
|  |  |  | // 更新钱包 | 
|---|
|  |  |  | // 总的是收益-平仓手续费 | 
|---|
|  |  |  | BigDecimal totalBalance = profitLossPrice.subtract(contractOrderEntity.getClosingFeeAmount()); | 
|---|
|  |  |  | memberWalletContractService.increaseWalletContractBalanceById(totalBalance,totalReturn,null,wallet.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | memberWalletContractService.increaseWalletContractBalanceById(totalReturn, totalBalance, null, wallet.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | insertAccountFlow(order, wallet, profitLossPrice, "开多止损平仓"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //返佣 | 
|---|
|  |  |  | calYj(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, 2); | 
|---|
|  |  |  | ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void dealForLessLoss(List<ContractHoldOrderEntity> orderList,List<OrderModel> list) { | 
|---|
|  |  |  | 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())); | 
|---|
|  |  |  | 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("传来的止损价格:" + modelMap.get(orderId).toPlainString()); | 
|---|
|  |  |  | System.out.println("开空止损订单号:" + order.getOrderNo()); | 
|---|
|  |  |  | if (null != order.getStopLossPrice()) { | 
|---|
|  |  |  | // 止损价 | 
|---|
|  |  |  | BigDecimal closePrice = order.getStopLossPrice(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | System.out.println("订单止损价格:"+closePrice.toPlainString()); | 
|---|
|  |  |  | System.out.println("订单止损价格:" + closePrice.toPlainString()); | 
|---|
|  |  |  | BigDecimal queuePrice = modelMap.get(orderId); | 
|---|
|  |  |  | if(closePrice.compareTo(queuePrice)!=0){ | 
|---|
|  |  |  | System.out.println("数据库价格:"+queuePrice.toPlainString()+"--价格不能开空止损:"+closePrice); | 
|---|
|  |  |  | if (closePrice.compareTo(queuePrice) != 0) { | 
|---|
|  |  |  | System.out.println("数据库价格:" + queuePrice.toPlainString() + "--价格不能开空止损:" + closePrice); | 
|---|
|  |  |  | contractHoldOrderService.updateOrderIsCanClosingAndBatchNoById(orderId); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | String symbol = order.getSymbol(); | 
|---|
|  |  |  | Long memberId = order.getMemberId(); | 
|---|
|  |  |  | // 本次需要退回的预付款 | 
|---|
|  |  |  | BigDecimal prePrice =order.getPrePaymentAmount(); | 
|---|
|  |  |  | BigDecimal prePrice = order.getBondAmount(); | 
|---|
|  |  |  | MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (wallet != null) { | 
|---|
|  |  |  | 
|---|
|  |  |  | // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 | 
|---|
|  |  |  | BigDecimal profitLossPrice = (order.getOpeningPrice() | 
|---|
|  |  |  | .subtract(closePrice)) | 
|---|
|  |  |  | .multiply(new BigDecimal(currentFlat+"")) | 
|---|
|  |  |  | .multiply(new BigDecimal(currentFlat + "")) | 
|---|
|  |  |  | .multiply(symbolSku).setScale(8, BigDecimal.ROUND_DOWN); | 
|---|
|  |  |  | MemberEntity memberEntity = memberService.getById(memberId); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(memberEntity.getIsProfit() == 1) { | 
|---|
|  |  |  | if (memberEntity.getIsProfit() == 1) { | 
|---|
|  |  |  | PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); | 
|---|
|  |  |  | if(profitLossPrice.compareTo(BigDecimal.ZERO)>0) { | 
|---|
|  |  |  | if (profitLossPrice.compareTo(BigDecimal.ZERO) > 0) { | 
|---|
|  |  |  | profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(tradeSetting.getProfitParam())); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //回报率 | 
|---|
|  |  |  | BigDecimal returnRate = profitLossPrice.divide((order.getPrePaymentAmount().subtract(contractOrderEntity.getClosingFeeAmount())), 8, BigDecimal.ROUND_DOWN); | 
|---|
|  |  |  | BigDecimal returnRate = profitLossPrice.divide((order.getBondAmount().subtract(contractOrderEntity.getOpeningFeeAmount())), 8, BigDecimal.ROUND_DOWN); | 
|---|
|  |  |  | contractOrderEntity.setRewardAmount(profitLossPrice); | 
|---|
|  |  |  | contractOrderEntity.setRewardRatio(returnRate); | 
|---|
|  |  |  | contractOrderEntity.setClosingFeeAmount(order.getOpeningFeeAmount()); | 
|---|
|  |  |  | contractOrderEntity.setClosingPrice(closePrice); | 
|---|
|  |  |  | contractOrderEntity.setClosingType(9); | 
|---|
|  |  |  | contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_LESS); | 
|---|
|  |  |  | BigDecimal totalReturn = BigDecimal.ZERO; | 
|---|
|  |  |  | contractOrderService.save(contractOrderEntity); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | contractHoldOrderService.removeById(order.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 将需要退回的减去手续费 | 
|---|
|  |  |  | BigDecimal needReturn = prePrice.add(profitLossPrice); | 
|---|
|  |  |  | //总退回金额=保证金+收益-手续费 | 
|---|
|  |  |  | 
|---|
|  |  |  | // 更新钱包 | 
|---|
|  |  |  | // 总的是收益-平仓手续费 | 
|---|
|  |  |  | BigDecimal totalBalance = profitLossPrice.subtract(contractOrderEntity.getClosingFeeAmount()); | 
|---|
|  |  |  | memberWalletContractService.increaseWalletContractBalanceById(totalBalance,totalReturn,null,wallet.getId()); | 
|---|
|  |  |  | memberWalletContractService.increaseWalletContractBalanceById(totalReturn, totalBalance, null, wallet.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | insertAccountFlow(order, wallet, profitLossPrice, "开空止损平仓"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //返佣 | 
|---|
|  |  |  | calYj(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, 2); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | * @param | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void dealLimitBuyOrder(List<ContractEntrustOrderEntity> orderList) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno); | 
|---|
|  |  |  | if (CollectionUtils.isNotEmpty(orderList)) { | 
|---|
|  |  |  | ContractHoldOrderEntity contractHoldOrderEntity=null; | 
|---|
|  |  |  | ContractHoldOrderEntity contractHoldOrderEntity = null; | 
|---|
|  |  |  | for (ContractEntrustOrderEntity coinsCoinsOrder : orderList) { | 
|---|
|  |  |  | MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(coinsCoinsOrder.getMemberId(), "USDT"); | 
|---|
|  |  |  | if (wallet == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | contractHoldOrderEntity = new ContractHoldOrderEntity(); | 
|---|
|  |  |  | // 委托单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(); | 
|---|
|  |  |  | //开仓价 | 
|---|
|  |  |  | // Double openPrice = coinsCoinsOrder.getOpenPrice().doubleValue(); | 
|---|
|  |  |  | //委托价 | 
|---|
|  |  |  | // Double markPrice = coinsCoinsOrder.getMarkPrice(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (type == 1) { | 
|---|
|  |  |  | // 开多 | 
|---|
|  |  |  | contractHoldOrderEntity.setOpeningType(ContractHoldOrderEntity.OPENING_TYPE_MORE); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 开空 | 
|---|
|  |  |  | contractHoldOrderEntity.setOpeningType(ContractHoldOrderEntity.OPENING_TYPE_LESS); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //持仓单赋值 | 
|---|
|  |  |  | 
|---|
|  |  |  | .setScale(8, BigDecimal.ROUND_DOWN); | 
|---|
|  |  |  | contractHoldOrderEntity.setOpeningFeeAmount(openFeePrice); | 
|---|
|  |  |  | contractHoldOrderEntity.setVersion(1); | 
|---|
|  |  |  | BigDecimal forceSetPrice = CalculateUtil.getForceSetPrice(coinsCoinsOrder.getBondAmount(), entrustPrice, symbolCnt, lotNumber, type, memberEntity); | 
|---|
|  |  |  | 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().toPlainString(), coinsCoinsOrder.getSymbol(),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().toPlainString(), coinsCoinsOrder.getSymbol(),1); | 
|---|
|  |  |  | OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 7, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1); | 
|---|
|  |  |  | producer.sendPriceOperate(JSONObject.toJSONString(model)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 扣除手续费 | 
|---|
|  |  |  | //double totalBalance = wallet.getTotalBalance() - coinsCoinsOrder.getClosingPrice(); | 
|---|
|  |  |  | BigDecimal totalBalance =  openFeePrice.negate(); | 
|---|
|  |  |  | BigDecimal totalBalance = openFeePrice.negate(); | 
|---|
|  |  |  | contractEntrustOrderService.removeById(coinsCoinsOrder.getId()); | 
|---|
|  |  |  | memberWalletContractService.increaseWalletContractBalanceById(null, totalBalance, coinsCoinsOrder.getBondAmount().negate(), wallet.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** 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, contractOrderEntity.getClosingFeeAmount(), contractOrderEntity, 1); | 
|---|
|  |  |  | //返佣 | 
|---|
|  |  |  | ThreadPoolUtils.calReturnMoney(memberEntity.getId(), openFeePrice, contractOrderEntity, AgentReturnEntity.ORDER_TYPE_OPEN); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void dealCoinOut(List<ContractHoldOrderEntity> orderList,List<OrderModel> orderModels) { | 
|---|
|  |  |  | // 需要比较查询到的和消息发来的单的爆仓操作次序号是否相同 | 
|---|
|  |  |  | // 构建map | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void dealCoinOut(List<ContractHoldOrderEntity> orderList, List<OrderModel> orderModels) { | 
|---|
|  |  |  | if (CollectionUtils.isNotEmpty(orderList)) { | 
|---|
|  |  |  | Map<Long,Integer> modelMap = new HashMap<Long,Integer>(); | 
|---|
|  |  |  | for(OrderModel model : orderModels){ | 
|---|
|  |  |  | modelMap.put(model.getOrderId(),model.getOperateNo()); | 
|---|
|  |  |  | 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)){ | 
|---|
|  |  |  | 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 (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(); | 
|---|
|  |  |  | // 订单状态转换 | 
|---|
|  |  |  | if (ContractOrderEntity.ORDER_TYPE_OPEN_MORE == contractOrderEntity.getOrderType()) { | 
|---|
|  |  |  | contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_MORE); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_LESS); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //更新主表订单状态位为“已平仓” | 
|---|
|  |  |  | contractOrderEntity.setId(null); | 
|---|
|  |  |  | contractOrderEntity.setClosingPrice(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()))); | 
|---|
|  |  |  | contractOrderEntity.setClosingFeeAmount(coinsOrder.getOpeningFeeAmount()); | 
|---|
|  |  |  | contractOrderEntity.setRewardAmount(coinsOrder.getBondAmount().subtract(contractOrderEntity.getOpeningFeeAmount()).negate()); | 
|---|
|  |  |  | 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()); | 
|---|
|  |  |  | BigDecimal totalPrice = coinsOrder.getBondAmount().negate(); | 
|---|
|  |  |  | memberWalletContractService.increaseWalletContractBalanceById(null, totalPrice, null, usdt.getId()); | 
|---|
|  |  |  | // 流水记录 TODO | 
|---|
|  |  |  | MemberAccountFlowEntity record = new MemberAccountFlowEntity(); | 
|---|
|  |  |  | record.setCreateTime(new Date()); | 
|---|
|  |  |  | 
|---|
|  |  |  | record.setBalance(usdt.getAvailableBalance()); | 
|---|
|  |  |  | record.setMemberId(memId); | 
|---|
|  |  |  | record.setSymbol(coinsOrder.getSymbol()); | 
|---|
|  |  |  | record.setPrice(coinsOrder.getPrePaymentAmount()); | 
|---|
|  |  |  | record.setPrice(coinsOrder.getBondAmount()); | 
|---|
|  |  |  | memberAccountFlowEntityDao.insert(record); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void calYj(Long mid, BigDecimal money, ContractOrderEntity order, int type) { | 
|---|
|  |  |  | if(money!=null) { | 
|---|
|  |  |  | money = money.multiply(new BigDecimal(0.7868)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | 
|---|
|  |  |  | agent.setInviteId(entry.getKey()); | 
|---|
|  |  |  | agentReturnDao.insert(agent); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|