package com.xcong.excoin.rabbit.pricequeue; import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSONObject; import com.xcong.excoin.common.contants.AppContants; import com.xcong.excoin.common.enumerates.CoinTypeEnum; import com.xcong.excoin.modules.contract.dao.ContractEntrustOrderDao; import com.xcong.excoin.modules.contract.dao.ContractHoldOrderDao; import com.xcong.excoin.modules.contract.entity.ContractEntrustOrderEntity; import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity; import com.xcong.excoin.modules.contract.mapper.ContractHoldOrderEntityMapper; import com.xcong.excoin.modules.member.dao.MemberWalletContractDao; import com.xcong.excoin.modules.member.entity.MemberWalletContractEntity; import com.xcong.excoin.rabbit.pricequeue.whole.HoldOrderDataModel; import com.xcong.excoin.rabbit.pricequeue.whole.WholeDataQueue; import com.xcong.excoin.rabbit.pricequeue.whole.WholePriceDataModel; import com.xcong.excoin.utils.RedisUtils; import com.xcong.excoin.utils.SpringContextHolder; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.PriorityBlockingQueue; /** * 处理消费者的订单止盈等价格信息 */ @Slf4j public class OrderOperatePriceService { /** * 处理用户提交的止盈止损价格 爆仓 限价委托 * * @param orderModel */ public static void dealWithNewMq(OrderModel orderModel) { // 根据不同的类型将价格信息加入到对应队列和MAP // 【1:买入委托2:开多3:开空4:平多5:平空6:爆仓平多7:爆仓平空8:撤单9:止盈平多10:止盈平空11:止损平多12:止损平空】 int type = orderModel.getType(); Map> orderMap = PricePriorityQueue.getOrderMap(orderModel.getSymbol(), type); if (type == 12 || type == 9 || type == 7 || type == 3 || type == 4) { // 需要价格涨的 PriorityBlockingQueue queue = PricePriorityQueue.getQueueAsc(orderModel.getSymbol()); dealPriceAsc(orderModel, orderMap, queue); } else { // 需要价格跌的 PriorityBlockingQueue queue = PricePriorityQueue.getQueueDesc(orderModel.getSymbol()); dealPriceDesc(orderModel, orderMap, queue); } } /** * 倒叙的添加价格和订单 * * @param orderMap * @param queue */ public static void dealPriceDesc(OrderModel order, Map> orderMap, PriorityBlockingQueue queue) { // 添加币种的价格和价格订单信息 String price = order.getPrice(); int type = order.getType(); Long orderId = order.getOrderId(); queue.add(new DescBigDecimal(price)); // log.info("原有:{}", JSONObject.toJSONString(orderMap)); removeExistOrder(type, orderId, orderMap); // log.info("删除后:{}", JSONObject.toJSONString(orderMap)); if (orderMap.containsKey(price)) { // 有这个价的key List list = orderMap.get(price); // 判断这个单的这个类型是否有 // if (CollectionUtils.isNotEmpty(list)) { // 新增 OrderModel orderModel = new OrderModel(orderId, type, price, null,order.getOperateNo(), order.getMemberId()); list.add(orderModel); // } } else { List list = new ArrayList(); OrderModel orderModel = new OrderModel(orderId, type, price, null,order.getOperateNo(), order.getMemberId()); list.add(orderModel); orderMap.put(price, list); } // log.info("调整后:{}", JSONObject.toJSONString(orderMap)); } /** * 正序的添加价格和订单 * * @param orderMap * @param queue */ public static void dealPriceAsc(OrderModel order, Map> orderMap, PriorityBlockingQueue queue) { // 添加币种的价格和价格订单信息 String price = order.getPrice(); int type = order.getType(); Long orderId = order.getOrderId(); queue.add(new AscBigDecimal(price)); // log.info("原有:{}", JSONObject.toJSONString(orderMap)); // 需要找到这个订单的原始的单进行处理 removeExistOrder(type, orderId, orderMap); // log.info("删除后:{}", JSONObject.toJSONString(orderMap)); if (orderMap.containsKey(price)) { // 有这个价的key List list = orderMap.get(price); // 判断这个单的这个类型是否有 // if (CollectionUtils.isNotEmpty(list)) { // 新增 OrderModel orderModel = new OrderModel(orderId, type, price, null,order.getOperateNo(), order.getMemberId()); list.add(orderModel); // } } else { List list = new ArrayList(); OrderModel orderModel = new OrderModel(orderId, type, price, null,order.getOperateNo(), order.getMemberId()); list.add(orderModel); orderMap.put(price, list); } // log.info("调整后:{}", JSONObject.toJSONString(orderMap)); } private static void removeExistOrder(Integer type, Long orderId, Map> orderMap) { // 需要找到这个订单的原始的单进行处理 boolean breakFlag = false; for (Map.Entry> entry : orderMap.entrySet()) { List value = entry.getValue(); if (CollectionUtils.isNotEmpty(value)) { Iterator iterator = value.iterator(); if (iterator.hasNext()) { OrderModel next = iterator.next(); if (next.getType().equals(type) && orderId.equals(next.getOrderId())) { // 移除这个 System.out.println("存在相同的平仓类型,删除原来的:"+next.getOrderId()+",价格:"+next.getPrice()); iterator.remove(); break; } } } } } /** * 全仓价格处理 * * @param memberId */ public static void wholePriceDataOperation(Long memberId) { Map dataModelMap = WholeDataQueue.MAP; RedisUtils redisUtils = SpringContextHolder.getBean(RedisUtils.class); ContractHoldOrderDao contractHoldOrderDao = SpringContextHolder.getBean(ContractHoldOrderDao.class); ContractEntrustOrderDao contractEntrustOrderDao = SpringContextHolder.getBean(ContractEntrustOrderDao.class); MemberWalletContractDao memberWalletContractDao = SpringContextHolder.getBean(MemberWalletContractDao.class); List holdOrders = contractHoldOrderDao.selectHoldOrderListByMemberId(memberId); if (CollUtil.isEmpty(holdOrders)) { if (dataModelMap.get(memberId.toString()) != null) { dataModelMap.remove(memberId.toString()); redisUtils.set(AppContants.WHOLE_BOMB_MAP, JSONObject.toJSONString(dataModelMap)); } return; } MemberWalletContractEntity wallet = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); WholePriceDataModel wholePriceData = new WholePriceDataModel(); List holdOrderDataModels = ContractHoldOrderEntityMapper.INSTANCE.entitiesToDataModels(holdOrders); wholePriceData.setList(holdOrderDataModels); BigDecimal totalHoldBond = BigDecimal.ZERO; for (ContractHoldOrderEntity holdOrder : holdOrders) { totalHoldBond = totalHoldBond.add(holdOrder.getHoldBond() == null ? BigDecimal.ZERO : holdOrder.getHoldBond()); } wholePriceData.setHoldBond(totalHoldBond); List entrustOrder = contractEntrustOrderDao.selectEntrustOrderListByMemberId(wholePriceData.getMemberId()); BigDecimal totalAmount = BigDecimal.ZERO; if (CollUtil.isNotEmpty(entrustOrder)) { for (ContractEntrustOrderEntity contractEntrustOrderEntity : entrustOrder) { totalAmount.add(contractEntrustOrderEntity.getEntrustAmount()); } } wholePriceData.setBalance(wallet.getTotalBalance().subtract(totalAmount)); wholePriceData.setMemberId(memberId); dataModelMap.put(wholePriceData.getMemberId().toString(), wholePriceData); redisUtils.set(AppContants.WHOLE_BOMB_MAP, JSONObject.toJSONString(dataModelMap)); } }