feat: 添加组合更新接口,支持修改名称/策略/状态

This commit is contained in:
OpenClaw Agent 2026-03-17 01:50:47 +00:00
parent 9f82ad0a81
commit 5bc318725d
6 changed files with 83 additions and 0 deletions

View File

@ -171,6 +171,33 @@ public class PortfolioController : ControllerBase
} }
} }
/// <summary>
/// 更新投资组合
/// </summary>
[HttpPut("{id}")]
public async Task<ActionResult<ApiResponse<object>>> UpdatePortfolio(string id, [FromBody] UpdatePortfolioRequest request)
{
var userId = GetCurrentUserId();
var success = await _portfolioFacade.UpdatePortfolioAsync(id, request, userId);
if (!success)
{
return NotFound(new ApiResponse<object>
{
code = Models.StatusCodes.NotFound,
data = null,
message = "组合不存在"
});
}
return Ok(new ApiResponse<object>
{
code = Models.StatusCodes.Success,
data = null,
message = "更新成功"
});
}
/// <summary> /// <summary>
/// 删除投资组合 /// 删除投资组合
/// </summary> /// </summary>

View File

@ -11,6 +11,16 @@ public class CreatePortfolioRequest
public List<StockItem>? Stocks { get; set; } public List<StockItem>? Stocks { get; set; }
} }
/// <summary>
/// 更新投资组合请求
/// </summary>
public class UpdatePortfolioRequest
{
public string? Name { get; set; }
public string? StrategyId { get; set; }
public string? Status { get; set; }
}
/// <summary> /// <summary>
/// 股票项 /// 股票项
/// </summary> /// </summary>

View File

@ -47,6 +47,11 @@ public interface IPortfolioFacade
/// </summary> /// </summary>
Task<bool> DeletePortfolioAsync(string portfolioId, string userId); Task<bool> DeletePortfolioAsync(string portfolioId, string userId);
/// <summary>
/// 更新投资组合
/// </summary>
Task<bool> UpdatePortfolioAsync(string portfolioId, UpdatePortfolioRequest request, string userId);
/// <summary> /// <summary>
/// 创建投资组合(含用户验证和币种校验) /// 创建投资组合(含用户验证和币种校验)
/// </summary> /// </summary>

View File

@ -6,6 +6,7 @@ public interface IPortfolioService
{ {
CreatePortfolioResponse CreatePortfolio(CreatePortfolioRequest request, string userId); CreatePortfolioResponse CreatePortfolio(CreatePortfolioRequest request, string userId);
Task<CreatePortfolioResponse> CreatePortfolioAsync(CreatePortfolioRequest request, string userId); Task<CreatePortfolioResponse> CreatePortfolioAsync(CreatePortfolioRequest request, string userId);
Task<bool> UpdatePortfolioAsync(string portfolioId, UpdatePortfolioRequest request, string userId);
List<PortfolioListItem> GetPortfolios(string userId); List<PortfolioListItem> GetPortfolios(string userId);
Task<List<PortfolioListItem>> GetPortfolioListAsync(string userId); Task<List<PortfolioListItem>> GetPortfolioListAsync(string userId);
TotalAssetsResponse GetTotalAssets(string userId); TotalAssetsResponse GetTotalAssets(string userId);

View File

@ -146,6 +146,12 @@ public class PortfolioFacade : IPortfolioFacade
return await _portfolioService.DeletePortfolioAsync(portfolioId, userId); return await _portfolioService.DeletePortfolioAsync(portfolioId, userId);
} }
public async Task<bool> UpdatePortfolioAsync(string portfolioId, UpdatePortfolioRequest request, string userId)
{
_logger.LogInformation("更新组合: {PortfolioId}", portfolioId);
return await _portfolioService.UpdatePortfolioAsync(portfolioId, request, userId);
}
/// <summary> /// <summary>
/// 创建投资组合(含用户验证和币种校验) /// 创建投资组合(含用户验证和币种校验)
/// </summary> /// </summary>

View File

@ -739,6 +739,40 @@ public class PortfolioService : IPortfolioService
}; };
} }
public async Task<bool> UpdatePortfolioAsync(string portfolioId, UpdatePortfolioRequest request, string userId)
{
var portfolio = _db.Queryable<Portfolio>()
.Where(p => p.Id == portfolioId && p.UserId == userId)
.First();
if (portfolio == null)
{
return false;
}
// 更新字段
if (!string.IsNullOrEmpty(request.Name))
{
portfolio.Name = request.Name;
}
// 策略可以为空(解绑策略)
portfolio.StrategyId = request.StrategyId;
if (!string.IsNullOrEmpty(request.Status))
{
portfolio.Status = request.Status;
}
portfolio.UpdatedAt = DateTime.Now;
_db.Updateable(portfolio).ExecuteCommand();
_logger.LogInformation("更新投资组合: {PortfolioId}, 名称: {Name}, 策略: {StrategyId}",
portfolioId, portfolio.Name, portfolio.StrategyId ?? "无");
return true;
}
public async Task<bool> DeletePortfolioAsync(string portfolioId, string userId) public async Task<bool> DeletePortfolioAsync(string portfolioId, string userId)
{ {
var portfolio = _db.Queryable<Portfolio>() var portfolio = _db.Queryable<Portfolio>()