using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using YLErp.DBModels; using YLErp.Modules.BasicDataModule; using YLErp.Modules.TradeMsgOutputModule.Dto; namespace YLErp.Modules.TradeMsgOutputModule { /// /// 交易资金导出服务 /// public class TradeCashOutputService: BaseTradeAfterEodOutputService { /// /// 获取资金记录 /// /// /// public List GetCashLog(DateTime valueDate) { CheckEodStatus(valueDate); var list = GetListByDate(valueDate); var result = new List(); if (list == null || list.Count == 0) { return result; } var tradeIds=list.Select(x => x.TradeId).ToList(); Dictionary tradeDic = null; using (var db = DbContextFactory.GetYLDbContext()) { tradeDic = GetEodTradeDicSimpleDic(db, valueDate, tradeIds); } if (tradeDic == null) { tradeDic = new Dictionary(); } Dictionary assetUnitDic = null; var assertIds = tradeDic.Values.Select(p => p.AssetId).Distinct().ToList(); if (assertIds != null && assertIds.Count > 0) { assetUnitDic = new AssetUnitDataService(new OptUserInfo(0, "系统", OptUserFrom.System)).GetAssertByAssertIds(assertIds); } if (assetUnitDic == null) { assetUnitDic = new Dictionary(); } List exchangeAccountList = null; if (assertIds != null && assertIds.Count > 0) { exchangeAccountList = new ExchangeAccountService(new OptUserInfo(0, "系统", OptUserFrom.System)).GetExchangeAccountByBookIds(assertIds); } if(exchangeAccountList == null) { exchangeAccountList = new List(); } var tradePriceList = GetTradePrice(tradeIds); if (tradePriceList == null) { tradePriceList = new List(); } list.ForEach(p => { var model = new CashLogOutputDto { ValueDate = p.ValueDate, HappenedDate = p.HappenedDate, TradeId = p.TradeId, CashAction = p.Action, Amount = p.Amount, Notional = p.Notional, }; model.TradePrice = tradePriceList.Where(d => d.TradeId == p.TradeId).Sum(p => p.TradePrice); if (tradeDic.ContainsKey(p.TradeId)) { var trade = tradeDic[p.TradeId]; model.TradeType = trade.TradeType; model.TradeNumber = trade.TradeNumber; model.TradeDate = trade.TradeDate; model.ExerciseDate = trade.ExerciseDate; model.UnderlyingCode = trade.UnderlyingCode; model.PremiumPayDate = trade.PremiumPayDate; model.OriginalStockEqvNotional = trade.OriginalStockEqvNotional; model.StockEqvNotional = trade.StockEqvNotional; model.OriginalNotional = trade.OriginalNotional; if (trade.AssetId > 0 && assetUnitDic.ContainsKey(trade.AssetId)) { model.AssetUnitGroupName = assetUnitDic[trade.AssetId].GroupName; } if (trade.AssetId > 0) { var exchangeAccount = exchangeAccountList.FirstOrDefault(d => d.DefaultBookId == trade.AssetId); if(exchangeAccount != null) { model.ExChangeAccount = exchangeAccount.AccountCode; } } result.Add(model); } }); return result; } private List GetByValueDate(DateTime valueDate) { using(var db = DbContextFactory.GetYLDbContext()) { return db.trade_cash.AsNoTracking().Where(p => p.ValueDate == valueDate && (p.ValidState != "InValid" || string.IsNullOrEmpty(p.ValidState))&&!p.IsDeleted).Select(p => new TradeCashOutputDto { Id=p.id, ValueDate=p.ValueDate, HappenedDate=p.HappenedDate, Action=p.Action, Amount=p.Amount, TradeId=p.TradeId, Notional=p.Notional }).ToList(); } } private List GetByHappendDate(DateTime valueDate) { var endDate = valueDate.AddDays(1); using (var db = DbContextFactory.GetYLDbContext()) { var tradeCashIds = db.ClientCashInCashOut.AsNoTracking().Where(p => p.HappenDate >= valueDate && p.HappenDate < endDate && (p.ValidState != "InValid" || string.IsNullOrEmpty(p.ValidState)) && p.TradeCashId > 0).Select(p => p.TradeCashId).Distinct().ToList(); if (tradeCashIds == null || tradeCashIds.Count == 0) { return null; } return db.trade_cash.AsNoTracking().Where(p => tradeCashIds.Contains(p.id) && (p.ValidState != "InValid" || string.IsNullOrEmpty(p.ValidState)) && !p.IsDeleted).Select(p => new TradeCashOutputDto { Id = p.id, ValueDate = p.ValueDate, HappenedDate = valueDate, Action = p.Action, Amount = p.Amount, TradeId = p.TradeId, Notional=p.Notional, }).ToList(); } } private List GetListByDate(DateTime valueDate) { var valueList = GetByValueDate(valueDate); var happendList = GetByHappendDate(valueDate); var result = new List(); if (happendList != null && happendList.Count > 0) { result.AddRange(happendList); } if (valueList != null && valueList.Count > 0) { valueList = valueList.Where(p => !result.Any(d => d.Id == p.Id)).ToList(); } if (valueList != null && valueList.Count > 0) { result.AddRange(valueList); } return result; } private List GetTradePrice(List tradeIds) { using (var db = DbContextFactory.GetYLDbContext()) { return db.trade_cash.AsNoTracking().Where(p => tradeIds.Contains(p.TradeId)&& ClientCashInCashOut.系统操作_期权费.Equals(p.Action) && (p.ValidState != "InValid" || string.IsNullOrEmpty(p.ValidState)) && !p.IsDeleted).Select(p => new TradePriceDto { TradeId = p.TradeId, TradePrice=p.Amount }).ToList(); } } } }