From dab196fda6e1631a9d495fbb8b935bfb6201c962 Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Wed, 03 Jun 2020 20:15:17 +0800 Subject: [PATCH] modify --- src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java | 380 ++++++++++++++++++++++++------------------------------ 1 files changed, 168 insertions(+), 212 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 e24d711..9cc6764 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,13 +1,17 @@ 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; @@ -19,22 +23,26 @@ 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.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; 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; @@ -42,10 +50,8 @@ @Resource ContractEntrustOrderService contractEntrustOrderService; - @Resource MemberWalletContractService memberWalletContractService; - @Resource CacheSettingUtils cacheSettingUtils; @@ -56,6 +62,11 @@ @Resource MemberService memberService; + @Resource + private AgentReturnDao agentReturnDao; + + @Resource + private MemberAccountFlowEntityDao memberAccountFlowEntityDao; public void dealOrderFromMq(List<OrderModel> list, Integer type) { @@ -73,19 +84,21 @@ // 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; } @@ -95,15 +108,15 @@ } } - 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); } @@ -113,25 +126,26 @@ /** * 开多止盈 */ - 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; @@ -139,8 +153,8 @@ 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) { @@ -155,51 +169,42 @@ // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 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); BigDecimal totalReturn = BigDecimal.ZERO; - contractOrderService.save(contractOrderEntity); + contractOrderService.save(contractOrderEntity); + + contractEntrustOrderService.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(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); + // 流水记录 TODO 531e + insertAccountFlow(order, wallet, profitLossPrice, "止盈平仓"); + + //返佣 + ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); } } } @@ -210,34 +215,34 @@ /** * 开空止盈 */ - 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) { @@ -252,20 +257,20 @@ // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 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()); @@ -273,6 +278,8 @@ contractOrderEntity.setClosingType(7); BigDecimal totalReturn = BigDecimal.ZERO; contractOrderService.save(contractOrderEntity); + + contractHoldOrderService.removeById(order.getId()); // 将需要退回的减去手续费 BigDecimal needReturn = prePrice.add(profitLossPrice); //总退回金额=保证金+收益-手续费 @@ -280,23 +287,13 @@ // 更新钱包 // 总的是收益-平仓手续费 BigDecimal totalBalance = profitLossPrice.subtract(contractOrderEntity.getClosingFeeAmount()); - memberWalletContractService.increaseWalletContractBalanceById(totalBalance,totalReturn,null,wallet.getId()); + 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); + + insertAccountFlow(order, wallet, profitLossPrice, "止盈平仓"); + + //返佣 + ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); } } } @@ -309,26 +306,26 @@ * * @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; } @@ -336,7 +333,7 @@ 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) { @@ -351,20 +348,20 @@ // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 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()); @@ -379,23 +376,12 @@ // 更新钱包 // 总的是收益-平仓手续费 BigDecimal totalBalance = profitLossPrice.subtract(contractOrderEntity.getClosingFeeAmount()); - memberWalletContractService.increaseWalletContractBalanceById(totalBalance,totalReturn,null,wallet.getId()); + 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 -// calYj(order.getMemberId(), new BigDecimal(order.getClosingPrice()), order, 2); + insertAccountFlow(order, wallet, profitLossPrice, "开多止损平仓"); + + //返佣 + ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); } } } @@ -407,26 +393,26 @@ * * @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; } @@ -434,7 +420,7 @@ String symbol = order.getSymbol(); Long memberId = order.getMemberId(); // 本次需要退回的预付款 - BigDecimal prePrice =order.getPrePaymentAmount(); + BigDecimal prePrice = order.getPrePaymentAmount(); MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); if (wallet != null) { @@ -449,20 +435,20 @@ // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 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()); @@ -477,28 +463,28 @@ // 更新钱包 // 总的是收益-平仓手续费 BigDecimal totalBalance = profitLossPrice.subtract(contractOrderEntity.getClosingFeeAmount()); - memberWalletContractService.increaseWalletContractBalanceById(totalBalance,totalReturn,null,wallet.getId()); + 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 -// calYj(order.getMemberId(), new BigDecimal(order.getClosingPrice()), order, 2); -// + insertAccountFlow(order, wallet, profitLossPrice, "开空止损平仓"); + + //返佣 + ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); } } } } + } + + 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); } @@ -508,33 +494,30 @@ * @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); - } //持仓单赋值 @@ -551,41 +534,39 @@ .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, new BigDecimal(coinsCoinsOrder.getClosingPrice()), coinsCoinsOrder, 1); + //返佣 + ThreadPoolUtils.calReturnMoney(memberEntity.getId(), openFeePrice, contractOrderEntity, AgentReturnEntity.ORDER_TYPE_OPEN); } } } @@ -595,30 +576,23 @@ * * @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); @@ -641,55 +615,39 @@ //删除次仓订单 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()))); + 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 -// 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); - + 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.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); @@ -743,22 +701,20 @@ agent.setOrderId(order.getId()); agent.setOrderNo(order.getOrderNo()); agent.setRefererId(agentMember.getId()); - agent.setOrderType(order.getClosingType()); + 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.getOpeningFeeAmount()); + agent.setClosingFeeAmount(order.getClosingFeeAmount()); } else {//持仓费 agent.setHoldingFeeAmount(order.getHoldAmount()); } agent.setInviteId(entry.getKey()); - //agentReturnMapper.insert(agent); + agentReturnDao.insert(agent); } - - } - } -- Gitblit v1.9.1