From 71b04dc16103b6669d5bcd922b1bc25f1b0f3116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= <9664676+pengyuthon@user.noreply.gitee.com> Date: Fri, 20 Mar 2026 20:57:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/soong_workflow_record.py | 89 +++++++++++++------ 1 file changed, 61 insertions(+), 28 deletions(-) diff --git a/soong_workflow/models/soong_workflow_record.py b/soong_workflow/models/soong_workflow_record.py index 174438abb..26c6b8f38 100644 --- a/soong_workflow/models/soong_workflow_record.py +++ b/soong_workflow/models/soong_workflow_record.py @@ -657,44 +657,77 @@ class SoongWorkflowRecord(models.Model): @api.model def get_view(self, view_id=None, view_type='form', **options): + if view_type != 'list': + return super(SoongWorkflowRecord, self).get_view(view_id, view_type, **options) + current_user = self.env.user all_records = self.search([ - ('users_ids', 'in', self.env.user.id), + ('users_ids', 'in', current_user.id), ('reclaim_state', '=', False) ]) + if not all_records: + return super(SoongWorkflowRecord, self).get_view(view_id, view_type, **options) + model_res_ids = {} for record in all_records: - # 校验关联记录是否存在 if not record.res_model or not record.res_id: continue - record_id = self.env[record.res_model].browse(record.res_id) + if record.res_model not in model_res_ids: + model_res_ids[record.res_model] = [] + model_res_ids[record.res_model].append(record.res_id) + + model_records = {} + for model, res_ids in model_res_ids.items(): + model_records[model] = self.env[model].browse(res_ids).sudo().prefetch(['log_ids', 'log_ids2']) + + record_state_map = {} + for record in all_records: + if not record.res_model or not record.res_id: + continue + record_id = model_records.get(record.res_model, self.env[model]).browse(record.res_id) if not record_id or not hasattr(record_id, 'log_ids'): continue - current_user_logs = record_id.log_ids.filtered( - lambda l: l.done_by.id == self.env.user.id - ) - if not current_user_logs: - continue - approval_states = current_user_logs.mapped('approval_state') - if any(state in ['0', '1'] for state in approval_states): - record.write({'soong_state': 'to_do'}) - elif all(state == '2' for state in approval_states): - record.write({'soong_state': 'done'}) - for log in current_user_logs: - if log.name == '归档': - if log.approval_state == '0' or log.approval_state == '1': - record.write({'soong_state': 'to_active'}) - elif log.approval_state == '2': - record.write({'soong_state': 'active'}) - break + new_state = None + # 处理log_ids(批量过滤,无数据库查询) + current_user_logs = record_id.log_ids.filtered(lambda l: l.done_by.id == current_user.id) + if current_user_logs: + approval_states = current_user_logs.mapped('approval_state') + # 优先级:归档日志 > 普通日志 + archive_log = current_user_logs.filtered(lambda l: l.name == '归档') + if archive_log: + if archive_log[0].approval_state in ['0', '1']: + new_state = 'to_active' + elif archive_log[0].approval_state == '2': + new_state = 'active' + else: + if any(state in ['0', '1'] for state in approval_states): + new_state = 'to_do' + elif all(state == '2' for state in approval_states): + new_state = 'done' - for log2 in record_id.log_ids2: - if log2.done_by.name == self.env.user.name: - if log2.approval_state == '2': - record.write({'soong_state': 'done'}) - elif log2.approval_state in ['0', '1']: - record.write({'soong_state': 'to_do'}) - record._compute_is_done() - record._compute_is_to_do() + # 处理log_ids2(批量过滤,用ID匹配而非name) + if not new_state and hasattr(record_id, 'log_ids2'): + user_logs2 = record_id.log_ids2.filtered(lambda l: l.done_by.id == current_user.id) + if user_logs2: + log2_states = user_logs2.mapped('approval_state') + if '2' in log2_states: + new_state = 'done' + elif any(s in ['0', '1'] for s in log2_states): + new_state = 'to_do' + if new_state: + record_state_map[record.id] = new_state + + if record_state_map: + state_groups = {} + for rec_id, state in record_state_map.items(): + if state not in state_groups: + state_groups[state] = [] + state_groups[state].append(rec_id) + for state, rec_ids in state_groups.items(): + self.browse(rec_ids).write({'soong_state': state}) + + if all_records: + all_records._compute_is_done() + all_records._compute_is_to_do() return super(SoongWorkflowRecord, self).get_view(view_id, view_type, **options) def to_do_process_reminders(self):