From 4e177f1b128ce1006cafeba8d07e55cfb7b8d78b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Fri, 30 Jan 2026 19:41:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=80=92=E5=BA=8F=EF=BC=8C=E8=A1=A5=E5=85=A8=E5=8A=9E=E7=BB=93?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/soong_workflow_record.py | 60 +++++++++++++------ .../views/soong_workflow_record.xml | 14 ++--- 2 files changed, 48 insertions(+), 26 deletions(-) diff --git a/soong_workflow/models/soong_workflow_record.py b/soong_workflow/models/soong_workflow_record.py index 4df2a92d6..a81f8acda 100644 --- a/soong_workflow/models/soong_workflow_record.py +++ b/soong_workflow/models/soong_workflow_record.py @@ -91,6 +91,22 @@ class SoongWorkflowRecord(models.Model): # 办结时间(上一节点的结束时间) node_update_time = fields.Datetime(string="办结时间") + + # 显示用的办结时间(如果node_update_time为空,则显示write_date2) + display_end_time = fields.Datetime( + string="办结时间", + compute='_compute_display_end_time', + store=True # 存储到数据库,以便用于排序 + ) + + @api.depends('node_update_time', 'write_date2') + def _compute_display_end_time(self): + """ + 计算显示用的办结时间 + 逻辑:如果node_update_time有值则使用,否则使用write_date2 + """ + for record in self: + record.display_end_time = record.node_update_time or record.write_date2 @api.depends('res_model', 'res_id') def _compute_urgency_level(self): @@ -645,36 +661,42 @@ class SoongWorkflowRecord(models.Model): def action_update_history_end_time(self): """ - 批量计算已结束流程的办结时间 + 批量计算已结杞流程的办结时间 """ # 寻找所有审批状态为结束(end)且办结时间为空的记录 records = self.search([ ('approve_state', '=', 'end'), ('node_update_time', '=', False) ]) - + count = 0 for rec in records: - if not rec.res_model or not rec.res_id: - continue + node_update_time = None - try: - # 获取对应的业务单据 - source_record = self.env[rec.res_model].browse(rec.res_id) - if not source_record.exists(): - continue + # 尝试从业务单据的log_ids获取办结旷间 + if rec.res_model and rec.res_id: + try: + # 获取对应的业务单据 + source_record = self.env[rec.res_model].browse(rec.res_id) + if source_record.exists(): + # 提取该单据最后一条审批日志的时间 + if hasattr(source_record, 'log_ids') and source_record.log_ids: + # 按ID排序,取最后一条记录 + sorted_logs = source_record.log_ids.sorted(lambda l: l.id) + if sorted_logs and sorted_logs[-1].lase_click_date: + node_update_time = sorted_logs[-1].lase_click_date + except Exception as e: + _logger.error(f"计算记录 {rec.id} 办结时间失败: {e}") - # 提取该单据最后一条审批日志的时间 - if hasattr(source_record, 'log_ids') and source_record.log_ids: - # 按ID排序,取最后一条记录 - sorted_logs = source_record.log_ids.sorted(lambda l: l.id) - if sorted_logs and sorted_logs[-1].lase_click_date: - # 更新办结时间 - rec.write({'node_update_time': sorted_logs[-1].lase_click_date}) - count += 1 - except Exception as e: - _logger.error(f"计算记录 {rec.id} 办结时间失败: {e}") + # 如果没有从 log_ids 获取到时间,则使用 write_date2 作为备选 + if not node_update_time: + node_update_time = rec.write_date2 + # 更新办结时间 + if node_update_time: + rec.write({'node_update_time': node_update_time}) + count += 1 + return { 'type': 'ir.actions.client', 'tag': 'display_notification', diff --git a/soong_workflow/views/soong_workflow_record.xml b/soong_workflow/views/soong_workflow_record.xml index fb8cb97f7..9549f66e9 100644 --- a/soong_workflow/views/soong_workflow_record.xml +++ b/soong_workflow/views/soong_workflow_record.xml @@ -86,7 +86,7 @@ + create="false" default_order="display_end_time desc, write_date2 desc, id desc" expand="1" limit="10">