using System.Text; using YLErp.DBModels.Consts; using YLErp.Helpers; using YLErp.Office; namespace YLErp.Modules.ApiModule.ExportModule { /// /// /// public class OtcTradeContractDocExportService : YLBaseService { public OtcTradeContractDocExportService(OptUserInfo userInfo) : base(userInfo) { } /// /// 生成开仓确认书批量导出文件 /// public byte[] GetZipFileOfOpenDocs(OtcTradeContractOpenDocExportRequest req, out TradeContractDocFileExportInfo[] exportInfos) { if (req is null) { throw new ArgumentNullException(nameof(req)); } int[] clientIds = null; if (req.ClientNumbers != null && req.ClientNumbers.Any()) { clientIds = DataCacheProvider.GetClientDataSource().AsQueryable() .Where(n => req.ClientNumbers.Contains(n.Number)) .Select(n => n.id).ToArray(); } var tdPredicate = PredicateBuilder.Create(td => td.ValidState != ConsGlobal.InValid && td.TradeDate >= req.OpenDateRangeStart && ("结构化交易" != td.TradeType || td.IsGroup == 1) && td.IsGroup != 2); if (req.TradeNumbers != null && req.TradeNumbers.Any()) { tdPredicate = tdPredicate.And(td => req.TradeNumbers.Contains(td.TradeNumber)); } if (req.TradeStatus != null && req.TradeStatus.Any()) { tdPredicate = tdPredicate.And(td => req.TradeStatus.Contains(td.TradeStatus)); } if (clientIds != null) { tdPredicate = tdPredicate.And(td => clientIds.Contains(td.ClientId)); } if (req.OpenDateRangeEnd.HasValue) { tdPredicate = tdPredicate.And(td => td.TradeDate <= req.OpenDateRangeEnd.Value); } var rPredicate = PredicateBuilder.Create(r => r.IsValid && (r.Type == ContractTypeEnum.Trade || r.Type == ContractTypeEnum.AdditionalTrade)); var query = from td in DbContext.trade.Where(tdPredicate) join r in DbContext.trade_contract_r.Where(rPredicate) on td.id equals r.TradeId into r_t from r in r_t.DefaultIfEmpty() join d in DbContext.trade_contract_document on r.ContractCode equals d.Code into d_t from d in d_t.DefaultIfEmpty() select new TradeContractDocFileExportInfo { TradeNumber = td.TradeNumber, TradeStatus = td.TradeStatus, ValueDate = td.TradeDate, ContractCode = r.ContractCode, FilePath = d.Paths, FileName = d.FileName, StampDocumentFileName = d.StampDocumentFileName }; //DbContext.SetDebugLog(); exportInfos = query.ToArray(); var zipEntryList = new List(exportInfos.Length + 1); foreach (var info in exportInfos) { if (PS.Config.ErpElement.ConfirmBookStampStatus && !string.IsNullOrWhiteSpace(info.StampDocumentFileName)) { var filePath = TradeContractHelper.GetPhysicalPath(info.StampDocumentFileName); if (File.Exists(filePath)) { var entry = MyZipEntry.Create(filePath); zipEntryList.Add(entry); info.FileName = entry.Name; } else { info.ErrorMsg = "已用印交易确认书文件不存在"; } } else { var filePath = TradeContractHelper.GetAbsolutePath(info.FilePath, info.FileName); if (File.Exists(filePath)) { var entry = MyZipEntry.Create(filePath); zipEntryList.Add(entry); info.FileName = entry.Name; } else { info.ErrorMsg = "交易确认书文件不存在"; } } } zipEntryList.Add(new MyZipEntry { Name = "info.txt", Buffer = Encoding.UTF8.GetBytes(JsonBeautify.Serialize(exportInfos)) }); return ZipFileHelper.ZipFiles(zipEntryList); } /// /// 生成了结确认书批量导出文件 /// public byte[] GetZipFileOfCloseDocs(OtcTradeContractCloseDocExportRequest req, out TradeContractDocFileExportInfo[] exportInfos) { if (req is null) { throw new ArgumentNullException(nameof(req)); } int[] clientIds = null; if (req.ClientNumbers != null && req.ClientNumbers.Any()) { clientIds = DataCacheProvider.GetClientDataSource().AsQueryable() .Where(n => req.ClientNumbers.Contains(n.Number)) .Select(n => n.id).ToArray(); } var tdPredicate = PredicateBuilder.Create(td => td.ValidState != ConsGlobal.InValid && ("结构化交易" != td.TradeType || td.IsGroup == 1) && td.IsGroup != 2); if (req.TradeNumbers != null && req.TradeNumbers.Any()) { tdPredicate = tdPredicate.And(td => req.TradeNumbers.Contains(td.TradeNumber)); } if (clientIds != null) { tdPredicate = tdPredicate.And(td => clientIds.Contains(td.ClientId)); } var actionList = new string[] { ClientCashInCashOut.系统操作_行权费, ClientCashInCashOut.系统操作_平仓费, ClientCashInCashOut.系统操作_互换, ClientCashInCashOut.系统操作_票息 }; var tcPredicate = PredicateBuilder.Create(tc => actionList.Contains(tc.Action) && tc.ValidState != ConsGlobal.InValid && !tc.IsDeleted && tc.ValueDate >= req.CloseDateRangeStart); if (req.CloseDateRangeEnd.HasValue) { tcPredicate = tcPredicate.And(tc => tc.ValueDate <= req.CloseDateRangeEnd.Value); } var rPredicate = PredicateBuilder.Create(r => r.IsValid && (r.Type == ContractTypeEnum.Clearing || r.Type == ContractTypeEnum.UnWind)); var query = from tc in DbContext.trade_cash.Where(tcPredicate) join td in DbContext.trade.Where(tdPredicate) on tc.TradeId equals td.id join r in DbContext.trade_contract_r.Where(rPredicate) on new { tc.TradeId, tcId = tc.id } equals new { r.TradeId, tcId = r.TradeCashId.Value } into r_t from r in r_t.DefaultIfEmpty() join doc in DbContext.trade_contract_document on new { Code = r.ContractCode, r.Type } equals new { doc.Code, doc.Type } into doc_t from doc in doc_t.DefaultIfEmpty() select new TradeContractDocFileExportInfo { ValueDate = tc.ValueDate, TradeNumber = td.TradeNumber, TradeStatus = td.TradeStatus, ContractCode = r.ContractCode, FilePath = doc.Paths, FileName = doc.FileName, StampDocumentFileName = null }; //DbContext.SetDebugLog(); exportInfos = query.ToArray(); var zipEntryList = new List(exportInfos.Length + 1); foreach (var info in exportInfos) { var path = info.FilePath; if (string.IsNullOrWhiteSpace(path)) { info.ErrorMsg = "确认书文件不存在"; } else { var filePath = GetFileName(path, ".pdf"); if (string.IsNullOrEmpty(path)) { filePath = GetFileName(path, ".doc"); } if (File.Exists(filePath)) { var entry = MyZipEntry.Create(filePath); zipEntryList.Add(entry); info.FileName = entry.Name; } else { info.ErrorMsg = "确认书文件不存在"; } } } zipEntryList.Add(new MyZipEntry { Name = "info.txt", Buffer = Encoding.UTF8.GetBytes(JsonBeautify.Serialize(exportInfos)) }); return ZipFileHelper.ZipFiles(zipEntryList); } private static string GetFileName(string baseName, string sufferFix) { var fName = Path.ChangeExtension(baseName, sufferFix); if (!string.IsNullOrWhiteSpace(fName) && (fName[0] != '/' || fName[0] != '\\')) { fName = fName.Insert(0, "/"); } fName = OtcAppContext.MapPath(fName); if (!File.Exists(fName)) { fName += "x"; //解决数据库中存的后缀名是doc但实际文件是docx的问题; } return File.Exists(fName) ? fName : null; } } /// /// 交易确认书文档导出信息 /// public class TradeContractDocFileExportInfo { /// /// 交易编号 /// public string TradeNumber { get; set; } /// /// 交易当前状态 /// public string TradeStatus { get; set; } /// /// 开平仓日期 /// public DateTime? ValueDate { get; set; } /// /// 合约编号 /// public string ContractCode { get; set; } /// /// 文件名称 /// public string FileName { get; set; } /// /// 错误信息 /// public string ErrorMsg { get; set; } internal string FilePath { get; set; } internal string StampDocumentFileName { get; set; } public override string ToString() { return $"{TradeNumber}-{ErrorMsg}"; } } }