using System.Data; using YLErp.DBModels.Consts; using YLErp.DBModels.Enums; using YLErp.Helpers; using YLErp.Modules.SuperviseReportModule.SAC.Common; using YLErp.Modules.SuperviseReportModule.SAC.Model; using static YLErp.DBModels.Consts.ConsReport; namespace YLErp.Modules.SuperviseReportModule.SAC.Service { class ReportPeriodicReportISDAService : ReportBaseService { public ReportPeriodicReportISDAService(OptUserInfo optUser) : base(optUser) { } protected override string _excelDataSourcePath => "定期报告\\"; protected override string _excelDataSourceFileName => "import_ISDA_template.xlsx"; protected override DataFlagsEnum BusiDataType => DataFlagsEnum.A1013; private List? _validOperationType = null; public override List ValidOperationType { get { _validOperationType ??= new List() { OptFlagsEnum.A, OptFlagsEnum.U, OptFlagsEnum.D, }; return _validOperationType; } } DateTime minDate = DateTime.MinValue; DateTime maxDate = DateTime.MinValue; protected override SuperviseReportTypeEnum ReportType => SuperviseReportTypeEnum.SAC_PeriodicReportISDA; readonly List noteList = new(); public override bool CheckRequestParamer(ReportInfo req, out string errMsg) { if (!base.CheckRequestParamer(req, out errMsg)) { return false; } if (req.ISDAReportDate == null) { errMsg = "ISDA定期报告对应的报告月份不应为空"; return false; } switch (req.ISDAReportStatus) { case OptFlagsEnum.U: case OptFlagsEnum.D: minDate = req.ISDAReportDate.Value.Date.AddDays(-req.ISDAReportDate.Value.Day).AddDays(1); maxDate = req.ISDAReportDate.Value.Date.AddMonths(1).AddDays(-req.ISDAReportDate.Value.Day); var note = base.GetReportNotes(ReportType, formatInfoTag(req.ISDAReportDate.Value.ToString("yyyy-MM"))).FirstOrDefault(); if (note == null) { errMsg = $"{minDate.ToString("yyyy-MM-dd")}~{maxDate.ToString("yyyy-MM-dd")}不存在报送成功的ISDA定期报告记录,请重新选择"; return false; } break; case OptFlagsEnum.A: if (base.GetReportNotes(ReportType, formatInfoTag(req.ISDAReportDate.Value.ToString("yyyy-MM"))).Any()) { minDate = req.ISDAReportDate.Value.Date.AddDays(-req.ISDAReportDate.Value.Day).AddDays(1); maxDate = req.ISDAReportDate.Value.Date.AddMonths(1).AddDays(-req.ISDAReportDate.Value.Day); errMsg = $"{minDate.ToString("yyyy-MM-dd")}~{maxDate.ToString("yyyy-MM-dd")}最新ISDA定期报告记录已报送成功,请选择补正"; return false; } break; default: break; } errMsg = ""; return true; } protected override BodyModel GenerateBody(out bool noData, out List fileList) { fileList = new List(); noData = true; var model = new BodyModel(); var cacheValue = formatInfoTag(_reqInfo.ISDAReportDate.Value.ToString("yyyy-MM")); if (ReportStatus.CheckCacheInfo(CacheKey, cacheValue)) { return model; } model.PeriodicReportISDA = new PeriodicReportISDAModel { OperationType = _operationType }; var note = base.GetReportNotes(ReportType, cacheValue).FirstOrDefault(); if (note == null && _operationType == OptFlagsEnum.A) { note = new SACReportNotes() { InfoCache = $"{{\"Tag\":\"{_reqInfo.ISDAReportDate.Value.ToString("yyyy-MM")}\"}}", IsValid = true, }; } else { switch (_operationType) { case OptFlagsEnum.A: noData = true;//新增数据已报送,跳过 return model; case OptFlagsEnum.U: note.IsValid = true; break; case OptFlagsEnum.D: note.IsValid = false; break; case OptFlagsEnum.NONE: default: throw new ServiceException("未知操作类型"); } } if (_operationType != OptFlagsEnum.A) { model.PeriodicReportISDA.BizID = note.BizId; } if (_excelDataSource != null) { var dt = _excelDataSource.Tables["业务统计"]; model.PeriodicReportISDA.Year = _reqInfo.ISDAReportDate.Value.Year.ToString("0000"); model.PeriodicReportISDA.Month = _reqInfo.ISDAReportDate.Value.Month.ToString("0"); model.PeriodicReportISDA.OperationType = _operationType; GetPotocolInfo(model, dt, 2, 1); GetBusinessInfo(model, dt, 12, 2); GetClientInfo(model, dt, 22, 2); dt = _excelDataSource.Tables["履约担保情况"]; GetSwapPerformanceGuaranteeInfo(model, dt, 2, 1); GetOptionPerformanceGuaranteeInfo(model, dt, 16, 1); GetPerformanceGuaranteeInfo(model, dt, 29, 1); dt = _excelDataSource.Tables["盈亏情况"]; GetSettleTradeWinlossInfo(model, dt, 2, 2); GetWinlossInfo(model, dt, 17, 1); model.PeriodicReportISDA.IncreaseBusinessDetailsThisMonthTuple = GetIncreaseBusinessDetailsThisMonthTuple(); model.PeriodicReportISDA.InventoryBusinessDetailsAtTheEndOfThisMonthTuple = GetInventoryBusinessDetailsAtTheEndOfThisMonthTuple(); model.PeriodicReportISDA.TargetCaseAndHedgeTuple = GetTargetCaseAndHedgeTuple(); model.PeriodicReportISDA.ExceID = base.formatExceID(); } ReportStatus.AddCacheInfo(CacheKey, cacheValue); noData = string.IsNullOrWhiteSpace(model.PeriodicReportISDA?.MainAgreementLastMonthAccumulatedThisYear); if (!noData) { note.id = 0; note.ExceId = model.PeriodicReportISDA.ExceID; note.CreateTime = DateTime.Now; note.FileTag = FileTag; note.ReportType = ReportType; note.ReportDate = _reqInfo.ReportDate; note.InfoTag = formatInfoTag(_reqInfo.ISDAReportDate.Value.ToString("yyyy-MM"), true); note.OptTime = note.CreateTime; note.RetCode = ""; note.RetMsg = ""; note.ReportResponse = false; note.BizId = ""; note.changeStatus = false; noteList.Add(note); } return model; } /// /// 获取签署协议统计 /// /// /// /// /// private void GetPotocolInfo(BodyModel model, DataTable dt, int startRow, int startCol) { var row = startRow + 0; model.PeriodicReportISDA.MainAgreementLastMonthAccumulatedThisYear = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.MainAgreementAddedThisMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); model.PeriodicReportISDA.MainAgreementAccumulatedThisYear = GetDataSetValue(dt, row, startCol + 2).ToString(); model.PeriodicReportISDA.MainAgreementValidedAtEndOfThisMonth = GetDataSetValue(dt, row, startCol + 3).ToString(); row = startRow + 1; model.PeriodicReportISDA.SupplementalAgreementLastMonthAccumulatedThisYear = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.SupplementalAgreementAddedThisMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); model.PeriodicReportISDA.SupplementalAgreementAccumulatedThisYear = GetDataSetValue(dt, row, startCol + 2).ToString(); model.PeriodicReportISDA.SupplementalAgreementValidedAtTheEndOfThisMonth = GetDataSetValue(dt, row, startCol + 3).ToString(); row = startRow + 2; model.PeriodicReportISDA.PerformanceGuaranteeAgreementLastMonthAccumulatedThisYear = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.PerformanceGuaranteeAgreementAddedThisMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); model.PeriodicReportISDA.PerformanceGuaranteeAgreementAccumulatedThisYear = GetDataSetValue(dt, row, startCol + 2).ToString(); model.PeriodicReportISDA.PerformanceGuaranteeAgreementValidedAtEndOfThisMonth = GetDataSetValue(dt, row, startCol + 3).ToString(); row = startRow + 3; model.PeriodicReportISDA.TransactionConfirmationLastMonthAccumulatedThisYear = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.TransactionConfirmationAddedThisMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); model.PeriodicReportISDA.TransactionConfirmationBookAccumulatedThisYear = GetDataSetValue(dt, row, startCol + 2).ToString(); model.PeriodicReportISDA.TransactionConfirmationValidedAtEndOfThisMonth = GetDataSetValue(dt, row, startCol + 3).ToString(); } /// /// 获取规模统计表 /// /// /// /// /// private void GetBusinessInfo(BodyModel model, DataTable dt, int startRow, int startCol) { var row = startRow + 0; model.PeriodicReportISDA.SWAPNominalCapitalStockAtBeginning = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.SWAPIncreasedOriginalTransactionNominalCapitalAtThisMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); model.PeriodicReportISDA.SWAPNotionalPrincipalAmountAllowedToBeTerminatedAtThisMonth = GetDataSetValue(dt, row, startCol + 2).ToString(); model.PeriodicReportISDA.SWAPNominalCapitalStockAtEnding = GetDataSetValue(dt, row, startCol + 3).ToString(); model.PeriodicReportISDA.SwapCategoryNominalPrincipalThisYearCumulativeInitialTransaction = GetDataSetValue(dt, row, startCol + 4).ToString(); row = startRow + 1; model.PeriodicReportISDA.OptionOfNotionalPrincipalStockAtBeginning = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.OptionIncreasedOriginalTransactionNominalCapitalAtThisMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); model.PeriodicReportISDA.OptionNotionalPrincipalAmountAllowedToBeTerminatedAtThisMonth = GetDataSetValue(dt, row, startCol + 2).ToString(); model.PeriodicReportISDA.OptionOfNotionalPrincipalStockAtEnding = GetDataSetValue(dt, row, startCol + 3).ToString(); model.PeriodicReportISDA.NominalPrincipalOfOptionClassHasBeenAddedToInitialTransaction = GetDataSetValue(dt, row, startCol + 4).ToString(); row = startRow + 2; model.PeriodicReportISDA.StockOfSwapContractsAtBeginning = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.NumberOfNewSwapInitialTradingContractsAtThisMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); model.PeriodicReportISDA.NumberOfSwapContractsToTerminateAtThisMonth = GetDataSetValue(dt, row, startCol + 2).ToString(); model.PeriodicReportISDA.StockOfSwapContractsAtEnding = GetDataSetValue(dt, row, startCol + 3).ToString(); model.PeriodicReportISDA.NumberOfSwapContractsIncreasedByThisYear = GetDataSetValue(dt, row, startCol + 4).ToString(); row = startRow + 3; model.PeriodicReportISDA.StockOfOptionContractsAtBeginning = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.NumberOfNewOptionInitialTradingContractsAtThisMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); model.PeriodicReportISDA.NumberOfOptionContractsToTerminateAtThisMonth = GetDataSetValue(dt, row, startCol + 2).ToString(); model.PeriodicReportISDA.StockOfOptionContractsAtEnding = GetDataSetValue(dt, row, startCol + 3).ToString(); model.PeriodicReportISDA.NumberOfOptionContractsHasIncreasedInitialTransaction = GetDataSetValue(dt, row, startCol + 4).ToString(); } /// /// 获取客户情况表 /// /// /// /// /// private void GetClientInfo(BodyModel model, DataTable dt, int startRow, int startCol) { var row = startRow + 0; model.PeriodicReportISDA.SwapSignedWithTheCustomerThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.NumberOfSwapTradingAccountsAtThisPeriodThisMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); model.PeriodicReportISDA.NumberOfSwapTradingClientStockThisMonth = GetDataSetValue(dt, row, startCol + 2).ToString(); row = startRow + 1; model.PeriodicReportISDA.SwapSignedWithTheCustomerLastMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.NumberOfSwapTradingAccountsLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); model.PeriodicReportISDA.NumberOfSwapTradingClientStockLastMonth = GetDataSetValue(dt, row, startCol + 2).ToString(); row = startRow + 2; model.PeriodicReportISDA.OptionSignedWithTheCustomerThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.NumberOfOptionTradingAccountsThisMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); model.PeriodicReportISDA.NumberOfOptionTradingClientStockThisMonth = GetDataSetValue(dt, row, startCol + 2).ToString(); row = startRow + 3; model.PeriodicReportISDA.OptionSignedWithTheCustomerLastMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.NumberOfOptionTradingAccountsLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); model.PeriodicReportISDA.NumberOfOptionTradingClientStockLastMonth = GetDataSetValue(dt, row, startCol + 2).ToString(); row = startRow + 4; model.PeriodicReportISDA.SignedTotalCustomer = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.TotalNumberOfTradingAccountsAtThisPeriod = GetDataSetValue(dt, row, startCol + 1).ToString(); model.PeriodicReportISDA.TotalNumberOfTradingClientAccounts = GetDataSetValue(dt, row, startCol + 2).ToString(); row = startRow + 5; model.PeriodicReportISDA.SignedTotalCustomerLastMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.TotalNumberOfTradingAccountsAtThisPeriodLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); model.PeriodicReportISDA.TotalNumberOfTradingClientAccountsLastMonth = GetDataSetValue(dt, row, startCol + 2).ToString(); } /// /// 获取收益互换类交易的履约担保品收取情况固定表格 /// /// /// /// /// private void GetSwapPerformanceGuaranteeInfo(BodyModel model, DataTable dt, int startRow, int startCol) { var row = startRow + 0; model.PeriodicReportISDA.TotalNominalPrincipalAmountOfSwapThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.TotalNominalPrincipalAmountOfSwapLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 1; model.PeriodicReportISDA.TheValueOfTheStockSwapInTheCorrespondingPerformanceGuaranteeThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.TheValueOfTheStockSwapInTheCorrespondingPerformanceGuaranteeLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 2; model.PeriodicReportISDA.SwapCashCollateralValueThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.SwapCashCollateralValueLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 3; model.PeriodicReportISDA.SwapSecuritiesCollateralValueThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.SwapSecuritiesCollateralValueLastMonthThisMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 4; model.PeriodicReportISDA.ProportionOfTheOverallPerformanceOfTheSwapBusinessThisMonthFull = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.ProportionOfTheOverallPerformanceOfTheSwapBusinessLastMonthFull = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 5; model.PeriodicReportISDA.ProportionOfTheOverallPerformanceOfTheSwapBusinessThisMonthNet = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.ProportionOfTheOverallPerformanceOfTheSwapBusinessLastMonthNet = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 6; model.PeriodicReportISDA.SwapNumberOfDefaultCustomersAtThisMonthThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.SwapNumberOfDefaultCustomersAtThisMonthLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 7; model.PeriodicReportISDA.SwapDefaultTransactionNumberAtThisMonthThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.SwapDefaultTransactionNumberAtThisMonthLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 8; model.PeriodicReportISDA.TotalSwapDefaultCustomerNumberInThisYearThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.TotalSwapDefaultCustomerNumberInThisYearLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 9; model.PeriodicReportISDA.SwapNumberOfDefaultCustomersInThisYearThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.SwapNumberOfDefaultCustomersInThisYearLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); } /// /// 获取场外期权类交易的履约担保品收取情况固定表格 /// /// /// /// /// private void GetOptionPerformanceGuaranteeInfo(BodyModel model, DataTable dt, int startRow, int startCol) { var row = startRow + 0; model.PeriodicReportISDA.TotalNominalPrincipalAmountOfOTCOptionsThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.TotalNominalPrincipalAmountOfOTCOptionsLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 1; model.PeriodicReportISDA.TheValueOfTheStockOTCOptionsCorrespondingPerformanceGuaranteeThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.TheValueOfTheStockOTCOptionsCorrespondingPerformanceGuaranteeLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 2; model.PeriodicReportISDA.OTCOptionsCashCollateralValueThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.OTCOptionsCashCollateralValueLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 3; model.PeriodicReportISDA.OTCOptionsSecuritiesCollateralValueThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.OTCOptionsSecuritiesCollateralValueLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 4; model.PeriodicReportISDA.ProportionOfTheOverallPerformanceOfTheOTCOptionsBusinessThisMonthFull = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.ProportionOfTheOverallPerformanceOfTheOTCOptionsBusinessLastMonthFull = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 5; model.PeriodicReportISDA.ProportionOfTheOverallPerformanceOfTheOTCOptionsBusinessThisMonthNet = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.ProportionOfTheOverallPerformanceOfTheOTCOptionsBusinessLastMonthNet = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 6; model.PeriodicReportISDA.OTCOptionsNumberOfDefaultCustomersAtThisMonthThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.OTCOptionsNumberOfDefaultCustomersAtThisMonthLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 7; model.PeriodicReportISDA.OTCOptionsTransactionNumberAtThisMonthThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.OTCOptionsTransactionNumberAtThisMonthLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 8; model.PeriodicReportISDA.TotalOTCOptionsDefaultCustomerNumberInThisYearThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.TotalOTCOptionsDefaultCustomerNumberInThisYearLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 9; model.PeriodicReportISDA.OTCOptionsNumberOfDefaultCustomersInThisYearThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.OTCOptionsNumberOfDefaultCustomersInThisYearLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); } /// /// 获取收取履约担保品的使用情况固定表格 /// /// /// /// /// private void GetPerformanceGuaranteeInfo(BodyModel model, DataTable dt, int startRow, int startCol) { var row = startRow + 0; model.PeriodicReportISDA.StockTradingCorrespondsToValueOfCollateralAtEndOfThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.StockTradingCorrespondsToValueOfCollateralAtEndOfLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 1; model.PeriodicReportISDA.CashBalanceAtEndOfThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.CashBalanceAtEndOfLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 2; model.PeriodicReportISDA.HoldStockMarketValueAtEndOfThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.HoldStockMarketValueAtEndOfLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 3; model.PeriodicReportISDA.HoldMarketValueOfBondsAtTheEndOfThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.HoldMarketValueOfBondsAtTheEndOfLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 4; model.PeriodicReportISDA.OwnedAssetManagementProductsAtTheEndOfThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.OwnedAssetManagementProductsAtTheEndOfLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 5; model.PeriodicReportISDA.OwnedBankFinanceAtTheEndOfThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.OwnedBankFinanceAtTheEndOfLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 6; model.PeriodicReportISDA.HoldTrustProductAtTheEndOfThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.HoldTrustProductAtTheEndOfLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 7; model.PeriodicReportISDA.InsuranceProductsAreHeldAtTheEndOfThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.InsuranceProductsAreHeldAtTheEndOfLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); row = startRow + 8; model.PeriodicReportISDA.HoldOtherProductsAtTheEndOfThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.HoldOtherProductsAtTheEndOfLastMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); } /// /// 获取本月了结交易盈亏情况统计 /// /// /// /// /// private void GetSettleTradeWinlossInfo(BodyModel model, DataTable dt, int startRow, int startCol) { model.PeriodicReportISDA.SettledSwapItemsAtThisMonth = GetDataSetValue(dt, startRow + 0, startCol).ToString(); model.PeriodicReportISDA.SettledSwapTransactionInvolvesNotionalPrincipalAtThisMonth = GetDataSetValue(dt, startRow + 1, startCol).ToString(); model.PeriodicReportISDA.SwapIncomeCashFlow = GetDataSetValue(dt, startRow + 2, startCol).ToString(); model.PeriodicReportISDA.SwapExpensesCashFlow = GetDataSetValue(dt, startRow + 3, startCol).ToString(); model.PeriodicReportISDA.CashFlowCorrespondingToNetIncomeOnSwapMargin = GetDataSetValue(dt, startRow + 4, startCol).ToString(); model.PeriodicReportISDA.SwapHedgeCost = GetDataSetValue(dt, startRow + 5, startCol).ToString(); model.PeriodicReportISDA.SettledOptionItemsAtThisMonth = GetDataSetValue(dt, startRow + 6, startCol).ToString(); model.PeriodicReportISDA.SettledOptionTransactionInvolvesNotionalPrincipalAtThisMonth = GetDataSetValue(dt, startRow + 7, startCol).ToString(); model.PeriodicReportISDA.OptionPremiumIncome = GetDataSetValue(dt, startRow + 8, startCol).ToString(); model.PeriodicReportISDA.OptionHedgeCost = GetDataSetValue(dt, startRow + 9, startCol).ToString(); } /// /// 获取本月会计损益统计 /// /// /// /// /// private void GetWinlossInfo(BodyModel model, DataTable dt, int startRow, int startCol) { var row = startRow + 0; model.PeriodicReportISDA.BalanceOfSwapRealizedGainsAndLossesAtThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.BalanceOfOptionRealizedGainsAndLossesAtThisMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); model.PeriodicReportISDA.BalanceOfSwapRealizedGainsAndLossesAtThisYear = GetDataSetValue(dt, row, startCol + 2).ToString(); model.PeriodicReportISDA.BalanceOfOptionRealizedGainsAndLossesAtThisYear = GetDataSetValue(dt, row, startCol + 3).ToString(); row = startRow + 1; model.PeriodicReportISDA.BalanceOfSwapChangedGainsAndLossesInFairValueAtThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.BalanceOfOptionChangedGainsAndLossesInFairValueAtThisMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); model.PeriodicReportISDA.BalanceOfSwapChangedGainsAndLossesInFairValueAtThisYear = GetDataSetValue(dt, row, startCol + 2).ToString(); model.PeriodicReportISDA.BalanceOfOptionChangedGainsAndLossesInFairValueAtThisYear = GetDataSetValue(dt, row, startCol + 3).ToString(); row = startRow + 2; model.PeriodicReportISDA.BalanceOfSwapTotalGainsAndLossesAtThisMonth = GetDataSetValue(dt, row, startCol + 0).ToString(); model.PeriodicReportISDA.BalanceOfOptionTotalGainsAndLossesAtThisMonth = GetDataSetValue(dt, row, startCol + 1).ToString(); model.PeriodicReportISDA.BalanceOfSwapTotalGainsAndLossesAtThisYear = GetDataSetValue(dt, row, startCol + 2).ToString(); model.PeriodicReportISDA.BalanceOfOptionTotalGainsAndLossesAtThisYear = GetDataSetValue(dt, row, startCol + 3).ToString(); } /// /// 获取本月新增业务明细 /// /// private List GetIncreaseBusinessDetailsThisMonthTuple() { var result = new List(); if (_excelDataSource != null && _excelDataSource.Tables.Contains("本月新增业务明细")) { var dt = _excelDataSource.Tables["本月新增业务明细"]; for (var i = 1; i < dt.Rows.Count; i++) { var colHead = dt.Rows[i][0]?.ToString(); if (string.IsNullOrWhiteSpace(colHead) || colHead.Contains("合计")) { //第一列空白说明数据结束了; break; } var model = new ISDAIncreaseBusinessDetailsThisMonthModel { NameOfSecuritiesCompany = GetDataSetValue(dt, i, 1).ToString(), NameOfCounterparty = GetDataSetValue(dt, i, 2).ToString(), NameOfCounterpartyProduct = GetDataSetValue(dt, i, 3).ToString(), TradeConfirmationNumber = GetDataSetValue(dt, i, 4), TransactionConfirmationNumber = GetDataSetValue(dt, i, 5) }; if (model.TransactionConfirmationNumber.IsNullOrWhiteSpace()) { model.TransactionConfirmationNumber = base.GetBizIdFromInfoTag(model.TradeConfirmationNumber); } model.BusinessType = ConsReport.BusinessTypeMap[GetDataSetValue(dt, i, 6).ToString()]; model.NotionalPrincipalAmountLNotionalPrincipalAmount = GetDataSetValue(dt, i, 7).ToString(); model.SNotionalPrincipalAmount = GetDataSetValue(dt, i, 8).ToString(); model.StartDay = GetDataSetValue(dt, i, 9).ToString(); model.DueDate = GetDataSetValue(dt, i, 10).ToString(); model.InvestmentTargetType = ConsReport.UndrlygAssetTypeMap[GetDataSetValue(dt, i, 11).ToString()]; model.UndrlygAssetName = GetDataSetValue(dt, i, 12).ToString(); model.UndrlygAssetCode = GetDataSetValue(dt, i, 13).ToString(); model.OptionObjectSecondClass = ConsReport.SwapUndrlygAssetDtldTypeMap[GetDataSetValue(dt, i, 14).ToString()]; model.SwapObjectSecondClass = ConsReport.SwapUndrlygAssetDtldTypeMap[GetDataSetValue(dt, i, 15).ToString()]; model.NonAnnualOptionFee = GetDataSetValue(dt, i, 16).ToString(); model.OptionType = ConsReport.OptionStructureTypeMap[GetDataSetValue(dt, i, 17).ToString()]; result.Add(model); } } return result; } /// /// 获取本月末存量业务明细 /// /// private List GetInventoryBusinessDetailsAtTheEndOfThisMonthTuple() { var result = new List(); if (_excelDataSource != null && _excelDataSource.Tables.Contains("本月末存量业务明细")) { var dt = _excelDataSource.Tables["本月末存量业务明细"]; for (var i = 1; i < dt.Rows.Count; i++) { var colHead = dt.Rows[i][0]?.ToString(); if (string.IsNullOrWhiteSpace(colHead) || colHead.Contains("合计")) { //第一列空白说明数据结束了; break; } var model = new ISDAInventoryBusinessDetailsAtTheEndOfThisMonthModel { NameOfSecuritiesCompany = GetDataSetValue(dt, i, 1).ToString(), NameOfCounterparty = GetDataSetValue(dt, i, 2).ToString(), NameOfCounterpartyProduct = GetDataSetValue(dt, i, 3).ToString(), TradeConfirmationNumber = GetDataSetValue(dt, i, 4), TransactionConfirmationNumber = GetDataSetValue(dt, i, 5) }; if (model.TransactionConfirmationNumber.IsNullOrWhiteSpace()) { model.TransactionConfirmationNumber = base.GetBizIdFromInfoTag(model.TradeConfirmationNumber); } model.BusinessType = ConsReport.BusinessTypeMap[GetDataSetValue(dt, i, 6).ToString()]; model.NotionalPrincipalAmountLNotionalPrincipalAmount = GetDataSetValue(dt, i, 7).ToString(); model.SNotionalPrincipalAmount = GetDataSetValue(dt, i, 8).ToString(); model.StartDay = GetDataSetValue(dt, i, 9).ToString(); model.DueDate = GetDataSetValue(dt, i, 10).ToString(); model.InvestmentTargetType = ConsReport.UndrlygAssetTypeMap[GetDataSetValue(dt, i, 11).ToString()]; model.UndrlygAssetName = GetDataSetValue(dt, i, 12).ToString(); model.UndrlygAssetCode = GetDataSetValue(dt, i, 13).ToString(); model.UndrlygAssetTradgPlc = GetDataSetValue(dt, i, 14).ToString(); model.OptionObjectSecondClass = ConsReport.SwapUndrlygAssetDtldTypeMap[GetDataSetValue(dt, i, 15).ToString()]; model.SwapObjectSecondClass = ConsReport.SwapUndrlygAssetDtldTypeMap[GetDataSetValue(dt, i, 16).ToString()]; model.NonAnnualOptionFee = GetDataSetValue(dt, i, 17).ToString(); model.OptionType = ConsReport.OptionStructureTypeMap[GetDataSetValue(dt, i, 18).ToString()]; model.MaitainMarginRation = GetDataSetValue(dt, i, 19).ToString(); model.CorrelationCoefficient = GetDataSetValue(dt, i, 20).ToString(); model.LongPositionContractValue = GetDataSetValue(dt, i, 21).ToString(); model.ShortPositionContractValue = GetDataSetValue(dt, i, 22).ToString(); result.Add(model); } } return result; } /// /// 获取标的情况与对冲 /// /// private List GetTargetCaseAndHedgeTuple() { var result = new List(); if (_excelDataSource != null && _excelDataSource.Tables.Contains("标的情况与对冲")) { var dt = _excelDataSource.Tables["标的情况与对冲"]; for (var i = 1; i < dt.Rows.Count; i++) { if (string.IsNullOrWhiteSpace(dt.Rows[i][0]?.ToString())) { //第一列空白说明数据结束了; break; } var model = new ISDATargetCaseAndHedgeModel { NameOfSecuritiesCompany = GetDataSetValue(dt, i, 1).ToString(), BusinessType = ConsReport.BusinessTypeMap[GetDataSetValue(dt, i, 2).ToString()], InvestmentTargetType = ConsReport.HedgeSACUndrlygAssetDtldTypeMap[GetDataSetValue(dt, i, 3).ToString()], InvestmentTarget = GetDataSetValue(dt, i, 4).ToString(), UnderlyingCode = GetDataSetValue(dt, i, 5).ToString(), UndrlygAssetTradgPlc = GetDataSetValue(dt, i, 6).ToString(), BuyingImpulseVolume = GetDataSetValue(dt, i, 7).ToString(), SellingImpulseVolume = GetDataSetValue(dt, i, 8).ToString(), ImpulseVolume = GetDataSetValue(dt, i, 9).ToString(), PositionAtTheEndOfThisMonth = GetDataSetValue(dt, i, 10).ToString(), TheNumberOfPositionsHeldAtTheEndOfThisMonth = GetDataSetValue(dt, i, 11).ToString(), AveragePriceAtTheEndOfTheMonth = GetDataSetValue(dt, i, 12).ToString() }; result.Add(model); } } return result; } protected override List CheckBodyValue(BodyModel model, out bool checkStatus) { var result = new List(); if (model?.PeriodicReportISDA != null) { var listRoot = new List(); var helper = new Common.CheckHelper(); var detailHelper = new Common.CheckHelper(); var detail2Helper = new Common.CheckHelper(); var hedgeHelper = new Common.CheckHelper(); helper.ExecuteCheck(model.PeriodicReportISDA, (name, value, msg) => { listRoot.Add(new SacInfo(name, value, msg)); }); if (model.PeriodicReportISDA.IncreaseBusinessDetailsThisMonthTuple != null) { for (var i = 0; i < model.PeriodicReportISDA.IncreaseBusinessDetailsThisMonthTuple.Count; i++) { var listItem = new List(); var item = model.PeriodicReportISDA.IncreaseBusinessDetailsThisMonthTuple[i]; detailHelper.ExecuteCheck(item, (name, value, msg) => { listItem.Add(new SacInfo(name, value, msg)); }); if (listItem.Count > 0) { var temp = new SacInfo("IncreaseBusinessDetailsThisMonthTuple", i) { SubMaps = new List(listItem) }; listRoot.Add(temp); } } } if (model.PeriodicReportISDA.InventoryBusinessDetailsAtTheEndOfThisMonthTuple != null) { for (var i = 0; i < model.PeriodicReportISDA.InventoryBusinessDetailsAtTheEndOfThisMonthTuple.Count; i++) { var listItem = new List(); var item = model.PeriodicReportISDA.InventoryBusinessDetailsAtTheEndOfThisMonthTuple[i]; detail2Helper.ExecuteCheck(item, (name, value, msg) => { listItem.Add(new SacInfo(name, value, msg)); }); if (listItem.Count > 0) { var temp = new SacInfo("InventoryBusinessDetailsAtTheEndOfThisMonthTuple", i) { SubMaps = new List(listItem) }; listRoot.Add(temp); } } } if (model.PeriodicReportISDA.TargetCaseAndHedgeTuple != null) { for (var i = 0; i < model.PeriodicReportISDA.TargetCaseAndHedgeTuple.Count; i++) { var listItem = new List(); var item = model.PeriodicReportISDA.TargetCaseAndHedgeTuple[i]; hedgeHelper.ExecuteCheck(item, (name, value, msg) => { listItem.Add(new SacInfo(name, value, msg)); }); if (listItem.Count > 0) { var temp = new SacInfo("TargetCaseAndHedgeTuple", i) { SubMaps = new List(listItem) }; listRoot.Add(temp); } } } if (listRoot.Count > 0) { var errMsg = new SacInfo("PeriodicReportISDA") { SubMaps = new List(listRoot) }; result.Add(errMsg); } } checkStatus = result.Count > 0; return result; } private string formatInfoTag(string tag, bool suffixType = false) { var result = $"{BusiDataType}_{tag}_"; if (suffixType) { result = $"{result}{_operationType}"; } return result; } protected override string _changeCodeOfInfoTag(string infoTag, string newCode, out string originalCode) { //定期报告中不存在编号,也就不存在修改编号的情况; throw new NotImplementedException(); } public override bool BeforeOfGenerated(out string errMsg) { errMsg = ""; for (var i = 0; i < noteList.Count; i++) { base.SaveReportNotes(noteList[i]); } return true; } } }