From 658010633db62fa5de0bd69d8fa9591ac4d83f06 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?=
<9664676+pengyuthon@user.noreply.gitee.com>
Date: Tue, 15 Sep 2026 18:59:21 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
soong_workflow/models/soong_workflow_mixin.py | 14 ++++++++++----
soong_workflow/models/soong_workflow_node.py | 7 +++++++
soong_workflow/views/soong_workflow_node_views.xml | 1 +
3 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/soong_workflow/models/soong_workflow_mixin.py b/soong_workflow/models/soong_workflow_mixin.py
index ac4f0ea13..c1fcc080a 100644
--- a/soong_workflow/models/soong_workflow_mixin.py
+++ b/soong_workflow/models/soong_workflow_mixin.py
@@ -845,13 +845,19 @@ class SoongWorkflowMixin(models.AbstractModel):
if current_link and all_links:
sorted_all_links = all_links.sorted('sequence')
for idx, link in enumerate(sorted_all_links):
+ node_id = self.workflow_id.node_ids.search([
+ ('name', '=', link.name),
+ ('workflow_id', '=', self.workflow_id.id)
+ ], limit=1)
+ # 本节点指定的"前置节点"仍出现在可选列表中(即它可以选择)→ 本节点直接跳过,
+ # 且本节点的"相同人员节点处理"也随之不触发
+ if node_id and node_id.skip_if_node_id and node_id.skip_if_node_id != node_id:
+ if any(l.name == node_id.skip_if_node_id.name for l in sorted_all_links):
+ invalid_links |= link
+ continue
approvers = self._get_approvers_for_link(link, self)
if len(approvers) == 1:
current_approver = approvers[0]
- node_id = self.workflow_id.node_ids.search([
- ('name', '=', link.name),
- ('workflow_id', '=', self.workflow_id.id)
- ], limit=1)
if node_id:
# 下一个相同审批人跳过
if node_id.same_user_skip_type == 'next':
diff --git a/soong_workflow/models/soong_workflow_node.py b/soong_workflow/models/soong_workflow_node.py
index 080117282..ffc3167ba 100644
--- a/soong_workflow/models/soong_workflow_node.py
+++ b/soong_workflow/models/soong_workflow_node.py
@@ -108,6 +108,13 @@ class SoongWorkflowNode(models.Model):
('prev', '跳过上一个相同人员节点'),
('after', '跳过此节点之后的所有相同人员节点'),
], string='相同人员节点处理', default='none')
+ skip_if_node_id = fields.Many2one(
+ 'soong.workflow.node',
+ string='前置节点',
+ domain="[('workflow_id', '=', workflow_id), ('id', '!=', id)]",
+ help="选择一个位于本节点之前的节点:若它在流转时仍出现在可选节点中(即它可以选择),"
+ "则本节点会被自动跳过;本节点被跳过时,其上配置的「相同人员节点处理」不再触发。",
+ )
is_mandatory_node = fields.Boolean(string="必经节点", default=False)
@api.onchange("is_apostille")
diff --git a/soong_workflow/views/soong_workflow_node_views.xml b/soong_workflow/views/soong_workflow_node_views.xml
index d0f2138b8..d60cafa00 100644
--- a/soong_workflow/views/soong_workflow_node_views.xml
+++ b/soong_workflow/views/soong_workflow_node_views.xml
@@ -19,6 +19,7 @@
+