fix: 策略相关修复

1. GetPortfolioDetailAsync: 移除硬编码逻辑模型信息
   - 根据策略ID从数据库读取真实策略信息
   - 无策略时返回 null,前端显示'未绑定策略'

2. GetStrategies: 修复返回格式
   - 改为返回 { items: [...] } 格式,匹配前端期望
   - 修复 StrategyListResponse.Items 类型为 StrategyListItemDto
This commit is contained in:
OpenClaw Agent 2026-03-25 07:52:13 +00:00
parent 7d37ef5561
commit 9b576de069
4 changed files with 44 additions and 16 deletions

View File

@ -64,7 +64,7 @@ public class StrategyController : ControllerBase
/// 此接口用于获取当前登录用户的所有策略列表。
/// </remarks>
[HttpGet("strategies")]
public ActionResult<ApiResponse<List<StrategyListItemDto>>> GetStrategies()
public ActionResult<ApiResponse<StrategyListResponse>> GetStrategies()
{
try
{
@ -74,12 +74,12 @@ public class StrategyController : ControllerBase
var strategies = _strategyService.GetStrategies(userId);
var strategyListItems = strategies.Select(MapToStrategyListItemDTO).ToList();
_logger.LogInformation("Strategies retrieved successfully");
_logger.LogInformation("Strategies retrieved successfully, count: {Count}", strategyListItems.Count);
return Ok(new ApiResponse<List<StrategyListItemDto>>
return Ok(new ApiResponse<StrategyListResponse>
{
code = AssetManager.Models.StatusCodes.Success,
data = strategyListItems,
data = new StrategyListResponse { Items = strategyListItems },
message = "Success"
});
}
@ -87,7 +87,7 @@ public class StrategyController : ControllerBase
{
_logger.LogError(ex, "Error retrieving strategies");
return StatusCode(AssetManager.Models.StatusCodes.InternalServerError, new ApiResponse<List<StrategyListItemDto>>
return StatusCode(AssetManager.Models.StatusCodes.InternalServerError, new ApiResponse<StrategyListResponse>
{
code = AssetManager.Models.StatusCodes.InternalServerError,
data = null,

View File

@ -5,7 +5,7 @@ namespace AssetManager.Models.DTOs;
/// </summary>
public class StrategyListResponse
{
public List<StrategyItem>? Items { get; set; }
public List<StrategyListItemDto>? Items { get; set; }
}
/// <summary>

View File

@ -550,27 +550,48 @@ public class PortfolioService : IPortfolioService
decimal TotalReturn = totalPortfolioValue - totalCost;
double totalReturnRate = totalCost > 0 ? (double)(TotalReturn / totalCost * 100) : 0;
// 获取策略信息(如果有的话)
StrategyInfo? strategyInfo = null;
string? logicModel = null;
string? logicModelStatus = null;
string? logicModelDescription = null;
if (!string.IsNullOrEmpty(portfolio.StrategyId))
{
var strategy = _db.Queryable<Strategy>()
.Where(s => s.Id == portfolio.StrategyId)
.First();
if (strategy != null)
{
strategyInfo = new StrategyInfo
{
Id = strategy.Id,
Name = strategy.Name,
Description = strategy.Description
};
logicModel = strategy.Name;
logicModelStatus = "监控中";
logicModelDescription = strategy.Description;
}
}
return new PortfolioDetailResponse
{
Id = portfolio.Id,
Name = portfolio.Name,
Currency = targetCurrency,
Status = portfolio.Status,
Strategy = new StrategyInfo
{
Id = portfolio.StrategyId,
Name = "策略名称",
Description = "策略描述"
},
Strategy = strategyInfo,
PortfolioValue = (double)totalPortfolioValue,
TotalReturn = (double)TotalReturn,
TodayProfit = (double)totalTodayProfit,
HistoricalChange = totalReturnRate,
DailyVolatility = 0, // 后续实现
DailyVolatility = 0,
TodayProfitCurrency = targetCurrency,
LogicModel = "HFEA 风险平价逻辑",
LogicModelStatus = "监控中",
LogicModelDescription = "目标权重 季度调仓",
LogicModel = logicModel,
LogicModelStatus = logicModelStatus,
LogicModelDescription = logicModelDescription,
TotalItems = Positions.Count,
TotalRatio = 100.0,
Positions = positionItems

View File

@ -0,0 +1,7 @@
-- 修改 portfolios 表 strategy_id 字段允许 NULL
-- 组合可能不使用任何策略,所以应该允许 NULL
ALTER TABLE portfolios MODIFY COLUMN strategy_id VARCHAR(50) NULL;
-- 验证
DESCRIBE portfolios;