refactor(swap): 提取 SwapPositionQueries.ActiveByTrade 收口有效持仓查询
- 新增 SwapPositionQueries.ActiveByTrade 静态扩展,收口 'SwapTradeId==X && !Invalid' 规则到单一真相 - 替换 SwapDealService/SwapEodPositionService/SwapTradeService 共 7 处纯重复谓词 - 仅返回 IQueryable,不调 SaveChanges,不动 FindTrade seam / 事务边界;行为保持等价
This commit is contained in:
@@ -210,7 +210,7 @@ namespace YLErp.Modules.SwapModule
|
||||
public UnwindData InitUnwind(int tradeId)
|
||||
{
|
||||
var td = DbContext.trade.Find(tradeId);
|
||||
var positions = DbContext.swap_position.Where(x => x.SwapTradeId == tradeId && !x.Invalid);
|
||||
var positions = DbContext.swap_position.ActiveByTrade(tradeId);
|
||||
var um = DataCacheProvider.GetUnderlyingDataSource().GetData(td.UnderlyingCode);
|
||||
bool commodity = ConsGlobal.InstrumentType.CalcTypeIsFutures(um.UnderlyingInstrumentType);
|
||||
List<int> eventTyps = new List<int>() { (int)SwapEventTypeEnum.自动互换, (int)SwapEventTypeEnum.互换 };
|
||||
@@ -355,7 +355,7 @@ namespace YLErp.Modules.SwapModule
|
||||
{
|
||||
var checkEventTypes = new List<int>() { (int)SwapEventTypeEnum.互换, (int)SwapEventTypeEnum.自动互换 };
|
||||
var td = DbContext.trade.Find(tradeId);
|
||||
var positions = DbContext.swap_position.Where(x => x.SwapTradeId == tradeId && !x.Invalid);
|
||||
var positions = DbContext.swap_position.ActiveByTrade(tradeId);
|
||||
var um = DataCacheProvider.GetUnderlyingDataSource().GetData(td.UnderlyingCode);
|
||||
List<int> eventTypes = new List<int>() { (int)SwapFlowEventTypeEnum.互换, (int)SwapFlowEventTypeEnum.自动互换 };
|
||||
var maxIncomeValueDate = GetMaxIncomeValueDate(td);
|
||||
@@ -460,7 +460,7 @@ namespace YLErp.Modules.SwapModule
|
||||
{
|
||||
throw new ServiceException("未找到交易信息");
|
||||
}
|
||||
var allpositions = DbContext.swap_position.Where(x => x.SwapTradeId == tradeId && !x.Invalid).ToList();
|
||||
var allpositions = DbContext.swap_position.ActiveByTrade(tradeId).ToList();
|
||||
var origPositions = allpositions.Where(x => x.IsInitial).ToList();
|
||||
var realPostitions = allpositions.Where(x => !x.IsInitial).ToList();
|
||||
// 根因修复(多次部分平仓预付金返还错误):见 ResolveInterestLegPositions 注释。
|
||||
@@ -1571,7 +1571,7 @@ namespace YLErp.Modules.SwapModule
|
||||
{
|
||||
unwindPriceFee = decimal.Parse(unwindPriceFee.ToString("F10"));
|
||||
var td = DbContext.trade.Find(tradeid);
|
||||
var positions = DbContext.swap_position.Where(x => x.SwapTradeId == td.id && !x.Invalid);
|
||||
var positions = DbContext.swap_position.ActiveByTrade(td.id);
|
||||
List<int> eventTypes = new List<int>() { (int)SwapEventTypeEnum.平仓, (int)SwapEventTypeEnum.互换 };
|
||||
var dealDate = valueDate;
|
||||
var tradeExtend = DbContext.trade_extend.FirstOrDefault(x => x.TradeId == td.id);
|
||||
|
||||
@@ -133,7 +133,7 @@ namespace YLErp.Modules.SwapModule
|
||||
/// <summary>查找交易持仓(生产: DbContext.swap_position.Where;测试: 内存列表)</summary>
|
||||
protected virtual List<swap_position> FindSwapPositions(int swapTradeId)
|
||||
{
|
||||
return DbContext.swap_position.Where(x => x.SwapTradeId == swapTradeId && !x.Invalid).ToList();
|
||||
return DbContext.swap_position.ActiveByTrade(swapTradeId).ToList();
|
||||
}
|
||||
|
||||
/// <summary>查找框架合约日终汇总(生产: DbContext.eod_swap.FirstOrDefault;测试: 内存字典)</summary>
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
using System.Linq;
|
||||
using YLErp.DBModels;
|
||||
|
||||
namespace YLErp.Modules.SwapModule
|
||||
{
|
||||
/// <summary>
|
||||
/// swap_position 查询收口(Query Object)。
|
||||
/// 规则"有效持仓 = SwapTradeId 匹配且未作废(!Invalid)"集中于此,
|
||||
/// 避免多处复制同一谓词导致语义漂移(漏写 !Invalid 即静默出 bug)。
|
||||
/// 仅返回 IQueryable,不调用 SaveChanges,不破坏跟踪/Include/事务边界。
|
||||
/// </summary>
|
||||
public static class SwapPositionQueries
|
||||
{
|
||||
public static IQueryable<swap_position> ActiveByTrade(
|
||||
this IQueryable<swap_position> query, int tradeId)
|
||||
=> query.Where(x => x.SwapTradeId == tradeId && !x.Invalid);
|
||||
}
|
||||
}
|
||||
@@ -1188,7 +1188,7 @@ namespace YLErp.Modules.SwapModule
|
||||
tradeObj.trade_Initial_Margin = new trade_initial_margin();
|
||||
}
|
||||
tradeObj.trade_extend = DbContext.trade_extend.FirstOrDefault(x => x.TradeId == intid);
|
||||
tradeObj.swap_positions = DbContext.swap_position.Where(x => x.SwapTradeId == intid && !x.Invalid).ToList();
|
||||
tradeObj.swap_positions = DbContext.swap_position.ActiveByTrade(intid).ToList();
|
||||
tradeObj.swap_positions = tradeObj.swap_positions.Where(x => x.PosiQuantity > 0 || x.InterestDirection > 0).ToList();
|
||||
var intervalPositions = tradeObj.swap_positions.Where(x => string.IsNullOrEmpty(x.UnderlyingCode) && x.IsInitial).ToList();
|
||||
var intervalPositionIds = intervalPositions.Select(s => s.id).ToList();
|
||||
@@ -1517,7 +1517,7 @@ namespace YLErp.Modules.SwapModule
|
||||
throw new ServiceException("交易不存在");
|
||||
}
|
||||
bool backToBegin = td.TradeDate == valueDate;
|
||||
var swapPositions = DbContext.swap_position.Where(x => x.SwapTradeId == tradeId && !x.Invalid).ToList();
|
||||
var swapPositions = DbContext.swap_position.ActiveByTrade(tradeId).ToList();
|
||||
td.trade_extend = DbContext.trade_extend.FirstOrDefault(x => x.TradeId == td.id);
|
||||
|
||||
//展期
|
||||
|
||||
Reference in New Issue
Block a user