using AssetManager.Data;
using Microsoft.Extensions.Logging;
using SqlSugar;
namespace AssetManager.Data.Repositories;
///
/// 投资组合仓储实现
///
public class PortfolioRepository : IPortfolioRepository
{
private readonly ISqlSugarClient _db;
private readonly ILogger _logger;
public PortfolioRepository(ISqlSugarClient db, ILogger logger)
{
_db = db;
_logger = logger;
}
// ===== Portfolio =====
public async Task GetByIdAsync(string id, string userId)
{
return await _db.Queryable()
.Where(p => p.Id == id && p.UserId == userId)
.FirstAsync();
}
public async Task> GetByUserIdAsync(string userId)
{
return await _db.Queryable()
.Where(p => p.UserId == userId)
.ToListAsync();
}
public async Task CreateAsync(Portfolio portfolio)
{
await _db.Insertable(portfolio).ExecuteCommandAsync();
return portfolio;
}
public async Task UpdateAsync(Portfolio portfolio)
{
portfolio.UpdatedAt = DateTime.Now;
return await _db.Updateable(portfolio).ExecuteCommandAsync() > 0;
}
public async Task DeleteAsync(string id, string userId)
{
var portfolio = await GetByIdAsync(id, userId);
if (portfolio == null) return false;
// 删除相关数据
await _db.Deleteable().Where(p => p.PortfolioId == id).ExecuteCommandAsync();
await _db.Deleteable().Where(t => t.PortfolioId == id).ExecuteCommandAsync();
await _db.Deleteable().Where(n => n.PortfolioId == id).ExecuteCommandAsync();
return await _db.Deleteable(portfolio).ExecuteCommandAsync() > 0;
}
// ===== Position =====
public async Task> GetPositionsByPortfolioIdAsync(string portfolioId)
{
return await _db.Queryable()
.Where(p => p.PortfolioId == portfolioId)
.ToListAsync();
}
public async Task GetPositionAsync(string portfolioId, string stockCode)
{
return await _db.Queryable()
.Where(p => p.PortfolioId == portfolioId && p.StockCode == stockCode)
.FirstAsync();
}
public async Task CreatePositionAsync(Position position)
{
position.CreatedAt = DateTime.Now;
position.UpdatedAt = DateTime.Now;
await _db.Insertable(position).ExecuteCommandAsync();
return position;
}
public async Task UpdatePositionAsync(Position position)
{
position.UpdatedAt = DateTime.Now;
return await _db.Updateable(position).ExecuteCommandAsync() > 0;
}
public async Task DeletePositionAsync(string positionId)
{
return await _db.Deleteable()
.Where(p => p.Id == positionId)
.ExecuteCommandAsync() > 0;
}
// ===== Transaction =====
public async Task> GetTransactionsAsync(string portfolioId, int limit, int offset)
{
return await _db.Queryable()
.Where(t => t.PortfolioId == portfolioId)
.OrderByDescending(t => t.TransactionTime)
.Skip(offset)
.Take(limit)
.ToListAsync();
}
public async Task GetTransactionCountAsync(string portfolioId)
{
return await _db.Queryable()
.Where(t => t.PortfolioId == portfolioId)
.CountAsync();
}
public async Task CreateTransactionAsync(Transaction transaction)
{
transaction.CreatedAt = DateTime.Now;
await _db.Insertable(transaction).ExecuteCommandAsync();
return transaction;
}
// ===== NavHistory =====
public async Task> GetNavHistoryAsync(string portfolioId, DateTime? startDate, DateTime? endDate)
{
var query = _db.Queryable()
.Where(n => n.PortfolioId == portfolioId);
if (startDate.HasValue)
{
query = query.Where(n => n.NavDate >= startDate.Value.Date);
}
if (endDate.HasValue)
{
query = query.Where(n => n.NavDate <= endDate.Value.Date);
}
return await query.OrderBy(n => n.NavDate).ToListAsync();
}
public async Task DeleteNavHistoryAfterDateAsync(string portfolioId, DateTime date)
{
return await _db.Deleteable()
.Where(n => n.PortfolioId == portfolioId && n.NavDate >= date.Date)
.ExecuteCommandAsync();
}
public async Task CreateNavHistoryBatchAsync(List records)
{
if (records == null || records.Count == 0) return 0;
return await _db.Insertable(records)
.ExecuteCommandAsync();
}
}