diff --git a/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs b/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs
index e54156b8..1d685a0c 100644
--- a/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs
+++ b/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs
@@ -79,6 +79,62 @@ namespace YLErp.Modules.SwapModule
grossPrice, orginPv, add, settment, newCalcLast, closeList);
}
+ /// 查找交易(生产: DbContext.trade.Find;测试: 内存字典)
+ protected virtual trade FindTrade(int swapTradeId)
+ {
+ return DbContext.trade.Find(swapTradeId);
+ }
+
+ /// 查找交易扩展(生产: DbContext.trade_extend;测试: 内存字典)
+ protected virtual trade_extend FindTradeExtend(int tradeId)
+ {
+ return DbContext.trade_extend.FirstOrDefault(x => x.TradeId == tradeId);
+ }
+
+ /// 查找指定日期范围的 eod 持仓(生产: DbContext.eod_swap_position.Where;测试: 内存列表)
+ protected virtual List FindEodSwapPositions(int swapTradeId, DateTime preSettleDate)
+ {
+ return DbContext.eod_swap_position.Where(x => x.SwapTradeId == swapTradeId && !x.Invalid && x.ValueDate >= preSettleDate).ToList();
+ }
+
+ /// 查找交易持仓(生产: DbContext.swap_position.Where;测试: 内存列表)
+ protected virtual List FindSwapPositions(int swapTradeId)
+ {
+ return DbContext.swap_position.Where(x => x.SwapTradeId == swapTradeId && !x.Invalid).ToList();
+ }
+
+ /// 查找框架合约日终汇总(生产: DbContext.eod_swap.FirstOrDefault;测试: 内存字典)
+ protected virtual eod_swap FindEodSwap(int swapTradeId, DateTime valueDate)
+ {
+ return DbContext.eod_swap.FirstOrDefault(x => x.SwapTradeId == swapTradeId && x.ValueDate == valueDate);
+ }
+
+ /// 添加互换事件(生产: new SwapEventService(this).AddSwapEventDate;测试: 收集到列表)
+ protected virtual swap_event AddSwapEvent(DateTime tradeDate, int swapTradeId, int eventType, string data, int clientCashId, bool save, string reason)
+ {
+ return new SwapEventService(this).AddSwapEventDate(tradeDate, swapTradeId, eventType, data, clientCashId, save, reason);
+ }
+
+ /// 在事务中执行(生产: BeginTransaction/Commit/Rollback;测试: 直接执行不包事务)
+ protected virtual void ExecuteInTransaction(Action action)
+ {
+ var trans = DbContext.Database.BeginTransaction();
+ try
+ {
+ action();
+ trans.Commit();
+ }
+ catch
+ {
+ trans.Rollback();
+ throw;
+ }
+ finally
+ {
+ trans.Dispose();
+ }
+ }
+
#endregion
///
@@ -633,7 +689,7 @@ namespace YLErp.Modules.SwapModule
///
/// 互换交易id
/// 清算日期
- private void ComposePage(int swapTradeId, List flowEvents, DateTime tradeDate, bool needTrans = true)
+ protected void ComposePage(int swapTradeId, List flowEvents, DateTime tradeDate, bool needTrans = true)
{
// 同一标的 事件编码一致
var eventQuery = flowEvents.OrderBy(o => o.PositionId).ToList();
@@ -647,21 +703,16 @@ namespace YLErp.Modules.SwapModule
{
UnwindData unwindData = new UnwindData();
unwindData.SwapTradeId = swapTradeId;
- var swapEvent = new SwapEventService(this).AddSwapEventDate(tradeDate, swapTradeId, (int)SwapEventTypeEnum.合成持仓, string.Empty, 0, true, "系统操作-自动合成持仓");//不用回退,回退时过滤该事件类型
- var td = DbContext.trade.Find(swapTradeId);
+ var swapEvent = AddSwapEvent(tradeDate, swapTradeId, (int)SwapEventTypeEnum.合成持仓, string.Empty, 0, true, "系统操作-自动合成持仓");
+ var td = FindTrade(swapTradeId);
var preSettleDate = GetPreValueDate(tradeDate);//上一交易日期
List eventTyps = new List() { (int)SwapEventTypeEnum.平仓, (int)SwapEventTypeEnum.互换, (int)SwapEventTypeEnum.自动互换 };
List removeEventTyps = new List() { (int)SwapEventTypeEnum.平仓, (int)SwapEventTypeEnum.互换, (int)SwapEventTypeEnum.自动互换 };
ClearSwapPositions(td, tradeDate, removeEventTyps, false);
- td.trade_extend = DbContext.trade_extend.FirstOrDefault(x => x.TradeId == swapTradeId);
- var allEodPositions = DbContext.eod_swap_position.Where(x => x.SwapTradeId == swapTradeId && !x.Invalid && x.ValueDate >= preSettleDate);
- //var curentInvalidEodPostions = allEodPositions.Where(x => x.SwapTradeId == swapTradeId && !x.Invalid && x.ValueDate >= tradeDate);//废弃当前清算日期之后的归档数据
- //curentInvalidEodPostions.ForEach(x =>
- //{
- // x.Invalid = true;
- //});
+ td.trade_extend = FindTradeExtend(swapTradeId);
+ var allEodPositions = FindEodSwapPositions(swapTradeId, preSettleDate);
var eodPositions = allEodPositions.Where(x => x.ValueDate == preSettleDate).ToList();//上一日终持仓信息
- var positions = DbContext.swap_position.Where(x => x.SwapTradeId == swapTradeId && !x.Invalid).ToList();
+ var positions = FindSwapPositions(swapTradeId);
var oriPositions = positions.Where(x => x.IsInitial).ToList();
var realPositions = positions.Where(x => !x.IsInitial).ToList();
var fpositions = positions.Where(x => x.PosiDirection > 0).ToList();
@@ -669,7 +720,7 @@ namespace YLErp.Modules.SwapModule
decimal totalPosiNotionalValue = 0;//总剩余名义本金
decimal tdCloseNotionalValue = 0;//当日平仓名义本金
var preDealDate = GetPreDealDate(swapTradeId, tradeDate, eventTyps);//上一次平仓/互换/自动互换事件日期
- var lastEodSwap = DbContext.eod_swap.FirstOrDefault(x => x.SwapTradeId == swapTradeId && x.ValueDate == preSettleDate);
+ var lastEodSwap = FindEodSwap(swapTradeId, preSettleDate);
decimal stockEqvNotional = lastEodSwap == null ? Convert.ToDecimal(td.OriginalStockEqvNotional ?? 0) : lastEodSwap.NotionalValue;//上一日名义本金
unwindData.NotionalValue = stockEqvNotional;
List longshortCloseInterests = new List();
@@ -795,9 +846,9 @@ namespace YLErp.Modules.SwapModule
unwindData.PosiNotionalValue = allPosiNotionalValue;
unwindData.CloseNotionalValue = tdCloseNotionalValue;
swapEvent.EventData = JsonHelper.Serialize(unwindData);
- DbContext.SaveChanges();
+ SaveAllChanges();
SaveEodSwap(td, tradeDate, preSettleDate);
- DbContext.SaveChanges();
+ SaveAllChanges();
trans?.Commit();
}
catch (Exception ex)