From 165d70f3ab462cc5c4c50cdc45bfd4a484aa8efd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Mon, 26 Jan 2026 10:56:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=B9=E9=87=8F=E8=A1=A5=E5=85=A8=E5=8A=9E?= =?UTF-8?q?=E7=BB=93=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- soong_workflow/models/soong_workflow_mixin.py | 4 ++ .../models/soong_workflow_record.py | 42 +++++++++++++++++++ .../views/soong_workflow_record.xml | 18 ++++++++ 3 files changed, 64 insertions(+) diff --git a/soong_workflow/models/soong_workflow_mixin.py b/soong_workflow/models/soong_workflow_mixin.py index fcd04ba59..87e584576 100644 --- a/soong_workflow/models/soong_workflow_mixin.py +++ b/soong_workflow/models/soong_workflow_mixin.py @@ -667,6 +667,10 @@ class SoongWorkflowMixin(models.AbstractModel): sorted_logs = rec.log_ids.sorted(lambda log: log.id) if sorted_logs and sorted_logs[-1].lase_click_date: node_update_time = sorted_logs[-1].lase_click_date + + # 补丁:如果审批状态已经是结束,但还没拿到时间,则尝试用当前时间作为办结时间 + if not node_update_time and record_obj.approve_state == 'end': + node_update_time = fields.Datetime.now() except Exception as e: _logger.debug(f"Failed to get node_update_time: {e}") diff --git a/soong_workflow/models/soong_workflow_record.py b/soong_workflow/models/soong_workflow_record.py index e4625d0fe..f7680c16a 100644 --- a/soong_workflow/models/soong_workflow_record.py +++ b/soong_workflow/models/soong_workflow_record.py @@ -622,6 +622,48 @@ 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 + + try: + # 获取对应的业务单据 + source_record = self.env[rec.res_model].browse(rec.res_id) + if not source_record.exists(): + continue + + # 提取该单据最后一条审批日志的时间 + 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}") + + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'title': '处理完成', + 'message': f'成功更新了 {count} 条记录的办结时间', + 'sticky': False, + } + } + diff --git a/soong_workflow/views/soong_workflow_record.xml b/soong_workflow/views/soong_workflow_record.xml index 8502c1d9a..c4178c9af 100644 --- a/soong_workflow/views/soong_workflow_record.xml +++ b/soong_workflow/views/soong_workflow_record.xml @@ -92,6 +92,8 @@ groups="soong_workflow.group_soong_workflow_manager"/>