using System.Linq.Expressions; using YLErp.Abstract; using YLErp.Models; namespace YLErp.Modules.TradeRiskCalcModule.TaskRunner { /// /// 自定义交易风险提供 /// class ManualRiskProvider : IDataUpdater, IJsonSerializable, IDataSource { readonly DateTime _valueDate; readonly string _volType; //使用tradeid做为主键 Dictionary _dic; DateTime _lastUpateTime; /// /// 构造函数 /// /// 当前结算日期 public ManualRiskProvider(DateTime valueDate, string volType) { _valueDate = valueDate; _volType = volType; } public string TableName => nameof(eod_trade_risk_manual); public int Count => throw new NotImplementedException(); public IQueryable AsQueryable(Expression> predicate = null) { lock (this) { return _dic.Values.ToArray().AsQueryable(); } } /// /// 获取自定义交易风险 /// public ManualRisk GetData(int tradeId) { var dic = _dic; if (_dic == null || _lastUpateTime > DateTime.Now || _lastUpateTime.AddMinutes(10) < DateTime.Now) { lock (this) { if (_dic == null || _lastUpateTime > DateTime.Now || _lastUpateTime.AddMinutes(10) < DateTime.Now) { _lastUpateTime = DateTime.Now; using (var db = DbContextFactory.GetYLDbContext()) { var query = db.eod_trade_risk_manual .Where(n => n.ValueDate == _valueDate) .Select(n => new { n.TradeId, n.VolType, risk = new ManualRisk { Pv = n.Pv, Delta = n.Delta, Gamma = n.Gamma, Theta = n.Theta, Vega = n.Vega, Rho = n.Rho } }); dic = _dic = query.ToDictionary(n => n.TradeId + "_" + (n.VolType != null ? n.VolType : ""), n => n.risk); } } } } if (dic == null) { return null; } dic.TryGetValue(tradeId + "_" + _volType, out var dataByType); if(dataByType == null) { dic.TryGetValue(tradeId + "_", out var data); if(data != null) { dataByType.Pv = dataByType.Pv ?? data.Pv; dataByType.Delta = dataByType.Delta ?? data.Delta; dataByType.Gamma = dataByType.Gamma ?? data.Gamma; dataByType.Theta = dataByType.Theta ?? data.Theta; dataByType.Vega = dataByType.Vega ?? data.Vega; dataByType.Rho = dataByType.Rho ?? data.Rho; } } return dataByType; } public void ResetDataSource() { lock (this) { _dic = null; } } public string ToJson() { return new { _valueDate, _dic }.ToJson(); } /// /// 更新数据 /// public void UpdateData(IEnumerable updateKeyIds) { ResetDataSource(); } } }