From f3ca4dc498923ff1449a3c5eae976c6a24ab852c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=94=A6=E9=BA=9F=20=E7=8E=8B?= Date: Mon, 13 Jul 2026 10:59:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B9=B3=E4=BB=93=E5=AE=A1=E6=A0=B8=E4=B8=8D?= =?UTF-8?q?=E7=AC=A6=E5=90=88=E6=9D=A1=E4=BB=B6=E7=9B=B4=E6=8E=A5=E8=B7=B3?= =?UTF-8?q?=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DealModule/TradeCloseService.cs | 35 ++++++++++++------- .../DealModule/TradeExerciseService.cs | 31 +++++++++++++--- .../Modules/TradeModule/TradeServiceBase.cs | 18 ++++++++++ 3 files changed, 67 insertions(+), 17 deletions(-) diff --git a/YLErpDAL/Modules/TradeModule/DealModule/TradeCloseService.cs b/YLErpDAL/Modules/TradeModule/DealModule/TradeCloseService.cs index 887a8964..a57ed767 100644 --- a/YLErpDAL/Modules/TradeModule/DealModule/TradeCloseService.cs +++ b/YLErpDAL/Modules/TradeModule/DealModule/TradeCloseService.cs @@ -1,4 +1,5 @@ using YLErp.BLL; +using YLErp.Helpers; using YLErp.Model; using YLErp.Model.Enum; using YLErp.Modules.TradeDalModule; @@ -115,25 +116,35 @@ 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); + // 先设状态,使流程类别能正确推断为 CloseProcess(需求②按交易状态推断开仓/了结) + td.TradeStatus = isFromExercise ? ConsTrade.行权待复核 : ConsTrade.平仓待复核; + //检查是否有交易审批流程(需求②:平仓/行权按交易状态查对应流程,而非只查开仓流程) - if (valuedateBLL.SystemDate.CloseReApprove == 1 && TradeProcessCountByCategory(td) > 0) + 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 + { + // 不需要审批:直接走平仓完成流程(与审批通过一致) + td.ProcessOrderId = ProcessTradeLog.审批通过; + td.ProcessStatus = ProcessTradeStatus.通过审批.ToString(); + td.ProcessOptDate = DateTime.Now; + // 直接完成平仓 + new TradeUnwindService(this).UnwindTrade(td, null, true, isFromExercise); + } } } diff --git a/YLErpDAL/Modules/TradeModule/DealModule/TradeExerciseService.cs b/YLErpDAL/Modules/TradeModule/DealModule/TradeExerciseService.cs index d9307b5b..1b8717b9 100644 --- a/YLErpDAL/Modules/TradeModule/DealModule/TradeExerciseService.cs +++ b/YLErpDAL/Modules/TradeModule/DealModule/TradeExerciseService.cs @@ -1,4 +1,5 @@ using YLErp.BLL; +using YLErp.Helpers; using YLErp.Model; using YLErp.Model.Enum; @@ -105,13 +106,33 @@ 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 && TradeProcessCountByCategory(td) > 0) + + // 先设状态,使流程类别能正确推断为 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 + { + // 不需要审批:直接完成行权 + td.ProcessOrderId = ProcessTradeLog.审批通过; + td.ProcessStatus = ProcessTradeStatus.通过审批.ToString(); + td.ProcessOptDate = DateTime.Now; + DbContext.SaveChanges(); + new TradeUnwindService(this).UnwindTrade(td, null, true, true); + return; } DbContext.SaveChanges(); diff --git a/YLErpDAL/Modules/TradeModule/TradeServiceBase.cs b/YLErpDAL/Modules/TradeModule/TradeServiceBase.cs index 0c9237f1..ef5d6cc3 100644 --- a/YLErpDAL/Modules/TradeModule/TradeServiceBase.cs +++ b/YLErpDAL/Modules/TradeModule/TradeServiceBase.cs @@ -214,6 +214,24 @@ namespace YLErp.Modules.TradeModule return ctx; } + /// + /// 需求①:判断按触发条件是否需要审批。 + /// 取该交易类别的审批流程,若所有节点配置的触发条件都不满足当前业务,则无需审批(返回 false)。 + /// 若无审批流程或节点无触发条件,返回 true(需要审批)。 + /// + protected bool NeedApprovalByTrigger(trade td) + { + var tradeProcess = TradeProcessByCategory(td); + if (tradeProcess == null || tradeProcess.Count == 0) return true; + + var start = tradeProcess.FirstOrDefault(x => x.node == 0); + if (start == null) start = tradeProcess.OrderBy(x => x.order).First(); + + var ctx = BuildTriggerContext(td, UserId); + var target = ConditionEvaluator.FindFirstTriggeredNode(tradeProcess, start, ctx); + return target != null; + } + /// /// 按交易状态推断流程类别:开仓(TradeProcess) / 了结(CloseProcess)。需求②。 /// 委托给 ProcessCategoryConst.Resolve,供全局复用。