diff --git a/soong_workflow/models/soong_workflow_record.py b/soong_workflow/models/soong_workflow_record.py index 7e01ce71f..2a4ed2f6e 100644 --- a/soong_workflow/models/soong_workflow_record.py +++ b/soong_workflow/models/soong_workflow_record.py @@ -75,6 +75,7 @@ class SoongWorkflowRecord(models.Model): is_unlink = fields.Boolean(string="是否可删", compute='_compute_is_unlink') is_to_do = fields.Boolean( string="是否是待办流程", + compute='_compute_is_to_do', search='_search_is_to_do', ) @@ -168,6 +169,64 @@ class SoongWorkflowRecord(models.Model): _logger.warning(f"Failed to get urgency_level from {record.res_model}: {e}") record.urgency_level = 'normal' + @api.depends('employee_ids', 'res_model', 'res_id', 'soong_state', 'reclaim_state', 'approve_state') + def _compute_is_to_do(self): + """计算待办状态: + 1. approve_state为start 且 employee_ids包含当前用户关联员工 → 待办 + 2. 原有逻辑:log_ids/log_ids2满足条件 → 待办 + """ + current_uid = self.env.user.id + current_employees = self.env['hr.employee'].search([('user_id', '=', current_uid)]) + active_employee_ids = current_employees.ids if current_employees else [] + if not active_employee_ids: + for record in self: + record.is_to_do = False + return + 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} + for record in self.filtered(lambda r: not r.reclaim_state): + record.is_to_do = False + all_record_emp_ids = record.employee_ids.ids + record.employee2_ids.ids + if record.approve_state == 'start' and set(active_employee_ids) & set(all_record_emp_ids) and not record.reclaim_state: + record.is_to_do = True + continue + # 原有逻辑:仅当新增条件不满足时,才执行原有log_ids/log_ids2判断 + record_emp_ids = [emp.id for emp in record.employee_ids if emp.id in active_employee_ids] + if not record_emp_ids: + continue + + record_user_ids = [emp_to_user[emp_id] for emp_id in record_emp_ids if emp_id in emp_to_user] + if not record_user_ids: + continue + + target_record = None + if record.res_model and record.res_id: + try: + target_record = self.env[record.res_model].browse(record.res_id).exists() + except (exceptions.MissingError, exceptions.AccessError): + continue + + if not target_record: + continue + + is_todo = False + # 检查log_ids + target_logs = target_record.log_ids.filtered( + lambda l: l.done_by.id in record_user_ids and l.approval_state in ['0', '1'] + ) + if target_logs: + is_todo = True + + # 检查log_ids2 + if not is_todo: + target_log2 = target_record.log_ids2.filtered( + lambda l: l.done_by.id in record_user_ids and l.approval_state in ['0', '1'] + ) + if target_log2: + is_todo = True + + # 设置最终待办状态 + record.is_to_do = is_todo def _search_is_to_do(self, operator, value): """搜索待办状态:仅打印总耗时""" @@ -266,6 +325,7 @@ class SoongWorkflowRecord(models.Model): domain = [('id', 'not in', invalid_ids)] else: domain = [('id', '=', False)] + return domain @api.depends('employee_ids', 'soong_state', 'reclaim_state')