diff --git a/soong_workflow/models/soong_workflow_record.py b/soong_workflow/models/soong_workflow_record.py index 713a7428f..56afd43b6 100644 --- a/soong_workflow/models/soong_workflow_record.py +++ b/soong_workflow/models/soong_workflow_record.py @@ -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) diff --git a/soong_workflow/wizard/soong_workflow_comment_wizard.py b/soong_workflow/wizard/soong_workflow_comment_wizard.py index d9d074812..15841563e 100644 --- a/soong_workflow/wizard/soong_workflow_comment_wizard.py +++ b/soong_workflow/wizard/soong_workflow_comment_wizard.py @@ -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