From 05c2dce91757aa3a7befba76ecc67699d4eee953 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: Wed, 29 Apr 2026 17:45:45 +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 --- .../wizard/soong_workflow_comment_wizard.py | 120 ++++++++++++------ yuthon_notice/models/yuthon_notice.py | 2 +- 2 files changed, 82 insertions(+), 40 deletions(-) diff --git a/soong_workflow/wizard/soong_workflow_comment_wizard.py b/soong_workflow/wizard/soong_workflow_comment_wizard.py index 9079201d0..6a4a9b966 100644 --- a/soong_workflow/wizard/soong_workflow_comment_wizard.py +++ b/soong_workflow/wizard/soong_workflow_comment_wizard.py @@ -39,7 +39,7 @@ class SoongWorkflowCommentWizard(models.TransientModel): return_link_id = fields.Many2one('trans.link', string='退回节点', ondelete='set null') invalid_link_ids = fields.Many2many( 'trans.link', - string='跳过相同人员以及无审批人员', + string='跳过相同人员', compute='_compute_invalid_link_ids', help='跳过相同人员的节点' ) @@ -169,37 +169,74 @@ class SoongWorkflowCommentWizard(models.TransientModel): ctx_links = self.env.context.get('all_workflow_links', []) all_links = self.env['trans.link'].browse(ctx_links) if isinstance(ctx_links, (list, tuple)) else ctx_links record_id = self.env[record.res_model].browse(record.res_id) if record.res_model and record.res_id else None - current_link = record.trans_link_id - if current_link and all_links: - sorted_all_links = all_links.sorted('sequence') - for idx, link in enumerate(sorted_all_links): - approvers = self._get_approvers_for_link(link, record_id) - # 如果当前审批人是 1 个人,才判断跳过 - if len(approvers) == 1: - current_approver = approvers[0] - # 跳过规则 next:跳过【下一个】节点 - node_id = record_id.workflow_id.node_ids.search([ - ('name', '=', link.name), - ('workflow_id', '=', record_id.workflow_id.id) - ]) - if node_id.same_user_skip_type == 'next': - # 有下一个节点 - if idx + 1 < len(sorted_all_links): - next_link = sorted_all_links[idx + 1] - next_approvers = self._get_approvers_for_link(next_link, record_id) - # 下一个节点也是 1 个人,且和当前是同一个 - if len(next_approvers) == 1 and next_approvers[0] == current_approver: - invalid_links |= next_link # 下一个节点无效(跳过) + applicant = self.env['hr.employee'] # 初始化申请人 - # 跳过规则 prev:跳过【上一个】节点 - if node_id.same_user_skip_type == 'prev': - # 有上一个节点 - if idx - 1 >= 0: - prev_link = sorted_all_links[idx - 1] - prev_approvers = self._get_approvers_for_link(prev_link, record_id) - # 上一个节点也是 1 个人,且和当前是同一个 - if len(prev_approvers) == 1 and prev_approvers[0] == current_approver: - invalid_links |= prev_link + # 先获取申请人(你原来的逻辑) + if record_id: + for field_name in ['user_id', 'users_id']: + if hasattr(record_id, field_name): + applicant = getattr(record_id, field_name) + if applicant: + break + + # ===================== 1. 当前节点 + 第一个节点单独判断 ===================== + if record_id: + workflow_id = self.env["soong.workflow"].search([('model_id', '=', record.res_model)], limit=1) + current_node = record_id.workflow_id.node_ids.search([ + ('name', '=', record_id.state), + ('workflow_id', '=', record_id.workflow_id.id) + ], limit=1) + if current_node and workflow_id and current_node.same_user_skip_type == 'next': + # ===================== 关键:第一个节点 → 审批人 = 申请人 ===================== + if workflow_id.node_ids and workflow_id.node_ids[0].name == record_id.state: + current_approver = applicant.employee_id + else: + # 非第一个节点 → 正常取审批人 + current_approver = self._get_approvers_for_link(node_id=current_node, record_id=record_id) + # 统一处理单人审批 + if len(current_approver) == 1: + current_approver = current_approver[0] + # 对比第一个链接,相同则跳过 + sorted_all_links_temp = all_links.sorted('sequence') + if sorted_all_links_temp: + first_link = sorted_all_links_temp[0] + first_approver = self._get_approvers_for_link(first_link, record_id) + if len(first_approver) == 1: + first_approver = first_approver[0] + if current_approver == first_approver: + invalid_links |= first_link + + sorted_all_links = all_links.sorted('sequence') + for idx, link in enumerate(sorted_all_links): + approvers = self._get_approvers_for_link(link, record_id) + # 如果当前审批人是 1 个人,才判断跳过 + if len(approvers) == 1: + current_approver = approvers[0] + # 跳过规则 next:跳过【下一个】节点 + node_id = record_id.workflow_id.node_ids.search([ + ('name', '=', link.name), + ('workflow_id', '=', record_id.workflow_id.id) + ], limit=1) + if not node_id: + continue + if node_id.same_user_skip_type == 'next': + # 有下一个节点 + if idx + 1 < len(sorted_all_links): + next_link = sorted_all_links[idx + 1] + next_approvers = self._get_approvers_for_link(next_link, record_id) + # 下一个节点也是 1 个人,且和当前是同一个 + if len(next_approvers) == 1 and next_approvers[0] == current_approver: + invalid_links |= next_link # 下一个节点无效(跳过) + + # 跳过规则 prev:跳过【上一个】节点 + if node_id.same_user_skip_type == 'prev': + # 有上一个节点 + if idx - 1 >= 0: + prev_link = sorted_all_links[idx - 1] + prev_approvers = self._get_approvers_for_link(prev_link, record_id) + # 上一个节点也是 1 个人,且和当前是同一个 + if len(prev_approvers) == 1 and prev_approvers[0] == current_approver: + invalid_links |= prev_link record.invalid_link_ids = invalid_links @@ -210,7 +247,9 @@ class SoongWorkflowCommentWizard(models.TransientModel): ctx_links = self.env.context.get('all_workflow_links', []) all_links = self.env['trans.link'].browse(ctx_links) if isinstance(ctx_links, (list, tuple)) else ctx_links - valid_links = all_links - record.invalid_link_ids + valid_ids = [id for id in all_links.ids if id not in record.invalid_link_ids.ids] + valid_links = self.env['trans.link'].browse(valid_ids) + self.trans_link_id = valid_links[0] if valid_links else False record.is_selection = False if self.node_btn_name == '退回': @@ -255,7 +294,7 @@ class SoongWorkflowCommentWizard(models.TransientModel): record.trans_link_id = False raise UserError(f"节点【{first_mandatory.name}】是必经节点,不可跳过!") - for link in record.trans_link_id: + for link in valid_links: employee_user_role_ids = self.env['hr.employee'] if link.name == '印章管理员': stamp_types = record_id.type_stamp_ids @@ -309,7 +348,7 @@ class SoongWorkflowCommentWizard(models.TransientModel): record.is_selection = True record._onchange_is_selection() - def _get_approvers_for_link(self, link, record_id=None): + def _get_approvers_for_link(self, link=None, record_id=None, node_id=None): """ 参数: link: trans.link 记录对象 @@ -319,11 +358,14 @@ class SoongWorkflowCommentWizard(models.TransientModel): """ if not link or isinstance(link, int): return self.env['hr.employee'] - workflow_id = link.node_button_id.workflow_id - node = workflow_id.node_ids.search([ - ('name', '=', link.name), - ('workflow_id', '=', workflow_id.id) - ]) + if node_id: + node = node_id + else: + workflow_id = link.node_button_id.workflow_id + node = workflow_id.node_ids.search([ + ('name', '=', link.name), + ('workflow_id', '=', workflow_id.id) + ]) button_priority_list = ["分发", "下发", "转交", "结束"] button = False if node.button_ids: diff --git a/yuthon_notice/models/yuthon_notice.py b/yuthon_notice/models/yuthon_notice.py index 02ee5b840..82d73d83e 100644 --- a/yuthon_notice/models/yuthon_notice.py +++ b/yuthon_notice/models/yuthon_notice.py @@ -199,8 +199,8 @@ class YuthonNotice(models.Model): def notice_publish(self): self.ensure_one() + self.notice_state = 'yes' if self.is_change_notice: - self.notice_state = 'yes' conf_old = self.env['yuthon.confirm.users'].sudo().search([ ('notice_id', '=', self.id), ('employee_id.user_id', 'in', self.users_ids.ids)