feat(trade): 添加确认书生成服务的日志记录功能

- 在 GJGenerateConfirmBook 方法中添加详细的日志记录
- 记录交易ID数量、文档类型、开始结束日期等关键参数
- 添加浙商生成确认书流程的日志记录
- 记录 tradeIds 为空或未找到交易记录的情况
- 添加查询交易记录、客户ID、持仓记录的统计日志
- 记录分组处理过程中的详细信息
- 为 groupGenerateHandle_Date 和 groupGenerateHandle 方法添加日志记录
- 记录交易处理、补充协议日期、单双章确认书生成过程
- 添加最终生成结果的统计日志
This commit is contained in:
hjhan
2026-03-25 11:05:23 +08:00
parent bc3664ee92
commit f201dde293
@@ -195,6 +195,9 @@ namespace YLErp.Modules.TradeModule.DealModule
public bool GJGenerateConfirmBook(List<int> tradeIds, string docType,
out IEnumerable<string> errors, out IEnumerable<string> 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<int, string> getUnderlyingInstrumentType = new Func<int, string>((underlyingId) =>
{
return DataCacheProvider.GetUnderlyingDataSource().GetData(underlyingId)?.UnderlyingInstrumentType;
@@ -204,9 +207,30 @@ namespace YLErp.Modules.TradeModule.DealModule
List<string> file = new List<string>();
if (PS.Config.Company == CompanyEnum.)
{
LogFactory.GetLogger("生成确认书").Error("浙商生成确认书");
logger.Info("[GJGenerateConfirmBook] 生成确认书流程");
if (tradeIds == null || !tradeIds.Any())
{
logger.Info("[GJGenerateConfirmBook] tradeIds 为空,直接返回");
errors = new List<string>();
files = new List<string>();
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<string>();
files = new List<string>();
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<int> ids, string docType, DateTime? startDate, DateTime? endDate, List<TradeDocGenerateResult> results, List<string> error, List<string> 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<int> ids, string docType, DateTime? startDate, DateTime? endDate, List<TradeDocGenerateResult> results, List<string> error, List<string> 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<int> tradeIds, out string ErrMsg)