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,供全局复用。