This commit is contained in:
李鹏宇
2026-03-20 18:06:49 +08:00
2 changed files with 4 additions and 80 deletions
@@ -178,7 +178,6 @@ class SoongWorkflowRecord(models.Model):
if not active_employee_ids:
self.is_to_do = False
return
# 批量优化:预加载员工映射(仅查1次)
all_employees = self.env['hr.employee'].search([('user_state', '=', 'in')])
emp_to_user = {emp.id: emp.user_id.id for emp in all_employees if emp.user_id}
@@ -669,8 +668,6 @@ class SoongWorkflowRecord(models.Model):
@api.model
def get_view(self, view_id=None, view_type='form', **options):
"""优化后:批量查询+批量写入,消除嵌套循环"""
# ========== 第一步:批量查询所有目标记录(仅1次搜索) ==========
current_user_id = self.env.user.id
all_records = self.search([
('users_ids', 'in', current_user_id),
@@ -678,81 +675,6 @@ class SoongWorkflowRecord(models.Model):
])
if not all_records:
return super().get_view(view_id, view_type, **options)
model_res_ids = defaultdict(list)
rec_model_res_map = {rec.id: (rec.res_model, rec.res_id) for rec in all_records if rec.res_model and rec.res_id}
for rec_id, (model, res_id) in rec_model_res_map.items():
model_res_ids[model].append(res_id)
log_data = defaultdict(dict)
for model_name, res_ids in model_res_ids.items():
if not res_ids:
continue
try:
TargetModel = self.env[model_name].sudo()
has_log1 = 'log_ids' in TargetModel._fields
has_log2 = 'log_ids2' in TargetModel._fields
# 批量查log_ids(当前用户,仅当字段存在时)
if has_log1:
log1_domain = [('res_id', 'in', res_ids), ('done_by', '=', current_user_id)]
log1_records = TargetModel.log_ids.search(log1_domain)
for log in log1_records:
if log.res_id not in log_data[model_name]:
log_data[model_name][log.res_id] = {'log1_states': [], 'log2_states': [],
'has_archive_log': False}
log_data[model_name][log.res_id]['log1_states'].append(log.approval_state)
if log.name == '归档':
log_data[model_name][log.res_id]['has_archive_log'] = True
log_data[model_name][log.res_id]['archive_state'] = log.approval_state
# 批量查log_ids2(当前用户,仅当字段存在时)
if has_log2:
log2_domain = [('res_id', 'in', res_ids), ('done_by.name', '=', self.env.user.name)]
log2_records = TargetModel.log_ids2.search(log2_domain)
for log2 in log2_records:
if log2.res_id not in log_data[model_name]:
log_data[model_name][log2.res_id] = {'log1_states': [], 'log2_states': [],
'has_archive_log': False}
log_data[model_name][log2.res_id]['log2_states'].append(log2.approval_state)
except Exception:
continue
to_write = defaultdict(list) # {状态: [记录ID]}
for rec in all_records:
if rec.id not in rec_model_res_map:
continue
model, res_id = rec_model_res_map[rec.id]
if model not in log_data or res_id not in log_data[model]:
continue
log_info = log_data[model][res_id]
# 处理归档日志优先级最高
if log_info['has_archive_log']:
if log_info['archive_state'] in ['0', '1']:
to_write['to_active'].append(rec.id)
elif log_info['archive_state'] == '2':
to_write['active'].append(rec.id)
continue
# 处理普通log_ids
log1_states = log_info['log1_states']
if any(s in ['0', '1'] for s in log1_states):
to_write['to_do'].append(rec.id)
elif all(s == '2' for s in log1_states if s):
to_write['done'].append(rec.id)
# 处理log_ids2
log2_states = log_info['log2_states']
if log2_states:
if any(s in ['0', '1'] for s in log2_states):
to_write['to_do'].append(rec.id)
elif all(s == '2' for s in log2_states):
to_write['done'].append(rec.id)
for state, rec_ids in to_write.items():
if rec_ids:
self.browse(rec_ids).write({'soong_state': state})
all_records._compute_is_done()
all_records._compute_is_to_do()
return super().get_view(view_id, view_type, **options)
@@ -386,8 +386,10 @@ class SoongWorkflowCommentWizard(models.TransientModel):
return self.env['hr.employee'].sudo().search(domain)
elif link_users_group_ids:
role_domain = ['|', ('user_role_id', 'in', link_users_group_ids.user_role_ids.ids),
('user_role_ids', 'in', link_users_group_ids.user_role_ids.ids)]
role_domain = ['|', '|', ('user_role_id', 'in', link_users_group_ids.user_role_ids.ids),
('user_role_ids', 'in', link_users_group_ids.user_role_ids.ids),
('role_group_ids', 'in', link_users_group_ids.ids)
]
if user_role_domain:
role_domain = ['|'] + role_domain + user_role_domain
domain = role_domain + company_domain + department_domain