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(); } }