From dcd212efa70881336c37b01e8125b35c832e7296 Mon Sep 17 00:00:00 2001 From: OpenClaw Agent Date: Sun, 15 Mar 2026 23:48:11 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=87=AA=E5=8A=A8=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E5=87=80=E5=80=BC=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 创建组合后,如有持仓则自动计算净值 2. 创建交易后,自动更新当日净值 3. 异步执行,不阻塞主流程 --- AssetManager.Services/PortfolioFacade.cs | 38 ++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/AssetManager.Services/PortfolioFacade.cs b/AssetManager.Services/PortfolioFacade.cs index 6b3809f..12583de 100644 --- a/AssetManager.Services/PortfolioFacade.cs +++ b/AssetManager.Services/PortfolioFacade.cs @@ -81,7 +81,22 @@ public class PortfolioFacade : IPortfolioFacade throw new UnauthorizedAccessException("组合不存在或无权访问"); } - return await _portfolioService.CreateTransactionAsync(portfolioId, request, userId); + var transaction = await _portfolioService.CreateTransactionAsync(portfolioId, request, userId); + + // 交易完成后,异步触发净值更新 + _ = Task.Run(async () => + { + try + { + await _navService.CalculateAndSaveDailyNavAsync(portfolioId); + } + catch (Exception ex) + { + _logger.LogWarning(ex, "交易后净值更新失败: {PortfolioId}", portfolioId); + } + }); + + return transaction; } public async Task> GetTransactionsAsync(string portfolioId, GetTransactionsRequest request, string userId) @@ -167,7 +182,26 @@ public class PortfolioFacade : IPortfolioFacade } } - return await _portfolioService.CreatePortfolioAsync(request, userId); + var response = await _portfolioService.CreatePortfolioAsync(request, userId); + + // 如果创建了持仓,自动触发净值计算 + if (request.Stocks != null && request.Stocks.Any()) + { + _logger.LogInformation("新组合包含持仓,触发净值计算: {PortfolioId}", response.Id); + _ = Task.Run(async () => + { + try + { + await _navService.CalculateAndSaveDailyNavAsync(response.Id); + } + catch (Exception ex) + { + _logger.LogWarning(ex, "新组合净值计算失败: {PortfolioId}", response.Id); + } + }); + } + + return response; } ///