From 75018b2f492444248d8b476d9703bb312d2befc3 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Sat, 08 Feb 2025 16:51:19 +0800
Subject: [PATCH] 项目提交
---
trading-order-service/src/main/java/com/yami/trading/service/impl/WalletServiceImpl.java | 151 ++++++++++++++++++++++++++++++++++++--------------
1 files changed, 109 insertions(+), 42 deletions(-)
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/impl/WalletServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/impl/WalletServiceImpl.java
index 0ac07ba..c1acf6d 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/impl/WalletServiceImpl.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/impl/WalletServiceImpl.java
@@ -1,6 +1,8 @@
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;
@@ -46,8 +48,12 @@
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
@@ -165,7 +171,11 @@
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) {
throw new YamiShopBindException("余额不足");
@@ -191,58 +201,102 @@
/*
* 获取 所有订单 永续合约总资产、总保证金、总未实现盈利,当日盈利
*/
+ @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);
@@ -251,11 +305,24 @@
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;
+ }
+
// /**
// * 获取总资产
// *
--
Gitblit v1.9.3