From d9d43aec7372dc579ced50eda32d7881265533b9 Mon Sep 17 00:00:00 2001
From: zyy <zyy@email.com>
Date: Mon, 14 Jul 2025 17:58:05 +0800
Subject: [PATCH] AI产品交易
---
src/main/java/com/nq/service/impl/UserAssetsServices.java | 10 ++++++----
src/main/java/com/nq/common/interceptor/ApiAdminAuthorityInterceptor.java | 4 ++--
src/main/java/com/nq/pojo/StockAIOrderPosition.java | 2 ++
src/main/java/com/nq/service/IUserAssetsServices.java | 2 +-
src/main/java/com/nq/service/impl/StockAiServiceImpl.java | 33 ++++++++++++++++++++++++++-------
5 files changed, 37 insertions(+), 14 deletions(-)
diff --git a/src/main/java/com/nq/common/interceptor/ApiAdminAuthorityInterceptor.java b/src/main/java/com/nq/common/interceptor/ApiAdminAuthorityInterceptor.java
index 7e1584b..c43ae91 100644
--- a/src/main/java/com/nq/common/interceptor/ApiAdminAuthorityInterceptor.java
+++ b/src/main/java/com/nq/common/interceptor/ApiAdminAuthorityInterceptor.java
@@ -30,7 +30,7 @@
return true;
}
- /*SiteAdmin siteAdmin = null;
+ SiteAdmin siteAdmin = null;
String loginToken = httpServletRequest.getHeader(PropertiesUtil.getProperty("admin.cookie.name"));
if (StringUtils.isNotEmpty(loginToken)) {
String adminJsonStr = RedisShardedPoolUtils.get(loginToken);
@@ -60,7 +60,7 @@
writer.flush();
writer.close();
return false;
- }*/
+ }
// 194.26.73.150, 172.70.34.195
// String ip = IpUtils.getIp(httpServletRequest);
diff --git a/src/main/java/com/nq/pojo/StockAIOrderPosition.java b/src/main/java/com/nq/pojo/StockAIOrderPosition.java
index dc03b11..634daec 100644
--- a/src/main/java/com/nq/pojo/StockAIOrderPosition.java
+++ b/src/main/java/com/nq/pojo/StockAIOrderPosition.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
@@ -51,6 +52,7 @@
/**
* 平仓时间
*/
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date coverDate;
/**
diff --git a/src/main/java/com/nq/service/IUserAssetsServices.java b/src/main/java/com/nq/service/IUserAssetsServices.java
index ce8bd35..b6ccd8a 100644
--- a/src/main/java/com/nq/service/IUserAssetsServices.java
+++ b/src/main/java/com/nq/service/IUserAssetsServices.java
@@ -54,7 +54,7 @@
* @param amount
* @return
*/
- Boolean aiAvailableBalanceChange(UserAssets userAssets, EUserAssets eUserAssets, BigDecimal amount);
+ Boolean aiAvailableBalanceChange(UserAssets userAssets, EUserAssets eUserAssets, BigDecimal amount, BigDecimal buyAmount);
/**
* 根据汇率转换金额
diff --git a/src/main/java/com/nq/service/impl/StockAiServiceImpl.java b/src/main/java/com/nq/service/impl/StockAiServiceImpl.java
index fe407ed..3a3f8e5 100644
--- a/src/main/java/com/nq/service/impl/StockAiServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/StockAiServiceImpl.java
@@ -134,7 +134,7 @@
stockAIOrder.setRealEarning(BigDecimal.valueOf(0));
stockAIOrder.setStatus(EStockAIOrderStatus.wait.getStatus()); //等待审核
stockAiOrderMapper.insert(stockAIOrder);
- iUserAssetsServices.aiAvailableBalanceChange(userAssets, EUserAssets.BUY_AI, buyNum);
+ iUserAssetsServices.aiAvailableBalanceChange(userAssets, EUserAssets.BUY_AI, buyNum, null);
return ServerResponse.createBySuccessMsg("下单成功");
}
} catch (Exception e) {
@@ -289,12 +289,14 @@
if (stockAIOrder.getRemainAmount().compareTo(remainAmount) < 0) {
return ServerResponse.createByErrorMsg("剩余买入金额不足");
}
- stockAIOrder.setRemainAmount(stockAIOrder.getBuyAmount().subtract(remainAmount));
+ stockAIOrder.setRemainAmount(stockAIOrder.getRemainAmount().subtract(remainAmount));
//计算收益 (平仓-建仓)*数量
BigDecimal earnings = model.getCoverPrice().subtract(model.getStockPrice()).multiply(BigDecimal.valueOf(model.getStockNum()));
model.setCreatDate(new Date());
model.setEarnings(earnings);
+ stockAIOrder.setRealEarning(stockAIOrder.getRealEarning().add(earnings));
+
//保存
stockAiOrderMapper.updateById(stockAIOrder);
stockAiOrderPositionMapper.insert(model);
@@ -325,8 +327,6 @@
return ServerResponse.createByErrorMsg("只能拒绝待审核订单");
}
//拒绝TODO 归还买入金额
- //获取用户账户
- UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.MX.getCode(), stockAIOrder.getUserId());
StockAI stockAI = stockAiMapper.selectById(stockAIOrder.getStockAiId());
//买入金额
BigDecimal buyNum = stockAIOrder.getBuyAmount();
@@ -341,13 +341,15 @@
//转换为墨西哥币
buyNum = iUserAssetsServices.exchangeAmountByRate(buyNum, exchangeRate.getRata());
}
- iUserAssetsServices.aiAvailableBalanceChange(userAssets, EUserAssets.BUY_AI_REJECT, buyNum);
+ //获取用户账户
+ UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.MX.getCode(), stockAIOrder.getUserId());
+ iUserAssetsServices.aiAvailableBalanceChange(userAssets, EUserAssets.BUY_AI_REJECT, buyNum, null);
} else if (status.equals(EStockAIOrderStatus.finished.getStatus())) {
if (!stockAIOrder.getStatus().equals(EStockAIOrderStatus.passed.getStatus())) {
return ServerResponse.createByErrorMsg("只能结算申请通过订单");
}
//结算 TODO结算建仓 计算收益
- //所有建仓
+ /*//所有建仓
List<StockAIOrderPosition> stockAIOrderPositionList = stockAiOrderPositionMapper
.selectList(new QueryWrapper<StockAIOrderPosition>()
.eq("stock_ai_order_id", id));
@@ -360,10 +362,27 @@
.filter(Objects::nonNull) // 过滤 null 值
.reduce(BigDecimal.ZERO, BigDecimal::add); // 累加
amount = amount.add(earningsSUM);
+ }*/
+ StockAI stockAI = stockAiMapper.selectById(stockAIOrder.getStockAiId());
+ //收益
+ BigDecimal amount = stockAIOrder.getBuyAmount().add(stockAIOrder.getRealEarning());
+ //需要解冻金额
+ BigDecimal buyAmount = stockAIOrder.getBuyAmount();
+ //如果不是墨西哥币需要转换金额
+ if (!stockAI.getStockType().equals(EStockType.MX.getCode())) {
+ EStockType stockType = EStockType.getEStockTypeByCode(stockAI.getStockType());
+ ExchangeRate exchangeRate = exchangeRateRepository.findExchangeRateByCurrencyAndConversionCurrency(stockType.getSymbol(), EStockType.MX.getSymbol())
+ .orElse(null);
+ if (exchangeRate == null) {
+ return ServerResponse.createByErrorMsg("请先设置当前货币汇率");
+ }
+ //转换为墨西哥币
+ amount = iUserAssetsServices.exchangeAmountByRate(amount, exchangeRate.getRata());
+ buyAmount = iUserAssetsServices.exchangeAmountByRate(buyAmount, exchangeRate.getRata());
}
//获取用户账户
UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.MX.getCode(), stockAIOrder.getUserId());
- iUserAssetsServices.aiAvailableBalanceChange(userAssets, EUserAssets.AI_SETTLEMENT, amount);
+ iUserAssetsServices.aiAvailableBalanceChange(userAssets, EUserAssets.AI_SETTLEMENT, amount, buyAmount);
}
stockAIOrder.setStatus(status);
stockAIOrder.setAuditDate(new Date());
diff --git a/src/main/java/com/nq/service/impl/UserAssetsServices.java b/src/main/java/com/nq/service/impl/UserAssetsServices.java
index 1584494..3e4ad25 100644
--- a/src/main/java/com/nq/service/impl/UserAssetsServices.java
+++ b/src/main/java/com/nq/service/impl/UserAssetsServices.java
@@ -17,6 +17,7 @@
import javax.annotation.Resource;
import javax.validation.constraints.Email;
import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@@ -293,7 +294,7 @@
}
- public Boolean aiAvailableBalanceChange(UserAssets userAssets, EUserAssets eUserAssets, BigDecimal amount) {
+ public Boolean aiAvailableBalanceChange(UserAssets userAssets, EUserAssets eUserAssets, BigDecimal amount, BigDecimal buyAmount) {
String before = userAssets.getAvailableBalance().toString();
if (eUserAssets.getCode().equals(EUserAssets.BUY_AI.getCode())) {
//冻结金额
@@ -307,8 +308,8 @@
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount));
} else if (eUserAssets.getCode().equals(EUserAssets.AI_SETTLEMENT.getCode())) {
//解除冻结金额
- userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(amount.negate()));
- //归还可用金额 + 收益
+ userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(buyAmount.negate()));
+ //归还可用金额(买入金额+收益)
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount));
}
String after = userAssets.getAvailableBalance().toString();
@@ -328,6 +329,7 @@
@Override
public BigDecimal exchangeAmountByRate(BigDecimal amount, BigDecimal rate) {
- return amount.multiply(rate);
+ //保留5位小数
+ return amount.multiply(rate).setScale(5, RoundingMode.HALF_UP);
}
}
--
Gitblit v1.9.3