diff --git a/YLErpDAL/Modules/TradeModule/DealModule/TradeContractGenerateService.cs b/YLErpDAL/Modules/TradeModule/DealModule/TradeContractGenerateService.cs index 019471f3..23797147 100644 --- a/YLErpDAL/Modules/TradeModule/DealModule/TradeContractGenerateService.cs +++ b/YLErpDAL/Modules/TradeModule/DealModule/TradeContractGenerateService.cs @@ -195,6 +195,9 @@ namespace YLErp.Modules.TradeModule.DealModule public bool GJGenerateConfirmBook(List tradeIds, string docType, out IEnumerable errors, out IEnumerable files, DateTime? startDate = null, DateTime? endDate = null) { + var logger = LogFactory.GetLogger("生成确认书"); + logger.Info($"[GJGenerateConfirmBook] 开始生成确认书 - tradeIds.Count: {tradeIds?.Count ?? 0}, docType: {docType}, startDate: {startDate}, endDate: {endDate}"); + Func getUnderlyingInstrumentType = new Func((underlyingId) => { return DataCacheProvider.GetUnderlyingDataSource().GetData(underlyingId)?.UnderlyingInstrumentType; @@ -204,9 +207,30 @@ namespace YLErp.Modules.TradeModule.DealModule List file = new List(); if (PS.Config.Company == CompanyEnum.浙商) { - LogFactory.GetLogger("生成确认书").Error("浙商生成确认书"); + logger.Info("[GJGenerateConfirmBook] 生成确认书流程"); + + if (tradeIds == null || !tradeIds.Any()) + { + logger.Info("[GJGenerateConfirmBook] tradeIds 为空,直接返回"); + errors = new List(); + files = new List(); + return true; + } + var trades = DbContext.trade.Where(x => tradeIds.Contains(x.id)).AsNoTracking().ToList(); + logger.Info($"[GJGenerateConfirmBook] 查询到交易记录数: {trades.Count}"); + + if (!trades.Any()) + { + logger.Info("[GJGenerateConfirmBook] 未找到交易记录,直接返回"); + errors = new List(); + files = new List(); + return true; + } + var clientIds = trades.Select(x => x.ClientId).Distinct().ToList(); + logger.Info($"[GJGenerateConfirmBook] 客户ID数: {clientIds.Count}"); + var allTrades = DbContext.trade.Where(x => clientIds.Contains(x.ClientId) && x.ValidState != ConsGlobal.InValid); if (startDate.HasValue) { @@ -219,59 +243,127 @@ namespace YLErp.Modules.TradeModule.DealModule var Ids = allTrades.Select(o => o.id).Distinct().ToArray(); var swapPositions = DbContext.swap_position.Where(s => Ids.Contains(s.SwapTradeId) && s.IsInitial && s.PositionType > 0 && !s.Invalid) .Distinct().ToList(); + logger.Info($"[GJGenerateConfirmBook] 查询到持仓记录数: {swapPositions.Count}"); + var allTradeList = allTrades.AsNoTracking().ToList(); foreach (var item in allTradeList) { item.swap_positions.Add(swapPositions.FirstOrDefault(o => o.SwapTradeId == item.id)); } allTradeList = allTradeList.Where(x => x.swap_positions.Any()).ToList(); + logger.Info($"[GJGenerateConfirmBook] 过滤后有持仓的交易数: {allTradeList.Count}"); + // 按照客户ID、交易日期、多空头进行分组 - var group = allTradeList.GroupBy(O => new { O.ClientId, O.StartDate, O.swap_positions.FirstOrDefault().PositionType }) + var group = allTradeList.GroupBy(O => new { O.ClientId, O.StartDate, O.swap_positions.FirstOrDefault()?.PositionType }) .ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList()); + + logger.Info($"[GJGenerateConfirmBook] 分组数: {group.Count}"); foreach (var item in group) { - LogFactory.GetLogger("生成确认书").Error("浙商生成确认书" + item.Value.Distinct().ToList().Count()); + var tradeCount = item.Value.Distinct().Count(); + logger.Info($"[GJGenerateConfirmBook] 处理分组 - ClientId: {item.Key.ClientId}, StartDate: {item.Key.StartDate}, PositionType: {item.Key.PositionType}, 交易数: {tradeCount}"); groupGenerateHandle(item.Value.Distinct().ToList(), docType, startDate, endDate, results, error, file); } } errors = results.Where(n => !string.IsNullOrWhiteSpace(n.ErrorMessage)).Select(n => n.ErrorMessage).ToList(); files = results.Where(n => !string.IsNullOrWhiteSpace(n.OutputFilePath)).Select(n => n.OutputFilePath).ToList(); + logger.Info($"[GJGenerateConfirmBook] 完成生成确认书 - 错误数: {errors.Count()}, 文件数: {files.Count()}"); return !errors.Any(); } private void groupGenerateHandle_Date(List ids, string docType, DateTime? startDate, DateTime? endDate, List results, List error, List file) { + var logger = LogFactory.GetLogger("生成确认书"); + logger.Info($"[groupGenerateHandle_Date] 开始处理 - ids.Count: {ids?.Count ?? 0}"); + + if (ids == null || !ids.Any()) + { + logger.Info("[groupGenerateHandle_Date] ids 为空,直接返回"); + return; + } + var trades = DbContext.trade.Where(c => ids.Contains(c.id)).ToList(); - var supProtocolDate = DataCacheProvider.GetClientDataSource().GetData(trades.FirstOrDefault().ClientId).SupProtocolDate; + logger.Info($"[groupGenerateHandle_Date] 查询到交易数: {trades.Count}"); + + if (!trades.Any()) + { + logger.Info("[groupGenerateHandle_Date] 未找到交易记录,直接返回"); + return; + } + + var firstTrade = trades.FirstOrDefault(); + if (firstTrade == null) + { + logger.Info("[groupGenerateHandle_Date] 第一条交易记录为 null,直接返回"); + return; + } + + var client = DataCacheProvider.GetClientDataSource().GetData(firstTrade.ClientId); + if (client == null) + { + logger.Info($"[groupGenerateHandle_Date] 未找到客户信息 - ClientId: {firstTrade.ClientId}"); + return; + } + + var supProtocolDate = client.SupProtocolDate; + logger.Info($"[groupGenerateHandle_Date] 客户补充协议日期: {supProtocolDate}"); + var groupDateDouble = trades.Where(x => supProtocolDate == null || x.TradeDate < supProtocolDate).Select(x => x.id).ToList(); var groupDateSingle = trades.Where(x => supProtocolDate != null && x.TradeDate >= supProtocolDate).Select(x => x.id).ToList(); + + logger.Info($"[groupGenerateHandle_Date] 双章确认书交易数: {groupDateDouble.Count}, 单章确认书交易数: {groupDateSingle.Count}"); + // 单章确认书和双章确认书同时生成要生成两个文件 if (groupDateDouble.Any() && groupDateSingle.Any()) { + logger.Info("[groupGenerateHandle_Date] 同时生成单章和双章确认书"); groupGenerateHandle(groupDateDouble, docType, startDate, supProtocolDate.Value.AddDays(-1), results, error, file); groupGenerateHandle(groupDateSingle, docType, supProtocolDate, endDate, results, error, file); } else if (groupDateDouble.Any()) { + logger.Info("[groupGenerateHandle_Date] 仅生成双章确认书"); groupGenerateHandle(groupDateDouble, docType, startDate, endDate, results, error, file); } else if (groupDateSingle.Any()) { + logger.Info("[groupGenerateHandle_Date] 仅生成单章确认书"); groupGenerateHandle(groupDateSingle, docType, startDate, endDate, results, error, file); } + else + { + logger.Info("[groupGenerateHandle_Date] 没有需要生成的确认书"); + } } private void groupGenerateHandle(List ids, string docType, DateTime? startDate, DateTime? endDate, List results, List error, List file) { + var logger = LogFactory.GetLogger("生成确认书"); + logger.Info($"[groupGenerateHandle] 开始处理 - ids.Count: {ids?.Count ?? 0}, docType: {docType}"); + + if (ids == null || !ids.Any()) + { + logger.Info("[groupGenerateHandle] ids 为空,直接返回"); + return; + } + var trade_contract_r = DbContext.trade_contract_r.Where(c => ids.Contains(c.TradeId) && c.Type == "交易确认书" && c.IsValid).ToList(); + logger.Info($"[groupGenerateHandle] 找到已存在的确认书记录数: {trade_contract_r.Count}"); + //DbContext.trade_contract_r.RemoveRange(trade_contract_r); trade_contract_r.ForEach(O => O.IsValid = false); DbContext.SaveChanges(); + + logger.Info("[groupGenerateHandle] 调用 BatchConfirmationGenerateService.Generate"); var result = new BatchConfirmationGenerateService(this).Generate(ids, docType, startDate, endDate); + logger.Info($"[groupGenerateHandle] 生成结果 - 成功数: {result.Count(r => string.IsNullOrWhiteSpace(r.ErrorMessage))}, 失败数: {result.Count(r => !string.IsNullOrWhiteSpace(r.ErrorMessage))}"); + results.AddRange(result); error.AddRange(results.Where(n => !string.IsNullOrWhiteSpace(n.ErrorMessage)).Select(n => n.ErrorMessage).ToArray()); file.AddRange(results.Where(n => !string.IsNullOrWhiteSpace(n.OutputFilePath)).Select(n => n.OutputFilePath).ToList()); + + logger.Info($"[groupGenerateHandle] 完成处理 - 当前总错误数: {error.Count}, 当前总文件数: {file.Count}"); } public bool GXJY_CorrespondingConfirmationTemplate(List tradeIds, out string ErrMsg)