public static ABSDealResult GetNancyDealResult(ABSDeal absDeal, NancyStaticAnalysisResult nancyResult) { var result = new ABSDealResult(); result.OriginAcf = nancyResult.AssetCashflowDt; result.OriginCf = nancyResult.CashflowDt; result.Acf = result.OriginAcf.Copy(); result.Cf = result.OriginCf.Copy(); result.AcfResult = new AcfResult(result.OriginAcf, absDeal.Assets); RunSpecialRules(result.Cf, absDeal.Info.IsCsdcDeal); SplitCategoryByNote(result.Cf); result.Cf = CleanAndTranslateCashflowTable(result.Cf); result.Acf = CleanAndTranslateAssetCashflowTable(result.Acf); AddAssetIdToRepeatedCNName(result.Acf, absDeal); var dictDates = GetDeterminationDatesByPaymentDates(absDeal); ConvertAcfColumnDateName(result.Acf, dictDates); return(result); }
public MemoryStream GetAssetCashflowFile(Project project, DateTime paymentDay) { var projectLogicModel = new ProjectLogicModel(m_userName, project); var datasetSchedule = projectLogicModel.DealSchedule.GetByPaymentDay(paymentDay); CommUtils.AssertNotNull(datasetSchedule.Dataset.Instance, "第{0}期模型未生成", Toolkit.DateToString(datasetSchedule.PaymentDate)); paymentDay = datasetSchedule.PaymentDate; var dealModel = datasetSchedule.Dataset.DealModel; var absDeal = new ABSDeal(dealModel.YmlFolder, dealModel.DsFolder); var acfResult = absDeal.Result.AcfResult; acfResult.MergeOsa(dealModel.OverrideSingleAsset); acfResult.ReCalcSum(); var dt = acfResult.ExtractAssetCashflowDataTable(absDeal, paymentDay); var temproaryFolder = CommUtils.CreateTemporaryFolder(m_userName); var filePath = Path.Combine(temproaryFolder, "AssetCashflowTable.csv"); ExcelUtils.WriteCsv(dt, filePath); var buffer = File.ReadAllBytes(filePath); CommUtils.DeleteFolderAync(temproaryFolder); return(new MemoryStream(buffer)); }
public object GetAssetCashflowTable(AssetCashflowStatisticInfo viewModel, Project project, DateTime paymentDate) { var acfTable = new DataTable(); var dictionaryDates = new Dictionary <DateTime, DateTime>(); try { var projectLogicModel = new ProjectLogicModel(m_userName, project); var datasetSchedule = projectLogicModel.DealSchedule.GetByPaymentDay(paymentDate); CommUtils.AssertNotNull(datasetSchedule.Dataset.Instance, "第{0}期模型未生成", Toolkit.DateToString(datasetSchedule.PaymentDate)); paymentDate = datasetSchedule.PaymentDate; var dealModel = datasetSchedule.Dataset.DealModel; var absDeal = new ABSDeal(dealModel.YmlFolder, dealModel.DsFolder); var acfResult = absDeal.Result.AcfResult; acfResult.MergeOsa(dealModel.OverrideSingleAsset); acfResult.ReCalcSum(); return(acfResult.ExtractAssetCashflowTable(absDeal, paymentDate)); } catch (ApplicationException ae) { var errorResult = new { isError = true, errorMessage = ae.Message }; return(errorResult); } }
private static NancyStaticAnalysisResult GetNancyStaticAnalysisResult(ABSDeal absDeal) { //TODO: 不同参数的设置 var result = m_nancy.RunStaticResultByPath( absDeal.Setting.Cdr.ToString(), absDeal.Setting.Cpr.ToString(), absDeal.Location.YmlFolder, absDeal.Location.DsFolder); return(result); }
public override object GetEntity() { var taskPeriod = m_dbAdapter.TaskPeriod.GetByShortCode(Task.ShortCode); var paymentDate = Task.EndTime.Value; if (taskPeriod != null) { paymentDate = taskPeriod.PaymentDate; } var projectLogicModel = new ProjectLogicModel(m_userName, Task.ProjectId); var datasetSchedule = projectLogicModel.DealSchedule.GetByPaymentDay(paymentDate); var dealModel = datasetSchedule.Dataset.DealModel; paymentDate = datasetSchedule.PaymentDate; var absDeal = new ABSDeal(dealModel.YmlFolder, dealModel.DsFolder); var acfResult = absDeal.Result.AcfResult; acfResult.MergeOsa(dealModel.OverrideSingleAsset); acfResult.ReCalcSum(); var acfDataset = acfResult.Dataset.FirstOrDefault(x => x.PaymentDay == paymentDate); double totalReceived = 0; if (acfDataset != null) { totalReceived = acfDataset.Sum.Principal + acfDataset.Sum.Interest; } var taskExInfo = RecyclingPaymentDate.FromJson(Task.TaskExtension.TaskExtensionInfo); var entity = new RecyclingPaymentDateViewModel(); entity.ConfirmedAccountBalance = taskExInfo.ConfirmedAccountBalance; var compareSign = CommUtils.ParseEnum <SignComparisonModes>(taskExInfo.CompareSign); var acountType = CommUtils.ParseEnum <EAccountType>(taskExInfo.AccountType); var bankAccounts = m_dbAdapter.BankAccount.GetAccounts(Task.ProjectId, true); var accountBalance = bankAccounts.Where(x => x.AccountType == acountType) .Where(x => x.CurrentBalance != null).Sum(x => x.CurrentBalance.EndBalance); entity.CurrentAccountName = taskExInfo.AccountType; entity.CompareSign = taskExInfo.CompareSign; entity.CurrentAccountBalance = accountBalance; entity.PaymentMoney = (decimal)totalReceived; entity.CompareResult = CompareAccount((double)accountBalance, totalReceived, compareSign, acountType); entity.PaymentDay = Toolkit.DateToString(paymentDate); return(entity); }
public static NancyDealInfo GetNancyDealData(ABSDeal absDeal) { using (StreamReader sr = new StreamReader(absDeal.Location.Yml)) { var dateFromYml = NancyUtils.ReadYmlExInfo(sr); var info = NancyUtils.GetNancyDealDataByFile(sr.BaseStream); info.UseCustomCashflow = dateFromYml.Item2; return(new NancyDealInfo { Info = info, FirstCollectionPeriodStartDate = dateFromYml.Item1, UseCustomCashflow = dateFromYml.Item2, }); } }
private object GetAssetCashflowTableDetail(string projectGuid, DateTime paymentDate) { var dictDeterminationDates = new Dictionary <DateTime, DateTime>(); var allAssetDetail = new NancyBasicAssetCashflow(); var projectLogicModel = Platform.GetProject(projectGuid); ABSDeal absDeal = null; try { var datasetSchedule = projectLogicModel.DealSchedule.GetByPaymentDay(paymentDate); paymentDate = datasetSchedule.PaymentDate; CommUtils.AssertNotNull(datasetSchedule.Dataset.Instance, "第{0}期模型未生成", Toolkit.DateToString(paymentDate)); CommUtils.Assert(datasetSchedule.Dataset.HasDealModel, "找不到第{0}期模型", Toolkit.DateToString(paymentDate)); absDeal = new ABSDeal(datasetSchedule.Dataset.DealModel); dictDeterminationDates = ABSDealUtils.GetDeterminationDatesByPaymentDates(absDeal); //获取当期所有的资产明细 var asOfDate = datasetSchedule.Dataset.Instance.AsOfDate; allAssetDetail = NancyUtils.GetUnaggregateAssetCashflowByPath(projectLogicModel.Instance.ProjectId, asOfDate); } catch (ApplicationException ae) { var errorResult = new { isError = true, errorMessage = ae.Message, stackTrace = ae.StackTrace, }; return(errorResult); } var dictAllAssetDetail = allAssetDetail.BasicAssetCashflowItems.ToList().GroupBy(x => x.AssetId).ToDictionary(x => x.Key, y => y.ToList()); var dataSetResult = new Dictionary <int, List <AssetCashflowData> >(); var dictRowSpan = new Dictionary <int, List <int> >(); var osaDict = new Dictionary <DateTime, OverrideSingleAssetLogicModel>(); var osaPrincipalRecords = m_dbAdapter.OverrideSingleAssetPrincipal.GetByProject(projectLogicModel.Instance.ProjectId); var osaPrincipalBalanceRecords = m_dbAdapter.OverrideSingleAssetPrincipalBalance.GetByProject(projectLogicModel.Instance.ProjectId); var osaInterestRecords = m_dbAdapter.OverrideSingleAssetInterest.GetByProject(projectLogicModel.Instance.ProjectId); //获取每笔资产的明细 dictAllAssetDetail.Keys.ToList().ForEach(x => { var currAssetDetailList = dictAllAssetDetail[x]; dictRowSpan[x] = new List <int>(); var dictCurrAssetList = new Dictionary <DateTime, List <NancyBasicAssetCashflowItem> >(); var data = new List <AssetCashflowData>(); var prevDateTime = DateTime.Parse("1753-01-02"); foreach (var currPaymentDate in dictDeterminationDates.Keys) { var currCompareTime = dictDeterminationDates[currPaymentDate]; dictCurrAssetList[currCompareTime] = currAssetDetailList.Where(item => prevDateTime < item.PaymentDate && item.PaymentDate <= currCompareTime).ToList(); var currAssetList = dictCurrAssetList[currCompareTime]; var assetId = x; OverrideSingleAssetLogicModel osa = null; if (osaDict.ContainsKey(currPaymentDate)) { osa = osaDict[currPaymentDate]; } else { osa = new OverrideSingleAssetLogicModel(projectLogicModel, currPaymentDate, osaPrincipalRecords, osaInterestRecords, osaPrincipalBalanceRecords); osaDict[currPaymentDate] = osa; } var hasOsa = osa.HasOverrideRecords(assetId); if (currAssetList.Count > 0) { dictRowSpan[x].Add(hasOsa ? 1 : (currAssetList.Count + 1)); var rowName = Toolkit.DateToString(currCompareTime); for (int i = 0; i < currAssetList.Count; i++) { var ditail = currAssetList[i]; var currACFRow = new AssetCashflowData(); currACFRow.RowName = rowName; currACFRow.AddValue("资产回款日", Toolkit.DateToString(ditail.PaymentDate)); currACFRow.AddValue("利息", ditail.Interest.ToString("n2")); currACFRow.AddValue("本金", ditail.Principal.ToString("n2")); currACFRow.AddValue("合计", (ditail.Interest + ditail.Principal).ToString("n2")); currACFRow.AddValue("剩余本金", ditail.Performing.ToString("n2")); currACFRow.AddValue("损失", ditail.Loss.ToString("n2")); currACFRow.AddValue("违约", ditail.Defaulted.ToString("n2")); if (!hasOsa) { data.Add(currACFRow); } } var total = new AssetCashflowData(); total.RowName = rowName; var interest = currAssetList.Sum(value => value.Interest); var principal = currAssetList.Sum(value => value.Principal); var performing = currAssetList.Last().Performing; if (osa.GetInterest(assetId) != null) { interest = osa.GetInterest(assetId).Interest; } if (osa.GetPrincipal(assetId) != null) { principal = osa.GetPrincipal(assetId).Principal; } if (osa.GetPrincipalBalance(assetId) != null) { performing = osa.GetPrincipalBalance(assetId).PrincipalBalance; } total.AddValue("资产回款日", "总计"); total.AddValue("利息", interest.ToString("n2")); total.AddValue("本金", principal.ToString("n2")); total.AddValue("合计", (interest + principal).ToString("n2")); total.AddValue("剩余本金", performing.ToString("n2")); total.AddValue("损失", currAssetList.Sum(value => value.Loss).ToString("n2")); total.AddValue("违约", currAssetList.Sum(value => value.Defaulted).ToString("n2")); data.Add(total); } prevDateTime = currCompareTime; } dataSetResult[x] = (data); }); //获取所有的资产的中文名 var dictAssetIdCNName = absDeal.Assets.GetAssetIdNameMap(); var detailTableHeader = new List <string>() { "归集日", "资产回款日", "利息", "本金", "合计", "剩余本金", "损失", "违约" }; return(new { tableHeader = detailTableHeader, assetIdCNName = dictAllAssetDetail.Keys.ToList().ConvertAll(x => new { tableKey = x, tableValues = dictAssetIdCNName[x] }), dataSets = dataSetResult.Keys.ToList().ConvertAll(x => new { tableKey = x, tableValues = dataSetResult[x], rowSpanList = dictRowSpan[x] }), isError = false }); }
public object GetCurrPeriodAssetCashflowTable(string projectGuid, DateTime paymentDate) { try { var projectLogicModel = Platform.GetProject(projectGuid); var datasetSchedule = projectLogicModel.DealSchedule.GetByPaymentDay(paymentDate); CommUtils.AssertNotNull(datasetSchedule.Dataset.Instance, "第{0}期模型未生成", Toolkit.DateToString(datasetSchedule.PaymentDate)); paymentDate = datasetSchedule.PaymentDate; var osa = datasetSchedule.Dataset.DealModel.OverrideSingleAsset; var dealModel = datasetSchedule.Dataset.DealModel; var absDeal = new ABSDeal(dealModel.YmlFolder, dealModel.DsFolder); //获取预测的资产池当期本金与利息 var oldCurrPeriodAcfDataset = absDeal.Result.AcfResult.Dataset.Single(x => x.PaymentDay == paymentDate); var predictInterePrincipal = new CurrPerdictPrincipalInterest(); predictInterePrincipal.CurrPerdictInterest = double.Parse(oldCurrPeriodAcfDataset.Sum.Interest.ToString("n2")); predictInterePrincipal.CurrPerdictPrincipal = double.Parse(oldCurrPeriodAcfDataset.Sum.Principal.ToString("n2")); //获取覆盖资产池的本金、利息 var assetCashflowVariable = m_dbAdapter.AssetCashflowVariable.GetByProjectIdPaymentDay(projectLogicModel.Instance.ProjectId, paymentDate); var assetIdNameMap = absDeal.Assets.GetAssetIdNameMap(); var osaResults = absDeal.Result.AcfResult.MergeOsa(datasetSchedule.Dataset.DealModel.OverrideSingleAsset); var currPeriodDataTable = absDeal.Result.AcfResult.ExtractCurrPeriodAssetSummaryTable(paymentDate); var currPeriodAcfDataset = absDeal.Result.AcfResult.Dataset.Single(x => x.PaymentDay == paymentDate); //获取当前表格的本金、利息 var currInterePrincipal = new CurrPerdictPrincipalInterest(); currInterePrincipal.CurrPerdictInterest = double.Parse(currPeriodAcfDataset.Sum.Interest.ToString("n2")); currInterePrincipal.CurrPerdictPrincipal = double.Parse(currPeriodAcfDataset.Sum.Principal.ToString("n2")); List <int> PrevOsaList = new List <int>(); if (datasetSchedule.Previous != null) { if (datasetSchedule.Previous.Dataset.HasDealModel) { var prevOsa = datasetSchedule.Previous.Dataset.DealModel.OverrideSingleAsset; datasetSchedule.Dataset.Assets.ForEach(x => { if (prevOsa.GetPrincipal(x.AssetId) != null || prevOsa.GetPrincipalBalance(x.AssetId) != null || prevOsa.GetInterest(x.AssetId) != null) { PrevOsaList.Add(x.AssetId); } }); } } var columnNames = new List <string>() { "资产", "利息", "本金", "剩余本金", "损失", "违约", "合计", "费用" }; var result = new { paymentDate = Toolkit.DateToString(paymentDate), currPeriodTableHeader = columnNames, isError = false, handsonData = currPeriodDataTable.ToHandson(), overrideSingleAssetData = osaResults, overrideSingleAssetDataLast = PrevOsaList, assetIdNameMap = assetIdNameMap.Keys.ToList() .Select(x => new { assetId = x, assetName = assetIdNameMap[x] }), userCustomCashflow = absDeal.Info.UseCustomCashflow, predictInterePrincipal = predictInterePrincipal, currInterePrincipal = currInterePrincipal, assetCashflowVariable = assetCashflowVariable == null ? null : new { interest = double.Parse(assetCashflowVariable.InterestCollection.ToString("n2")), principal = double.Parse(assetCashflowVariable.PricipalCollection.ToString("n2")), enableOverride = assetCashflowVariable.EnableOverride }, }; return(result); } catch (ApplicationException ae) { var errorResult = new { isError = true, errorMessage = ae.Message }; return(errorResult); } }
public static DealSchedule GetNancyDealSchedule(ABSDeal absDeal) { return(m_nancy.GetDealSchedule(absDeal.Location.Yml, absDeal.Location.DsFolder)); }
public static void UpdateDatasetByPredictModel(ProjectLogicModel project) { var dbAdapter = new DBAdapter(); var dealSchedule = project.DealSchedule.Instanse; var errorMsg = "Error occurred in UpdateDatasetByPredictModel"; CommUtils.Assert(dealSchedule.DeterminationDates != null && dealSchedule.DeterminationDates.Length > 0, errorMsg); CommUtils.Assert(dealSchedule.PaymentDates != null && dealSchedule.PaymentDates.Length > 0, errorMsg); CommUtils.Assert(dealSchedule.DeterminationDates.Length == dealSchedule.PaymentDates.Length, errorMsg); var asOfDateEndList = dealSchedule.DeterminationDates.ToList(); var asOfDateBeginList = asOfDateEndList.Select(x => x).ToList(); asOfDateBeginList.RemoveAt(asOfDateBeginList.Count - 1); asOfDateBeginList.Insert(0, dealSchedule.FirstCollectionPeriodStartDate); var newAsOfDateList = project.EnablePredictMode ? asOfDateBeginList : asOfDateEndList; var oldAsOfDateList = project.EnablePredictMode ? asOfDateEndList : asOfDateBeginList; var paymentDateList = dealSchedule.PaymentDates.ToList(); var durationPeriods = new List <DatasetScheduleLogicModel>(); if (project.EnablePredictMode) { //切换到预测模式 //使用过去一期的模型collateral里asset的PrincipalBalance覆盖掉未来一期的值 //从过去到未来遍历 durationPeriods.AddRange(project.DealSchedule.DurationPeriods); } else { //切换到当期模式: //使用未来一期的模型collateral里asset的PrincipalBalance覆盖掉过去一期的值 //从未来到过去遍历 durationPeriods.AddRange(project.DealSchedule.DurationPeriods); durationPeriods.Reverse(); } //Fields: asOfDate, assetId, principalBalance foreach (var period in durationPeriods) { var dataset = period.Dataset.Instance; if (dataset == null) { continue; } var idx = paymentDateList.IndexOf(period.PaymentDate); if (idx < 0 || idx >= newAsOfDateList.Count) { continue; } var ymlFolder = dbAdapter.Dataset.GetYmlFolder(project.Instance); var newAsOfDate = newAsOfDateList[idx]; var newDatasetFolder = dbAdapter.Dataset.GetDatasetFolder(project.Instance, newAsOfDate); var newCollateralCsvPath = Path.Combine(newDatasetFolder, "collateral.csv"); var oldAsOfDate = oldAsOfDateList[idx]; var oldDatasetFolder = dbAdapter.Dataset.GetDatasetFolder(project.Instance, oldAsOfDate); var oldCollateralCsvPath = Path.Combine(oldDatasetFolder, "collateral.csv"); dataset.AsOfDate = DateUtils.DateToDigitString(newAsOfDate); dbAdapter.Dataset.Update(dataset); if (File.Exists(newCollateralCsvPath)) { var assetPrincipalBalance = new Dictionary <int, string>(); if (File.Exists(oldCollateralCsvPath)) { var oldCollateralCsv = new CollateralCsv(); oldCollateralCsv.Load(oldCollateralCsvPath); foreach (var record in oldCollateralCsv) { //保存当次遍历Asset的期初本金 assetPrincipalBalance[record.AssetId] = record.Items["PrincipalBalance"]; } } else { if (oldAsOfDate > newAsOfDate && period.Next != null) { var deal = new ABSDeal(ymlFolder, newDatasetFolder); var acfDataset = deal.Result.AcfResult.Dataset.FirstOrDefault(x => x.PaymentDay == period.Previous.PaymentDate); if (acfDataset != null) { assetPrincipalBalance = acfDataset.ToDictionary(x => x.Asset.Id, x => x.Performing.ToString("n2")); } } } var collateralAsOfDate = asOfDateBeginList[idx]; var newCollateralCsv = new CollateralCsv(); newCollateralCsv.Load(newCollateralCsvPath); foreach (var record in newCollateralCsv) { var assetId = record.AssetId; //更新封包日日期 newCollateralCsv.UpdateCellValue(assetId, "AsOfDate", collateralAsOfDate.ToString("MM/dd/yyyy")); //更新Asset的期初本金 if (assetPrincipalBalance.ContainsKey(assetId)) { newCollateralCsv.UpdateCellValue(assetId, "PrincipalBalance", assetPrincipalBalance[assetId]); } } newCollateralCsv.Save(newCollateralCsvPath); } } }
/// <summary> /// 根据当期PaymentDate获取PaymentDates对应的DeterminationDates /// </summary> public static Dictionary <DateTime, DateTime> GetDeterminationDatesByPaymentDates(ABSDeal absDeal) { var dealSchedule = absDeal.Schedule; var paymentDates = dealSchedule.PaymentDates; var determinationDates = dealSchedule.DeterminationDates; var paymentDateStrList = paymentDates.ToList().ConvertAll(x => x.ToString()); var dictionaryDates = new Dictionary <DateTime, DateTime>(); for (int i = 0; i < paymentDates.Length; i++) { dictionaryDates[paymentDates[i]] = determinationDates[i]; } return(dictionaryDates); }
public static DataTable GetCashflowDt(DatasetScheduleLogicModel datasetSchedule, AssetCashflowVariable assetCashflowVariable, double sysPredictInterest, double sysPredictPrincipal, out double currInterestCollection, out double currPrincipalCollection) { currInterestCollection = sysPredictInterest; currPrincipalCollection = sysPredictPrincipal; var assetOverrideSetting = new AssetOverrideSetting(assetCashflowVariable); DataTable cashflowDt = new DataTable(); var project = datasetSchedule.ProjectLogicModel.Instance; var dataset = datasetSchedule.Dataset.Instance; var paymentDate = datasetSchedule.PaymentDate; var hasOsa = false; var osa = datasetSchedule.Dataset.DealModel.OverrideSingleAsset; foreach (var asset in datasetSchedule.Dataset.Assets) { var overridePrincipal = osa.GetPrincipal(asset.AssetId); var overrideInterest = osa.GetInterest(asset.AssetId); if (overridePrincipal != null || overrideInterest != null) { hasOsa = true; break; } } //测算优先级: //1、覆盖现金流测算 //2、单笔资产覆盖的方式测算 //3、系统测算 //未填写覆盖现金流值,或填写值和系统测算值一致,认为是不使用本息覆盖现金流测算 var hasOverrideCashflow = assetCashflowVariable != null && assetCashflowVariable.EnableOverride; if (hasOverrideCashflow) { //使用覆盖现金流的方式测算 cashflowDt = NancyUtils.GetStaticAnalyticsResult(project.ProjectId, null, dataset.AsOfDate, assetOverrideSetting).CashflowDt; currInterestCollection = assetOverrideSetting.Interest; currPrincipalCollection = assetOverrideSetting.Principal; } else { if (hasOsa) { //未填写覆盖现金流参数,已填写单笔资产覆盖 //重新计算本息,使用覆盖现金流的方式测算 var dealModel = datasetSchedule.Dataset.DealModel; var absDeal = new ABSDeal(dealModel.YmlFolder, dealModel.DsFolder); var acfResult = absDeal.Result.AcfResult; var acfDataset = acfResult.Dataset.SingleOrDefault(x => x.PaymentDay == paymentDate); acfResult.MergeOsa(osa); acfResult.ReCalcSum(); var sumPrincipal = double.Parse(acfDataset.Sum.Principal.ToString("n2")); var sumInterest = double.Parse(acfDataset.Sum.Interest.ToString("n2")); assetOverrideSetting.IsOverride = true; assetOverrideSetting.Principal = sumPrincipal; assetOverrideSetting.Interest = sumInterest; assetOverrideSetting.PaymentDate = paymentDate; cashflowDt = NancyUtils.GetStaticAnalyticsResult(project.ProjectId, null, dataset.AsOfDate, assetOverrideSetting).CashflowDt; currInterestCollection = assetOverrideSetting.Interest; currPrincipalCollection = assetOverrideSetting.Principal; } else { //未填写覆盖现金流参数,且未填写单笔资产覆盖 //使用非覆盖现金流的方式测算 cashflowDt = NancyUtils.GetStaticAnalyticsResult(project.ProjectId, null, dataset.AsOfDate).CashflowDt; } } return(cashflowDt); }
public static void GenerateNextModel(ABSDeal absDeal) { }
public static ABSDealResult GetNancyDealResult(ABSDeal absDeal) { var nancyResult = GetNancyStaticAnalysisResult(absDeal); return(GetNancyDealResult(absDeal, nancyResult)); }
public DataTable ExtractAssetCashflowDataTable(ABSDeal absDeal, DateTime paymentDay) { var dt = new DataTable(); var determinationDates = ABSDealUtils.GetDeterminationDatesByPaymentDates(absDeal); var colHeader = new List <string> { "资产", "项目" }; colHeader.AddRange(determinationDates.Keys.Select(x => determinationDates[x].ToString("yyyy-MM-dd"))); colHeader.ForEach(x => dt.Columns.Add(x)); var selectName = new List <string> { "利息", "本金", "剩余本金", "损失", "违约", "合计", "费用" }; var selectValue = new List <Func <AcfUnitBase, double> > { x => x.Interest, x => x.Principal, x => x.Performing, x => x.Loss, x => x.Defaulted, x => x.Sum, x => x.Fee, }; var dataResult = new List <List <string> >(); foreach (var acfAsset in Asset) { for (int i = 0; i < selectName.Count; i++) { var row = new List <string>(); row.Add(acfAsset.Asset.DisplayName); row.Add(selectName[i]); foreach (var acfUnit in acfAsset) { var value = selectValue[i](acfUnit); row.Add(value.ToString("n2")); } var dtRow = dt.NewRow(); dtRow.ItemArray = row.ToArray(); dt.Rows.Add(dtRow); } } for (int i = 0; i < selectName.Count; i++) { var row = new List <string>(); row.Add("总计"); row.Add("总" + selectName[i]); foreach (var acfDataset in Dataset) { var value = selectValue[i](acfDataset.Sum); row.Add(value.ToString("n2")); } var dtRow = dt.NewRow(); dtRow.ItemArray = row.ToArray(); dt.Rows.Add(dtRow); } return(dt); }
/// <summary> /// 抽出资产端现金流表 /// </summary> public object ExtractAssetCashflowTable(ABSDeal absDeal, DateTime paymentDay) { var determinationDates = ABSDealUtils.GetDeterminationDatesByPaymentDates(absDeal); var colHeader = new List <string> { "资产", "项目" }; colHeader.AddRange(determinationDates.Keys.Select(x => determinationDates[x].ToString("yyyy-MM-dd"))); var selectName = new List <string> { "利息", "本金", "剩余本金", "损失", "违约", "合计", "费用" }; var selectValue = new List <Func <AcfUnitBase, double> > { x => x.Interest, x => x.Principal, x => x.Performing, x => x.Loss, x => x.Defaulted, x => x.Sum, x => x.Fee, }; var dataResult = new List <List <string> >(); foreach (var acfAsset in Asset) { for (int i = 0; i < selectName.Count; i++) { var row = new List <string>(); row.Add(acfAsset.Asset.DisplayName); row.Add(selectName[i]); foreach (var acfUnit in acfAsset) { var value = selectValue[i](acfUnit); row.Add(value.ToString("n2")); } dataResult.Add(row); } } for (int i = 0; i < selectName.Count; i++) { var row = new List <string>(); row.Add("总计"); row.Add("总" + selectName[i]); foreach (var acfDataset in Dataset) { var value = selectValue[i](acfDataset.Sum); row.Add(value.ToString("n2")); } dataResult.Add(row); } List <object> mergeCellsInfo = new List <object>(); for (int i = 0; i < Asset.Count + 1; i++) { mergeCellsInfo.Add(new { row = i * 7, col = 0, rowspan = 7, colspan = 1, }); } ; var result = new { colHeader = colHeader, paymentDate = paymentDay.ToString("yyyy-MM-dd"), dataResult = dataResult, mergeCellsInfo = mergeCellsInfo, isError = false }; return(result); }
private static void AddAssetIdToRepeatedCNName(DataTable acf, ABSDeal absDeal) { var assets = absDeal.Assets; var rowSpansDic = SetRowSpansDic(acf); List <string> acfTableCNNames = new List <string>(); for (int iRow = 0; iRow < acf.Rows.Count; iRow++) { var row = acf.Rows[iRow]; var cnName = row[0].ToString(); if (rowSpansDic[iRow] != 0 && cnName != string.Empty && cnName != "总计") { acfTableCNNames.Add(cnName); } } var assetsCNNames = assets.Select(x => x.SecurityData.SecurityName).ToList(); var diffAcfTableCNNames = acfTableCNNames.Distinct().ToList(); var diffAssetsCNNames = assetsCNNames.Distinct().ToList(); CommUtils.Assert(diffAcfTableCNNames.Count == diffAssetsCNNames.Count, "资产表格行数与资产数量不相等"); object lastName = string.Empty; int iAssetsRow = 0; for (int iRow = 0; iRow < acf.Rows.Count; iRow++) { var acfTableRow = acf.Rows[iRow]; CommUtils.Assert(acfTableRow.ItemArray.Length > 0, ""); if (acf.Rows[iRow][0].ToString() == string.Empty || acf.Rows[iRow][0].ToString() == "总计") { continue; } if (rowSpansDic[iRow] != 0) { iAssetsRow++; lastName = acfTableRow[0].ToString(); } CommUtils.Assert(iAssetsRow >= 1 && iAssetsRow < assets.Count + 1, "资产assets下标[{0}]越界({1}-{2})", iAssetsRow, 1, assets.Count + 1); var assetId = assets[iAssetsRow - 1].SecurityData.AssetId; var acfTableCNName = acfTableCNNames[iAssetsRow - 1]; var assetsCNName = assetsCNNames[iAssetsRow - 1]; var acfTableCNNameCount = acfTableCNNames.FindAll(x => x == acfTableCNName).ToList().Count(); var assetsCNNameCount = assetsCNNames.FindAll(x => x == assetsCNName).ToList().Count(); CommUtils.Assert(acfTableCNNameCount == assetsCNNameCount, "资产[{0}]数量有误", acfTableCNName); if (acfTableCNNameCount > 1) { if (rowSpansDic[iRow] != 0) { lastName = acfTableCNName + "(" + assetId.ToString() + ")"; assets[iAssetsRow - 1].SecurityData.SecurityName = lastName.ToString(); } acf.Rows[iRow][0] = lastName; acf.Rows[iRow][0] = lastName; } } }