From 1977dd609d1e9a53f2d1b91e7ab10a7593f46f70 Mon Sep 17 00:00:00 2001 From: OpenClaw Agent Date: Fri, 13 Mar 2026 16:21:31 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=AF=B7=E6=B1=82=E6=94=B6=E7=9B=8A?= =?UTF-8?q?=E6=9B=B2=E7=BA=BF=E6=97=B6=E8=87=AA=E5=8A=A8=E5=9B=9E=E5=A1=AB?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - GetNavHistoryAsync现在会自动检查是否有历史数据 - 无历史数据时自动调用BackfillNavHistoryInternalAsync - 拆分内部回填方法,避免重复验证权限 --- .dockerignore | 0 .env.example | 0 .gitignore | 0 AssetManager.API/AssetManager.API.csproj | 0 AssetManager.API/AssetManager.API.http | 0 .../Controllers/AuthController.cs | 0 .../Controllers/StrategyController.cs | 0 .../Controllers/TickerController.cs | 0 .../Controllers/UserController.cs | 0 .../Middleware/GlobalExceptionMiddleware.cs | 0 .../Middleware/RateLimitMiddleware.cs | 0 .../PublishProfiles/FolderProfile.pubxml | 0 .../Properties/launchSettings.json | 0 AssetManager.API/appsettings.Development.json | 0 AssetManager.Data/AssetManager.Data.csproj | 0 AssetManager.Data/DatabaseExtensions.cs | 0 AssetManager.Data/DatabaseService.cs | 0 AssetManager.Data/MarketKlineCache.cs | 0 AssetManager.Data/MarketPriceCache.cs | 0 AssetManager.Data/Portfolio.cs | 0 AssetManager.Data/README.md | 0 AssetManager.Data/SqlSugarConfig.cs | 0 AssetManager.Data/Strategy.cs | 0 AssetManager.Data/TiingoTicker.cs | 0 AssetManager.Data/User.cs | 0 .../AssetManager.Infrastructure.csproj | 0 .../Services/ExchangeRateService.cs | 0 .../Services/IExchangeRateService.cs | 0 .../Services/IMarketDataService.cs | 0 .../Services/MarketDataService.cs | 0 .../Services/MockExchangeRateService.cs | 0 .../Services/MockMarketDataService.cs | 0 .../Calculators/ChandelierExitCalculator.cs | 0 .../Calculators/MaTrendCalculator.cs | 0 .../Calculators/RiskParityCalculator.cs | 0 .../StrategyEngine/IStrategyCalculator.cs | 0 .../StrategyEngine/IStrategyEngine.cs | 0 .../StrategyEngine/StrategyEngine.cs | 0 .../StrategyEngineExtensions.cs | 0 .../StrategyEngine/TechnicalIndicators.cs | 0 AssetManager.Models/ApiResponse.cs | 0 .../AssetManager.Models.csproj | 0 AssetManager.Models/Currency.cs | 0 AssetManager.Models/DTOs/AuthDTO.cs | 0 .../DTOs/ChandelierExitConfig.cs | 0 AssetManager.Models/DTOs/MaTrendConfig.cs | 0 AssetManager.Models/DTOs/MarketDTO.cs | 0 AssetManager.Models/DTOs/RiskParityConfig.cs | 0 AssetManager.Models/DTOs/StrategyDTO.cs | 0 AssetManager.Models/DTOs/StrategySignal.cs | 0 AssetManager.Models/DTOs/StrategyType.cs | 0 AssetManager.Models/DTOs/TickerDTO.cs | 0 AssetManager.Models/DTOs/UserDTO.cs | 0 .../AssetManager.Services.csproj | 0 AssetManager.Services/IPortfolioService.cs | 0 AssetManager.Services/IStrategyService.cs | 0 AssetManager.Services/ITickerService.cs | 0 AssetManager.Services/PortfolioNavService.cs | 23 +++++++++++++++---- AssetManager.Services/PortfolioService.cs | 0 AssetManager.Services/Services/JwtService.cs | 0 .../Services/WechatService.cs | 0 AssetManager.Services/StrategyService.cs | 0 AssetManager.Services/TickerService.cs | 0 AssetManager.sln | 0 DEPLOY.md | 0 Dockerfile | 0 README.md | 0 docker-compose.yml | 0 68 files changed, 19 insertions(+), 4 deletions(-) mode change 100644 => 100755 .dockerignore mode change 100644 => 100755 .env.example mode change 100644 => 100755 .gitignore mode change 100644 => 100755 AssetManager.API/AssetManager.API.csproj mode change 100644 => 100755 AssetManager.API/AssetManager.API.http mode change 100644 => 100755 AssetManager.API/Controllers/AuthController.cs mode change 100644 => 100755 AssetManager.API/Controllers/StrategyController.cs mode change 100644 => 100755 AssetManager.API/Controllers/TickerController.cs mode change 100644 => 100755 AssetManager.API/Controllers/UserController.cs mode change 100644 => 100755 AssetManager.API/Middleware/GlobalExceptionMiddleware.cs mode change 100644 => 100755 AssetManager.API/Middleware/RateLimitMiddleware.cs mode change 100644 => 100755 AssetManager.API/Properties/PublishProfiles/FolderProfile.pubxml mode change 100644 => 100755 AssetManager.API/Properties/launchSettings.json mode change 100644 => 100755 AssetManager.API/appsettings.Development.json mode change 100644 => 100755 AssetManager.Data/AssetManager.Data.csproj mode change 100644 => 100755 AssetManager.Data/DatabaseExtensions.cs mode change 100644 => 100755 AssetManager.Data/DatabaseService.cs mode change 100644 => 100755 AssetManager.Data/MarketKlineCache.cs mode change 100644 => 100755 AssetManager.Data/MarketPriceCache.cs mode change 100644 => 100755 AssetManager.Data/Portfolio.cs mode change 100644 => 100755 AssetManager.Data/README.md mode change 100644 => 100755 AssetManager.Data/SqlSugarConfig.cs mode change 100644 => 100755 AssetManager.Data/Strategy.cs mode change 100644 => 100755 AssetManager.Data/TiingoTicker.cs mode change 100644 => 100755 AssetManager.Data/User.cs mode change 100644 => 100755 AssetManager.Infrastructure/AssetManager.Infrastructure.csproj mode change 100644 => 100755 AssetManager.Infrastructure/Services/ExchangeRateService.cs mode change 100644 => 100755 AssetManager.Infrastructure/Services/IExchangeRateService.cs mode change 100644 => 100755 AssetManager.Infrastructure/Services/IMarketDataService.cs mode change 100644 => 100755 AssetManager.Infrastructure/Services/MarketDataService.cs mode change 100644 => 100755 AssetManager.Infrastructure/Services/MockExchangeRateService.cs mode change 100644 => 100755 AssetManager.Infrastructure/Services/MockMarketDataService.cs mode change 100644 => 100755 AssetManager.Infrastructure/StrategyEngine/Calculators/ChandelierExitCalculator.cs mode change 100644 => 100755 AssetManager.Infrastructure/StrategyEngine/Calculators/MaTrendCalculator.cs mode change 100644 => 100755 AssetManager.Infrastructure/StrategyEngine/Calculators/RiskParityCalculator.cs mode change 100644 => 100755 AssetManager.Infrastructure/StrategyEngine/IStrategyCalculator.cs mode change 100644 => 100755 AssetManager.Infrastructure/StrategyEngine/IStrategyEngine.cs mode change 100644 => 100755 AssetManager.Infrastructure/StrategyEngine/StrategyEngine.cs mode change 100644 => 100755 AssetManager.Infrastructure/StrategyEngine/StrategyEngineExtensions.cs mode change 100644 => 100755 AssetManager.Infrastructure/StrategyEngine/TechnicalIndicators.cs mode change 100644 => 100755 AssetManager.Models/ApiResponse.cs mode change 100644 => 100755 AssetManager.Models/AssetManager.Models.csproj mode change 100644 => 100755 AssetManager.Models/Currency.cs mode change 100644 => 100755 AssetManager.Models/DTOs/AuthDTO.cs mode change 100644 => 100755 AssetManager.Models/DTOs/ChandelierExitConfig.cs mode change 100644 => 100755 AssetManager.Models/DTOs/MaTrendConfig.cs mode change 100644 => 100755 AssetManager.Models/DTOs/MarketDTO.cs mode change 100644 => 100755 AssetManager.Models/DTOs/RiskParityConfig.cs mode change 100644 => 100755 AssetManager.Models/DTOs/StrategyDTO.cs mode change 100644 => 100755 AssetManager.Models/DTOs/StrategySignal.cs mode change 100644 => 100755 AssetManager.Models/DTOs/StrategyType.cs mode change 100644 => 100755 AssetManager.Models/DTOs/TickerDTO.cs mode change 100644 => 100755 AssetManager.Models/DTOs/UserDTO.cs mode change 100644 => 100755 AssetManager.Services/AssetManager.Services.csproj mode change 100644 => 100755 AssetManager.Services/IPortfolioService.cs mode change 100644 => 100755 AssetManager.Services/IStrategyService.cs mode change 100644 => 100755 AssetManager.Services/ITickerService.cs mode change 100644 => 100755 AssetManager.Services/PortfolioService.cs mode change 100644 => 100755 AssetManager.Services/Services/JwtService.cs mode change 100644 => 100755 AssetManager.Services/Services/WechatService.cs mode change 100644 => 100755 AssetManager.Services/StrategyService.cs mode change 100644 => 100755 AssetManager.Services/TickerService.cs mode change 100644 => 100755 AssetManager.sln mode change 100644 => 100755 DEPLOY.md mode change 100644 => 100755 Dockerfile mode change 100644 => 100755 README.md mode change 100644 => 100755 docker-compose.yml diff --git a/.dockerignore b/.dockerignore old mode 100644 new mode 100755 diff --git a/.env.example b/.env.example old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/AssetManager.API/AssetManager.API.csproj b/AssetManager.API/AssetManager.API.csproj old mode 100644 new mode 100755 diff --git a/AssetManager.API/AssetManager.API.http b/AssetManager.API/AssetManager.API.http old mode 100644 new mode 100755 diff --git a/AssetManager.API/Controllers/AuthController.cs b/AssetManager.API/Controllers/AuthController.cs old mode 100644 new mode 100755 diff --git a/AssetManager.API/Controllers/StrategyController.cs b/AssetManager.API/Controllers/StrategyController.cs old mode 100644 new mode 100755 diff --git a/AssetManager.API/Controllers/TickerController.cs b/AssetManager.API/Controllers/TickerController.cs old mode 100644 new mode 100755 diff --git a/AssetManager.API/Controllers/UserController.cs b/AssetManager.API/Controllers/UserController.cs old mode 100644 new mode 100755 diff --git a/AssetManager.API/Middleware/GlobalExceptionMiddleware.cs b/AssetManager.API/Middleware/GlobalExceptionMiddleware.cs old mode 100644 new mode 100755 diff --git a/AssetManager.API/Middleware/RateLimitMiddleware.cs b/AssetManager.API/Middleware/RateLimitMiddleware.cs old mode 100644 new mode 100755 diff --git a/AssetManager.API/Properties/PublishProfiles/FolderProfile.pubxml b/AssetManager.API/Properties/PublishProfiles/FolderProfile.pubxml old mode 100644 new mode 100755 diff --git a/AssetManager.API/Properties/launchSettings.json b/AssetManager.API/Properties/launchSettings.json old mode 100644 new mode 100755 diff --git a/AssetManager.API/appsettings.Development.json b/AssetManager.API/appsettings.Development.json old mode 100644 new mode 100755 diff --git a/AssetManager.Data/AssetManager.Data.csproj b/AssetManager.Data/AssetManager.Data.csproj old mode 100644 new mode 100755 diff --git a/AssetManager.Data/DatabaseExtensions.cs b/AssetManager.Data/DatabaseExtensions.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Data/DatabaseService.cs b/AssetManager.Data/DatabaseService.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Data/MarketKlineCache.cs b/AssetManager.Data/MarketKlineCache.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Data/MarketPriceCache.cs b/AssetManager.Data/MarketPriceCache.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Data/Portfolio.cs b/AssetManager.Data/Portfolio.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Data/README.md b/AssetManager.Data/README.md old mode 100644 new mode 100755 diff --git a/AssetManager.Data/SqlSugarConfig.cs b/AssetManager.Data/SqlSugarConfig.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Data/Strategy.cs b/AssetManager.Data/Strategy.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Data/TiingoTicker.cs b/AssetManager.Data/TiingoTicker.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Data/User.cs b/AssetManager.Data/User.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Infrastructure/AssetManager.Infrastructure.csproj b/AssetManager.Infrastructure/AssetManager.Infrastructure.csproj old mode 100644 new mode 100755 diff --git a/AssetManager.Infrastructure/Services/ExchangeRateService.cs b/AssetManager.Infrastructure/Services/ExchangeRateService.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Infrastructure/Services/IExchangeRateService.cs b/AssetManager.Infrastructure/Services/IExchangeRateService.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Infrastructure/Services/IMarketDataService.cs b/AssetManager.Infrastructure/Services/IMarketDataService.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Infrastructure/Services/MarketDataService.cs b/AssetManager.Infrastructure/Services/MarketDataService.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Infrastructure/Services/MockExchangeRateService.cs b/AssetManager.Infrastructure/Services/MockExchangeRateService.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Infrastructure/Services/MockMarketDataService.cs b/AssetManager.Infrastructure/Services/MockMarketDataService.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Infrastructure/StrategyEngine/Calculators/ChandelierExitCalculator.cs b/AssetManager.Infrastructure/StrategyEngine/Calculators/ChandelierExitCalculator.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Infrastructure/StrategyEngine/Calculators/MaTrendCalculator.cs b/AssetManager.Infrastructure/StrategyEngine/Calculators/MaTrendCalculator.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Infrastructure/StrategyEngine/Calculators/RiskParityCalculator.cs b/AssetManager.Infrastructure/StrategyEngine/Calculators/RiskParityCalculator.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Infrastructure/StrategyEngine/IStrategyCalculator.cs b/AssetManager.Infrastructure/StrategyEngine/IStrategyCalculator.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Infrastructure/StrategyEngine/IStrategyEngine.cs b/AssetManager.Infrastructure/StrategyEngine/IStrategyEngine.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Infrastructure/StrategyEngine/StrategyEngine.cs b/AssetManager.Infrastructure/StrategyEngine/StrategyEngine.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Infrastructure/StrategyEngine/StrategyEngineExtensions.cs b/AssetManager.Infrastructure/StrategyEngine/StrategyEngineExtensions.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Infrastructure/StrategyEngine/TechnicalIndicators.cs b/AssetManager.Infrastructure/StrategyEngine/TechnicalIndicators.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Models/ApiResponse.cs b/AssetManager.Models/ApiResponse.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Models/AssetManager.Models.csproj b/AssetManager.Models/AssetManager.Models.csproj old mode 100644 new mode 100755 diff --git a/AssetManager.Models/Currency.cs b/AssetManager.Models/Currency.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Models/DTOs/AuthDTO.cs b/AssetManager.Models/DTOs/AuthDTO.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Models/DTOs/ChandelierExitConfig.cs b/AssetManager.Models/DTOs/ChandelierExitConfig.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Models/DTOs/MaTrendConfig.cs b/AssetManager.Models/DTOs/MaTrendConfig.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Models/DTOs/MarketDTO.cs b/AssetManager.Models/DTOs/MarketDTO.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Models/DTOs/RiskParityConfig.cs b/AssetManager.Models/DTOs/RiskParityConfig.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Models/DTOs/StrategyDTO.cs b/AssetManager.Models/DTOs/StrategyDTO.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Models/DTOs/StrategySignal.cs b/AssetManager.Models/DTOs/StrategySignal.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Models/DTOs/StrategyType.cs b/AssetManager.Models/DTOs/StrategyType.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Models/DTOs/TickerDTO.cs b/AssetManager.Models/DTOs/TickerDTO.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Models/DTOs/UserDTO.cs b/AssetManager.Models/DTOs/UserDTO.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Services/AssetManager.Services.csproj b/AssetManager.Services/AssetManager.Services.csproj old mode 100644 new mode 100755 diff --git a/AssetManager.Services/IPortfolioService.cs b/AssetManager.Services/IPortfolioService.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Services/IStrategyService.cs b/AssetManager.Services/IStrategyService.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Services/ITickerService.cs b/AssetManager.Services/ITickerService.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Services/PortfolioNavService.cs b/AssetManager.Services/PortfolioNavService.cs index 4e7301a..6afacd2 100644 --- a/AssetManager.Services/PortfolioNavService.cs +++ b/AssetManager.Services/PortfolioNavService.cs @@ -44,6 +44,17 @@ public class PortfolioNavService : IPortfolioNavService var endDate = request.endDate ?? DateTime.Today; var startDate = request.startDate ?? endDate.AddDays(-30); + // 检查是否有历史数据,没有则自动回填 + var existingCount = await _db.Queryable() + .Where(n => n.PortfolioId == portfolioId) + .CountAsync(); + + if (existingCount == 0) + { + _logger.LogInformation("组合 {PortfolioId} 无净值历史数据,自动开始回填", portfolioId); + await BackfillNavHistoryInternalAsync(portfolioId, portfolio); + } + // 查询净值历史 var navHistory = await _db.Queryable() .Where(n => n.PortfolioId == portfolioId) @@ -244,6 +255,14 @@ public class PortfolioNavService : IPortfolioNavService throw new Exception("Portfolio not found or access denied"); } + return await BackfillNavHistoryInternalAsync(portfolioId, portfolio, force); + } + + /// + /// 内部回填方法(已验证权限) + /// + private async Task BackfillNavHistoryInternalAsync(string portfolioId, Portfolio portfolio, bool force = false) + { // 获取所有交易记录,按时间排序 var transactions = await _db.Queryable() .Where(t => t.PortfolioId == portfolioId) @@ -288,10 +307,6 @@ public class PortfolioNavService : IPortfolioNavService // 遍历每个交易日 for (var date = startDate; date <= endDate; date = date.AddDays(1)) { - // 跳过周末(可选,美股周末无交易) - // if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday) - // continue; - // 检查是否已存在该日期的净值记录(非强制模式) if (!force) { diff --git a/AssetManager.Services/PortfolioService.cs b/AssetManager.Services/PortfolioService.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Services/Services/JwtService.cs b/AssetManager.Services/Services/JwtService.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Services/Services/WechatService.cs b/AssetManager.Services/Services/WechatService.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Services/StrategyService.cs b/AssetManager.Services/StrategyService.cs old mode 100644 new mode 100755 diff --git a/AssetManager.Services/TickerService.cs b/AssetManager.Services/TickerService.cs old mode 100644 new mode 100755 diff --git a/AssetManager.sln b/AssetManager.sln old mode 100644 new mode 100755 diff --git a/DEPLOY.md b/DEPLOY.md old mode 100644 new mode 100755 diff --git a/Dockerfile b/Dockerfile old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/docker-compose.yml b/docker-compose.yml old mode 100644 new mode 100755