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 @@ +