using BaseOUDAL; using OfficeOpenXml; using Org.BouncyCastle.Ocsp; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Dynamic.Core; using System.Text; using System.Threading.Tasks; using YLErp.BLL; using YLErp.DBModels; using YLErp.Model; using YLErp.Modules.DataCompare.Dto; using YLErp.Modules.SwapModule; using YLErp.Office; namespace YLErp.Modules.DataCompare { /// /// 数据比较服务 /// public class DataCompareService: YLBaseService { public DataCompareService(OptUserInfo userInfo) : base(userInfo) { } public SearchListResult QueryNeedCompareData(QueryNeedCompareDataRequest req) { var predicate = PredicateBuilder.Create(x => true); if (!string.IsNullOrEmpty(req.TradeNumber)) { predicate = predicate.And(x => x.TradeNumber.Contains(req.TradeNumber)); } if (req.AssetId!=null&&req.AssetId.Count>0) { predicate = predicate.And(p => req.AssetId.Contains(p.AssetId)); } var predicateSwap = PredicateBuilder.Create(d => d.ValueDate == req.ValueDate); if (req.ShowException) { predicateSwap = predicateSwap.And(p => !p.IsSkipEod); } var query = from a in DbContext.trade.Where(predicate) join b in DbContext.eod_swap.Where(predicateSwap) on a.id equals b.SwapTradeId where a.TradeDate<=req.ValueDate || (a.TradeStatus==ConsTrade.已平仓&&a.UnWindDate<=req.ValueDate) select new HengTaiCompareData { id=a.id, ValueDate = req.ValueDate, TradeNumber = a.TradeNumber, AssetId = a.AssetId, StartDate = a.StartDate, TradeStatus =(b.ValueDate>=a.UnWindDate&& a.TradeStatus == ConsTrade.已平仓) ? ConsTrade.已平仓 : ConsTrade.确认成交, TradeDate = a.TradeDate, EndDate = a.ExerciseDate, StructType = a.TradeType, QuoteCurrency = a.QuoteCurrency, ClientName = a.ClientName, TraderName = a.TraderName, SwapType = a.StructureType, StockEqvNotional = b.NotionalValue, StockEqvNotionalV2 = b.IsSkipEod ? b.NotionalValue : null, Pv = b.IsSkipEod ? b.HTPostionValue : b.PostionValue, PvV2 = b.IsSkipEod ? b.HTPostionValue : null, AssetName = a.AssetBookName, CheckResult = b.IsSkipEod, VTradingFee=b.VTradingFee }; if (string.IsNullOrEmpty(req.sidx)) { req.sidx = "id"; req.sord = "desc"; } return query.ToSearchList(req); } public DateTime GetLastCloseDate() { var model=DbContext.eodStatus.AsNoTracking().OrderByDescending(p => p.ValueDate).FirstOrDefault(); if (model != null) { return model.ValueDate; } return valuedateBLL.SystemDate.ValueDate; } public SearchListResult QueryOnlyHengTaiData(QueryNeedCompareDataRequest req) { var predicate = PredicateBuilder.Create(x => x.NPV_DATE.Equals(req.ValueDate.ToString("yyyy-MM-dd"))); if (!string.IsNullOrEmpty(req.TradeNumber)) { predicate = predicate.And(x => x.EXT_NO.Contains(req.TradeNumber)); } var tradeNumberQuery = from a in DbContext.trade.AsNoTracking() select a.TradeNumber; predicate = predicate.And(p => !tradeNumberQuery.Contains(p.EXT_NO)); var query = from a in DbContext.reg_valuation_end_of_day.Where(predicate) select new OnlyHengTaiDataDto { id=a.id, ValueDate=req.ValueDate, StockEqvNotionalV2=a.ORDCOUNT, PvV2=a.NPV, TradeNumber=a.EXT_NO, EndDateStr=a.SETDATE_TERMINATE, StartDateStr=a.START_DATE }; if (string.IsNullOrEmpty(req.sidx)) { req.sidx = "id"; req.sord = "desc"; } return query.ToSearchList(req); } public byte[] ExprotExcel(QueryNeedCompareDataRequest req) { var predicate = PredicateBuilder.Create(x => true); if (!string.IsNullOrEmpty(req.TradeNumber)) { predicate = predicate.And(x => x.TradeNumber.Contains(req.TradeNumber)); } if (req.AssetId != null && req.AssetId.Count > 0) { predicate = predicate.And(p => req.AssetId.Contains(p.AssetId)); } var predicateSwap = PredicateBuilder.Create(d => d.ValueDate == req.ValueDate); if (req.ShowException) { predicateSwap = predicateSwap.And(p => !p.IsSkipEod); } List dataList = (from a in DbContext.trade.Where(predicate) join b in DbContext.eod_swap.Where(predicateSwap) on a.id equals b.SwapTradeId select new HengTaiCompareData { id = a.id, ValueDate = req.ValueDate, TradeNumber = a.TradeNumber, AssetId = a.AssetId, StartDate = a.StartDate, TradeStatus = a.TradeStatus, TradeDate = a.TradeDate, EndDate = a.ExerciseDate, StructType = a.TradeType, QuoteCurrency = a.QuoteCurrency, ClientName = a.ClientName, TraderName = a.TraderName, SwapType = a.StructureType, StockEqvNotional = b.NotionalValue, StockEqvNotionalV2 = b.IsSkipEod ? b.NotionalValue : null, Pv = b.IsSkipEod ? b.HTPostionValue : b.PostionValue, PvV2 = b.IsSkipEod ? b.HTPostionValue : null, VTradingFee=b.VTradingFee, AssetName = a.AssetBookName, CheckResult = b.IsSkipEod }).OrderByDescending(p=>p.id).ToList(); var predicate2 = PredicateBuilder.Create(x => x.NPV_DATE.Equals(req.ValueDate.ToString("yyyy-MM-dd"))); if (!string.IsNullOrEmpty(req.TradeNumber)) { predicate2 = predicate2.And(x => x.EXT_NO.Contains(req.TradeNumber)); } var tradeNumberQuery = from a in DbContext.trade.AsNoTracking() select a.TradeNumber; predicate2 = predicate2.And(p => !tradeNumberQuery.Contains(p.EXT_NO)); var list2 = (from a in DbContext.reg_valuation_end_of_day.Where(predicate2) select new OnlyHengTaiDataDto { id = a.id, ValueDate = req.ValueDate, StockEqvNotionalV2 = a.ORDCOUNT, PvV2 = a.NPV, TradeNumber = a.EXT_NO, EndDateStr = a.SETDATE_TERMINATE, StartDateStr = a.START_DATE }).OrderByDescending(p => p.id).ToList(); var tplFilePath = OtcAppContext.MapPath("/App_Docs"); var sourceFileName = Path.Combine(tplFilePath, "导出模板", "与衡泰对账导出模板.xlsx"); var modelDict = new Dictionary(); var model = new { list = dataList }; var modelDict2 = new Dictionary(); var model2 = new { list = list2 }; modelDict.Add("本系统中的合约", model); modelDict.Add("仅衡泰中有的合约", model2); ExcelPackage.LicenseContext = LicenseContext.NonCommercial; return new ExcelTemplateGenerator().SetTemplateFile(sourceFileName).SetTemplateData(modelDict).Output(); } /// /// 获取清算时间 /// /// /// public LiquidationTimeDto GetLiquidationTime(QueryNeedCompareDataRequest req) { var res = new LiquidationTimeDto(); res.SystemLiquidationTime = "未清算"; res.HengTaiLiquidationTime = "未同步"; var model = DbContext.eodStatus.Where(p=>p.ValueDate==req.ValueDate).AsNoTracking().OrderByDescending(p => p.OptDate).FirstOrDefault(); if(model!=null&&model.OptDate!=null) { res.SystemLiquidationTime = model.OptDate.Value.ToString("yyyy-MM-dd HH:mm:ss"); } var model2 = DbContext.reg_valuation_end_of_day.Where(p => p.NPV_DATE.Equals(req.ValueDate.ToString("yyyy-MM-dd"))).OrderByDescending(p => p.create_time).FirstOrDefault(); if (model2 != null) { res.HengTaiLiquidationTime = model2.create_time.ToString("yyyy-MM-dd HH:mm:ss"); } return res; } /// /// 校验日期区间是否有获取衡泰估值 /// /// /// /// public string CheckHTDataByDate(DateTime startDate,DateTime endDate) { var regList = DbContext.reg_valuation_end_of_day.FromSqlRaw($"select * from reg_valuation_end_of_day where NPV_DATE>='{startDate.ToString("yyyy-MM-dd")}' and NPV_DATE<='{endDate.ToString("yyyy-MM-dd")}'").ToList(); var allDays = (endDate - startDate).Days; if (regList.Count==0) { return $"{startDate.ToString("yyyy-MM-dd")}未获取衡泰估值"; } for (int i=0;i< allDays;i++) { var valueDate = valuedateBLL.GetNonHoliday(startDate.AddDays(i)); if (!regList.Any(x=>x.NPV_DATE.Equals(valueDate.ToString("yyyy-MM-dd")))) { return $"{valueDate.ToString("yyyy-MM-dd")}未获取衡泰估值"; } } return ""; } public string GetHTLastDate() { var regValue= DbContext.reg_valuation_end_of_day.OrderByDescending(o=>o.NPV_DATE).FirstOrDefault(); return regValue == null ? "未获取衡泰估值" : regValue.NPV_DATE; } } }