diff --git a/soong_workflow/models/soong_workflow_mixin.py b/soong_workflow/models/soong_workflow_mixin.py index a56e419ed..969cc6999 100644 --- a/soong_workflow/models/soong_workflow_mixin.py +++ b/soong_workflow/models/soong_workflow_mixin.py @@ -81,6 +81,7 @@ class SoongWorkflowMixin(models.AbstractModel): domain=lambda self: [('res_model', '=', self._name)], auto_join=True, string="审批明细") approval_sign_ids = fields.Many2many('res.users', store=False, compute="_compute_approval_sign_ids", string="加签人员") + is_import = fields.Boolean(string='是否导入') is_back = fields.Boolean(string='是否允许收回', compute='_compute_is_back', store=False,) is_active = fields.Boolean(string='是否允许归档', compute='_compute_is_active', store=False,) is_confirm = fields.Boolean(string="未确认", compute='_compute_is_confirm', store=False,) @@ -1163,6 +1164,11 @@ class SoongWorkflowMixin(models.AbstractModel): end_el.set("invisible", "1") header_el.append(end_el) + import_el = etree.Element("field") + import_el.set("name", "is_import") + import_el.set("invisible", "1") + header_el.append(import_el) + back_el = etree.Element("field") back_el.set("name", "is_back") back_el.set("invisible", "1") diff --git a/soong_workflow/models/soong_workflow_record.py b/soong_workflow/models/soong_workflow_record.py index bce7f00a4..26c6b8f38 100644 --- a/soong_workflow/models/soong_workflow_record.py +++ b/soong_workflow/models/soong_workflow_record.py @@ -657,22 +657,78 @@ class SoongWorkflowRecord(models.Model): @api.model def get_view(self, view_id=None, view_type='form', **options): - current_user_id = self.env.user.id - current_employee = self.env['hr.employee'].search([('user_id', '=', current_user_id)], limit=1) - view = super().get_view(view_id, view_type, **options) - if not current_employee: - return view - if view_type == 'list': - all_records = self.search([ - '|', - ('employee_ids', 'in', [current_employee.id]), - ('employee2_ids', 'in', [current_employee.id]), - ('reclaim_state', '=', False) # 补回丢失的过滤条件 - ]) # 限制最大记录数,避免性能问题 - if all_records: - all_records._compute_is_done() - all_records._compute_is_to_do() - return view + 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', 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 + 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 + + 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' + + # 处理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): workflow_records = self.env['soong.workflow.record'].search([ diff --git a/soong_workflow/templates/soong_workflow_templates.xml b/soong_workflow/templates/soong_workflow_templates.xml index ae14f50cb..b81123d57 100644 --- a/soong_workflow/templates/soong_workflow_templates.xml +++ b/soong_workflow/templates/soong_workflow_templates.xml @@ -2,7 +2,7 @@