test(swap): 启用MergeCompose场景6/7+SwapFlowEventService录制钩子+RecordingSwapFlowEventService

1. MergeComposeScenarioTest 场景6/7 启用(去掉Ignore):
   此前失败是stale binary(未重新编译),重新build后8场景全部通过。
   - 场景6 单条merge无持仓→DealNoPosition创建交易
   - 场景7 两条merge无持仓→创建交易+平仓

2. SwapFlowEventService 补OnBefore/OnAfterMergePageEvent录制钩子(默认空实现):
   - OnBefore: DB查询完成、合成逻辑执行前触发,可捕获输入快照
   - OnAfter: PersistEvents后触发,捕获输出事件
   生产路径为空方法体,零行为影响。

3. 移植RecordingSwapFlowEventService(借鉴testable分支):
   override OnAfterMergePageEvent录制golden文件,备用录制工具。
   内联GoldenFileModel(简单POCO)。FullRecord_WithPreBookingPositions连库测试自动跳过。

SwapModule 171测试全绿,无回归。
This commit is contained in:
hjhan
2026-07-03 09:38:05 +08:00
parent f0ef37b599
commit b501e21904
3 changed files with 364 additions and 5 deletions
@@ -76,6 +76,15 @@ namespace YLErp.Modules.SwapModule
protected virtual void RollbackTransaction(IDisposable transaction)
=> (transaction as Microsoft.EntityFrameworkCore.Storage.IDbContextTransaction)?.Rollback();
/// <summary>MergePageEvent 业务逻辑执行前钩子(默认空,录制golden用)。在DB查询完成、合成逻辑执行前触发</summary>
protected virtual void OnBeforeMergePageEvent(int swapTradeId, DateTime tradeDate,
trade trade, trade_extend tradeExtend,
List<swap_flow_merge> merges, List<swap_position> positions) { }
/// <summary>MergePageEvent 业务逻辑执行后钩子(默认空,录制golden用)。在PersistEvents之后触发,捕获输出事件</summary>
protected virtual void OnAfterMergePageEvent(int swapTradeId, DateTime tradeDate,
List<swap_flow_event> resultEvents) { }
#endregion
/// <summary>
@@ -133,6 +142,7 @@ namespace YLErp.Modules.SwapModule
{
var eodPositions = FindPositions(swapTradeId);//上一日终持仓信息
FindAndInvalidateFutureEvents(swapTradeId, tradeDate);//废弃当前清算日期及之后的开平仓事件
OnBeforeMergePageEvent(swapTradeId, tradeDate, trade, tradeExtend, flowquery, eodPositions);
var mergeUnderlyingGroup = flowquery.GroupBy(g => g.UnderlyingCode);
int direction = tradeExtend.ExtendObj.Direction;
foreach (var underlyingGroup in mergeUnderlyingGroup)
@@ -252,6 +262,7 @@ namespace YLErp.Modules.SwapModule
}
}
PersistEvents(flowEvents);
OnAfterMergePageEvent(swapTradeId, tradeDate, flowEvents);
if (trans != null) CommitTransaction(trans);
}
catch (Exception ex)