!11238 添加功能

Merge pull request !11238 from 李鹏宇/dev_zhou
This commit is contained in:
李鹏宇
2026-04-29 09:46:42 +00:00
committed by Gitee
2 changed files with 82 additions and 40 deletions
@@ -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:
+1 -1
View File
@@ -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)