Merge remote-tracking branch 'origin/glms/feature/1.4.2' into feature/p132_74-risk-engine
This commit is contained in:
@@ -224,7 +224,7 @@ namespace YLErp.Modules.TradeModule.DealModule
|
||||
|
||||
#endregion
|
||||
|
||||
//审批流程
|
||||
//审批流程(需求②:按交易状态查对应流程)
|
||||
if (!req.SkipWorkflow && HasTradeProcess())
|
||||
{
|
||||
var isUnwind = tradeCash.Action.Contains("平仓");
|
||||
@@ -235,14 +235,33 @@ namespace YLErp.Modules.TradeModule.DealModule
|
||||
|
||||
dbTrade.CheckStatus = Convert.ToInt32(TradeCheckEnum.StatusOfOld);
|
||||
|
||||
//检查是否有交易审批流程
|
||||
if (valuedateBLL.SystemDate.CloseReApprove == 1)
|
||||
//检查是否有交易审批流程(需求②:按交易状态查对应流程,而非只查开仓流程)
|
||||
var needApproval = valuedateBLL.SystemDate.CloseReApprove == 1 && TradeProcessCountByCategory(dbTrade) > 0;
|
||||
if (needApproval)
|
||||
{
|
||||
// 如果有审批组
|
||||
InitTradeProcessOrder(dbTrade, UserId);
|
||||
// 需求①:进入审批前先判断触发条件——若所有节点都不满足触发条件,跳过审批。
|
||||
needApproval = NeedApprovalByTrigger(dbTrade);
|
||||
}
|
||||
|
||||
AddTradeOperationHistoryAndSetParentTradeInfo(false, dbTrade, optType: isUnwind ? "平仓审核提交" : "行权审核提交", comments: req.ImportFlag);
|
||||
if (needApproval)
|
||||
{
|
||||
// 需要审批:进入审批流程等待人工审批
|
||||
InitTradeProcessOrder(dbTrade, UserId);
|
||||
AddTradeOperationHistoryAndSetParentTradeInfo(false, dbTrade, optType: isUnwind ? "平仓审核提交" : "行权审核提交", comments: req.ImportFlag);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 不需要审批:设 ProcessOrderId=审批通过,再调 UpdateTradeProcessLog(pass) 执行审批通过流程
|
||||
dbTrade.ProcessOrderId = ProcessTradeLog.审批通过;
|
||||
DbContext.SaveChanges();
|
||||
new TradeOpenService(this).UpdateTradeProcessLog(new TradeOpenReqModel
|
||||
{
|
||||
tradeId = dbTrade.id,
|
||||
status = "pass",
|
||||
comments = "触发条件未满足,自动跳过审批",
|
||||
notNeedOperationHistory = false
|
||||
});
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using YLErp.BLL;
|
||||
using YLErp.Helpers;
|
||||
using YLErp.Model;
|
||||
using YLErp.Model.Enum;
|
||||
using YLErp.Modules.TradeDalModule;
|
||||
@@ -115,25 +116,40 @@ namespace YLErp.Modules.TradeModule.DealModule
|
||||
td.OptId = UserId;
|
||||
td.OptName = UserName;
|
||||
td.OptDate = OptDate;
|
||||
if (isFromExercise)
|
||||
{
|
||||
td.TradeStatus = ConsTrade.行权待复核;
|
||||
}
|
||||
else
|
||||
{
|
||||
td.TradeStatus = ConsTrade.平仓待复核;
|
||||
}
|
||||
|
||||
td.CheckStatus = Convert.ToInt32(TradeCheckEnum.StatusOfOld);
|
||||
|
||||
//检查是否有交易审批流程
|
||||
if (valuedateBLL.SystemDate.CloseReApprove == 1 && hasTradeProcess)
|
||||
// 先设状态,使流程类别能正确推断为 CloseProcess(需求②按交易状态推断开仓/了结)
|
||||
td.TradeStatus = isFromExercise ? ConsTrade.行权待复核 : ConsTrade.平仓待复核;
|
||||
|
||||
//检查是否有交易审批流程(需求②:平仓/行权按交易状态查对应流程,而非只查开仓流程)
|
||||
var needApproval = valuedateBLL.SystemDate.CloseReApprove == 1 && TradeProcessCountByCategory(td) > 0;
|
||||
if (needApproval)
|
||||
{
|
||||
// 如果有审批组
|
||||
InitTradeProcessOrder(td, UserId);
|
||||
// 需求①:进入审批前先判断触发条件——若所有节点都不满足触发条件,跳过审批。
|
||||
needApproval = NeedApprovalByTrigger(td);
|
||||
}
|
||||
|
||||
AddTradeOperationHistoryAndSetParentTradeInfo(false, td, isFromExercise ? "部分行权审核提交" : "平仓审核提交");
|
||||
if (needApproval)
|
||||
{
|
||||
// 需要审批:保持"平仓待复核/行权待复核",进入审批流程等待人工审批
|
||||
InitTradeProcessOrder(td, UserId);
|
||||
AddTradeOperationHistoryAndSetParentTradeInfo(false, td, isFromExercise ? "部分行权审核提交" : "平仓审核提交");
|
||||
}
|
||||
else
|
||||
{
|
||||
// 不需要审批:设 ProcessOrderId=审批通过,再调 UpdateTradeProcessLog(pass) 执行审批通过流程
|
||||
// (SetTradeOpen 会完成平仓、改状态、写日志,与人工审批通过完全一致)
|
||||
td.ProcessOrderId = ProcessTradeLog.审批通过;
|
||||
DbContext.SaveChanges();
|
||||
new TradeOpenService(this).UpdateTradeProcessLog(new TradeOpenReqModel
|
||||
{
|
||||
tradeId = td.id,
|
||||
status = "pass",
|
||||
comments = "触发条件未满足,自动跳过审批",
|
||||
notNeedOperationHistory = false
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using YLErp.BLL;
|
||||
using YLErp.Helpers;
|
||||
using YLErp.Model;
|
||||
using YLErp.Model.Enum;
|
||||
|
||||
@@ -105,12 +106,37 @@ namespace YLErp.Modules.TradeModule.DealModule
|
||||
{
|
||||
var td = DbContext.trade.Find(tradeId);
|
||||
td.OptDate = DateTime.Now;
|
||||
td.TradeStatus = ConsTrade.行权待复核;
|
||||
td.CheckStatus = Convert.ToInt32(TradeCheckEnum.StatusOfOld);
|
||||
if (valuedateBLL.SystemDate.CloseReApprove == 1 && hasTradeProcess)
|
||||
|
||||
// 先设状态,使流程类别能正确推断为 CloseProcess
|
||||
td.TradeStatus = ConsTrade.行权待复核;
|
||||
|
||||
// 需求②:行权按交易状态查对应流程
|
||||
var needApproval = valuedateBLL.SystemDate.CloseReApprove == 1 && TradeProcessCountByCategory(td) > 0;
|
||||
if (needApproval)
|
||||
{
|
||||
//如果有审批组
|
||||
InitTradeProcessOrder(td,UserId);
|
||||
// 需求①:进入审批前先判断触发条件——若所有节点都不满足触发条件,跳过审批。
|
||||
needApproval = NeedApprovalByTrigger(td);
|
||||
}
|
||||
|
||||
if (needApproval)
|
||||
{
|
||||
// 需要审批:保持"行权待复核",进入审批流程等待人工审批
|
||||
InitTradeProcessOrder(td, UserId);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 不需要审批:设 ProcessOrderId=审批通过,再调 UpdateTradeProcessLog(pass) 执行审批通过流程
|
||||
td.ProcessOrderId = ProcessTradeLog.审批通过;
|
||||
DbContext.SaveChanges();
|
||||
new TradeOpenService(this).UpdateTradeProcessLog(new TradeOpenReqModel
|
||||
{
|
||||
tradeId = td.id,
|
||||
status = "pass",
|
||||
comments = "触发条件未满足,自动跳过审批",
|
||||
notNeedOperationHistory = false
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
DbContext.SaveChanges();
|
||||
|
||||
@@ -140,7 +140,9 @@ namespace YLErp.Modules.TradeModule.DealModule
|
||||
|
||||
#region 设置期末价格和执行价格
|
||||
|
||||
var finalPrice = EodPriceQueryService.TryGetEodPrice(exerciseDate, td.UnderlyingCode, out var eodPrice)
|
||||
// 债券标的需走中债估值表取价,原 TryGetEodPrice 只查期货/股票两表会漏掉债券,导致"结算价未找到"。
|
||||
// 统一改用债券感知的 TryGetSettlementEodPrice(见 EodPriceQueryService)。
|
||||
var finalPrice = EodPriceQueryService.TryGetSettlementEodPrice(exerciseDate, td.UnderlyingCode, out var eodPrice)
|
||||
? eodPrice.GetPrice(td.SettlementType) : 0;
|
||||
|
||||
if (finalPrice <= 0)
|
||||
@@ -280,8 +282,6 @@ namespace YLErp.Modules.TradeModule.DealModule
|
||||
trade_cash tradeCash = null;
|
||||
|
||||
//日终价格
|
||||
var underlyingIds = tradeUnwindTrades.Select(t => t.UnderlyingId).ToList();
|
||||
var EodPriceProvider = new EodPriceProvider(valueDate);
|
||||
//批量结算的全是现金流交易就不用结算价
|
||||
if (!EodPriceQueryService.CheckDbExists(valueDate) && tradeQuery.Any(t => t.TradeType != "现金流交易"))
|
||||
{
|
||||
@@ -308,8 +308,8 @@ namespace YLErp.Modules.TradeModule.DealModule
|
||||
var CountRatio = 1;
|
||||
if (t.TradeType != "现金流交易")
|
||||
{
|
||||
//结算价
|
||||
if (EodPriceProvider.TryGetEodPrice(t.UnderlyingCode, out var eodPrice))
|
||||
//结算价(债券感知统一取价:债券走中债估值,期货/股票走原路径,见 EodPriceQueryService.TryGetSettlementEodPrice)
|
||||
if (EodPriceQueryService.TryGetSettlementEodPrice(valueDate, t.UnderlyingCode, out var eodPrice))
|
||||
{
|
||||
settlePrice = eodPrice.GetPrice(t.SettlementType);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using BaseOUDAL;
|
||||
using YLErp.BLL;
|
||||
using YLErp.BLL.Eod;
|
||||
using YLErp.Helpers;
|
||||
using YLErp.Model;
|
||||
using YLErp.Model.Enum;
|
||||
using YLErp.Modules.ClientModule;
|
||||
@@ -140,7 +141,8 @@ namespace YLErp.Modules.TradeModule.DealModule
|
||||
return result;
|
||||
}
|
||||
//TODO 如果是审批组
|
||||
var tradeProessQuery = TradeProcess();
|
||||
// 需求②:按交易状态推断开仓/了结流程。了结类(平仓/行权/互换待复核)走 CloseProcess。
|
||||
var tradeProessQuery = TradeProcessByCategory(td);
|
||||
var count = tradeProessQuery.Count();
|
||||
if (count == 0 || td.ProcessOrderId == ProcessTradeLog.审批通过)//投资规模校验已经将数据设置为已通过
|
||||
{
|
||||
@@ -166,6 +168,8 @@ namespace YLErp.Modules.TradeModule.DealModule
|
||||
//{
|
||||
// td.ProcessOrderBranch = 0;
|
||||
//}
|
||||
// 节点触发条件(需求①):下一节点配置了 triggerCondition 时,满足才进入审批,不满足则跳过。
|
||||
nextOrder = AdvanceThroughTriggerNodes(tradeProessQuery, nextOrder, BuildTriggerContext(td, UserId));
|
||||
if (nextOrder==null)
|
||||
{
|
||||
|
||||
@@ -225,7 +229,8 @@ namespace YLErp.Modules.TradeModule.DealModule
|
||||
var childrenTrades = DbContext.trade.Where(x => childrenTradeIds.Contains(x.id)).ToList();
|
||||
var result = new TradeOpenResult(td);
|
||||
// 如果是审批组
|
||||
var tradeProessQuery = TradeProcess();
|
||||
// 需求②:分组了结按交易状态推断开仓/了结流程。
|
||||
var tradeProessQuery = TradeProcessByCategory(td);
|
||||
var count = tradeProessQuery.Count();
|
||||
if (count == 0)
|
||||
{
|
||||
@@ -246,6 +251,8 @@ namespace YLErp.Modules.TradeModule.DealModule
|
||||
{
|
||||
nextOrder = tradeProessQuery.FirstOrDefault(x => x.order > td.ProcessOrderId && x.node == td.ProcessOrderBranch && x.approvalGroupId == 0);
|
||||
}
|
||||
// 节点触发条件(需求①):分组了结推进同样支持触发条件。
|
||||
nextOrder = AdvanceThroughTriggerNodes(tradeProessQuery, nextOrder, BuildTriggerContext(td, UserId));
|
||||
if (nextOrder == null)
|
||||
{
|
||||
SetParentTradeOpen(req, td, childrenTrades, parentTradeCash);
|
||||
|
||||
@@ -294,8 +294,8 @@ namespace YLErp.Modules.TradeModule.DealModule
|
||||
|
||||
}
|
||||
var result = new TradeUnwindResultModel(td);
|
||||
//存在审批流程时,走审批成功流程
|
||||
if (valuedateBLL.SystemDate.CloseReApprove == 1 && HasTradeProcess())
|
||||
//存在审批流程时,走审批成功流程(需求②:按交易状态查对应流程)
|
||||
if (valuedateBLL.SystemDate.CloseReApprove == 1 && TradeProcessCountByCategory(td) > 0)
|
||||
{
|
||||
result.ApprovalProcess = true;
|
||||
|
||||
@@ -462,8 +462,8 @@ namespace YLErp.Modules.TradeModule.DealModule
|
||||
throw new ServiceException("平仓费不一致!复核不通过");
|
||||
}
|
||||
}
|
||||
//存在审批流程时,走审批成功流程
|
||||
if (valuedateBLL.SystemDate.CloseReApprove == 1 && HasTradeProcess())
|
||||
//存在审批流程时,走审批成功流程(需求②:按交易状态查对应流程)
|
||||
if (valuedateBLL.SystemDate.CloseReApprove == 1 && TradeProcessCountByCategory(td) > 0)
|
||||
{
|
||||
var reqModel = new TradeOpenReqModel
|
||||
{
|
||||
@@ -1848,14 +1848,28 @@ namespace YLErp.Modules.TradeModule.DealModule
|
||||
|
||||
td.CheckStatus = Convert.ToInt32(TradeCheckEnum.StatusOfOld);
|
||||
|
||||
//检查是否有交易审批流程
|
||||
if ((valuedateBLL.SystemDate.CloseReApprove == 1 || isSwap) && hasTradeProcess)
|
||||
//检查是否有交易审批流程(需求②:按交易状态查对应流程,而非只查开仓流程)
|
||||
var needApproval = (valuedateBLL.SystemDate.CloseReApprove == 1 || isSwap) && TradeProcessCountByCategory(td) > 0;
|
||||
if (needApproval)
|
||||
{
|
||||
//如果有审批组
|
||||
InitTradeProcessOrder(td, UserId);
|
||||
// 需求①:进入审批前先判断触发条件——若所有节点都不满足触发条件,跳过审批。
|
||||
needApproval = NeedApprovalByTrigger(td);
|
||||
}
|
||||
|
||||
AddTradeOperationHistoryAndSetParentTradeInfo(false, td, isSwap ? "互换审核提交" : "平仓审核提交");
|
||||
if (needApproval)
|
||||
{
|
||||
// 需要审批:进入审批流程等待人工审批
|
||||
InitTradeProcessOrder(td, UserId);
|
||||
AddTradeOperationHistoryAndSetParentTradeInfo(false, td, isSwap ? "互换审核提交" : "平仓审核提交");
|
||||
}
|
||||
else
|
||||
{
|
||||
// 不需要审批:只标记 ProcessOrderId=审批通过。
|
||||
// 互换的 swap_event 记录要等调用方 ApplySwapTrade 的 SaveSwapDeal 执行后才创建,
|
||||
// 所以互换不在这里调 UpdateTradeProcessLog(否则 FindSwapEvent 找不到记录),
|
||||
// 由 ApplySwapTrade 在 SaveSwapDeal 之后判断并触发审批通过流程。
|
||||
td.ProcessOrderId = ProcessTradeLog.审批通过;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user