From f7d346c0ae4a4295208a140264e64497b2eb05a4 Mon Sep 17 00:00:00 2001 From: OpenClaw Agent Date: Sun, 15 Mar 2026 14:35:26 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20API=E8=B7=AF=E7=94=B1=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E4=BB=A5=E5=8C=B9=E9=85=8D=E5=89=8D=E7=AB=AF=E6=9C=9F=E6=9C=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 创建交易: POST /api/v1/portfolio/{id}/transactions -> POST /api/v1/portfolio/transactions - portfolioId 改为在 body 中传递 2. 新增计算净值端点: POST /api/v1/portfolio/{id}/nav-history/calculate 前端 API 格式已完全对齐 --- .../Controllers/PortfolioController.cs | 50 ++++++++++++++++--- AssetManager.Services/IPortfolioFacade.cs | 5 ++ AssetManager.Services/PortfolioFacade.cs | 9 ++++ 3 files changed, 58 insertions(+), 6 deletions(-) diff --git a/AssetManager.API/Controllers/PortfolioController.cs b/AssetManager.API/Controllers/PortfolioController.cs index 7cce11e..7218806 100755 --- a/AssetManager.API/Controllers/PortfolioController.cs +++ b/AssetManager.API/Controllers/PortfolioController.cs @@ -270,18 +270,56 @@ public class PortfolioController : ControllerBase } /// - /// 创建交易(买入/卖出) + /// 计算投资组合当日净值 /// - [HttpPost("{id}/transactions")] - public async Task>> CreateTransaction( - string id, - [FromBody] CreateTransactionRequest request) + [HttpPost("{id}/nav-history/calculate")] + public async Task>> CalculateDailyNav(string id) { var userId = GetCurrentUserId(); try { - var transaction = await _portfolioFacade.CreateTransactionAsync(id, request, userId); + var success = await _portfolioFacade.CalculateDailyNavAsync(id); + return Ok(new ApiResponse + { + code = Models.StatusCodes.Success, + data = new { portfolioId = id, calculated = success }, + message = success ? "净值计算成功" : "净值计算失败" + }); + } + catch (Exception ex) + { + return BadRequest(new ApiResponse + { + code = Models.StatusCodes.BadRequest, + data = null, + message = ex.Message + }); + } + } + + /// + /// 创建交易(买入/卖出) + /// + [HttpPost("transactions")] + public async Task>> CreateTransaction( + [FromBody] CreateTransactionRequest request) + { + var userId = GetCurrentUserId(); + + if (string.IsNullOrEmpty(request.PortfolioId)) + { + return BadRequest(new ApiResponse + { + code = Models.StatusCodes.BadRequest, + data = null, + message = "portfolioId 不能为空" + }); + } + + try + { + var transaction = await _portfolioFacade.CreateTransactionAsync(request.PortfolioId, request, userId); return Ok(new ApiResponse { code = Models.StatusCodes.Success, diff --git a/AssetManager.Services/IPortfolioFacade.cs b/AssetManager.Services/IPortfolioFacade.cs index 51f1945..b686d2b 100644 --- a/AssetManager.Services/IPortfolioFacade.cs +++ b/AssetManager.Services/IPortfolioFacade.cs @@ -61,4 +61,9 @@ public interface IPortfolioFacade /// 获取用户总资产 /// Task GetTotalAssetsAsync(string userId); + + /// + /// 计算投资组合当日净值 + /// + Task CalculateDailyNavAsync(string portfolioId); } diff --git a/AssetManager.Services/PortfolioFacade.cs b/AssetManager.Services/PortfolioFacade.cs index 6b3809f..7c8ac0c 100644 --- a/AssetManager.Services/PortfolioFacade.cs +++ b/AssetManager.Services/PortfolioFacade.cs @@ -195,4 +195,13 @@ public class PortfolioFacade : IPortfolioFacade _logger.LogInformation("获取用户总资产: {UserId}", userId); return await _portfolioService.GetTotalAssetsAsync(userId); } + + /// + /// 计算投资组合当日净值 + /// + public async Task CalculateDailyNavAsync(string portfolioId) + { + _logger.LogInformation("计算投资组合当日净值: {PortfolioId}", portfolioId); + return await _navService.CalculateAndSaveDailyNavAsync(portfolioId); + } }