| | |
| | | package com.yami.trading.service.impl; |
| | | |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.hutool.json.JSONUtil; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.text.DecimalFormat; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.LocalTime; |
| | | import java.util.*; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | import java.util.stream.Collectors; |
| | | |
| | | @Slf4j |
| | | @Service |
| | |
| | | Date now = new Date(); |
| | | Wallet wallet = findByUserId(userId); |
| | | BigDecimal amountBefore = wallet.getMoney(); |
| | | |
| | | wallet.setMoney(wallet.getMoney().add(money)); |
| | | if(wallet.getMoney().compareTo(BigDecimal.ZERO) < 0){ |
| | | wallet.setMoney(BigDecimal.ZERO); |
| | | } |
| | | wallet.setUpdateTime(now); |
| | | if (wallet.getMoney().doubleValue() < 0) { |
| | | if (wallet.getMoney().doubleValue() <= 0) { |
| | | throw new YamiShopBindException("余额不足"); |
| | | } |
| | | updateById(wallet); |
| | |
| | | /* |
| | | * 获取 所有订单 永续合约总资产、总保证金、总未实现盈利,当日盈利 |
| | | */ |
| | | @Override |
| | | public Map<String, Double> getMoneyContract(Serializable partyId, String symbolType) { |
| | | double money_contract = 0; |
| | | double money_contract_deposit = 0; |
| | | double money_contract_profit = 0; |
| | | double money_contract_profit_today = 0; |
| | | double money_contract = 0;//总资产 |
| | | double money_contract_deposit = 0;//总保证金 |
| | | double money_contract_profit = 0;//浮动盈亏 |
| | | double money_contract_profit_today = 0;//当日盈亏 |
| | | |
| | | ContractOrderService contractOrderService = ApplicationContextUtils.getBean(ContractOrderService.class); |
| | | List<ContractOrder> contractOrders = contractOrderService.findSubmitted(partyId.toString(), "", ""); |
| | | List<ContractOrder> contractOrders = getContractOrders(partyId); |
| | | |
| | | if (contractOrders != null) { |
| | | for (ContractOrder order : contractOrders) { |
| | | String symbol = order.getSymbol(); |
| | | Item bySymbol = itemService.findBySymbol(symbol); |
| | | if (bySymbol == null) { |
| | | continue; |
| | | } |
| | | // 类型不对直接continue |
| | | if (StringUtils.isNotEmpty(symbolType)) { |
| | | if (!bySymbol.getType().equalsIgnoreCase(symbolType)) { |
| | | continue; |
| | | } |
| | | // for (ContractOrder order : contractOrders) { |
| | | // String symbol = order.getSymbol(); |
| | | // Item bySymbol = itemService.findBySymbol(symbol); |
| | | // if (bySymbol == null) { |
| | | // continue; |
| | | // } |
| | | // // 类型不对直接continue |
| | | // if (StringUtils.isNotEmpty(symbolType)) { |
| | | // if (!bySymbol.getType().equalsIgnoreCase(symbolType)) { |
| | | // continue; |
| | | // } |
| | | // |
| | | // } |
| | | // // 真正下单里 |
| | | // double order_volume = 1; |
| | | // |
| | | // if (order.getLeverRate() != null && order.getLeverRate().compareTo(BigDecimal.ZERO) != 0) { |
| | | // order_volume = order.getVolumeOpen().divide(order.getLeverRate()).doubleValue(); |
| | | // } else { |
| | | // order_volume = order.getVolumeOpen().doubleValue(); |
| | | // } |
| | | // |
| | | // double amount = Arith.add(Arith.mul(order_volume, order.getUnitAmount().doubleValue()), order.getProfit().doubleValue()); |
| | | // money_contract = Arith.add(amount, money_contract); |
| | | // money_contract_deposit = Arith.add(order.getDeposit().doubleValue(), money_contract_deposit); |
| | | // money_contract_profit = Arith.add(order.getProfit().doubleValue(), money_contract_profit); |
| | | // // 只需要计算当日盈亏比例*金额就是当日盈亏 |
| | | // |
| | | // List<Realtime> realtimes = dataService.realtime(symbol); |
| | | // if (CollectionUtils.isNotEmpty(realtimes)) { |
| | | // Realtime realtime = realtimes.get(0); |
| | | // // 当前每张金额*加杠杆后多少金额 |
| | | // // 今天总体涨跌幅 |
| | | // BigDecimal changeRatio = realtime.getClose().subtract(realtime.getOpen()).divide(realtime.getOpen(), 10, RoundingMode.HALF_UP); |
| | | // Double todayProfit = order.getUnitAmount().multiply(order.getVolumeOpen()).multiply(changeRatio).setScale(10, RoundingMode.HALF_UP).doubleValue(); |
| | | // money_contract_profit_today += todayProfit; |
| | | // } |
| | | // } |
| | | |
| | | } |
| | | // 真正下单里 |
| | | double order_volume = 1; |
| | | |
| | | if (order.getLeverRate() != null && order.getLeverRate().compareTo(BigDecimal.ZERO) != 0) { |
| | | order_volume = order.getVolumeOpen().divide(order.getLeverRate()).doubleValue(); |
| | | } else { |
| | | order_volume = order.getVolumeOpen().doubleValue(); |
| | | } |
| | | Map<String, List<ContractOrder>> groupedOrders = contractOrders.stream() |
| | | .collect(Collectors.groupingBy(ContractOrder::getState)); |
| | | //持仓订单 |
| | | List<ContractOrder> submittedOrderList = groupedOrders.get(ContractOrder.STATE_SUBMITTED); |
| | | |
| | | double amount = Arith.add(Arith.mul(order_volume, order.getUnitAmount().doubleValue()), order.getProfit().doubleValue()); |
| | | money_contract = Arith.add(amount, money_contract); |
| | | money_contract_deposit = Arith.add(order.getDeposit().doubleValue(), money_contract_deposit); |
| | | money_contract_profit = Arith.add(order.getProfit().doubleValue(), money_contract_profit); |
| | | // 只需要计算当日盈亏比例*金额就是当日盈亏 |
| | | //总资产计算 |
| | | if(CollectionUtils.isNotEmpty(submittedOrderList)){ |
| | | //持仓单盈亏 |
| | | BigDecimal totalProfit = submittedOrderList.stream() |
| | | .map(ContractOrder::getProfit) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | |
| | | List<Realtime> realtimes = dataService.realtime(symbol); |
| | | if (CollectionUtils.isNotEmpty(realtimes)) { |
| | | Realtime realtime = realtimes.get(0); |
| | | // 当前每张金额*加杠杆后多少金额 |
| | | // 今天总体涨跌幅 |
| | | BigDecimal changeRatio = realtime.getClose().subtract(realtime.getOpen()).divide(realtime.getOpen(), 10, RoundingMode.HALF_UP); |
| | | Double todayProfit = order.getUnitAmount().multiply(order.getVolumeOpen()).multiply(changeRatio).setScale(10, RoundingMode.HALF_UP).doubleValue(); |
| | | money_contract_profit_today += todayProfit; |
| | | } |
| | | //持仓单保证金 |
| | | BigDecimal totalDeposit = submittedOrderList.stream() |
| | | .map(ContractOrder::getDepositOpen) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | |
| | | money_contract = totalProfit.add(totalDeposit).doubleValue(); |
| | | } |
| | | |
| | | //浮动盈亏 |
| | | if(CollectionUtils.isNotEmpty(submittedOrderList)){ |
| | | BigDecimal totalProfit = submittedOrderList.stream() |
| | | .map(ContractOrder::getProfit) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | money_contract_profit = totalProfit.doubleValue(); |
| | | } |
| | | |
| | | //当日盈亏 |
| | | LocalDateTime startOfDay = LocalDate.now().atStartOfDay(); |
| | | LocalDateTime endOfDay = LocalDate.now().atTime(LocalTime.MAX); |
| | | // 获取今天的订单 |
| | | BigDecimal totalRevenue = contractOrders.stream() |
| | | .filter(order -> { |
| | | LocalDateTime orderDate = toLocalDateTime(order.getCreateTime()); // 转换为 LocalDateTime |
| | | return !orderDate.isBefore(startOfDay) && !orderDate.isAfter(endOfDay); |
| | | }) |
| | | .map(ContractOrder::getProfit) // 获取订单的收益 |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | |
| | | |
| | | money_contract_profit_today = totalRevenue.doubleValue(); |
| | | } |
| | | |
| | | Map<String, Double> moneys_contract = new HashMap<String, Double>(); |
| | | moneys_contract.put("money_contract", money_contract); |
| | | |
| | | moneys_contract.put("money_contract_deposit", money_contract_deposit); |
| | | moneys_contract.put("money_contract_profit", money_contract_profit); |
| | | moneys_contract.put("money_contract_profit_today", money_contract_profit_today); |
| | |
| | | if (!"".equals(partyId) && partyId != null) { |
| | | wallet = findByUserId(partyId.toString()); |
| | | } |
| | | moneys_contract.put("money_wallet", wallet.getMoney().doubleValue()); |
| | | |
| | | moneys_contract.put("money_wallet", wallet.getMoney().doubleValue());//可用余额 |
| | | moneys_contract.put("money_contract", wallet.getMoney().doubleValue()+money_contract); |
| | | return moneys_contract; |
| | | } |
| | | |
| | | private static LocalDateTime toLocalDateTime(Date date) { |
| | | return LocalDateTime.ofInstant(date.toInstant(), java.time.ZoneId.systemDefault()); |
| | | } |
| | | |
| | | private static List<ContractOrder> getContractOrders(Serializable partyId) { |
| | | ContractOrderService contractOrderService = ApplicationContextUtils.getBean(ContractOrderService.class); |
| | | QueryWrapper<ContractOrder> queryWrapper = new QueryWrapper<>(); |
| | | queryWrapper.eq(StrUtil.isNotBlank(partyId.toString()), "party_id", partyId); |
| | | queryWrapper.orderByDesc("create_time"); |
| | | List<ContractOrder> contractOrders = contractOrderService.list(queryWrapper); |
| | | return contractOrders; |
| | | } |
| | | |
| | | // /** |
| | | // * 获取总资产 |
| | | // * |