// 2018-11-07 追加: // NancyAbsProxyService::GetBasicAnalyticsData 中使用的是GET方式请求 // 参数类型为DataSet时,序列化后会出现参数过程,请求Nancy失败的情况 // 所以更新 GetBasicAnalyticsData 使用POST方式请求 public static BasicAnalyticsData Nancy_GetBasicAnalyticsData(string path, string dsPath, DataSet ds) { RestRequest request = new RestRequest(Method.POST); request.Resource = "AbsManagement/GetBasicAnalyticsData"; var variables = JsonConvert.SerializeObject(ds); request.AddParameter("variables", variables); request.AddParameter("path", path); request.AddParameter("dsPath", dsPath); var rt = m_nancy.Execute(request); BasicAnalyticsData obj = null; try { obj = JsonConvert.DeserializeObject <BasicAnalyticsData>(rt.ContentJson); } catch (Exception e) { throw new ApplicationException("读取Cashflow失败:" + Environment.NewLine + rt.ContentJson); } return(obj); }
public void GenerateNextDataset(int projectId) { CommUtils.Assert(m_isInitialized, "AssetModifier hasn't been initialized!"); var project = m_dbAdapter.Project.GetProjectById(projectId); var datasetFolder = m_dbAdapter.Dataset.GetDatasetFolder(project, m_asOfDay); CommUtils.Assert(Directory.Exists(datasetFolder), "Load dataset [" + project.ProjectGuid + "][" + m_asOfDay + "] failed!"); if (!m_nextAsOfDay.HasValue) { return; } //Create folder for next dataset if not exists. var nextDatasetFolder = m_dbAdapter.Dataset.GetDatasetFolder(project, m_nextAsOfDay.Value); if (!Directory.Exists(nextDatasetFolder)) { try { Directory.CreateDirectory(nextDatasetFolder); } catch (Exception e) { throw new ApplicationException("Create dataset [" + project.ProjectGuid + "][" + m_asOfDay + "] folder failed! Exception: " + e.Message); } } //Copy and modify collertal.csv var collateralPath = Path.Combine(datasetFolder, "collateral.csv"); var nextCollateralPath = Path.Combine(nextDatasetFolder, "collateral.csv"); FileUtils.Copy(collateralPath, nextCollateralPath); var amortizationPath = Path.Combine(datasetFolder, "AmortizationSchedule.csv"); var nextAmortizationPath = Path.Combine(nextDatasetFolder, "AmortizationSchedule.csv"); FileUtils.Copy(amortizationPath, nextAmortizationPath, false); var promisedCashflowPath = Path.Combine(datasetFolder, "PromisedCashflow.csv"); var nextPromisedCashflowPath = Path.Combine(nextDatasetFolder, "PromisedCashflow.csv"); FileUtils.Copy(promisedCashflowPath, nextPromisedCashflowPath, false); var reinvestmentPath = Path.Combine(datasetFolder, "Reinvestment.csv"); var nextReinvestmentPath = Path.Combine(nextDatasetFolder, "Reinvestment.csv"); FileUtils.Copy(reinvestmentPath, nextReinvestmentPath, false); var currentCombileVaiablesPath = Path.Combine(datasetFolder, "CombinedVariables.csv"); var nextCombileVaiablesPath = Path.Combine(nextDatasetFolder, "CombinedVariables.csv"); FileUtils.Copy(currentCombileVaiablesPath, nextCombileVaiablesPath, false); var currentVariablesPath = Path.Combine(datasetFolder, "CurrentVariables.csv"); var nextCurrentVariablesPath = Path.Combine(nextDatasetFolder, "CurrentVariables.csv"); FileUtils.Copy(currentVariablesPath, nextCurrentVariablesPath, false); var futureVariablesPath = Path.Combine(datasetFolder, "FutureVariables.csv"); var nextFutureVariablesPath = Path.Combine(nextDatasetFolder, "FutureVariables.csv"); FileUtils.Copy(futureVariablesPath, nextFutureVariablesPath, false); var pastVariablesPath = Path.Combine(datasetFolder, "PastVariables.csv"); var nextPastVariablesPath = Path.Combine(nextDatasetFolder, "PastVariables.csv"); FileUtils.Copy(pastVariablesPath, nextPastVariablesPath, false); BasicAnalyticsData basicAnalyticsData = NancyUtils.GetBasicAnalyticsData(projectId, null, m_asOfDay); //AssetId, 剩余本金 var dictPrincipalBalance = new Dictionary <int, double>(); foreach (var assetCashFlow in basicAnalyticsData.BasicAssetCashflow.BasicAssetCashflowItems) { if (assetCashFlow.PaymentDate == m_paymentDay) { dictPrincipalBalance[assetCashFlow.AssetId] = assetCashFlow.Performing; } } var collateralCsv = new CollateralCsv(); collateralCsv.Load(nextCollateralPath); foreach (var record in collateralCsv) { var assetId = record.AssetId; //更新封包日日期 collateralCsv.UpdateCellValue(assetId, "AsOfDate", m_nextAsOfDay.Value.ToString("MM/dd/yyyy")); //更新剩余本金 collateralCsv.UpdateCellValue(assetId, "PrincipalBalance", dictPrincipalBalance.ContainsKey(assetId) ? dictPrincipalBalance[assetId].ToString() : "0"); if (collateralCsv.ContainsColumn("AccrueFromAsOfDate")) { collateralCsv.UpdateCellValue(assetId, "AccrueFromAsOfDate", "FALSE"); } } collateralCsv.Save(nextCollateralPath); ProcessVaiables(m_dbAdapter.Dataset.GetYmlFolder(project), basicAnalyticsData); if (m_previousPaymentDay != m_paymentDay && File.Exists(nextPromisedCashflowPath)) { var p = new PromisedCashflowCsv(nextPromisedCashflowPath); p.Load(); p.Records = p.Records.Where(o => o.PaymentDate > m_previousPaymentDay).ToList(); p.Save(); } }
private void ProcessVaiables(string projectFolder, BasicAnalyticsData basicAnalyticsData) { double sumPrincipal = basicAnalyticsData.BasicAssetCashflow.BasicAssetCashflowItems .Where(x => x.PaymentDate == m_paymentDay).Sum(x => x.Principal); double sumInterest = basicAnalyticsData.BasicAssetCashflow.BasicAssetCashflowItems .Where(x => x.PaymentDate == m_paymentDay).Sum(x => x.Interest); NancyBasicCashflowItem basicCashflowItem = basicAnalyticsData.BasicCashflow.BasicCashflowItems.Where(x => x.PaymentDate == m_previousPaymentDay).Single(); VariablesHelper helper = new VariablesHelper(Path.Combine(projectFolder, m_nextAsOfDay.Value.ToString("yyyyMMdd"))); helper.Load(); helper.TranferToAsofdate(m_nextAsOfDay.Value); helper.Save(Path.Combine(projectFolder, m_nextAsOfDay.Value.ToString("yyyyMMdd"))); //{ // var nextCurrentVariablesPath = Path.Combine(nextDatasetFolder, "CurrentVariables.csv"); // var nextFutureVariablesPath = Path.Combine(nextDatasetFolder, "FutureVariables.csv"); // var nextPastVariablesPath = Path.Combine(nextDatasetFolder, "PastVariables.csv"); // currentVariablesCsv = new VariablesCsv(); // currentVariablesCsv.Load(nextCurrentVariablesPath); // //current variables中的 日期指的是前一个偿付日 // currentVariablesCsv.UpdateColumnDate(m_previousPaymentDay, m_paymentDay); // futureVariablesCsv = new VariablesCsv(); // futureVariablesCsv.Load(nextFutureVariablesPath); // if (m_paymentDay != m_previousPaymentDay) // { // futureVariablesCsv.RemoveColumn(m_previousPaymentDay); // } // //在PastVariables.csv中填入 支付日 // var pastVariablesCsv = new VariablesCsv(); // pastVariablesCsv.Load(nextPastVariablesPath); // m_dealSchedule.PaymentDates.Where(x => x < m_paymentDay).ToList().ForEach(x => // { // if (!pastVariablesCsv.DateColumns.Contains(x)) // { // pastVariablesCsv.DateColumns.Add(x); // } // }); // pastVariablesCsv.Save(nextPastVariablesPath); //} //资产覆盖现金流的情况下,资产端的本金和利息一般是0 //这时如果将 Collateral.InterestCollection 和 Collateral.PrincipalCollection 填 0,会导致证券端偿付金额为 0,不填即可 if (MathUtils.MoneyNE(sumInterest, 0) && MathUtils.MoneyNE(sumPrincipal, 0)) { helper.UpdateVariableValue("Collateral.InterestCollection", m_asOfDay, sumInterest.ToString()); helper.UpdateVariableValue("Collateral.PrincipalCollection", m_asOfDay, sumPrincipal.ToString()); } string reserveAmount = ""; //第一期生成第二期数据时,由于CurrentVariables.csv中支付日是第一个支付日 //Reserve账户会重新计算,所以不需要在ReserveAmount中填值 if (m_paymentDay != m_dealSchedule.PaymentDates.First()) { reserveAmount = basicCashflowItem.ReserveAmountEndBalance.ToString(); } helper.UpdateVariableValue("ReserveAmount", m_asOfDay, reserveAmount); //第一期要特殊处理(生成第N期PaymentDate模型时,填写参数的ColumnName从第N-1期开始) if (m_paymentDay != m_previousPaymentDay) { foreach (var note in basicCashflowItem.Notes) { var principal = (note.BeginningPrincipalOutstanding - note.PrincipalReceived).ToString(); helper.UpdateVariableValue(note.NoteName, m_paymentDay, principal); } } helper.Save(Path.Combine(projectFolder, m_nextAsOfDay.Value.ToString("yyyyMMdd"))); }