Merge branch 'dev' of https://gitee.com/jinan-pengyusen-data/gzth into dev_wang
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user