using BaseOUDAL; using NPOI.OpenXmlFormats.Dml.Diagram; using Oracle.ManagedDataAccess.Client; using System.Data; using System.Diagnostics; using System.Text; using System.Text.RegularExpressions; using System.Xml; using System.Xml.Linq; using System.Xml.Schema; using YLErp.BLL; using YLErp.Commons; using YLErp.DBModels.Enums; using YLErp.Helpers; using YLErp.Modules.SuperviseReportModule.SAC.Common; using YLErp.Modules.SuperviseReportModule.SAC.Model; using YLErp.Modules.TempFilesModule; using static YLErp.DBModels.Consts.ConsReport; namespace YLErp.Modules.SuperviseReportModule.SAC.Service { public abstract class ReportBaseService : YLBaseService { /// /// Excel数据源根目录 /// protected string _excelDataSourceRootPath { get; private set; } /// /// Excel数据源的相对路径 /// protected virtual string _excelDataSourcePath { get; } /// /// Excel数据源的文件名 /// protected virtual string _excelDataSourceFileName { get; } /// /// Excel数据源 /// protected DataSet _excelDataSource; /// /// View数据源 /// protected DataSet _viewDataSource; /// /// 子系统报送文件目录 /// protected List xmlAttachmentList = new(); /// /// /// protected TempFilesService? tempFilesService = null; protected ReportBaseService(OptUserInfo optUser) : base(optUser) { tempFilesService = new TempFilesService(optUser); } /// /// 文件序号 /// public int FileNumber { get; set; } public static int MaxExceIndex { get; set; } protected abstract DataFlagsEnum BusiDataType { get; } protected virtual string CacheKey => $"{BusiDataType}"; protected abstract SuperviseReportTypeEnum ReportType { get; } /// /// 支持的操作类型 /// public abstract List ValidOperationType { get; } protected ReportInfo _reqInfo { get; private set; } /// /// 操作类型 /// protected OptFlagsEnum _operationType { get; private set; } private YLContext? _writeDb = null; public YLContext WriteDb { get { return _writeDb ?? DbContext; } set { _writeDb = value; } } /// /// 当前文件代码 /// protected string FileTag { get; private set; } /// /// 报告状态 /// public ReportStatusModel ReportStatus { get; set; } public ReportRootModel Execute(ReportInfo req, OptFlagsEnum operationType) { _reqInfo = req; LogFactory.GetLogger("Executeone").Info($"PS.Config.ErpElement.SAC_ReportDataSource:" + _reqInfo.DataSource.ToString()); _operationType = operationType; var root = new ReportRootModel(); try { root.Annex = new List(); loadExcelDataSource(); root.Header = GenerateHeader(); FileTag = root.FileTag; root.Body = GenerateBody(out var noData, out var fileList); if (noData) { return null; } root.Annex.AddRange(fileList); WriteDb.supervise_report.Add(new DBModels.SuperviseReport() { ReportType = ReportType, ReportDate = _reqInfo.ReportDate, DataDate = _reqInfo.DataDate, SenderCode = _reqInfo.SenderCode, ReceiverCode = _reqInfo.ReceiverCode, LastMonthCash = _reqInfo.LastMonthCash, LatestMonthCash = _reqInfo.LatestMonthCash, LatestNetAssets = _reqInfo.LatestNetAssets, SRCReportStatus = _reqInfo.SACReportStatus, NAFMIIReportStatus = _reqInfo.NAFMIIReportStatus, ISDAReportStatus = _reqInfo.ISDAReportStatus, EventReportStatus = _reqInfo.EventReportStatus, OtherReportStatus = _reqInfo.OtherReportStatus, PeriodicReportQuarterStatus = _reqInfo.PeriodicReportQuarterStatus, FileTag = root.FileTag, FilePath = "", ReportReponseStatus = ReportSentStatus.NONE, ReportReponseCode = "", ReportReponseMessage = "未知", ReportReponsePath = "", optDate = DateTime.Now, optUserId = OptUser.UserId, }); } catch (ServiceException ex) { throw ex; } catch (Exception ex) { LogFactory.GetLogger(this.GetType().Name).Error(ex, $"req={req.ToJson()}\r\noperationType={_operationType}"); throw new Exception("生成出错", ex); } return root; } private HeaderModel GenerateHeader() { var model = new HeaderModel { SenderCode = _reqInfo.SenderCode, ReceiverCode = _reqInfo.ReceiverCode, SendDate = _reqInfo.ReportDate.ToString("yyyy-MM-dd"), FileNumber = FileNumber.ToString("0000"), BusiDataType = BusiDataType, OperationType = _operationType.ToString() }; return model; } protected abstract BodyModel GenerateBody(out bool noData, out List fileList); public virtual bool CheckRequestParamer(ReportInfo req, out string errMsg) { errMsg = ""; if (string.IsNullOrWhiteSpace(req.SenderCode)) { errMsg = "报送方编号不应为空"; return false; } if (string.IsNullOrWhiteSpace(req.ReceiverCode)) { errMsg = "接收方编号不应为空"; return false; } if (req.ReportDate == default) { errMsg = "报送日期不应为空"; return false; } return true; } public SacInfo CheckValue(ReportRootModel model, out bool checkStatus) { SacInfo errMsg = null; if (model != null) { var listRoot = new List(); var headerItem = CheckHeaderValue(model?.Header, out _); if (headerItem != null) { listRoot.Add(headerItem); } var bodyItem = CheckBodyValue(model?.Body, out _); if (bodyItem.Count > 0) { var item = new SacInfo("Body") { SubMaps = bodyItem }; listRoot.Add(item); } model.XmlStr = XmlHelper.Serializable(model, true); if (listRoot.Count == 0) { var xsdPath = OtcAppContext.MapPath(Path.Combine("\\App_Docs\\xsd", BusiDataType.ToString() + ".xsd")); if (File.Exists(xsdPath)) { var item = ValidationXSD(model.XmlStr, xsdPath); if (item != null) { listRoot.Add(item); } } } if (listRoot.Count > 0) { errMsg = new SacInfo("Root") { SubMaps = new List(listRoot) }; errMsg.formatFieldDescription(); } } checkStatus = errMsg == null; return errMsg; } private SacInfo CheckHeaderValue(HeaderModel model, out bool checkStatus) { SacInfo errMsg = null; var listRoot = new List(); var helper = new CheckHelper(); helper.ExecuteCheck(model, (name, value, msg) => { listRoot.Add(new SacInfo(name, value, msg)); }); if (listRoot.Count > 0) { errMsg = new SacInfo("Header") { SubMaps = new List(listRoot) }; } checkStatus = errMsg == null; return errMsg; } protected void SaveReportNotes(SACReportNotes sacReportNotes) { sacReportNotes.DataId ??= ""; WriteDb.sac_report_notes.Add(sacReportNotes); } /// /// 初始化报告记录 /// /// /// protected IEnumerable InitReportNotes(SuperviseReportTypeEnum reportType) { return DbContext.sac_report_notes.AsNoTracking().Where(O => O.ReportType == reportType).ToList(); } /// /// 获取报送记录 /// /// 报告标识 /// 是否需要无效的记录 /// protected List GetReportNotes(string infoTag, bool needInValid = false, IEnumerable dataSource = null) { IQueryable query; if (dataSource == null) { query = DbContext.sac_report_notes.AsNoTracking(); } else { query = dataSource.AsQueryable(); } query = query.Where(O => O.InfoTag.Contains(infoTag) && O.ReportResponse); if (!needInValid) { query = query.Where(O => O.IsValid); } return query.OrderByDescending(O => O.OptTime).ToList(); } protected List GetReportNotes(SuperviseReportTypeEnum reportType, string infoTag, bool needInValid = false, IEnumerable dataSource = null) { return GetReportNotes(infoTag, needInValid, dataSource).Where(O => O.ReportType == reportType).ToList(); } /// /// 根据交易确认书编号获取协会分配的编号 /// /// /// protected string GetBizIdFromInfoTag(string tradeConfirmationNumber) { var transactionConfirmationNumber = ""; var note = GetReportNotes($"_{tradeConfirmationNumber.Replace("_", "-")}_").Where(O => O.ReportType == SuperviseReportTypeEnum.SAC_OptionConfirmation || O.ReportType == SuperviseReportTypeEnum.SAC_SwapConfirmation).LastOrDefault(); if (note != null && !note.BizId.IsNullOrWhiteSpace()) { transactionConfirmationNumber = note.BizId; } return transactionConfirmationNumber; } /// /// 检查生成内容是否合规 /// /// /// /// protected abstract List CheckBodyValue(BodyModel model, out bool checkStatus); /// /// 修改InfoTag中的编号 /// /// 原始InfoTag /// 要修改的编号 /// /// 修改后的InfoTag /// protected abstract string _changeCodeOfInfoTag(string infoTag, string newCode, out string originalCode); /// /// 修改InfoTag中的编号 /// /// 原始InfoTag /// 要修改的编号 /// /// 修改后的InfoTag public string ChangeCodeOfInfoTag(string infoTag, string newCode, out string originalCode) { if (string.IsNullOrEmpty(infoTag)) { throw new ArgumentException($"“{nameof(infoTag)}”不能为 null 或空。", nameof(infoTag)); } if (string.IsNullOrEmpty(newCode)) { throw new ArgumentException($"“{nameof(newCode)}”不能为 null 或空。", nameof(newCode)); } return _changeCodeOfInfoTag(infoTag, newCode, out originalCode); } /// /// 全部报表生成成功后执行 /// /// public virtual bool BeforeOfGenerated(out string errMsg) { errMsg = ""; return true; } public static ReportBaseService ReportFactory(OptUserInfo optUser, SuperviseReportTypeEnum dataFlag) { ReportBaseService service = null; switch (dataFlag) { case SuperviseReportTypeEnum.SAC_MasterAgrmt: service = new ReportMasterAgrmtService(optUser); break; case SuperviseReportTypeEnum.SAC_MasterAgrmtProduct: service = new ReportMasterAgrmtProductService(optUser); break; case SuperviseReportTypeEnum.SAC_SupAgrmt: service = new ReportSupAgrmtService(optUser); break; case SuperviseReportTypeEnum.SAC_PerformanceGuaranteeAgrmt: service = new ReportPerformanceGuaranteeAgrmtService(optUser); break; case SuperviseReportTypeEnum.SAC_OptionConfirmation: service = new ReportOptionConfirmationService(optUser); break; case SuperviseReportTypeEnum.SAC_SwapConfirmation: service = new ReportSwapConfirmationService(optUser); break; case SuperviseReportTypeEnum.SAC_OptionTermination: service = new ReportOptionTerminationService(optUser); break; case SuperviseReportTypeEnum.SAC_SwapDurationManagement: service = new ReportSwapTerminationService(optUser); break; case SuperviseReportTypeEnum.SAC_PeriodicReportSAC: service = new ReportPeriodicReportSACService(optUser); break; case SuperviseReportTypeEnum.SAC_PeriodicReportNAFMII: service = new ReportPeriodicReportNAFMIIService(optUser); break; case SuperviseReportTypeEnum.SAC_PeriodicReportISDA: service = new ReportPeriodicReportISDAService(optUser); break; case SuperviseReportTypeEnum.SAC_EventReport: service = new ReportEventReportService(optUser); break; case SuperviseReportTypeEnum.SAC_OtherReport: service = new ReportOtherReportService(optUser); break; case SuperviseReportTypeEnum.SAC_PeriodicReportQuarter: service = new ReportPeriodicReportQuarterService(optUser); break; case SuperviseReportTypeEnum.SAC_ContractNumberProcess: service = new ContractNumberProcessService(optUser); break; case SuperviseReportTypeEnum.SAC_SwapEquityPayment: service = new ReportSwapEquityPaymentService(optUser); break; case SuperviseReportTypeEnum.SAC_ConfirmationAtt: service = new ReportSwapConfirmationAttService(optUser); break; case SuperviseReportTypeEnum.SAC_OptionConfirmationAtt: service = new ReportOptionConfirmationAttService(optUser); break; case SuperviseReportTypeEnum.SAC_ValuationInformation: service = new ReportValuationInformationService(optUser); break; default: throw new ServiceException("报表未实现"); } return service; } public static string ZipFile(ReportResponse res) { if (res.Infos.Count == 0) { return ""; } var directory = $"/App_Docs/Download/Report/"; var absDirectory = OtcAppContext.MapPath(directory); checkDirectory(absDirectory); var tempFile = Path.Combine(absDirectory, "Temp", res.FileTag); checkDirectory(tempFile, true); var attachmentPath = Path.Combine(tempFile, "ATTACHMENT"); checkDirectory(attachmentPath); foreach (var item in res.Infos) { File.WriteAllText(Path.Combine(tempFile, item.FileTag + ".xml"), item.XmlStr); for (var i = 0; i < item.Annex.Count; i++) { if (string.IsNullOrWhiteSpace(item.Annex[i])) { continue; } var annexPath = item.Annex[i]; LogFactory.GetLogger().Info($"附件路径:{annexPath}"); if (annexPath.StartsWith("\\") || annexPath.StartsWith("/") || !Path.IsPathRooted(annexPath)) { annexPath = OtcAppContext.MapPath(item.Annex[i]); if (!OperatingSystem.IsWindows()) { //修复linux环境下绝对路径MapPath处理结果会增加系统根目录的问题; if (!File.Exists(annexPath)) { annexPath = item.Annex[i]; } } LogFactory.GetLogger().Info($"附件物理路径:{annexPath}"); } var annexFileName = Path.GetFileName(annexPath); try { var destFileName = Path.Combine(attachmentPath, annexFileName); //国元固收从金仕达获取的交易确认书附件会有多笔交易指向同一附件的情况,做特殊处理. if (PS.Config.Company == Configuration.CompanyEnum.国元固收 && File.Exists(destFileName)) { continue; } LogFactory.GetLogger().Info($"附件目标路径:{destFileName}"); File.Copy(annexPath, destFileName); } catch (Exception ex) { LogFactory.GetLogger().Error(ex); throw new ServiceException($"生成报送文件失败,{Regex.Replace(ex.Message, $"(?<=“)\\S+(?={annexFileName})", "")}"); } } } var zipFile = res.FileTag + ".zip"; var outFile = Path.Combine(OtcAppContext.MapPath(directory), zipFile); ZipHelper.ZipDirectory(tempFile, outFile); return Path.Combine(directory, zipFile); } /// /// 校验xml文件 /// /// /// private static SacInfo ValidationXSD(string xmlStr, string xsdPath) { SacInfo result = null; var listRoot = new List(); var schema = new XmlSchemaSet(); schema.Add("", xsdPath); var reader = XmlReader.Create(new StringReader(xmlStr)); var doc = XDocument.Load(reader); doc.Validate(schema, (obj, e) => { var msg = Regex.Replace(e.Message, @"元素[^,]+,", ""); msg = Regex.Replace(msg, @"\s-\s[\D]+约束失败。", "").Replace("“", "").Replace("”", ""); var name = ""; try { name = XDocument.Load(new StringReader(obj?.ToString())).Root.Name.LocalName; } catch (Exception ex) { LogFactory.GetLogger("ValidationXSD").Error(ex, "XSD校验失败"); } listRoot.Add(new SacInfo(name, "", msg)); Debug.WriteLine(msg); }); if (listRoot.Count > 0) { result = new SacInfo("Body") { SubMaps = new List(listRoot) }; } return result; } private static void checkDirectory(string path, bool isInit = false) { if (isInit && Directory.Exists(path)) { Directory.Delete(path, true); } if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } } /// /// 获取标的小类 /// /// /// /// /// protected string GetSACUndrlygAssetDtldTypeMap(ExpandoDictionary undrlygAssetDtldTypeMap, string underlyingInstrumentType, string commodityCode) { var desc = ConsGlobal.InstrumentType.GetDesc(underlyingInstrumentType); if (!undrlygAssetDtldTypeMap.TryGetValue(desc, out var result)) { switch (desc) { case "商品期货": if (commodityCode == "AU") { result = undrlygAssetDtldTypeMap["黄金期货"]; } else { result = undrlygAssetDtldTypeMap["其他期货"]; } break; case "商品现货": if (commodityCode == "AU") { result = undrlygAssetDtldTypeMap["黄金现货"]; } else { result = undrlygAssetDtldTypeMap["其他现货"]; } break; default: result = undrlygAssetDtldTypeMap["其他标的"]; break; } } return result; } /// /// 从_excelDataSource中获取指定信息 /// /// /// /// /// protected string GetDataSetValue(DataTable dt, int rowIndex, int colIndex) { var result = ""; if (dt != null) { if (dt.Rows.Count <= rowIndex || dt.Columns.Count <= colIndex) { throw new ServiceException($"{dt.TableName} Sheet页内容不符合规则,不存在[{rowIndex},{colIndex}]单元格"); } result = dt.Rows[rowIndex][colIndex].ToString().Trim(); } return result; } /// /// 从_viewDataSource中获取指定信息 /// /// /// /// /// protected string GetDataSetValue(DataRow row, string colName) { var result = ""; try { result = row[colName].ToString().Trim(); } catch (Exception) { LogFactory.GetLogger("GetDataSetValue").Info($"{row.Table.TableName} 不存在[{colName}]列数据"); result = ""; } return result; } /// /// 从_viewDataSource中获取指定信息 /// /// /// /// /// protected double GetDataSetValueToDouble(DataRow row, string colName) { var str = GetDataSetValue(row, colName); if (str == null || !double.TryParse(str, out var result)) { result = 0; } return result; } /// /// 从_excelDataSource中获取汇总信息 /// /// /// /// /// protected double? GetDataSetValueToDoubleOrNull(DataTable dt, int rowIndex, int colIndex) { var str = GetDataSetValue(dt, rowIndex, colIndex); if (str == null || !double.TryParse(str, out var result)) { return null; } return result; } /// /// 从_excelDataSource中获取指定信息 /// /// /// /// /// protected double GetDataSetValueToDouble(DataTable dt, int rowIndex, int colIndex) { var str = GetDataSetValue(dt, rowIndex, colIndex); if (str == null || !double.TryParse(str, out var result)) { result = 0; } return result; } protected void loadExcelDataSource() { //if ((_reqInfo.DataSource.HasFlag(SAC_ReportDataSourceEnum.Template) || // //BusiDataType == DataFlagsEnum.A1011 || // BusiDataType == DataFlagsEnum.A1012 || // BusiDataType == DataFlagsEnum.A1013) && // !string.IsNullOrWhiteSpace(_excelDataSourcePath)) //{ var rootPath = tempFilesService.QueryTempFile(_reqInfo.ReportDate, "报送模板").Select(O => O.filePath).FirstOrDefault(); if (string.IsNullOrWhiteSpace(rootPath)) { return; } _excelDataSourceRootPath = $"{Path.GetDirectoryName(rootPath)}\\{Path.GetFileNameWithoutExtension(rootPath)}\\"; var path = $"{_excelDataSourceRootPath}{_excelDataSourcePath}"; LogFactory.GetLogger("loadExcelDataSource").Info($"查找数据源目录:{path}"); path = OtcAppContext.MapPath(path); if (System.IO.Directory.Exists(path)) { var filePath = System.IO.Directory.GetFiles(path, _excelDataSourceFileName).FirstOrDefault(); LogFactory.GetLogger("loadExcelDataSource").Info($"查找数据源文件:{filePath}"); if (!string.IsNullOrWhiteSpace(filePath)) { _excelDataSource = new ExcelHelper().ExcelToDataSet(filePath, 0); LogFactory.GetLogger("loadExcelDataSource").Info($"成功加载数据源"); } } //} } /// /// 加载外部金仕达视图报送数据 /// protected void loadViewDataSource() { try { _viewDataSource = new DataSet(); LogFactory.GetLogger("loadViewDataSource").Info("开始执行loadViewDataSource....."); var connection = PS.Config.ErpElement.KingstarViewConnectionString; LogFactory.GetLogger("loadViewDataSource").Info($"链接字符串:{connection}"); using (var db = new DbHelper(connection)) { switch (BusiDataType) { case DataFlagsEnum.NONE: break; case DataFlagsEnum.A1001: break; case DataFlagsEnum.A1002: break; case DataFlagsEnum.A1003: break; case DataFlagsEnum.A1004: break; case DataFlagsEnum.A1005: LogFactory.GetLogger("loadViewDataSource").Info("开始执行GetSwapConfirm....."); GetSwapConfirm(db, _reqInfo.DataDate); LogFactory.GetLogger("loadViewDataSource").Info("执行完GetSwapConfirm....."); break; case DataFlagsEnum.A1006: LogFactory.GetLogger("loadViewDataSource").Info("开始执行GetSwapLifeCycle....."); GetSwapLifeCycle(db, _reqInfo.DataDate); LogFactory.GetLogger("loadViewDataSource").Info("执行完GetSwapLifeCycle....."); break; case DataFlagsEnum.A1007: break; case DataFlagsEnum.A1008: break; case DataFlagsEnum.A1009: break; case DataFlagsEnum.A1010: break; case DataFlagsEnum.A1011: break; case DataFlagsEnum.A1012: break; case DataFlagsEnum.A1013: break; case DataFlagsEnum.A1014: break; case DataFlagsEnum.A1015: break; case DataFlagsEnum.A1016: LogFactory.GetLogger("loadViewDataSource").Info("开始执行GetSwapequityPayment....."); GetSwapequityPayment(db, _reqInfo.DataDate); LogFactory.GetLogger("loadViewDataSource").Info("执行完GetSwapequityPayment....."); break; case DataFlagsEnum.A1017: LogFactory.GetLogger("loadViewDataSource").Info("开始执行GetSwapConfirmationAtt....."); GetSwapConfirmationAtt(db, _reqInfo.DataDate); LogFactory.GetLogger("loadViewDataSource").Info("执行完GetSwapConfirmationAtt....."); break; default: break; } } LogFactory.GetLogger("loadViewDataSource").Info("成功执行loadViewDataSource"); } catch (Exception ex) { LogFactory.GetLogger("loadViewDataSource").Error(ex, "出现异常"); } } private string GetDataReaderValue(OracleDataReader dr, string fieldName) { var result = ""; if (dr == null) { return result; } result = dr[fieldName] == DBNull.Value ? "" : dr[fieldName].ToString(); return result; } private string SetOneColumnData(OracleDataReader dr, DataRow row, string fieldName) { return SetOneColumnData(dr, row, fieldName, ""); } private string SetOneColumnData(OracleDataReader dr, DataRow row, string fieldName, string toFileName = "") { var value = GetDataReaderValue(dr, fieldName); return SetOneColumnData(value, row, fieldName, toFileName); } private string SetOneColumnData(string value, DataRow row, string fieldName, string toFileName = "") { if (string.IsNullOrEmpty(toFileName)) row[fieldName] = value; else row[toFileName] = value; return value; } #region 交易确认书视图数据读取 /// /// 交易确认书数据读取 /// /// /// private void GetSwapConfirm(DbHelper db, DateTime reportDate) { try { LogFactory.GetLogger("GetSwapConfirm").Info("进入GetSwapConfirm"); var schema = PS.Config.ErpElement.KingstarViewTableSchema.IsNullOrWhiteSpace() ? "" : $"\"{PS.Config.ErpElement.KingstarViewTableSchema}\"."; var dtSwapConfirm = CreateSwapConfirmDataTable(); LogFactory.GetLogger("GetSwapConfirm").Info("创建完3个DataTable结构"); var sqlStr = new StringBuilder(); sqlStr.Append("SELECT confirmation.*"); sqlStr.Append($"FROM {schema}v_swap_confirmation_A1005 confirmation "); sqlStr.Append($"WHERE confirmation.SUBMIT_STATUS = 0 AND confirmation.OPERATIONTYPE = '{_operationType.ToString()}' AND confirmation.BUSIDATE='{reportDate.ToString("yyyy-MM-dd")}'"); db.ExecuteSql(sqlStr.ToString(), dr => { try { LogFactory.GetLogger("GetSwapConfirm ExecuteSql CreateSwapConfirmNewRow").Info("RowData:" + dr.ToStringContent()); } catch (Exception ex) { LogFactory.GetLogger("GetSwapConfirm ExecuteSql CreateSwapConfirmNewRow").Error(ex); } CreateSwapConfirmNewRow(dtSwapConfirm, dr); }); if (dtSwapConfirm.Rows.Count > 0) { sqlStr.Clear(); sqlStr.Append("SELECT collateral.*"); sqlStr.Append($"FROM {schema}v_swap_collateral_A1005 collateral "); sqlStr.Append($"WHERE collateral.BUSIDATE='{reportDate.ToString("yyyy-MM-dd")}'"); var dtSwapCollateral = CreateSwapCollateralDataTable(); var dict = new Dictionary>(); db.ExecuteSql(sqlStr.ToString(), dr => { try { LogFactory.GetLogger("GetSwapConfirm ExecuteSql CreateSwapPerformanceGuaranteeAttNewRow").Info("RowData:" + dr.ToStringContent()); } catch (Exception ex) { LogFactory.GetLogger("GetSwapConfirm ExecuteSql CreateSwapPerformanceGuaranteeAttNewRow").Error(ex); } CreateSwapCollateralNewRow(dtSwapCollateral, dr, dict, setIndexDict); }); dtSwapCollateral.ExtendedProperties["Index"] = dict; dict = new Dictionary>(); sqlStr.Clear(); sqlStr.Append("SELECT feepayment.*"); sqlStr.Append($"FROM {schema}v_swap_fee_payment_A1005 feepayment "); sqlStr.Append($"WHERE feepayment.BUSIDATE='{reportDate.ToString("yyyy-MM-dd")}'"); var dtPaymentMethod = CreatePaymentMethodDataTable(); db.ExecuteSql(sqlStr.ToString(), dr => { try { LogFactory.GetLogger("GetSwapConfirm ExecuteSql CreatePaymentMethodNewRow").Info("RowData:" + dr.ToStringContent()); } catch (Exception ex) { LogFactory.GetLogger("GetSwapConfirm ExecuteSql CreatePaymentMethodNewRow").Error(ex); } CreatePaymentMethodNewRow(dtPaymentMethod, dr, dict, setIndexDict); }); dtPaymentMethod.ExtendedProperties["Index"] = dict; _viewDataSource.Tables.Add(dtSwapConfirm); _viewDataSource.Tables.Add(dtSwapCollateral); _viewDataSource.Tables.Add(dtPaymentMethod); LogFactory.GetLogger("GetSwapConfirm ExecuteSql dtSwapConfirm").Info($"dtSwapConfirm:{dtSwapConfirm.Rows.Count}"); LogFactory.GetLogger("GetSwapConfirm ExecuteSql dtSwapCollateral").Info($"dtSwapCollateral:{dtSwapCollateral.Rows.Count}"); LogFactory.GetLogger("GetSwapConfirm ExecuteSql dtPaymentMethod").Info($"dtPaymentMethod:{dtPaymentMethod.Rows.Count}"); } LogFactory.GetLogger("GetSwapConfirm").Info("成功执行完离开GetSwapConfirm"); } catch (Exception ex) { LogFactory.GetLogger("GetSwapConfirm").Error(ex, "出现异常"); } } /// /// 增加确认书-费用端支付记录 /// /// /// /// /// private void CreatePaymentMethodNewRow( DataTable dtPaymentMethod, OracleDataReader dr, Dictionary> indexDict, Action>, DataRow, string> action) { var newRow = dtPaymentMethod.NewRow(); var no = SetOneColumnData(dr, newRow, "CONFIRMATIONNO"); SetOneColumnData(dr, newRow, "PAYMENTMETHOD"); SetOneColumnData(dr, newRow, "PAYER"); SetOneColumnData(dr, newRow, "PAYMENTFREQ"); SetOneColumnData(dr, newRow, "FIXEDINTERESTRATE"); SetOneColumnData(dr, newRow, "FLOATINTERESTRATE"); SetOneColumnData(dr, newRow, "REFFLOATINGINTERESTRATE"); SetOneColumnData(dr, newRow, "BASEPOINT"); SetOneColumnData(dr, newRow, "BLANK1", "BLANK1"); SetOneColumnData(dr, newRow, "BLANK2", "BLANK2"); dtPaymentMethod.Rows.Add(newRow); action(indexDict, newRow, no); } /// /// 增加确认书-履约担保品记录 /// /// /// /// /// private void CreateSwapCollateralNewRow( DataTable dtSwapPerformanceGuaranteeAtt, OracleDataReader dr, Dictionary> indexDict, Action>, DataRow, string> action) { var newRow = dtSwapPerformanceGuaranteeAtt.NewRow(); var no = SetOneColumnData(dr, newRow, "CONFIRMATIONNO"); SetOneColumnData(dr, newRow, "PERFORMANCECOLLTYPE"); SetOneColumnData(dr, newRow, "PERFORMANCECOLLRANGE"); SetOneColumnData(dr, newRow, "MULTICONFIRMATIONID"); SetOneColumnData(dr, newRow, "REMARKS", "REMARKS"); dtSwapPerformanceGuaranteeAtt.Rows.Add(newRow); action(indexDict, newRow, no); } private static void setIndexDict(Dictionary> indexDict, DataRow row, string no) { if (!indexDict.ContainsKey(no)) { indexDict[no] = new List(); } indexDict[no].Add(row); } /// /// 增加确认书记录 /// /// /// private void CreateSwapConfirmNewRow(DataTable dtSwapConfirm, OracleDataReader dr) { var confirmationNo = GetDataReaderValue(dr, "CONFIRMATIONNO"); var row = dtSwapConfirm.Rows.Find(confirmationNo); if (row != null) return;//存在了就不用再加了 var newRow = dtSwapConfirm.NewRow(); SetOneColumnData(dr, newRow, "MASTERAGRMTNO"); SetOneColumnData(dr, newRow, "SUPAGRMNO"); SetOneColumnData(dr, newRow, "CONFIRMATIONNO"); SetOneColumnData(dr, newRow, "FILLPARTY"); SetOneColumnData(dr, newRow, "SWAPTYPE"); SetOneColumnData(dr, newRow, "STARTDATE"); SetOneColumnData(dr, newRow, "DUEDATE"); SetOneColumnData(dr, newRow, "SETTLEMENTDATE"); SetOneColumnData(dr, newRow, "CURRENCY"); SetOneColumnData(dr, newRow, "NOTIONALPRINCIPLEAMT"); SetOneColumnData(dr, newRow, "CLEARINGAGENCY"); SetOneColumnData(dr, newRow, "TRADINGPLACE"); SetOneColumnData(dr, newRow, "TRADINGPLACEOTHER"); SetOneColumnData(dr, newRow, "UNDRLYGASSETTYPE"); SetOneColumnData(dr, newRow, "CONFIRMATIONREMARK"); SetOneColumnData(dr, newRow, "PERFORMANCEGUARANTEETYPE"); SetOneColumnData(dr, newRow, "PERFORMANCECOLLPROVIDER"); SetOneColumnData(dr, newRow, "PARTYUSECOLL"); SetOneColumnData(dr, newRow, "COLLINSTRUCTION"); SetOneColumnData(dr, newRow, "CALCULATECOLLINTEREST"); SetOneColumnData(dr, newRow, "PERFORMANCECOLLINITIALRATIO"); SetOneColumnData(dr, newRow, "PERFORMANCECOLLADDTLRATIO"); SetOneColumnData(dr, newRow, "PERFORMANCECOLLOFFSETRATIO"); SetOneColumnData(dr, newRow, "MAINTAINGUARANTEERATIO"); SetOneColumnData(dr, newRow, "PERFORMANCEGUARANTEEATT"); SetOneColumnData(dr, newRow, "PERFORMANCEGUARANTEEREMARK"); SetOneColumnData(dr, newRow, "REMARK"); SetOneColumnData(dr, newRow, "COMPLIANCEOPINION"); SetOneColumnData(dr, newRow, "PTYAUNDRLYGASSETNO"); SetOneColumnData(dr, newRow, "PTYAPROFITCALCULATIONINFO"); SetOneColumnData(dr, newRow, "PTYAPROFITREMARK"); SetOneColumnData(dr, newRow, "PTYAPDCTNAME"); SetOneColumnData(dr, newRow, "PTYAPDCTCODE"); SetOneColumnData(dr, newRow, "PTYBPDCTNAME"); SetOneColumnData(dr, newRow, "PTYBPDCTCODE"); SetOneColumnData(dr, newRow, "BLANK1"); SetOneColumnData(dr, newRow, "BLANK2"); SetOneColumnData(dr, newRow, "SUBMIT_STATUS"); SetOneColumnData(dr, newRow, "OPERATIONTYPE"); dtSwapConfirm.Rows.Add(newRow); LogFactory.GetLogger("CreateSwapConfirmNewRow").Info("退出CreateSwapConfirmNewRow"); } /// /// 创建确认书表格 /// /// private DataTable CreateSwapConfirmDataTable() { var dtSwapConfirm = new DataTable("交易确认书"); dtSwapConfirm.Columns.Add("MASTERAGRMTNO"); dtSwapConfirm.Columns.Add("SUPAGRMNO"); var primaryKey = dtSwapConfirm.Columns.Add("CONFIRMATIONNO"); dtSwapConfirm.Columns.Add("FILLPARTY"); dtSwapConfirm.Columns.Add("SWAPTYPE"); dtSwapConfirm.Columns.Add("STARTDATE"); dtSwapConfirm.Columns.Add("DUEDATE"); dtSwapConfirm.Columns.Add("SETTLEMENTDATE"); dtSwapConfirm.Columns.Add("CURRENCY"); dtSwapConfirm.Columns.Add("NOTIONALPRINCIPLEAMT"); dtSwapConfirm.Columns.Add("CLEARINGAGENCY"); dtSwapConfirm.Columns.Add("TRADINGPLACE"); dtSwapConfirm.Columns.Add("TRADINGPLACEOTHER"); dtSwapConfirm.Columns.Add("UNDRLYGASSETTYPE"); dtSwapConfirm.Columns.Add("CONFIRMATIONREMARK"); dtSwapConfirm.Columns.Add("PERFORMANCEGUARANTEETYPE"); dtSwapConfirm.Columns.Add("PERFORMANCECOLLPROVIDER"); dtSwapConfirm.Columns.Add("PARTYUSECOLL"); dtSwapConfirm.Columns.Add("COLLINSTRUCTION"); dtSwapConfirm.Columns.Add("CALCULATECOLLINTEREST"); dtSwapConfirm.Columns.Add("PERFORMANCECOLLINITIALRATIO"); dtSwapConfirm.Columns.Add("PERFORMANCECOLLADDTLRATIO"); dtSwapConfirm.Columns.Add("PERFORMANCECOLLOFFSETRATIO"); dtSwapConfirm.Columns.Add("MAINTAINGUARANTEERATIO"); dtSwapConfirm.Columns.Add("PERFORMANCEGUARANTEEATT"); dtSwapConfirm.Columns.Add("PERFORMANCEGUARANTEEREMARK"); dtSwapConfirm.Columns.Add("REMARK"); dtSwapConfirm.Columns.Add("COMPLIANCEOPINION"); dtSwapConfirm.Columns.Add("PTYAUNDRLYGASSETNO"); dtSwapConfirm.Columns.Add("PTYAPROFITCALCULATIONINFO"); dtSwapConfirm.Columns.Add("PTYAPROFITREMARK"); dtSwapConfirm.Columns.Add("PTYAPDCTNAME"); dtSwapConfirm.Columns.Add("PTYAPDCTCODE"); dtSwapConfirm.Columns.Add("PTYBPDCTNAME"); dtSwapConfirm.Columns.Add("PTYBPDCTCODE"); dtSwapConfirm.Columns.Add("BLANK1"); dtSwapConfirm.Columns.Add("BLANK2"); dtSwapConfirm.Columns.Add("SUBMIT_STATUS"); dtSwapConfirm.Columns.Add("OPERATIONTYPE"); dtSwapConfirm.PrimaryKey = new DataColumn[] { primaryKey }; return dtSwapConfirm; } /// /// 创建确认书-履约担保品表格 /// /// private DataTable CreateSwapCollateralDataTable() { var dtSwapPerformanceGuaranteeAtt = new DataTable("履约担保品"); dtSwapPerformanceGuaranteeAtt.Columns.Add("CONFIRMATIONNO"); dtSwapPerformanceGuaranteeAtt.Columns.Add("PERFORMANCECOLLTYPE"); dtSwapPerformanceGuaranteeAtt.Columns.Add("PERFORMANCECOLLRANGE"); dtSwapPerformanceGuaranteeAtt.Columns.Add("MULTICONFIRMATIONID"); dtSwapPerformanceGuaranteeAtt.Columns.Add("REMARKS"); return dtSwapPerformanceGuaranteeAtt; } /// /// 创建确认书-费用端支付表格 /// /// private DataTable CreatePaymentMethodDataTable() { var dtPaymentMethod = new DataTable("费用端支付"); dtPaymentMethod.Columns.Add("CONFIRMATIONNO"); dtPaymentMethod.Columns.Add("PAYMENTMETHOD"); dtPaymentMethod.Columns.Add("PAYER"); dtPaymentMethod.Columns.Add("PAYMENTFREQ"); dtPaymentMethod.Columns.Add("FIXEDINTERESTRATE"); dtPaymentMethod.Columns.Add("FLOATINTERESTRATE"); dtPaymentMethod.Columns.Add("REFFLOATINGINTERESTRATE"); dtPaymentMethod.Columns.Add("BASEPOINT"); dtPaymentMethod.Columns.Add("BLANK1"); dtPaymentMethod.Columns.Add("BLANK2"); return dtPaymentMethod; } #endregion #region 互换终止视图数据读取 /// /// 互换终止数据读取 /// /// /// private void GetSwapLifeCycle(DbHelper db, DateTime reportDate) { try { var schema = PS.Config.ErpElement.KingstarViewTableSchema.IsNullOrWhiteSpace() ? "" : $"\"{PS.Config.ErpElement.KingstarViewTableSchema}\"."; LogFactory.GetLogger("GetSwapLifeCycle").Info("进入GetSwapLifeCycle"); var dtSwapLifeCycle = CreateSwapLifeCycleDataTable(); var sqlStr = new StringBuilder(); sqlStr.Append("SELECT lifecycle.* "); sqlStr.Append($" FROM {schema}v_swap_lifecycle_A1006 lifecycle "); sqlStr.Append("WHERE lifecycle.SUBMIT_STATUS = 0 "); sqlStr.Append($" AND lifecycle.OPERATIONTYPE = '{_operationType.ToString()}' AND lifecycle.BUSIDATE='{reportDate.ToString("yyyy-MM-dd")}'"); LogFactory.GetLogger("GetSwapLifeCycle").Info($"sqlStr:{sqlStr}"); db.ExecuteSql(sqlStr.ToString(), dr => { try { LogFactory.GetLogger("GetSwapLifeCycle ExecuteSql").Info("RowData:" + dr.ToStringContent()); } catch (Exception ex) { LogFactory.GetLogger("GetSwapLifeCycle ExecuteSql").Error(ex); } CreateSwapLifeCycleNewRow(dtSwapLifeCycle, dr); }); if (dtSwapLifeCycle.Rows.Count > 0) { sqlStr.Clear(); sqlStr.Append("SELECT posdt.* "); sqlStr.Append($" FROM {schema}v_swap_lifecycle_pos_dt_A1006 posdt "); sqlStr.Append($"WHERE posdt.BUSIDATE='{reportDate.ToString("yyyy-MM-dd")}'"); LogFactory.GetLogger("dtSwapLifeCyclePosDt").Info($"sqlStr:{sqlStr}"); var dtSwapLifeCyclePosDt = CreateSwapLifeCyclePosDtDataTable(); var dict = new Dictionary>(); db.ExecuteSql(sqlStr.ToString(), dr => { try { LogFactory.GetLogger("dtSwapLifeCyclePosDt ExecuteSql").Info("RowData:" + dr.ToStringContent()); } catch (Exception ex) { LogFactory.GetLogger("dtSwapLifeCyclePosDt ExecuteSql").Error(ex); } CreateSwapLifeCyclePosDtNewRow(dtSwapLifeCyclePosDt, dr, dict, setIndexDict); }); dtSwapLifeCyclePosDt.ExtendedProperties["Index"] = dict; _viewDataSource.Tables.Add(dtSwapLifeCycle); _viewDataSource.Tables.Add(dtSwapLifeCyclePosDt); LogFactory.GetLogger("dtSwapLifeCycle ExecuteSql dtSwapLifeCycle").Info($"dtSwapLifeCycle:{dtSwapLifeCycle.Rows.Count}"); LogFactory.GetLogger("dtSwapLifeCycle ExecuteSql dtSwapLifeCyclePosDt").Info($"dtSwapLifeCyclePosDt:{dtSwapLifeCyclePosDt.Rows.Count}"); LogFactory.GetLogger("dtSwapLifeCycle Index dtSwapLifeCyclePosDt").Info($"Index:{dict.Count}"); } } catch (Exception ex) { LogFactory.GetLogger("GetSwapLifeCycle").Error(ex, "出现异常"); } } /// /// 增加存续期管理记录 /// /// /// private void CreateSwapLifeCycleNewRow(DataTable dtSwapLifeCycle, OracleDataReader dr) { var confirmationNo = GetDataReaderValue(dr, "CONFIRMATIONNO"); var row = dtSwapLifeCycle.Rows.Find(confirmationNo); if (row != null) return;//存在了就不用再加了 var newRow = dtSwapLifeCycle.NewRow(); SetOneColumnData(dr, newRow, "BIZID"); SetOneColumnData(dr, newRow, "GUID"); SetOneColumnData(dr, newRow, "DURATIONEVENTNO"); SetOneColumnData(confirmationNo, newRow, "CONFIRMATIONNO"); SetOneColumnData(dr, newRow, "DURATIONOPERATIONTYPE"); SetOneColumnData(dr, newRow, "DURATIONOPERATIONDATE"); SetOneColumnData(dr, newRow, "RENEWALDATE"); SetOneColumnData(dr, newRow, "DEFAULTINGPARTY"); SetOneColumnData(dr, newRow, "DEFAULTEVENT"); SetOneColumnData(dr, newRow, "CHANGEAMOUNT"); SetOneColumnData(dr, newRow, "BALANCE"); SetOneColumnData(dr, newRow, "AMOUNTPAIDTHISTIME"); SetOneColumnData(dr, newRow, "MARGINRATIO"); //SetOneColumnData(dr, newRow, "CURRENTPOSITIONDETAILS"); SetOneColumnData(dr, newRow, "SWAPDURATIONMANAGEMENTATT"); SetOneColumnData(dr, newRow, "BLANK1"); SetOneColumnData(dr, newRow, "BLANK2"); SetOneColumnData(dr, newRow, "SUBMIT_STATUS"); SetOneColumnData(dr, newRow, "OPERATIONTYPE"); SetOneColumnData(dr, newRow, "BUSIDATE"); dtSwapLifeCycle.Rows.Add(newRow); } /// /// 增加持仓明细记录 /// /// /// /// /// private void CreateSwapLifeCyclePosDtNewRow( DataTable dtSwapLifeCyclePosDt, OracleDataReader dr, Dictionary> indexDict, Action>, DataRow, string> action) { var newRow = dtSwapLifeCyclePosDt.NewRow(); SetOneColumnData(dr, newRow, "GUID", "GUID"); var no = SetOneColumnData(dr, newRow, "CONFIRMATIONNO"); SetOneColumnData(dr, newRow, "BUSIDATE"); //SetOneColumnData(dr, newRow, "DURATIONOPERATIONTYPE"); SetOneColumnData(dr, newRow, "UNDRLYGASSETCODE"); SetOneColumnData(dr, newRow, "UNDRLYGASSETDTLDTYPE"); SetOneColumnData(dr, newRow, "UNDRLYGASSETNAME"); SetOneColumnData(dr, newRow, "UNDRLYGASSETTRADEPLACE"); SetOneColumnData(dr, newRow, "UNDRLYGASSETPRICE"); SetOneColumnData(dr, newRow, "INVESTORPOSITION"); SetOneColumnData(dr, newRow, "UNDRLYGASSETAMT"); SetOneColumnData(dr, newRow, "CONTRACTMULTIPLIER"); SetOneColumnData(dr, newRow, "NOTINALPRINCIPLEAMT"); SetOneColumnData(dr, newRow, "BLANK1", "BLANK1"); SetOneColumnData(dr, newRow, "BLANK2", "BLANK2"); SetOneColumnData(dr, newRow, "DURATIONEVENTNO", "DURATIONEVENTNO"); action(indexDict, newRow, no); dtSwapLifeCyclePosDt.Rows.Add(newRow); } /// /// 创建存续期管理表格 /// /// private DataTable CreateSwapLifeCycleDataTable() { var dtSwapLifeCycle = new DataTable("互换交易存续期管理"); dtSwapLifeCycle.Columns.Add("BIZID"); dtSwapLifeCycle.Columns.Add("GUID"); dtSwapLifeCycle.Columns.Add("DURATIONEVENTNO"); var primaryKey = dtSwapLifeCycle.Columns.Add("CONFIRMATIONNO"); dtSwapLifeCycle.Columns.Add("DURATIONOPERATIONTYPE"); dtSwapLifeCycle.Columns.Add("DURATIONOPERATIONDATE"); dtSwapLifeCycle.Columns.Add("RENEWALDATE"); dtSwapLifeCycle.Columns.Add("DEFAULTINGPARTY"); dtSwapLifeCycle.Columns.Add("DEFAULTEVENT"); dtSwapLifeCycle.Columns.Add("CHANGEAMOUNT"); dtSwapLifeCycle.Columns.Add("BALANCE"); dtSwapLifeCycle.Columns.Add("AMOUNTPAIDTHISTIME"); dtSwapLifeCycle.Columns.Add("MARGINRATIO"); //dtSwapLifeCycle.Columns.Add("CURRENTPOSITIONDETAILS"); dtSwapLifeCycle.Columns.Add("SWAPDURATIONMANAGEMENTATT"); dtSwapLifeCycle.Columns.Add("BLANK1"); dtSwapLifeCycle.Columns.Add("BLANK2"); dtSwapLifeCycle.Columns.Add("SUBMIT_STATUS"); dtSwapLifeCycle.Columns.Add("OPERATIONTYPE"); dtSwapLifeCycle.Columns.Add("BUSIDATE"); dtSwapLifeCycle.PrimaryKey = new DataColumn[] { primaryKey }; return dtSwapLifeCycle; } /// /// 创建存续期管理-合约持仓明细表格 /// /// private DataTable CreateSwapLifeCyclePosDtDataTable() { var dtSwapLifeCyclePosDt = new DataTable("合约持仓明细"); dtSwapLifeCyclePosDt.Columns.Add("GUID"); dtSwapLifeCyclePosDt.Columns.Add("CONFIRMATIONNO"); dtSwapLifeCyclePosDt.Columns.Add("BUSIDATE"); //dtSwapLifeCycle.Columns.Add("DURATIONOPERATIONTYPE"); dtSwapLifeCyclePosDt.Columns.Add("UNDRLYGASSETCODE"); dtSwapLifeCyclePosDt.Columns.Add("UNDRLYGASSETDTLDTYPE"); dtSwapLifeCyclePosDt.Columns.Add("UNDRLYGASSETNAME"); dtSwapLifeCyclePosDt.Columns.Add("UNDRLYGASSETTRADEPLACE"); dtSwapLifeCyclePosDt.Columns.Add("UNDRLYGASSETPRICE"); dtSwapLifeCyclePosDt.Columns.Add("INVESTORPOSITION"); dtSwapLifeCyclePosDt.Columns.Add("UNDRLYGASSETAMT"); dtSwapLifeCyclePosDt.Columns.Add("CONTRACTMULTIPLIER"); dtSwapLifeCyclePosDt.Columns.Add("NOTINALPRINCIPLEAMT"); dtSwapLifeCyclePosDt.Columns.Add("BLANK1"); dtSwapLifeCyclePosDt.Columns.Add("BLANK2"); dtSwapLifeCyclePosDt.Columns.Add("DURATIONEVENTNO"); return dtSwapLifeCyclePosDt; } #endregion #region 收益互换交易权益端支付视图数据读取 /// /// ///收益互换交易权益端支付 /// /// /// private void GetSwapequityPayment(DbHelper db, DateTime reportDate) { try { var schema = PS.Config.ErpElement.KingstarViewTableSchema.IsNullOrWhiteSpace() ? "" : $"\"{PS.Config.ErpElement.KingstarViewTableSchema}\"."; LogFactory.GetLogger("GetSwapequityPayment").Info("进入GetSwapequityPayment"); var dtSwapEquityPayment = CreateSwapEquityPaymentDataTable(); var sqlStr = new StringBuilder(); sqlStr.Append("SELECT quitypayment.* "); sqlStr.Append($"FROM {schema}v_swap_equity_payment_A1016 quitypayment "); sqlStr.Append("WHERE quitypayment.SUBMIT_STATUS = 0 "); sqlStr.Append($" AND quitypayment.OPERATIONTYPE = '{_operationType.ToString()}' AND quitypayment.BUSIDATE='{reportDate.ToString("yyyy-MM-dd")}'");//一对多分组 LogFactory.GetLogger("GetSwapequityPayment").Info($"sqlStr:{sqlStr}"); db.ExecuteSql(sqlStr.ToString(), dr => { try { LogFactory.GetLogger("GetSwapequityPayment ExecuteSql").Info("RowData:" + dr.ToStringContent()); } catch (Exception ex) { LogFactory.GetLogger("GetSwapequityPayment ExecuteSql").Error(ex); } CreateSwapEquityPaymentNewRow(dtSwapEquityPayment, dr); }); if (dtSwapEquityPayment.Rows.Count > 0) { sqlStr.Clear(); sqlStr.Append("SELECT equityaymenttp.* "); sqlStr.Append($"FROM {schema}v_swap_equity_payment_tp_A1016 equityaymenttp "); sqlStr.Append($"WHERE equityaymenttp.BUSIDATE='{reportDate.ToString("yyyy-MM-dd")}'");//一对多分组 LogFactory.GetLogger("dtSwapEquityPaymentTP").Info($"sqlStr:{sqlStr}"); var dtSwapEquityPaymentTP = CreateSwapEquityPaymentTPDataTable(); var dict = new Dictionary>(); db.ExecuteSql(sqlStr.ToString(), dr => { try { LogFactory.GetLogger("dtSwapEquityPaymentTP ExecuteSql").Info("RowData:" + dr.ToStringContent()); } catch (Exception ex) { LogFactory.GetLogger("dtSwapEquityPaymentTP ExecuteSql").Error(ex); } CreateSwapEquityPaymentPtNewRow(dtSwapEquityPaymentTP, dr, dict, setIndexDict); }); dtSwapEquityPaymentTP.ExtendedProperties["Index"] = dict; _viewDataSource.Tables.Add(dtSwapEquityPayment); _viewDataSource.Tables.Add(dtSwapEquityPaymentTP); LogFactory.GetLogger("dtSwapEquityPayment ExecuteSql dtSwapEquityPayment").Info($"dtSwapLifeCycle:{dtSwapEquityPayment.Rows.Count}"); LogFactory.GetLogger("dtSwapEquityPayment ExecuteSql dtSwapEquityPaymentTP").Info($"dtSwapLifeCyclePosDt:{dtSwapEquityPaymentTP.Rows.Count}"); LogFactory.GetLogger("dtSwapEquityPayment Index dtSwapEquityPayment").Info($"Index:{dict.Count}"); } } catch (Exception ex) { LogFactory.GetLogger("GetSwapequityPayment").Error(ex, "出现异常"); } } /// /// 增加权益端支付明细记录 /// /// /// /// /// private void CreateSwapEquityPaymentPtNewRow( DataTable dtSwapEquityPaymentPt, OracleDataReader dr, Dictionary> indexDict, Action>, DataRow, string> action) { var newRow = dtSwapEquityPaymentPt.NewRow(); var no = SetOneColumnData(dr, newRow, "CONFIRMATIONNO"); SetOneColumnData(dr, newRow, "BUSIDATE"); SetOneColumnData(dr, newRow, "PAYMENTMETHOD"); SetOneColumnData(dr, newRow, "PAYER"); SetOneColumnData(dr, newRow, "PAYMENTFREQ"); SetOneColumnData(dr, newRow, "OPENANDCLOSINGDATE"); SetOneColumnData(dr, newRow, "UNDRLYGASSETDTLDTYPE"); SetOneColumnData(dr, newRow, "UNDRLYGASSETCODE"); SetOneColumnData(dr, newRow, "UNDRLYGASSETNAME"); SetOneColumnData(dr, newRow, "UNDRLYGASSETTRADEPLC"); SetOneColumnData(dr, newRow, "UNDRLYGASSETPRICE"); SetOneColumnData(dr, newRow, "UNDRLYGASSETPOSITION"); SetOneColumnData(dr, newRow, "UNDRLYGASSETAMT"); SetOneColumnData(dr, newRow, "CONTRACTMULTIPLIER"); SetOneColumnData(dr, newRow, "LNOTINALPRINCIPLEAMT"); SetOneColumnData(dr, newRow, "SNOTINALPRINCIPLEAMT"); SetOneColumnData(dr, newRow, "INTERESTRATE"); SetOneColumnData(dr, newRow, "BLANK1"); SetOneColumnData(dr, newRow, "BLANK2"); SetOneColumnData(dr, newRow, "DURATIONEVENTNO"); action(indexDict, newRow, no); dtSwapEquityPaymentPt.Rows.Add(newRow); } /// /// 增加权益端支付记录 /// /// /// private void CreateSwapEquityPaymentNewRow(DataTable dtSwapEquityPayment, OracleDataReader dr) { var confirmationNo = GetDataReaderValue(dr, "CONFIRMATIONNO"); var row = dtSwapEquityPayment.Rows.Find(confirmationNo); if (row != null) return;//存在了就不用再加了 var newRow = dtSwapEquityPayment.NewRow(); SetOneColumnData(dr, newRow, "BIZID"); SetOneColumnData(dr, newRow, "BUSIDATE"); SetOneColumnData(dr, newRow, "DURATIONEVENTNO", "DURATIONEVENTNO"); SetOneColumnData(dr, newRow, "CONFIRMATIONNO"); SetOneColumnData(dr, newRow, "BLANK1", "BLANK1"); SetOneColumnData(dr, newRow, "BLANK2", "BLANK2"); SetOneColumnData(dr, newRow, "SUBMIT_STATUS"); SetOneColumnData(dr, newRow, "OPERATIONTYPE"); dtSwapEquityPayment.Rows.Add(newRow); } /// /// 创建权益端支付明细表格 /// /// private DataTable CreateSwapEquityPaymentTPDataTable() { var dtSwapEquityPaymentPt = new DataTable("权益端支付"); dtSwapEquityPaymentPt.Columns.Add("CONFIRMATIONNO"); dtSwapEquityPaymentPt.Columns.Add("BUSIDATE"); dtSwapEquityPaymentPt.Columns.Add("PAYMENTMETHOD"); dtSwapEquityPaymentPt.Columns.Add("PAYER"); dtSwapEquityPaymentPt.Columns.Add("PAYMENTFREQ"); dtSwapEquityPaymentPt.Columns.Add("OPENANDCLOSINGDATE"); dtSwapEquityPaymentPt.Columns.Add("UNDRLYGASSETDTLDTYPE"); dtSwapEquityPaymentPt.Columns.Add("UNDRLYGASSETCODE"); dtSwapEquityPaymentPt.Columns.Add("UNDRLYGASSETNAME"); dtSwapEquityPaymentPt.Columns.Add("UNDRLYGASSETTRADEPLC"); dtSwapEquityPaymentPt.Columns.Add("UNDRLYGASSETPRICE"); dtSwapEquityPaymentPt.Columns.Add("UNDRLYGASSETPOSITION"); dtSwapEquityPaymentPt.Columns.Add("UNDRLYGASSETAMT"); dtSwapEquityPaymentPt.Columns.Add("CONTRACTMULTIPLIER"); dtSwapEquityPaymentPt.Columns.Add("LNOTINALPRINCIPLEAMT"); dtSwapEquityPaymentPt.Columns.Add("SNOTINALPRINCIPLEAMT"); dtSwapEquityPaymentPt.Columns.Add("INTERESTRATE"); dtSwapEquityPaymentPt.Columns.Add("BLANK1"); dtSwapEquityPaymentPt.Columns.Add("BLANK2"); dtSwapEquityPaymentPt.Columns.Add("DURATIONEVENTNO"); return dtSwapEquityPaymentPt; } /// /// 创建权益端支付表格 /// /// private DataTable CreateSwapEquityPaymentDataTable() { var dtSwapEquityPayment = new DataTable("互换交易权益端支付"); dtSwapEquityPayment.Columns.Add("BIZID"); dtSwapEquityPayment.Columns.Add("BUSIDATE"); var primaryKey = dtSwapEquityPayment.Columns.Add("CONFIRMATIONNO"); dtSwapEquityPayment.Columns.Add("DURATIONEVENTNO"); dtSwapEquityPayment.Columns.Add("SUBMIT_STATUS"); dtSwapEquityPayment.Columns.Add("OPERATIONTYPE"); dtSwapEquityPayment.Columns.Add("BLANK1"); dtSwapEquityPayment.Columns.Add("BLANK2"); dtSwapEquityPayment.PrimaryKey = new DataColumn[] { primaryKey }; return dtSwapEquityPayment; } #endregion #region 交易确认书附件视图数据读取 /// /// 交易确认书附件视图数据读取 /// /// /// private void GetSwapConfirmationAtt(DbHelper db, DateTime reportDate) { try { var schema = PS.Config.ErpElement.KingstarViewTableSchema.IsNullOrWhiteSpace() ? "" : $"\"{PS.Config.ErpElement.KingstarViewTableSchema}\"."; LogFactory.GetLogger("GetSwapConfirmationAtt").Info("进入GetSwapConfirmationAtt"); var dtSwapConfirmationAtt = CreateSwapConfirmationAttDataTable(); LogFactory.GetLogger("GetSwapConfirmationAtt").Info("创建完1个DataTable结构"); var sqlStr = new StringBuilder(); sqlStr.Append($"SELECT * FROM {schema}v_confirmationatt_A1017 confirmationatt "); sqlStr.Append($"WHERE confirmationatt.SUBMIT_STATUS = 0 AND confirmationatt.OPERATIONTYPE='{_operationType.ToString()}' AND confirmationatt.BUSIDATE='{reportDate.ToString("yyyy-MM-dd")}'"); LogFactory.GetLogger("GetSwapConfirmationAtt").Info($"sqlStr:{sqlStr}"); db.ExecuteSql(sqlStr.ToString(), dr => { try { LogFactory.GetLogger("GetSwapConfirmationAtt ExecuteSql").Info("RowData:" + dr.ToStringContent()); } catch (Exception ex) { LogFactory.GetLogger("GetSwapConfirmationAtt ExecuteSql").Error(ex); } CreatConfirmationAttNewRow(dtSwapConfirmationAtt, dr); }); _viewDataSource.Tables.Add(dtSwapConfirmationAtt); } catch (Exception ex) { LogFactory.GetLogger("GetSwapConfirmationAtt").Error(ex, "出现异常"); } } private void CreatConfirmationAttNewRow(DataTable dtConfirmationAtt, OracleDataReader dr) { var newRow = dtConfirmationAtt.NewRow(); SetOneColumnData(dr, newRow, "BIZID"); SetOneColumnData(dr, newRow, "BUSIDATE"); SetOneColumnData(dr, newRow, "CONFIRMATIONNO"); SetOneColumnData(dr, newRow, "CONFIRMATIONFILES"); SetOneColumnData(dr, newRow, "SUBMIT_STATUS"); SetOneColumnData(dr, newRow, "OPERATIONTYPE"); dtConfirmationAtt.Rows.Add(newRow); } private DataTable CreateSwapConfirmationAttDataTable() { var dtSwapLifeCycle = new DataTable("交易确认书附件"); dtSwapLifeCycle.Columns.Add("BIZID"); dtSwapLifeCycle.Columns.Add("BUSIDATE"); dtSwapLifeCycle.Columns.Add("CONFIRMATIONNO"); dtSwapLifeCycle.Columns.Add("CONFIRMATIONFILES"); dtSwapLifeCycle.Columns.Add("SUBMIT_STATUS"); dtSwapLifeCycle.Columns.Add("OPERATIONTYPE"); return dtSwapLifeCycle; } #endregion protected List loadSubsystemDataSource(List fileList, Func, string, bool> callback) where T : ReportBaseModel { LogFactory.GetLogger("loadSubsystemDataSource").Info($"开始执行"); var list = new List(); var subSystemOutboxPath = PS.Config.ErpElement.SAC_SubSystemOutboxPath; LogFactory.GetLogger("loadSubsystemDataSource").Info($"subSystemOutboxPath:" + subSystemOutboxPath); if (string.IsNullOrEmpty(subSystemOutboxPath) || !Directory.Exists(subSystemOutboxPath)) { return list; } LogFactory.GetLogger("loadSubsystemDataSource").Info($"目录存在:{subSystemOutboxPath}"); var dateDir = _reqInfo.ReportDate.ToString("yyyyMMdd"); //获取子系统发件箱目录里所有zip压缩文件 var folder = new DirectoryInfo(subSystemOutboxPath); var files = folder.GetFiles("*.zip"); LogFactory.GetLogger("loadSubsystemDataSource").Info($"zip文件个数:" + files.Count()); if (files == null || files.Count() == 0) { return list; } foreach (var file in files) { LogFactory.GetLogger("loadSubsystemDataSource").Info($"准备读取{file.Name}"); //zip压缩文件名包含报送日期才需要读取解析 if (!file.Name.Contains("_" + dateDir + "_")) { continue; } LogFactory.GetLogger("loadSubsystemDataSource").Info($"文件名中包含{dateDir}"); //获取文件不包含扩展名的文件名 var tag = Path.GetFileNameWithoutExtension(file.FullName); //待解压的包含路径的完整文件名 var targetName = Path.Combine(subSystemOutboxPath, file.Name); LogFactory.GetLogger("loadSubsystemDataSource").Info($"targetName:" + targetName); //解压后文件的根目录 var fileDir = Path.Combine(subSystemOutboxPath, tag); //注意解压后会自动创建压缩文件名对应的文件夹,就在子系统发件箱目录下建立解压文件夹 var tDir = subSystemOutboxPath; //不存在才解压 var msg = ""; //解压 if (!Directory.Exists(fileDir)) { ZipHelper.unZipFile(targetName, tDir, out msg); LogFactory.GetLogger("loadSubsystemDataSource").Info($"解压成功:targetName:" + targetName + ",tDir:" + tDir); } //存在说明已经解压过了 //解压后文件的附件根目录 var fileAttachmentDir = Path.Combine(subSystemOutboxPath, tag, "ATTACHMENT"); //获取解压文件夹下的所有xml报告文件 var reportFolder = new DirectoryInfo(fileDir); //当前报告类型的业务才去解析获取数据,即只获取当前业务类型的数据,通过文件名判断 //如OTC_134083_000899_20220629_0001_A1001_A.xml var matchBusiTypeTag = $"*{BusiDataType}_{_operationType}*"; var reportFiles = reportFolder.GetFiles(matchBusiTypeTag); //遍历每个xml报告文件 LogFactory.GetLogger("loadSubsystemDataSource").Info($"reportFilesCount:" + reportFiles.Count()); foreach (var reportFile in reportFiles) { LogFactory.GetLogger("loadSubsystemDataSource").Info($"准备解析:{reportFile.FullName}"); //读取xml文件,并反序列化成对象 var xml = File.ReadAllText(reportFile.FullName); var model = XmlHelper.Deserialize(xml); if (model.Body == null) { continue; } //记录xml报告文件,等读取完后,需要删掉 xmlAttachmentList.Add(reportFile.FullName); //根据不同报送业务类型,加载数据 switch (Enum.Parse(typeof(DataFlagsEnum), model.Header.BusiDataType.ToString())) { case DataFlagsEnum.A1001: foreach (var x in model.Body.MasterAgrmt) { //子系统的数据忽略字段检查 x.OperationType = (OptFlagsEnum)Enum.Parse(typeof(OptFlagsEnum), model.Header.OperationType, true); x.IgnoreCheck = true; //通过调用委托返回业务的附件文件名数据 var flist = new List(); //调用委托构造notes数据 var ret = callback(x as T, flist, tag); if (!ret) { continue; } //把返回的附件文件名加上完整路径添加到附件集合待后边删除 flist.ForEach(attchment => { var path = Path.Combine(fileAttachmentDir, attchment); //把附件添加到报告附件列表,为了生成报告 fileList.Add(path); //把附件添加到附件列表中,以便后边删除 xmlAttachmentList.Add(path); }); //添加数据到数据集合当中 list.Add(x as T); }; break; case DataFlagsEnum.A1002: foreach (var x in model.Body.MasterAgrmtProduct) { x.OperationType = (OptFlagsEnum)Enum.Parse(typeof(OptFlagsEnum), model.Header.OperationType, true); //子系统的数据忽略字段检查 x.IgnoreCheck = true; //通过调用委托返回业务的附件文件名数据 var flist = new List(); //调用委托构造notes数据 var ret = callback(x as T, flist, tag); if (!ret) { continue; } //把返回的附件文件名加上完整路径添加到附件集合待后边删除 flist.ForEach(attchment => { var path = Path.Combine(fileAttachmentDir, attchment); //把附件添加到报告附件列表,为了生成报告 fileList.Add(path); //把附件添加到附件列表中,以便后边删除 xmlAttachmentList.Add(path); }); //添加数据到数据集合当中 list.Add(x as T); }; break; case DataFlagsEnum.A1003: foreach (var x in model.Body.SupAgrmt) { x.OperationType = (OptFlagsEnum)Enum.Parse(typeof(OptFlagsEnum), model.Header.OperationType, true); //子系统的数据忽略字段检查 x.IgnoreCheck = true; //通过调用委托返回业务的附件文件名数据 var flist = new List(); //调用委托构造notes数据 var ret = callback(x as T, flist, tag); if (!ret) { continue; } //把返回的附件文件名加上完整路径添加到附件集合待后边删除 flist.ForEach(attchment => { var path = Path.Combine(fileAttachmentDir, attchment); //把附件添加到报告附件列表,为了生成报告 fileList.Add(path); //把附件添加到附件列表中,以便后边删除 xmlAttachmentList.Add(path); }); //添加数据到数据集合当中 list.Add(x as T); }; break; case DataFlagsEnum.A1008: foreach (var x in model.Body.PerformanceGuaranteeAgrmt) { x.OperationType = (OptFlagsEnum)Enum.Parse(typeof(OptFlagsEnum), model.Header.OperationType, true); //子系统的数据忽略字段检查 x.IgnoreCheck = true; //通过调用委托返回业务的附件文件名数据 var flist = new List(); //调用委托构造notes数据 var ret = callback(x as T, flist, tag); if (!ret) { continue; } //把返回的附件文件名加上完整路径添加到附件集合待后边删除 flist.ForEach(attchment => { var path = Path.Combine(fileAttachmentDir, attchment); //把附件添加到报告附件列表,为了生成报告 fileList.Add(path); //把附件添加到附件列表中,以便后边删除 xmlAttachmentList.Add(path); }); //添加数据到数据集合当中 list.Add(x as T); }; break; case DataFlagsEnum.A1004: foreach (var x in model.Body.OptionConfirmation) { x.OperationType = (OptFlagsEnum)Enum.Parse(typeof(OptFlagsEnum), model.Header.OperationType, true); //子系统的数据忽略字段检查 x.IgnoreCheck = true; //通过调用委托返回业务的附件文件名数据 var flist = new List(); //调用委托构造notes数据 var ret = callback(x as T, flist, tag); if (!ret) { continue; } //把返回的附件文件名加上完整路径添加到附件集合待后边删除 flist.ForEach(attchment => { var path = Path.Combine(fileAttachmentDir, attchment); //把附件添加到报告附件列表,为了生成报告 fileList.Add(path); //把附件添加到附件列表中,以便后边删除 xmlAttachmentList.Add(path); }); //添加数据到数据集合当中 list.Add(x as T); }; break; case DataFlagsEnum.A1005: foreach (var x in model.Body.SwapConfirmation) { x.OperationType = (OptFlagsEnum)Enum.Parse(typeof(OptFlagsEnum), model.Header.OperationType, true); //子系统的数据忽略字段检查 x.IgnoreCheck = true; //通过调用委托返回业务的附件文件名数据 var flist = new List(); //调用委托构造notes数据 var ret = callback(x as T, flist, tag); if (!ret) { continue; } //把返回的附件文件名加上完整路径添加到附件集合待后边删除 flist.ForEach(attchment => { var path = Path.Combine(fileAttachmentDir, attchment); //把附件添加到报告附件列表,为了生成报告 fileList.Add(path); //把附件添加到附件列表中,以便后边删除 xmlAttachmentList.Add(path); }); //添加数据到数据集合当中 list.Add(x as T); }; break; case DataFlagsEnum.A1007: foreach (var x in model.Body.OptionTermination) { x.OperationType = (OptFlagsEnum)Enum.Parse(typeof(OptFlagsEnum), model.Header.OperationType, true); //子系统的数据忽略字段检查 x.IgnoreCheck = true; //通过调用委托返回业务的附件文件名数据 var flist = new List(); //调用委托构造notes数据 var ret = callback(x as T, flist, tag); if (!ret) { continue; } //把返回的附件文件名加上完整路径添加到附件集合待后边删除 flist.ForEach(attchment => { var path = Path.Combine(fileAttachmentDir, attchment); //把附件添加到报告附件列表,为了生成报告 fileList.Add(path); //把附件添加到附件列表中,以便后边删除 xmlAttachmentList.Add(path); }); //添加数据到数据集合当中 list.Add(x as T); }; break; case DataFlagsEnum.A1006: foreach (var x in model.Body.SwapDurationManagement) { x.OperationType = (OptFlagsEnum)Enum.Parse(typeof(OptFlagsEnum), model.Header.OperationType, true); //子系统的数据忽略字段检查 x.IgnoreCheck = true; //通过调用委托返回业务的附件文件名数据 var flist = new List(); //调用委托构造notes数据 var ret = callback(x as T, flist, tag); if (!ret) { continue; } //把返回的附件文件名加上完整路径添加到附件集合待后边删除 flist.ForEach(attchment => { var path = Path.Combine(fileAttachmentDir, attchment); //把附件添加到报告附件列表,为了生成报告 fileList.Add(path); //把附件添加到附件列表中,以便后边删除 xmlAttachmentList.Add(path); }); //添加数据到数据集合当中 list.Add(x as T); }; break; case DataFlagsEnum.A1016: foreach (var x in model.Body.SwapEquityPayment) { x.OperationType = (OptFlagsEnum)Enum.Parse(typeof(OptFlagsEnum), model.Header.OperationType, true); //子系统的数据忽略字段检查 x.IgnoreCheck = true; //通过调用委托返回业务的附件文件名数据 var flist = new List(); //调用委托构造notes数据 var ret = callback(x as T, flist, tag); if (!ret) { continue; } //把返回的附件文件名加上完整路径添加到附件集合待后边删除 flist.ForEach(attchment => { var path = Path.Combine(fileAttachmentDir, attchment); //把附件添加到报告附件列表,为了生成报告 fileList.Add(path); //把附件添加到附件列表中,以便后边删除 xmlAttachmentList.Add(path); }); //添加数据到数据集合当中 list.Add(x as T); }; break; case DataFlagsEnum.A1017: foreach (var x in model.Body.ConfirmationAtt) { if (string.IsNullOrWhiteSpace(x.ConfirmationFilesTuple.FirstOrDefault()?.ConfirmationFiles)) { continue; } x.OperationType = (OptFlagsEnum)Enum.Parse(typeof(OptFlagsEnum), model.Header.OperationType, true); //子系统的数据忽略字段检查 x.IgnoreCheck = true; //通过调用委托返回业务的附件文件名数据 var flist = new List(); //调用委托构造notes数据 var ret = callback(x as T, flist, tag); if (!ret) continue; //把返回的附件文件名加上完整路径添加到附件集合待后边删除 flist.ForEach(attchment => { var path = Path.Combine(fileAttachmentDir, attchment); //把附件添加到报告附件列表,为了生成报告 fileList.Add(path); //把附件添加到附件列表中,以便后边删除 xmlAttachmentList.Add(path); }); //添加数据到数据集合当中 list.Add(x as T); }; break; case DataFlagsEnum.A1018: foreach (var x in model.Body.ValuationInformation) { x.OperationType = (OptFlagsEnum)Enum.Parse(typeof(OptFlagsEnum), model.Header.OperationType, true); //子系统的数据忽略字段检查 x.IgnoreCheck = true; //通过调用委托返回业务的附件文件名数据 var flist = new List(); //调用委托构造notes数据 var ret = callback(x as T, flist, tag); if (!ret) continue; //把返回的附件文件名加上完整路径添加到附件集合待后边删除 flist.ForEach(attchment => { var path = Path.Combine(fileAttachmentDir, attchment); //把附件添加到报告附件列表,为了生成报告 fileList.Add(path); //把附件添加到附件列表中,以便后边删除 xmlAttachmentList.Add(path); }); //添加数据到数据集合当中 list.Add(x as T); }; break; case DataFlagsEnum.A1019: foreach (var x in model.Body.ConfirmationAtt) { if (string.IsNullOrWhiteSpace(x.ConfirmationFilesTuple.FirstOrDefault()?.ConfirmationAtt)) { continue; } x.OperationType = (OptFlagsEnum)Enum.Parse(typeof(OptFlagsEnum), model.Header.OperationType, true); //子系统的数据忽略字段检查 x.IgnoreCheck = true; //通过调用委托返回业务的附件文件名数据 var flist = new List(); //调用委托构造notes数据 var ret = callback(x as T, flist, tag); if (!ret) { continue; } //把返回的附件文件名加上完整路径添加到附件集合待后边删除 flist.ForEach(attchment => { var path = Path.Combine(fileAttachmentDir, attchment); //把附件添加到报告附件列表,为了生成报告 fileList.Add(path); //把附件添加到附件列表中,以便后边删除 xmlAttachmentList.Add(path); }); //添加数据到数据集合当中 list.Add(x as T); }; break; default: break; } } } return list; } /// /// 生成ExceID /// /// /// protected string formatExceID(IEnumerable dataSource = null) { var exceId = ""; IQueryable query; if (dataSource != null) { query = dataSource.AsQueryable(); } else { query = DbContext.sac_report_notes; } do { exceId = $"{_reqInfo.SenderCode}{_reqInfo.ReceiverCode}{_reqInfo.ReportDate.ToString("yyyyMMdd")}{MaxExceIndex.ToString("00000000")}"; MaxExceIndex = MaxExceIndex + 1; } while (query.Any(O => O.ExceId == exceId)); return exceId; } /// /// 获取指定日期所在的季度以及季度起始日 /// 返回"01","02","03","04" /// /// /// /// /// public static string GetQuarterRange(DateTime valueDate, out DateTime minDate, out DateTime maxDate) { var quarter = (((valueDate.Month - 1) / 3) + 1).ToString("00"); if (valueDate.Day == 15) { quarter = "05"; } switch (quarter) { case "01": minDate = new DateTime(valueDate.Year, 01, 01); maxDate = new DateTime(valueDate.Year, 03, 31); break; case "02": minDate = new DateTime(valueDate.Year, 04, 01); maxDate = new DateTime(valueDate.Year, 06, 30); break; case "03": minDate = new DateTime(valueDate.Year, 07, 01); maxDate = new DateTime(valueDate.Year, 09, 30); break; case "04": minDate = new DateTime(valueDate.Year, 10, 01); maxDate = new DateTime(valueDate.Year, 12, 31); break; case "05": if (valueDate.Month < 6) { minDate = new DateTime(valueDate.Year, 01, 01); maxDate = new DateTime(valueDate.Year, 06, 30); } else { minDate = new DateTime(valueDate.Year, 07, 01); maxDate = new DateTime(valueDate.Year, 12, 31); } break; default: throw new ServiceException("未知日期"); } return quarter; } protected string ViewLocalAttFileDir { get { return PS.Config.ErpElement.KingstarView_LocalViewAttDir; } } protected string CreateViewAttDownloadPath(string viewAttFileName) { //var configPath = "/usr/local/minio/kingstar";// var configPath = PS.Config.ErpElement.KingstarView_RemoteFileRootPath; var path = $"{configPath}/data/{viewAttFileName}"; return path; } /// /// 从DataTable中获取索引字典 /// /// /// protected Dictionary> readIndexDict(string tableName) { Dictionary> result = null; if (_viewDataSource != null && _viewDataSource.Tables.Contains(tableName)) { DataTable dt = _viewDataSource.Tables[tableName]; if (dt.ExtendedProperties["Index"] is Dictionary> dict) { result = dict; LogFactory.GetLogger("Index").Info($"取出索引:{dict.Count}"); } } return result; } protected string formatUnderlyingCode(string underlyingCode, List dictItemMap, string name, string defaultValue = "") { if (underlyingCode == null || underlyingCode.Contains(".")) { return underlyingCode; } if (name == null || dictItemMap == null) { return defaultValue; } var obj = dictItemMap.FirstOrDefault(O => O.Name == name); var suffix = (obj == null ? defaultValue : obj.ShortName); if (suffix.IsNullOrWhiteSpace()) { return underlyingCode; } return $"{underlyingCode}.{suffix}"; } /// /// 获取普通互换客户方向多空 山证金衍 逻辑 /// /// /// /// /// public string GetClientSideLongShort(bool isPayFloat, string getLongShort, string payLongShort) { string getPayStr = isPayFloat ? ("支付" + payLongShort) : ("收取" + getLongShort); switch (getPayStr) { case "收取多头": return "空头"; case "收取空头": return "多头"; case "支付多头": return "多头"; case "支付空头": return "空头"; default: return ""; } } } }