@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user