diff --git a/AssetManager.Data/DatabaseService.cs b/AssetManager.Data/DatabaseService.cs index c88a531..5fc740a 100755 --- a/AssetManager.Data/DatabaseService.cs +++ b/AssetManager.Data/DatabaseService.cs @@ -21,7 +21,8 @@ public class DatabaseService typeof(Transaction), typeof(TiingoTicker), typeof(MarketPriceCache), - typeof(MarketKlineCache) + typeof(MarketKlineCache), + typeof(PortfolioNavHistory) ); } diff --git a/AssetManager.Data/Strategy.cs b/AssetManager.Data/Strategy.cs index 60f5939..96d97b7 100755 --- a/AssetManager.Data/Strategy.cs +++ b/AssetManager.Data/Strategy.cs @@ -53,7 +53,7 @@ public class Strategy /// /// 策略配置项(周期,阈值,资产配比) /// - [SugarColumn(ColumnName = "config", IsJson = true)] + [SugarColumn(ColumnName = "config", ColumnDataType = "text")] public string? Config { get; set; } /// diff --git a/AssetManager.Services/StrategyService.cs b/AssetManager.Services/StrategyService.cs index 13d1dc8..e78f291 100755 --- a/AssetManager.Services/StrategyService.cs +++ b/AssetManager.Services/StrategyService.cs @@ -1,6 +1,7 @@ using AssetManager.Data; using AssetManager.Models.DTOs; using SqlSugar; +using System.Text.Json; namespace AssetManager.Services; @@ -24,7 +25,7 @@ public class StrategyService : IStrategyService Description = request.description, Tags = request.tags != null ? string.Join(",", request.tags) : null, RiskLevel = request.riskLevel, - Config = request.parameters != null ? System.Text.Json.JsonSerializer.Serialize(request.parameters) : null, + Config = request.parameters != null ? JsonSerializer.Serialize(request.parameters) : null, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now }; @@ -63,7 +64,7 @@ public class StrategyService : IStrategyService strategy.Description = request.description; strategy.Tags = request.tags != null ? string.Join(",", request.tags) : null; strategy.RiskLevel = request.riskLevel; - strategy.Config = request.parameters != null ? System.Text.Json.JsonSerializer.Serialize(request.parameters) : null; + strategy.Config = request.parameters != null ? JsonSerializer.Serialize(request.parameters) : null; strategy.UpdatedAt = DateTime.Now; _db.Updateable(strategy).ExecuteCommand(); diff --git a/migrations/001_create_nav_history_table.sql b/migrations/001_create_nav_history_table.sql deleted file mode 100644 index e8bb9a0..0000000 --- a/migrations/001_create_nav_history_table.sql +++ /dev/null @@ -1,34 +0,0 @@ --- ============================================= --- 净值历史表迁移脚本 --- 创建时间: 2026-03-13 --- 说明: 用于记录组合每日净值和收益数据 --- ============================================= - --- 创建净值历史表 -CREATE TABLE IF NOT EXISTS portfolio_nav_history ( - id VARCHAR(50) PRIMARY KEY COMMENT '主键ID', - portfolio_id VARCHAR(50) NOT NULL COMMENT '组合ID', - nav_date DATE NOT NULL COMMENT '净值日期', - total_value DECIMAL(18,4) DEFAULT 0 COMMENT '总资产价值(本位币)', - total_cost DECIMAL(18,4) DEFAULT 0 COMMENT '累计投入成本(本位币)', - nav DECIMAL(18,8) DEFAULT 1.0 COMMENT '单位净值', - daily_return DECIMAL(10,4) DEFAULT 0 COMMENT '日收益率(%)', - cumulative_return DECIMAL(10,4) DEFAULT 0 COMMENT '累计收益率(%)', - currency VARCHAR(10) DEFAULT 'CNY' COMMENT '本位币', - position_count INT DEFAULT 0 COMMENT '持仓数量', - source VARCHAR(20) DEFAULT 'calculated' COMMENT '数据来源', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='组合净值历史表'; - --- 创建组合日期联合索引 -CREATE INDEX idx_portfolio_date ON portfolio_nav_history(portfolio_id, nav_date); - --- 创建唯一约束(同一组合同一天只能有一条记录) -ALTER TABLE portfolio_nav_history ADD CONSTRAINT uk_portfolio_date UNIQUE(portfolio_id, nav_date); - --- 为portfolio表的total_value字段添加注释 -ALTER TABLE portfolios MODIFY COLUMN total_value DECIMAL(18,4) DEFAULT 0 COMMENT '当前总市值(冗余字段,实时计算)'; - --- 为portfolio表添加净值相关字段 -ALTER TABLE portfolios ADD COLUMN IF NOT EXISTS initial_cost DECIMAL(18,4) DEFAULT 0 COMMENT '初始投入成本'; -ALTER TABLE portfolios ADD COLUMN IF NOT EXISTS last_nav_date DATE COMMENT '最后净值计算日期';