zainali5120
2020-05-31 801f5056d26137600a3fd99ed45c72af3b5ec204
订单止盈止损类提交
1 files added
6 files modified
1634 ■■■■ changed files
src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java 1520 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java 9 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/entity/AgentReturnEntity.java 10 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/parameter/vo/NeedMoneyMemberVo.java 18 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/service/MemberService.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java 27 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/member/MemberDao.xml 40 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java
@@ -1,322 +1,191 @@
//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);
//                        // 流水记录
package com.xcong.excoin.modules.contract.service.impl;
import com.alibaba.fastjson.JSONObject;
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.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.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.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 531
//                        MemberAccountFlowRecord record = new MemberAccountFlowRecord();
//                        record.setCreateTime(new Date());
//                        record.setDirectionSource("止盈平仓");
@@ -329,111 +198,190 @@
//                        record.setPrice(profitLossPrice + order.getPrePrice());
//                        memberService.addFlowRecord(record);
//
//                        //返佣 TODO
//                        //返佣 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();
                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());
//                        // 流水记录 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);
//
//    }
//
//    /**
//     * 开多止损
//     *
//     * @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);
//                        // 流水记录
//                        //返佣 TODO 531
//                        calYj(order.getMemberId(), new BigDecimal(order.getClosingPrice()), order, 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());
                        // 流水记录 TODO 531
//                        MemberAccountFlowRecord record = new MemberAccountFlowRecord();
//                        record.setCreateTime(new Date());
//                        record.setDirectionSource("开多止损平仓");
@@ -448,114 +396,90 @@
//
//                        //返佣 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);
//
//                        // 流水记录
                    }
                }
            }
        }
    }
    /**
     * 开空止损
     *
     * @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());
                        // 流水记录 TODO 531
//                        MemberAccountFlowRecord record = new MemberAccountFlowRecord();
//                        record.setCreateTime(new Date());
//                        record.setDirectionSource("开空止损平仓");
@@ -570,273 +494,271 @@
//
//                        //返佣 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);
//        }
//
//
//    }
//
//}
                    }
                }
            }
        }
    }
    /**
     * 限价委托
     *
     * @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.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(), 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.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, 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.getClosingType());
            agent.setReturnSymbol(order.getSymbol());
            agent.setIsReturn(0);
            agent.setReturnAmount(entry.getValue());
            if (type == 1) {//开仓
                agent.setOpeningFeeAmount(order.getOpeningFeeAmount());
            } else if (type == 2) {//平仓
                agent.setClosingFeeAmount(order.getOpeningFeeAmount());
            } else {//持仓费
                agent.setHoldingFeeAmount(order.getHoldAmount());
            }
            agent.setInviteId(entry.getKey());
            //agentReturnMapper.insert(agent);
        }
    }
}
src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java
@@ -2,7 +2,10 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcong.excoin.modules.member.entity.MemberEntity;
import com.xcong.excoin.modules.member.parameter.vo.NeedMoneyMemberVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * @author wzy
@@ -11,6 +14,10 @@
    public MemberEntity selectMemberInfoByAccount(@Param("account") String account);
    public MemberEntity selectMemberInfoByRefererId(@Param("refererId") String refererId);
    public MemberEntity selectMemberInfoByInviteId(@Param("inviteId") String inviteId);
    public NeedMoneyMemberVo selectFriendRelationUserByMemberId(@Param("memberId") Long memberId);
    public List<NeedMoneyMemberVo> selectAllNeedMoneyMember(@Param("list") List<String> list);
}
src/main/java/com/xcong/excoin/modules/member/entity/AgentReturnEntity.java
@@ -16,7 +16,7 @@
    private Long memberId;
    private Long id;
    private Long orderId;
    private String orderNo;
@@ -30,7 +30,7 @@
    private BigDecimal returnAmount;
    private String refererId;
    private Long refererId;
    private String inviteId;
@@ -38,4 +38,10 @@
    private BigDecimal childReturnRatio;
    /**
     * 0-否1-是
     */
    private int isReturn;
    private String returnSymbol;
}
src/main/java/com/xcong/excoin/modules/member/parameter/vo/NeedMoneyMemberVo.java
New file
@@ -0,0 +1,18 @@
package com.xcong.excoin.modules.member.parameter.vo;
import lombok.Data;
import java.math.BigDecimal;
/**
 * 返佣用户
 */
@Data
public class NeedMoneyMemberVo {
    private Long memberId;
    private String inviteId;
    private String referenceId;
    private BigDecimal returnRatio;
    private int levelId;
    private int feeIsSelf;
}
src/main/java/com/xcong/excoin/modules/member/service/MemberService.java
@@ -16,6 +16,10 @@
import com.xcong.excoin.modules.member.parameter.dto.MemberPaymethodDto;
import com.xcong.excoin.modules.member.parameter.dto.MemberUpdatePwdDto;
import com.xcong.excoin.modules.member.parameter.dto.MemberUpdateTradePwdDto;
import com.xcong.excoin.modules.member.parameter.vo.NeedMoneyMemberVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * @author wzy
@@ -60,5 +64,11 @@
    public Result memberDelCoinAddress(@Valid MemberDelCoinAddressDto memberDelCoinAddressDto);
    public NeedMoneyMemberVo selectFriendRelationUserByMemberId(Long memberId);
    public List<NeedMoneyMemberVo> selectAllNeedMoneyMember(List<String> list);
    public MemberEntity selectMemberInfoByInviteId(String inviteId);
}
src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
@@ -25,14 +25,7 @@
import com.xcong.excoin.modules.member.parameter.dto.MemberPaymethodDto;
import com.xcong.excoin.modules.member.parameter.dto.MemberUpdatePwdDto;
import com.xcong.excoin.modules.member.parameter.dto.MemberUpdateTradePwdDto;
import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressCountListVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressCountVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressListVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberInfoVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberPaymethodDetailListVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberPaymethodDetailVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberSendCodeWayVo;
import com.xcong.excoin.modules.member.parameter.vo.*;
import com.xcong.excoin.modules.member.service.MemberService;
import com.xcong.excoin.modules.platform.dao.PlatformSymbolsCoinDao;
import com.xcong.excoin.modules.platform.entity.PlatformSymbolsCoinEntity;
@@ -140,7 +133,7 @@
        String ids = "";
        while (!flag) {
            ids += ("," + parentId);
            MemberEntity parentMember = memberDao.selectMemberInfoByRefererId(parentId);
            MemberEntity parentMember = memberDao.selectMemberInfoByInviteId(parentId);
            if (parentMember == null) {
                break;
            }
@@ -656,4 +649,20 @@
        return Result.ok("success");
    }
    @Override
    public NeedMoneyMemberVo selectFriendRelationUserByMemberId(Long memberId){
        return memberDao.selectFriendRelationUserByMemberId(memberId);
    }
    @Override
    public List<NeedMoneyMemberVo> selectAllNeedMoneyMember(List<String> list) {
        return memberDao.selectAllNeedMoneyMember(list);
    }
    @Override
    public MemberEntity selectMemberInfoByInviteId(String inviteId) {
        return memberDao.selectMemberInfoByInviteId(inviteId);
    }
}
src/main/resources/mapper/member/MemberDao.xml
@@ -6,8 +6,42 @@
        select * from member where phone=#{account} or email=#{account}
    </select>
    <select id="selectMemberInfoByRefererId" resultType="com.xcong.excoin.modules.member.entity.MemberEntity">
        select * from member where invite_id=#{refererId}
    <select id="selectMemberInfoByInviteId" resultType="com.xcong.excoin.modules.member.entity.MemberEntity">
        select * from member where invite_id=#{inviteId}
    </select>
    <select id="selectFriendRelationUserByMemberId" parameterType="long" resultType="com.xcong.excoin.modules.member.parameter.vo.NeedMoneyMemberVo">
        SELECT
            t1.id memberId,
            t1.invite_id inviteId,
            t2.referer_id referenceId,
            t2.return_ratio returnRatio,
            t2.level_id levelId,
            t2.fee_is_self feeIsSelf
        FROM
            member t1
        INNER JOIN agent_friend_relation t2 ON t1.id = t2.member_id
        WHERE
            t1.id = #{memberId}
        AND t2.referer_id IS NOT NULL
    </select>
    <select id="selectAllNeedMoneyMember" parameterType="map" resultType="com.xcong.excoin.modules.member.parameter.vo.NeedMoneyMemberVo">
        SELECT
        t1.id memberId,
        t1.invite_id inviteId,
        t2.referer_id referenceId,
        t2.return_ratio returnRatio,
        t2.level_id levelId,
        t2.fee_is_self feeIsSelf
        FROM
        member t1
        INNER JOIN agent_friend_relation t2 ON t1.id = t2.member_id
        WHERE
        t2.referer_id IS NOT NULL
        AND t1.invite_id IN
        <foreach collection = "list" item = "item"  separator=","  open = "(" close = ")" >
            #{item}
        </foreach >
    </select>
</mapper>