feat: 交易后自动触发净值历史重算
- CreateTransaction完成后删除该交易日期之后的净值记录 - 下次请求收益曲线时自动重新计算 - 修改CreateTransaction为async方法 - 注入IPortfolioNavService到PortfolioService 流程: 1. 用户买入/卖出 → 创建交易记录 2. 删除交易日期之后的净值历史 3. 下次请求收益曲线 → 自动回填缺失数据
This commit is contained in:
parent
1977dd609d
commit
849db7d2b2
@ -263,7 +263,7 @@ public class PortfolioController : ControllerBase
|
||||
/// <param name="request">交易请求参数(类型、标的、数量、价格等)</param>
|
||||
/// <returns>创建的交易记录</returns>
|
||||
[HttpPost("transactions")]
|
||||
public ActionResult<ApiResponse<CreateTransactionResponse>> CreateTransaction([FromBody] CreateTransactionRequest request)
|
||||
public async Task<ActionResult<ApiResponse<CreateTransactionResponse>>> CreateTransaction([FromBody] CreateTransactionRequest request)
|
||||
{
|
||||
var userId = GetCurrentUserId();
|
||||
if (string.IsNullOrEmpty(userId))
|
||||
@ -325,7 +325,7 @@ public class PortfolioController : ControllerBase
|
||||
}
|
||||
}
|
||||
|
||||
var response = _portfolioService.CreateTransaction(request, userId);
|
||||
var response = await _portfolioService.CreateTransaction(request, userId);
|
||||
|
||||
_logger.LogInformation("Transaction created successfully");
|
||||
|
||||
|
||||
@ -10,5 +10,5 @@ public interface IPortfolioService
|
||||
PortfolioDetailResponse GetPortfolioById(string id, string userId);
|
||||
Task<PortfolioDetailResponse> GetPortfolioByIdAsync(string id, string userId);
|
||||
GetTransactionsResponse GetTransactions(string portfolioId, string userId, int limit, int offset);
|
||||
CreateTransactionResponse CreateTransaction(CreateTransactionRequest request, string userId);
|
||||
Task<CreateTransactionResponse> CreateTransaction(CreateTransactionRequest request, string userId);
|
||||
}
|
||||
@ -11,17 +11,20 @@ public class PortfolioService : IPortfolioService
|
||||
private readonly ISqlSugarClient _db;
|
||||
private readonly IMarketDataService _marketDataService;
|
||||
private readonly IExchangeRateService _exchangeRateService;
|
||||
private readonly IPortfolioNavService _navService;
|
||||
private readonly ILogger<PortfolioService> _logger;
|
||||
|
||||
public PortfolioService(
|
||||
ISqlSugarClient db,
|
||||
IMarketDataService marketDataService,
|
||||
IExchangeRateService exchangeRateService,
|
||||
IPortfolioNavService navService,
|
||||
ILogger<PortfolioService> logger)
|
||||
{
|
||||
_db = db;
|
||||
_marketDataService = marketDataService;
|
||||
_exchangeRateService = exchangeRateService;
|
||||
_navService = navService;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
@ -444,7 +447,7 @@ public class PortfolioService : IPortfolioService
|
||||
};
|
||||
}
|
||||
|
||||
public CreateTransactionResponse CreateTransaction(CreateTransactionRequest request, string userId)
|
||||
public async Task<CreateTransactionResponse> CreateTransaction(CreateTransactionRequest request, string userId)
|
||||
{
|
||||
// 验证投资组合是否属于该用户
|
||||
var portfolio = _db.Queryable<Portfolio>()
|
||||
@ -602,6 +605,21 @@ public class PortfolioService : IPortfolioService
|
||||
portfolio.UpdatedAt = DateTime.Now;
|
||||
_db.Updateable(portfolio).ExecuteCommand();
|
||||
|
||||
// 删除该交易日期之后的净值历史记录,下次请求收益曲线时会自动重新计算
|
||||
try
|
||||
{
|
||||
var deletedCount = await _navService.DeleteNavHistoryAfterDateAsync(request.portfolioId, transactionTime.Date);
|
||||
if (deletedCount > 0)
|
||||
{
|
||||
_logger.LogInformation("交易创建后删除净值历史: PortfolioId={PortfolioId}, Date={Date}, Count={Count}",
|
||||
request.portfolioId, transactionTime.Date, deletedCount);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogWarning(ex, "删除净值历史失败,将在下次请求时重新计算");
|
||||
}
|
||||
|
||||
return new CreateTransactionResponse
|
||||
{
|
||||
id = transaction.Id,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user